Merge "Support confirmation of international calls while on WFC only."
diff --git a/Android.mk b/Android.mk
index 28adbca..f544620 100644
--- a/Android.mk
+++ b/Android.mk
@@ -109,6 +109,7 @@
core/java/android/app/backup/IRestoreObserver.aidl \
core/java/android/app/backup/IRestoreSession.aidl \
core/java/android/app/backup/ISelectBackupTransportCallback.aidl \
+ core/java/android/app/usage/ICacheQuotaService.aidl \
core/java/android/app/usage/IStorageStatsManager.aidl \
core/java/android/app/usage/IUsageStatsManager.aidl \
core/java/android/bluetooth/IBluetooth.aidl \
@@ -212,7 +213,6 @@
core/java/android/hardware/usb/IUsbManager.aidl \
core/java/android/net/ICaptivePortal.aidl \
core/java/android/net/IConnectivityManager.aidl \
- core/java/android/net/IConnectivityMetricsLogger.aidl \
core/java/android/net/IIpConnectivityMetrics.aidl \
core/java/android/net/IEthernetManager.aidl \
core/java/android/net/IEthernetServiceListener.aidl \
@@ -295,9 +295,9 @@
core/java/android/printservice/IPrintService.aidl \
core/java/android/printservice/IPrintServiceClient.aidl \
core/java/android/companion/ICompanionDeviceManager.aidl \
- core/java/android/companion/ICompanionDeviceManagerService.aidl \
- core/java/android/companion/ICompanionDeviceManagerServiceCallback.aidl \
- core/java/android/companion/IOnAssociateCallback.aidl \
+ core/java/android/companion/ICompanionDeviceDiscoveryService.aidl \
+ core/java/android/companion/ICompanionDeviceDiscoveryServiceCallback.aidl \
+ core/java/android/companion/IFindDeviceCallback.aidl \
core/java/android/service/dreams/IDreamManager.aidl \
core/java/android/service/dreams/IDreamService.aidl \
core/java/android/service/persistentdata/IPersistentDataBlockService.aidl \
@@ -322,6 +322,7 @@
core/java/android/view/IAppTransitionAnimationSpecsFuture.aidl \
core/java/android/view/IDockedStackListener.aidl \
core/java/android/view/IGraphicsStats.aidl \
+ core/java/android/view/IGraphicsStatsCallback.aidl \
core/java/android/view/IInputFilter.aidl \
core/java/android/view/IInputFilterHost.aidl \
core/java/android/view/IOnKeyguardExitResult.aidl \
@@ -407,6 +408,10 @@
location/java/android/location/INetInitiatedListener.aidl \
location/java/com/android/internal/location/ILocationProvider.aidl \
media/java/android/media/IAudioService.aidl \
+ ../av/drm/libmediadrm/aidl/android/media/ICas.aidl \
+ ../av/drm/libmediadrm/aidl/android/media/ICasListener.aidl \
+ ../av/drm/libmediadrm/aidl/android/media/IDescrambler.aidl \
+ ../av/drm/libmediadrm/aidl/android/media/IMediaCasService.aidl \
media/java/android/media/IAudioFocusDispatcher.aidl \
media/java/android/media/IAudioRoutesObserver.aidl \
media/java/android/media/IMediaHTTPConnection.aidl \
@@ -436,6 +441,7 @@
media/java/android/media/projection/IMediaProjectionManager.aidl \
media/java/android/media/projection/IMediaProjectionWatcherCallback.aidl \
media/java/android/media/session/IActiveSessionsListener.aidl \
+ media/java/android/media/session/ICallback.aidl \
media/java/android/media/session/IOnMediaKeyListener.aidl \
media/java/android/media/session/IOnVolumeKeyLongPressListener.aidl \
media/java/android/media/session/ISession.aidl \
@@ -473,6 +479,7 @@
telephony/java/com/android/ims/internal/IImsEcbm.aidl \
telephony/java/com/android/ims/internal/IImsEcbmListener.aidl \
telephony/java/com/android/ims/internal/IImsExternalCallStateListener.aidl \
+ telephony/java/com/android/ims/internal/IImsFeatureStatusCallback.aidl \
telephony/java/com/android/ims/internal/IImsMultiEndpoint.aidl \
telephony/java/com/android/ims/internal/IImsService.aidl \
telephony/java/com/android/ims/internal/IImsServiceController.aidl \
@@ -531,6 +538,7 @@
LOCAL_AIDL_INCLUDES += \
frameworks/av/camera/aidl \
+ frameworks/av/drm/libmediadrm/aidl \
frameworks/native/aidl/gui \
system/netd/server/binder
@@ -560,6 +568,7 @@
LOCAL_MODULE := framework
+LOCAL_DX_FLAGS := --core-library --multi-dex
LOCAL_JACK_FLAGS := --multi-dex native
LOCAL_RMTYPEDEFS := true
@@ -706,6 +715,7 @@
frameworks/base/core/java/android/service/notification/StatusBarNotification.aidl \
frameworks/base/core/java/android/service/chooser/ChooserTarget.aidl \
frameworks/base/core/java/android/speech/tts/Voice.aidl \
+ frameworks/base/core/java/android/app/usage/CacheQuotaHint.aidl \
frameworks/base/core/java/android/app/usage/ExternalStorageStats.aidl \
frameworks/base/core/java/android/app/usage/StorageStats.aidl \
frameworks/base/core/java/android/app/usage/UsageEvents.aidl \
@@ -923,6 +933,7 @@
-since $(SRC_API_DIR)/23.txt 23 \
-since $(SRC_API_DIR)/24.txt 24 \
-since $(SRC_API_DIR)/25.txt 25 \
+ -since ./frameworks/base/api/current.txt O \
-werror -hide 111 -hide 113 \
-overview $(LOCAL_PATH)/core/java/overview.html
@@ -995,7 +1006,7 @@
-removedApi $(INTERNAL_PLATFORM_REMOVED_API_FILE) \
-nodocs
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk
+LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
LOCAL_UNINSTALLABLE_MODULE := true
@@ -1030,7 +1041,7 @@
-removedApi $(INTERNAL_PLATFORM_SYSTEM_REMOVED_API_FILE) \
-nodocs
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk
+LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
LOCAL_UNINSTALLABLE_MODULE := true
@@ -1066,7 +1077,7 @@
-removedApi $(INTERNAL_PLATFORM_TEST_REMOVED_API_FILE) \
-nodocs
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk
+LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
LOCAL_UNINSTALLABLE_MODULE := true
@@ -1096,7 +1107,7 @@
-referenceonly \
-parsecomments
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk
+LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
LOCAL_UNINSTALLABLE_MODULE := true
@@ -1132,7 +1143,7 @@
-sdkvalues $(OUT_DOCS) \
-hdf android.whichdoc offline
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk
+LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
include $(BUILD_DROIDDOC)
@@ -1171,7 +1182,7 @@
-resourcesdir $(LOCAL_PATH)/docs/html/reference/images/ \
-resourcesoutdir reference/android/images/
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk
+LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
include $(BUILD_DROIDDOC)
@@ -1214,7 +1225,7 @@
-hdf android.hasSamples true \
-samplesdir $(samples_dir)
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk
+LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
include $(BUILD_DROIDDOC)
@@ -1250,7 +1261,7 @@
-hdf android.hasSamples true \
-samplesdir $(samples_dir)
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk
+LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
# Don't build by default
LOCAL_UNINSTALLABLE_MODULE := true
@@ -1282,7 +1293,7 @@
-hdf android.hasSamples true \
-samplesdir $(samples_dir)
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk
+LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
include $(BUILD_DROIDDOC)
@@ -1310,7 +1321,7 @@
-devsite \
-ignoreJdLinks
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk
+LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
include $(BUILD_DROIDDOC)
@@ -1335,7 +1346,7 @@
-atLinksNavtree \
-navtreeonly
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk
+LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
include $(BUILD_DROIDDOC)
@@ -1363,7 +1374,7 @@
-hdf android.hasSamples true \
-samplesdir $(samples_dir)
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk
+LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
include $(BUILD_DROIDDOC)
@@ -1386,7 +1397,7 @@
-title "Android SDK - Including hidden APIs."
# -hidden
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk
+LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
include $(BUILD_DROIDDOC)
@@ -1410,6 +1421,8 @@
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := ext
+LOCAL_DX_FLAGS := --core-library
+
ifneq ($(INCREMENTAL_BUILDS),)
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_JACK_ENABLED := incremental
@@ -1417,6 +1430,24 @@
include $(BUILD_JAVA_LIBRARY)
+# ==== c++ proto device library ==============================
+include $(CLEAR_VARS)
+LOCAL_MODULE := libplatformprotos
+# b/34740546, work around clang-tidy segmentation fault.
+LOCAL_TIDY_CHECKS := -modernize*
+LOCAL_PROTOC_OPTIMIZE_TYPE := lite
+LOCAL_PROTOC_FLAGS := \
+ --include_source_info \
+ -Iexternal/protobuf/src
+LOCAL_SRC_FILES := \
+ $(call all-proto-files-under, core/proto) \
+ $(call all-proto-files-under, libs/incident/proto)
+LOCAL_C_INCLUDES := \
+ $(call generated-sources-dir-for,STATIC_LIBRARIES,libplatformprotos,)/proto
+LOCAL_EXPORT_C_INCLUDES := \
+ $(call generated-sources-dir-for,STATIC_LIBRARIES,libplatformprotos,)/proto
+include $(BUILD_STATIC_LIBRARY)
+
# ==== c++ proto host library ==============================
include $(CLEAR_VARS)
LOCAL_MODULE := libplatformprotos
diff --git a/apct-tests/perftests/core/res/layout/test_autosize_textview_10.xml b/apct-tests/perftests/core/res/layout/test_autosize_textview_10.xml
index a8d3de0..4a4b3b4 100644
--- a/apct-tests/perftests/core/res/layout/test_autosize_textview_10.xml
+++ b/apct-tests/perftests/core/res/layout/test_autosize_textview_10.xml
@@ -35,7 +35,7 @@
android:layout_width="400dp"
android:layout_height="600dp"
android:text="@string/long_text"
- android:autoSizeText="uniform"
+ android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="10px"
android:textSize="20px"
android:autoSizeStepGranularity="1px"/>
diff --git a/apct-tests/perftests/core/res/layout/test_autosize_textview_100.xml b/apct-tests/perftests/core/res/layout/test_autosize_textview_100.xml
index d991862..0b326e8 100644
--- a/apct-tests/perftests/core/res/layout/test_autosize_textview_100.xml
+++ b/apct-tests/perftests/core/res/layout/test_autosize_textview_100.xml
@@ -19,7 +19,7 @@
android:layout_width="400dp"
android:layout_height="600dp"
android:text="@string/long_text"
- android:autoSizeText="uniform"
+ android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="10px"
android:textSize="110px"
android:autoSizeStepGranularity="1px"/>
diff --git a/apct-tests/perftests/core/res/layout/test_autosize_textview_1000.xml b/apct-tests/perftests/core/res/layout/test_autosize_textview_1000.xml
index 3b55b6c..2f4239d 100644
--- a/apct-tests/perftests/core/res/layout/test_autosize_textview_1000.xml
+++ b/apct-tests/perftests/core/res/layout/test_autosize_textview_1000.xml
@@ -19,7 +19,7 @@
android:layout_width="400dp"
android:layout_height="600dp"
android:text="@string/long_text"
- android:autoSizeText="uniform"
+ android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="10px"
android:textSize="1010px"
android:autoSizeStepGranularity="1px"/>
diff --git a/apct-tests/perftests/core/res/layout/test_autosize_textview_10000.xml b/apct-tests/perftests/core/res/layout/test_autosize_textview_10000.xml
index 64a25c2..b6be10a 100644
--- a/apct-tests/perftests/core/res/layout/test_autosize_textview_10000.xml
+++ b/apct-tests/perftests/core/res/layout/test_autosize_textview_10000.xml
@@ -19,7 +19,7 @@
android:layout_width="400dp"
android:layout_height="600dp"
android:text="@string/long_text"
- android:autoSizeText="uniform"
+ android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="10px"
android:textSize="10010px"
android:autoSizeStepGranularity="1px"/>
diff --git a/apct-tests/perftests/core/res/layout/test_autosize_textview_100000.xml b/apct-tests/perftests/core/res/layout/test_autosize_textview_100000.xml
index 1f60783..aed339c 100644
--- a/apct-tests/perftests/core/res/layout/test_autosize_textview_100000.xml
+++ b/apct-tests/perftests/core/res/layout/test_autosize_textview_100000.xml
@@ -19,7 +19,7 @@
android:layout_width="400dp"
android:layout_height="600dp"
android:text="@string/long_text"
- android:autoSizeText="uniform"
+ android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="10px"
android:textSize="100010px"
android:autoSizeStepGranularity="1px"/>
diff --git a/apct-tests/perftests/core/res/layout/test_autosize_textview_300.xml b/apct-tests/perftests/core/res/layout/test_autosize_textview_300.xml
index 54c7e71..62522ba 100644
--- a/apct-tests/perftests/core/res/layout/test_autosize_textview_300.xml
+++ b/apct-tests/perftests/core/res/layout/test_autosize_textview_300.xml
@@ -19,7 +19,7 @@
android:layout_width="400dp"
android:layout_height="600dp"
android:text="@string/long_text"
- android:autoSizeText="uniform"
+ android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="10px"
android:textSize="310px"
android:autoSizeStepGranularity="1px"/>
diff --git a/apct-tests/perftests/core/res/layout/test_autosize_textview_5.xml b/apct-tests/perftests/core/res/layout/test_autosize_textview_5.xml
index 525b2c8..f383fa4 100644
--- a/apct-tests/perftests/core/res/layout/test_autosize_textview_5.xml
+++ b/apct-tests/perftests/core/res/layout/test_autosize_textview_5.xml
@@ -35,7 +35,7 @@
android:layout_width="400dp"
android:layout_height="600dp"
android:text="@string/long_text"
- android:autoSizeText="uniform"
+ android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="10px"
android:textSize="15px"
android:autoSizeStepGranularity="1px"/>
diff --git a/apct-tests/perftests/core/res/layout/test_autosize_textview_50.xml b/apct-tests/perftests/core/res/layout/test_autosize_textview_50.xml
index 470c4da..04dd6c2 100644
--- a/apct-tests/perftests/core/res/layout/test_autosize_textview_50.xml
+++ b/apct-tests/perftests/core/res/layout/test_autosize_textview_50.xml
@@ -19,7 +19,7 @@
android:layout_width="400dp"
android:layout_height="600dp"
android:text="@string/long_text"
- android:autoSizeText="uniform"
+ android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="10px"
android:textSize="60px"
android:autoSizeStepGranularity="1px"/>
diff --git a/apct-tests/perftests/core/res/layout/test_autosize_textview_500.xml b/apct-tests/perftests/core/res/layout/test_autosize_textview_500.xml
index b8a6e0a..a8e2b38 100644
--- a/apct-tests/perftests/core/res/layout/test_autosize_textview_500.xml
+++ b/apct-tests/perftests/core/res/layout/test_autosize_textview_500.xml
@@ -19,7 +19,7 @@
android:layout_width="400dp"
android:layout_height="600dp"
android:text="@string/long_text"
- android:autoSizeText="uniform"
+ android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="10px"
android:textSize="510px"
android:autoSizeStepGranularity="1px"/>
diff --git a/apct-tests/perftests/core/src/android/widget/TextViewAutoSizeLayoutPerfTest.java b/apct-tests/perftests/core/src/android/widget/TextViewAutoSizeLayoutPerfTest.java
index 6ee6f70..c310166 100644
--- a/apct-tests/perftests/core/src/android/widget/TextViewAutoSizeLayoutPerfTest.java
+++ b/apct-tests/perftests/core/src/android/widget/TextViewAutoSizeLayoutPerfTest.java
@@ -89,7 +89,7 @@
while (state.keepRunning()) {
TextView textView = new TextView(activity);
- // TextView#onMeasure() gets called, which triggers TextView#autoSizeText()
+ // TextView#onLayout() gets called, which triggers TextView#autoSizeText()
// which is the method we want to benchmark.
textView.requestLayout();
}
diff --git a/api/current.txt b/api/current.txt
index 9df1764..445c576 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -30,7 +30,6 @@
field public static final java.lang.String BIND_INPUT_METHOD = "android.permission.BIND_INPUT_METHOD";
field public static final java.lang.String BIND_MIDI_DEVICE_SERVICE = "android.permission.BIND_MIDI_DEVICE_SERVICE";
field public static final java.lang.String BIND_NFC_SERVICE = "android.permission.BIND_NFC_SERVICE";
- field public static final java.lang.String BIND_NOTIFICATION_ASSISTANT_SERVICE = "android.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE";
field public static final java.lang.String BIND_NOTIFICATION_LISTENER_SERVICE = "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE";
field public static final java.lang.String BIND_PRINT_SERVICE = "android.permission.BIND_PRINT_SERVICE";
field public static final java.lang.String BIND_QUICK_SETTINGS_TILE = "android.permission.BIND_QUICK_SETTINGS_TILE";
@@ -121,6 +120,7 @@
field public static final java.lang.String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES";
field public static final deprecated java.lang.String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES";
field public static final java.lang.String RESTRICTED_VR_ACCESS = "android.permission.RESTRICTED_VR_ACCESS";
+ field public static final java.lang.String RUN_IN_BACKGROUND = "android.permission.RUN_IN_BACKGROUND";
field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";
field public static final java.lang.String SEND_SMS = "android.permission.SEND_SMS";
field public static final java.lang.String SET_ALARM = "com.android.alarm.permission.SET_ALARM";
@@ -139,6 +139,7 @@
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_DATA_IN_BACKGROUND = "android.permission.USE_DATA_IN_BACKGROUND";
field public static final 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";
@@ -296,6 +297,7 @@
field public static final int authorities = 16842776; // 0x1010018
field public static final int autoAdvanceViewId = 16843535; // 0x101030f
field public static final int autoCompleteTextViewStyle = 16842859; // 0x101006b
+ field public static final int autoFillMode = 16844116; // 0x1010554
field public static final int autoLink = 16842928; // 0x10100b0
field public static final int autoMirrored = 16843754; // 0x10103ea
field public static final int autoRemoveFromRecents = 16843847; // 0x1010447
@@ -303,7 +305,7 @@
field public static final int autoSizeMinTextSize = 16844088; // 0x1010538
field public static final int autoSizePresetSizes = 16844087; // 0x1010537
field public static final int autoSizeStepGranularity = 16844086; // 0x1010536
- field public static final int autoSizeText = 16844085; // 0x1010535
+ field public static final int autoSizeTextType = 16844085; // 0x1010535
field public static final int autoStart = 16843445; // 0x10102b5
field public static final deprecated int autoText = 16843114; // 0x101016a
field public static final int autoUrlDetect = 16843404; // 0x101028c
@@ -408,6 +410,7 @@
field public static final int colorControlHighlight = 16843820; // 0x101042c
field public static final int colorControlNormal = 16843817; // 0x1010429
field public static final int colorEdgeEffect = 16843982; // 0x10104ce
+ field public static final int colorError = 16844100; // 0x1010544
field public static final int colorFocusedHighlight = 16843663; // 0x101038f
field public static final int colorForeground = 16842800; // 0x1010030
field public static final int colorForegroundInverse = 16843270; // 0x1010206
@@ -1314,7 +1317,6 @@
field public static final int textCheckMarkInverse = 16842823; // 0x1010047
field public static final int textColor = 16842904; // 0x1010098
field public static final int textColorAlertDialogListItem = 16843526; // 0x1010306
- field public static final int textColorError = 16844100; // 0x1010544
field public static final int textColorHighlight = 16842905; // 0x1010099
field public static final int textColorHighlightInverse = 16843599; // 0x101034f
field public static final int textColorHint = 16842906; // 0x101009a
@@ -3653,6 +3655,7 @@
method public void onLowMemory();
method public boolean onMenuItemSelected(int, android.view.MenuItem);
method public boolean onMenuOpened(int, android.view.Menu);
+ method public void onMovedToDisplay(int);
method public void onMultiWindowModeChanged(boolean);
method public boolean onNavigateUp();
method public boolean onNavigateUpFromChild(android.app.Activity);
@@ -4734,6 +4737,7 @@
method public abstract android.app.Fragment getPrimaryNavigationFragment();
method public void invalidateOptionsMenu();
method public abstract boolean isDestroyed();
+ method public abstract boolean isStateSaved();
method public abstract void popBackStack();
method public abstract void popBackStack(java.lang.String, int);
method public abstract void popBackStack(int, int);
@@ -6197,9 +6201,10 @@
method public void addUserRestriction(android.content.ComponentName, java.lang.String);
method public boolean bindDeviceAdminServiceAsUser(android.content.ComponentName, android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle);
method public void clearCrossProfileIntentFilters(android.content.ComponentName);
- method public void clearDeviceOwnerApp(java.lang.String);
+ method public deprecated void clearDeviceOwnerApp(java.lang.String);
method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String);
- method public void clearProfileOwner(android.content.ComponentName);
+ method public deprecated void clearProfileOwner(android.content.ComponentName);
+ method public boolean clearResetPasswordToken(android.content.ComponentName);
method public void clearUserRestriction(android.content.ComponentName, java.lang.String);
method public android.content.Intent createAdminSupportIntent(java.lang.String);
method public android.os.UserHandle createAndManageUser(android.content.ComponentName, java.lang.String, android.content.ComponentName, android.os.PersistableBundle, int);
@@ -6276,6 +6281,7 @@
method public boolean isPackageSuspended(android.content.ComponentName, java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
method public boolean isProfileOwnerApp(java.lang.String);
method public boolean isProvisioningAllowed(java.lang.String);
+ method public boolean isResetPasswordTokenActive(android.content.ComponentName);
method public boolean isSecurityLoggingEnabled(android.content.ComponentName);
method public boolean isUninstallBlocked(android.content.ComponentName, java.lang.String);
method public void lockNow();
@@ -6287,6 +6293,7 @@
method public boolean removeUser(android.content.ComponentName, android.os.UserHandle);
method public boolean requestBugreport(android.content.ComponentName);
method public boolean resetPassword(java.lang.String, int);
+ method public boolean resetPasswordWithToken(android.content.ComponentName, java.lang.String, byte[], int);
method public java.util.List<android.app.admin.NetworkEvent> retrieveNetworkLogs(android.content.ComponentName, long);
method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrievePreRebootSecurityLogs(android.content.ComponentName);
method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrieveSecurityLogs(android.content.ComponentName);
@@ -6335,6 +6342,7 @@
method public void setProfileName(android.content.ComponentName, java.lang.String);
method public void setRecommendedGlobalProxy(android.content.ComponentName, android.net.ProxyInfo);
method public void setRequiredStrongAuthTimeout(android.content.ComponentName, long);
+ method public boolean setResetPasswordToken(android.content.ComponentName, byte[]);
method public void setRestrictionsProvider(android.content.ComponentName, android.content.ComponentName);
method public void setScreenCaptureDisabled(android.content.ComponentName, boolean);
method public void setSecureSetting(android.content.ComponentName, java.lang.String, java.lang.String);
@@ -6540,6 +6548,7 @@
public static class AssistStructure.ViewNode {
method public float getAlpha();
method public android.view.autofill.AutoFillId getAutoFillId();
+ method public java.lang.String[] getAutoFillOptions();
method public android.view.autofill.AutoFillType getAutoFillType();
method public android.view.autofill.AutoFillValue getAutoFillValue();
method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
@@ -6568,6 +6577,7 @@
method public int getTextStyle();
method public int getTop();
method public android.graphics.Matrix getTransformation();
+ method public java.lang.String getUrl();
method public int getVisibility();
method public int getWidth();
method public boolean isAccessibilityFocused();
@@ -6708,6 +6718,7 @@
method public android.app.job.JobInfo.TriggerContentUri[] getTriggerContentUris();
method public boolean isPeriodic();
method public boolean isPersisted();
+ method public boolean isRequireBatteryNotLow();
method public boolean isRequireCharging();
method public boolean isRequireDeviceIdle();
method public void writeToParcel(android.os.Parcel, int);
@@ -6734,6 +6745,7 @@
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 setRequiredNetworkType(int);
+ method public android.app.job.JobInfo.Builder setRequiresBatteryNotLow(boolean);
method public android.app.job.JobInfo.Builder setRequiresCharging(boolean);
method public android.app.job.JobInfo.Builder setRequiresDeviceIdle(boolean);
method public android.app.job.JobInfo.Builder setTransientExtras(android.os.Bundle);
@@ -6874,6 +6886,7 @@
method public long getFreeBytes(java.lang.String);
method public long getTotalBytes(java.lang.String);
method public android.app.usage.ExternalStorageStats queryExternalStatsForUser(java.lang.String, android.os.UserHandle);
+ method public android.app.usage.StorageStats queryStatsForPackage(java.lang.String, java.lang.String, android.os.UserHandle);
method public android.app.usage.StorageStats queryStatsForUid(java.lang.String, int);
method public android.app.usage.StorageStats queryStatsForUser(java.lang.String, android.os.UserHandle);
}
@@ -9030,6 +9043,7 @@
field public static final java.lang.String ACTION_CALL = "android.intent.action.CALL";
field public static final java.lang.String ACTION_CALL_BUTTON = "android.intent.action.CALL_BUTTON";
field public static final java.lang.String ACTION_CAMERA_BUTTON = "android.intent.action.CAMERA_BUTTON";
+ field public static final java.lang.String ACTION_CARRIER_SETUP = "android.intent.action.CARRIER_SETUP";
field public static final java.lang.String ACTION_CHOOSER = "android.intent.action.CHOOSER";
field public static final java.lang.String ACTION_CLEAR_PACKAGE = "android.intent.action.CLEAR_PACKAGE";
field public static final java.lang.String ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS";
@@ -9220,7 +9234,7 @@
field public static final java.lang.String EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER";
field public static final java.lang.String EXTRA_PROCESS_TEXT = "android.intent.extra.PROCESS_TEXT";
field public static final java.lang.String EXTRA_PROCESS_TEXT_READONLY = "android.intent.extra.PROCESS_TEXT_READONLY";
- field public static final java.lang.String EXTRA_QUICK_VIEW_PLAIN = "android.intent.extra.QUICK_VIEW_PLAIN";
+ field public static final java.lang.String EXTRA_QUICK_VIEW_ADVANCED = "android.intent.extra.QUICK_VIEW_ADVANCED";
field public static final java.lang.String EXTRA_QUIET_MODE = "android.intent.extra.QUIET_MODE";
field public static final java.lang.String EXTRA_REFERRER = "android.intent.extra.REFERRER";
field public static final java.lang.String EXTRA_REFERRER_NAME = "android.intent.extra.REFERRER_NAME";
@@ -10091,10 +10105,12 @@
ctor public LauncherApps.ShortcutQuery();
method public android.content.pm.LauncherApps.ShortcutQuery setActivity(android.content.ComponentName);
method public android.content.pm.LauncherApps.ShortcutQuery setChangedSince(long);
+ method public android.content.pm.LauncherApps.ShortcutQuery setIntent(android.content.Intent);
method public android.content.pm.LauncherApps.ShortcutQuery setPackage(java.lang.String);
method public android.content.pm.LauncherApps.ShortcutQuery setQueryFlags(int);
method public android.content.pm.LauncherApps.ShortcutQuery setShortcutIds(java.util.List<java.lang.String>);
field public static final int FLAG_GET_KEY_FIELDS_ONLY = 4; // 0x4
+ field public static final int FLAG_MATCH_CHOOSER = 16; // 0x10
field public static final int FLAG_MATCH_DYNAMIC = 1; // 0x1
field public static final int FLAG_MATCH_MANIFEST = 8; // 0x8
field public static final int FLAG_MATCH_PINNED = 2; // 0x2
@@ -10633,6 +10649,9 @@
method public int describeContents();
method public android.content.ComponentName getActivity();
method public java.util.Set<java.lang.String> getCategories();
+ method public android.content.ComponentName[] getChooserComponentNames();
+ method public android.os.PersistableBundle getChooserExtras();
+ method public android.content.IntentFilter[] getChooserIntentFilters();
method public java.lang.CharSequence getDisabledMessage();
method public android.os.PersistableBundle getExtras();
method public java.lang.String getId();
@@ -10645,6 +10664,7 @@
method public java.lang.CharSequence getShortLabel();
method public android.os.UserHandle getUserHandle();
method public boolean hasKeyFieldsOnly();
+ method public boolean isChooser();
method public boolean isDeclaredInManifest();
method public boolean isDynamic();
method public boolean isEnabled();
@@ -10657,9 +10677,11 @@
public static class ShortcutInfo.Builder {
ctor public ShortcutInfo.Builder(android.content.Context, java.lang.String);
+ method public android.content.pm.ShortcutInfo.Builder addChooserIntentFilter(android.content.IntentFilter, android.content.ComponentName);
method public android.content.pm.ShortcutInfo build();
method public android.content.pm.ShortcutInfo.Builder setActivity(android.content.ComponentName);
method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.Set<java.lang.String>);
+ method public android.content.pm.ShortcutInfo.Builder setChooserExtras(android.os.PersistableBundle);
method public android.content.pm.ShortcutInfo.Builder setDisabledMessage(java.lang.CharSequence);
method public android.content.pm.ShortcutInfo.Builder setExtras(android.os.PersistableBundle);
method public android.content.pm.ShortcutInfo.Builder setIcon(android.graphics.drawable.Icon);
@@ -12564,6 +12586,7 @@
method public static android.graphics.ColorSpace.Adaptation valueOf(java.lang.String);
method public static final android.graphics.ColorSpace.Adaptation[] values();
enum_constant public static final android.graphics.ColorSpace.Adaptation BRADFORD;
+ enum_constant public static final android.graphics.ColorSpace.Adaptation CIECAT02;
enum_constant public static final android.graphics.ColorSpace.Adaptation VON_KRIES;
}
@@ -13157,6 +13180,7 @@
field public static final deprecated int LA_88 = 10; // 0xa
field public static final deprecated int L_8 = 9; // 0x9
field public static final int OPAQUE = -1; // 0xffffffff
+ field public static final int RGBA_1010102 = 43; // 0x2b
field public static final deprecated int RGBA_4444 = 7; // 0x7
field public static final deprecated int RGBA_5551 = 6; // 0x6
field public static final int RGBA_8888 = 1; // 0x1
@@ -13482,6 +13506,21 @@
package android.graphics.drawable {
+ public class AdaptiveIconDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ method public void draw(android.graphics.Canvas);
+ method public android.graphics.drawable.Drawable getBackground();
+ method public static float getExtraInsetPercentage();
+ method public android.graphics.drawable.Drawable getForeground();
+ method public android.graphics.Path getIconMask();
+ method public int getOpacity();
+ method public void invalidateDrawable(android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setOpacity(int);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+ }
+
public abstract interface Animatable {
method public abstract boolean isRunning();
method public abstract void start();
@@ -13871,21 +13910,6 @@
method public void addLevel(int, int, android.graphics.drawable.Drawable);
}
- public class MaskableIconDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
- method public void draw(android.graphics.Canvas);
- method public android.graphics.drawable.Drawable getBackground();
- method public static float getExtraInsetPercentage();
- method public android.graphics.drawable.Drawable getForeground();
- method public android.graphics.Path getIconMask();
- method public int getOpacity();
- method public void invalidateDrawable(android.graphics.drawable.Drawable);
- method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
- method public void setAlpha(int);
- method public void setColorFilter(android.graphics.ColorFilter);
- method public void setOpacity(int);
- method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
- }
-
public class NinePatchDrawable extends android.graphics.drawable.Drawable {
ctor public deprecated NinePatchDrawable(android.graphics.Bitmap, byte[], android.graphics.Rect, java.lang.String);
ctor public NinePatchDrawable(android.content.res.Resources, android.graphics.Bitmap, byte[], android.graphics.Rect, java.lang.String);
@@ -13999,6 +14023,8 @@
public class ArcShape extends android.graphics.drawable.shapes.RectShape {
ctor public ArcShape(float, float);
+ method public final float getStartAngle();
+ method public final float getSweepAngle();
}
public class OvalShape extends android.graphics.drawable.shapes.RectShape {
@@ -14387,6 +14413,7 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final int BLOB = 33; // 0x21
field public static final android.os.Parcelable.Creator<android.hardware.HardwareBuffer> CREATOR;
+ field public static final int RGBA_1010102 = 43; // 0x2b
field public static final int RGBA_8888 = 1; // 0x1
field public static final int RGBA_FP16 = 22; // 0x16
field public static final int RGBX_8888 = 2; // 0x2
@@ -20633,6 +20660,26 @@
field public static final int TYPE_WIRED_HEADSET = 3; // 0x3
}
+ public final class AudioFocusRequest {
+ method public boolean acceptsDelayedFocusGain();
+ method public android.media.AudioAttributes getAudioAttributes();
+ method public int getFocusGain();
+ method public android.media.AudioManager.OnAudioFocusChangeListener getOnAudioFocusChangeListener();
+ method public android.os.Handler getOnAudioFocusChangeListenerHandler();
+ method public boolean willPauseWhenDucked();
+ }
+
+ public static final class AudioFocusRequest.Builder {
+ ctor public AudioFocusRequest.Builder(int);
+ ctor public AudioFocusRequest.Builder(android.media.AudioFocusRequest);
+ method public android.media.AudioFocusRequest build();
+ method public android.media.AudioFocusRequest.Builder setAcceptsDelayedFocusGain(boolean);
+ method public android.media.AudioFocusRequest.Builder setAudioAttributes(android.media.AudioAttributes);
+ method public android.media.AudioFocusRequest.Builder setFocusGain(int);
+ method public android.media.AudioFocusRequest.Builder setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener, android.os.Handler);
+ method public android.media.AudioFocusRequest.Builder setWillPauseWhenDucked(boolean);
+ }
+
public final class AudioFormat implements android.os.Parcelable {
method public int describeContents();
method public int getChannelCount();
@@ -20709,6 +20756,7 @@
public class AudioManager {
method public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener);
+ method public int abandonAudioFocusRequest(android.media.AudioFocusRequest);
method public void adjustStreamVolume(int, int, int);
method public void adjustSuggestedStreamVolume(int, int, int);
method public void adjustVolume(int, int);
@@ -20745,6 +20793,7 @@
method public deprecated void registerRemoteControlClient(android.media.RemoteControlClient);
method public deprecated boolean registerRemoteController(android.media.RemoteController);
method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int);
+ method public int requestAudioFocus(android.media.AudioFocusRequest);
method public deprecated void setBluetoothA2dpOn(boolean);
method public void setBluetoothScoOn(boolean);
method public void setMicrophoneMute(boolean);
@@ -20787,6 +20836,8 @@
field public static final int AUDIOFOCUS_LOSS = -1; // 0xffffffff
field public static final int AUDIOFOCUS_LOSS_TRANSIENT = -2; // 0xfffffffe
field public static final int AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK = -3; // 0xfffffffd
+ field public static final int AUDIOFOCUS_NONE = 0; // 0x0
+ field public static final int AUDIOFOCUS_REQUEST_DELAYED = 2; // 0x2
field public static final int AUDIOFOCUS_REQUEST_FAILED = 0; // 0x0
field public static final int AUDIOFOCUS_REQUEST_GRANTED = 1; // 0x1
field public static final int AUDIO_SESSION_ID_GENERATE = 0; // 0x0
@@ -20983,13 +21034,14 @@
field public long nanoTime;
}
- public class AudioTrack implements android.media.AudioRouting {
+ public class AudioTrack implements android.media.AudioRouting android.media.VolumeAutomation {
ctor public deprecated AudioTrack(int, int, int, int, int, int) throws java.lang.IllegalArgumentException;
ctor public deprecated AudioTrack(int, int, int, int, int, int, int) throws java.lang.IllegalArgumentException;
ctor public AudioTrack(android.media.AudioAttributes, android.media.AudioFormat, int, int, int) throws java.lang.IllegalArgumentException;
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
method public deprecated void addOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener, android.os.Handler);
method public int attachAuxEffect(int);
+ method public android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
method public void flush();
method public int getAudioFormat();
method public int getAudioSessionId();
@@ -21457,8 +21509,42 @@
field public static final int STOP_VIDEO_RECORDING = 3; // 0x3
}
+ public final class MediaCas {
+ ctor public MediaCas(int) throws android.media.UnsupportedCasException;
+ method public void closeSession(byte[]);
+ method public static android.media.MediaCas.PluginDescriptor[] enumeratePlugins();
+ method public static boolean isSystemIdSupported(int);
+ method public byte[] openSession(int);
+ method public byte[] openSession(int, int);
+ method public void processEcm(byte[], byte[], int, int);
+ method public void processEcm(byte[], byte[]);
+ method public void processEmm(byte[], int, int);
+ method public void processEmm(byte[]);
+ method public void provision(java.lang.String);
+ method public void refreshEntitlements(int, byte[]);
+ method public void release();
+ method public void sendEvent(int, int, byte[]);
+ method public void setEventListener(android.media.MediaCas.EventListener, android.os.Handler);
+ method public void setPrivateData(byte[]);
+ method public void setSessionPrivateData(byte[], byte[]);
+ }
+
+ public static abstract interface MediaCas.EventListener {
+ method public abstract void onEvent(android.media.MediaCas, int, int, byte[]);
+ }
+
+ public static class MediaCas.PluginDescriptor {
+ method public java.lang.String getName();
+ method public int getSystemId();
+ }
+
+ public class MediaCasException extends java.lang.Exception {
+ ctor public MediaCasException(java.lang.String);
+ }
+
public final class MediaCodec {
method public void configure(android.media.MediaFormat, android.view.Surface, android.media.MediaCrypto, int);
+ method public void configure(android.media.MediaFormat, android.view.Surface, int, android.media.MediaDescrambler);
method public static android.media.MediaCodec createByCodecName(java.lang.String) throws java.io.IOException;
method public static android.media.MediaCodec createDecoderByType(java.lang.String) throws java.io.IOException;
method public static android.media.MediaCodec createEncoderByType(java.lang.String) throws java.io.IOException;
@@ -21498,6 +21584,7 @@
field public static final int BUFFER_FLAG_CODEC_CONFIG = 2; // 0x2
field public static final int BUFFER_FLAG_END_OF_STREAM = 4; // 0x4
field public static final int BUFFER_FLAG_KEY_FRAME = 1; // 0x1
+ field public static final int BUFFER_FLAG_PARTIAL_FRAME = 8; // 0x8
field public static final deprecated int BUFFER_FLAG_SYNC_FRAME = 1; // 0x1
field public static final int CONFIGURE_FLAG_ENCODE = 1; // 0x1
field public static final int CRYPTO_MODE_AES_CBC = 2; // 0x2
@@ -21654,6 +21741,7 @@
field public static final deprecated int COLOR_TI_FormatYUV420PackedSemiPlanar = 2130706688; // 0x7f000100
field public static final java.lang.String FEATURE_AdaptivePlayback = "adaptive-playback";
field public static final java.lang.String FEATURE_IntraRefresh = "intra-refresh";
+ field public static final java.lang.String FEATURE_PartialFrame = "partial-frame";
field public static final java.lang.String FEATURE_SecurePlayback = "secure-playback";
field public static final java.lang.String FEATURE_TunneledPlayback = "tunneled-playback";
field public int[] colorFormats;
@@ -21878,6 +21966,14 @@
method public abstract int readAt(long, byte[], int, int) throws java.io.IOException;
}
+ public final class MediaDescrambler {
+ ctor public MediaDescrambler(int) throws android.media.UnsupportedCasException;
+ method public final int descramble(java.nio.ByteBuffer, int, java.nio.ByteBuffer, int, android.media.MediaCodec.CryptoInfo);
+ method public final void release();
+ method public final boolean requiresSecureDecoderComponent(java.lang.String);
+ method public final void setMediaCasSession(byte[]);
+ }
+
public class MediaDescription implements android.os.Parcelable {
method public int describeContents();
method public java.lang.CharSequence getDescription();
@@ -22034,8 +22130,10 @@
method public final void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public final void setDataSource(java.io.FileDescriptor) throws java.io.IOException;
method public final void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException;
+ method public final void setMediaCas(android.media.MediaCas);
method public void unselectTrack(int);
field public static final int SAMPLE_FLAG_ENCRYPTED = 2; // 0x2
+ field public static final int SAMPLE_FLAG_PARTIAL_FRAME = 4; // 0x4
field public static final int SAMPLE_FLAG_SYNC = 1; // 0x1
field public static final int SEEK_TO_CLOSEST_SYNC = 2; // 0x2
field public static final int SEEK_TO_NEXT_SYNC = 1; // 0x1
@@ -22101,6 +22199,7 @@
field public static final java.lang.String KEY_IS_FORCED_SUBTITLE = "is-forced-subtitle";
field public static final java.lang.String KEY_I_FRAME_INTERVAL = "i-frame-interval";
field public static final java.lang.String KEY_LANGUAGE = "language";
+ field public static final java.lang.String KEY_LATENCY = "latency";
field public static final java.lang.String KEY_LEVEL = "level";
field public static final java.lang.String KEY_MAX_HEIGHT = "max-height";
field public static final java.lang.String KEY_MAX_INPUT_SIZE = "max-input-size";
@@ -22132,6 +22231,7 @@
field public static final java.lang.String MIMETYPE_AUDIO_OPUS = "audio/opus";
field public static final java.lang.String MIMETYPE_AUDIO_QCELP = "audio/qcelp";
field public static final java.lang.String MIMETYPE_AUDIO_RAW = "audio/raw";
+ field public static final java.lang.String MIMETYPE_AUDIO_SCRAMBLED = "audio/scrambled";
field public static final java.lang.String MIMETYPE_AUDIO_VORBIS = "audio/vorbis";
field public static final java.lang.String MIMETYPE_TEXT_CEA_608 = "text/cea-608";
field public static final java.lang.String MIMETYPE_TEXT_VTT = "text/vtt";
@@ -22142,6 +22242,7 @@
field public static final java.lang.String MIMETYPE_VIDEO_MPEG2 = "video/mpeg2";
field public static final java.lang.String MIMETYPE_VIDEO_MPEG4 = "video/mp4v-es";
field public static final java.lang.String MIMETYPE_VIDEO_RAW = "video/raw";
+ field public static final java.lang.String MIMETYPE_VIDEO_SCRAMBLED = "video/scrambled";
field public static final java.lang.String MIMETYPE_VIDEO_VP8 = "video/x-vnd.on2.vp8";
field public static final java.lang.String MIMETYPE_VIDEO_VP9 = "video/x-vnd.on2.vp9";
}
@@ -22282,7 +22383,7 @@
field public static final int MUXER_OUTPUT_WEBM = 1; // 0x1
}
- public class MediaPlayer {
+ public class MediaPlayer implements android.media.VolumeAutomation {
ctor public MediaPlayer();
method public void addTimedTextSource(java.lang.String, java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void addTimedTextSource(android.content.Context, android.net.Uri, java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
@@ -22294,6 +22395,7 @@
method public static android.media.MediaPlayer create(android.content.Context, android.net.Uri, android.view.SurfaceHolder, android.media.AudioAttributes, int);
method public static android.media.MediaPlayer create(android.content.Context, int);
method public static android.media.MediaPlayer create(android.content.Context, int, android.media.AudioAttributes, int);
+ method public android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
method public void deselectTrack(int) throws java.lang.IllegalStateException;
method public int getAudioSessionId();
method public android.media.BufferingParams getBufferingParams();
@@ -22316,7 +22418,7 @@
method public void pause() throws java.lang.IllegalStateException;
method public void prepare() throws java.io.IOException, java.lang.IllegalStateException;
method public void prepareAsync() throws java.lang.IllegalStateException;
- method public void prepareDrm(java.util.UUID, android.media.MediaPlayer.OnDrmConfigCallback) throws android.media.MediaPlayer.ProvisioningErrorException, android.media.ResourceBusyException, android.media.UnsupportedSchemeException;
+ method public void prepareDrm(java.util.UUID) throws android.media.MediaPlayer.ProvisioningErrorException, android.media.ResourceBusyException, android.media.UnsupportedSchemeException;
method public byte[] provideKeyResponse(byte[], byte[]) throws android.media.DeniedByServerException, android.media.MediaPlayer.NoDrmSchemeException;
method public void release();
method public void releaseDrm() throws android.media.MediaPlayer.NoDrmSchemeException;
@@ -22331,6 +22433,7 @@
method public void setAuxEffectSendLevel(float);
method public void setBufferingParams(android.media.BufferingParams);
method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
+ method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>, java.util.List<java.net.HttpCookie>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
method public void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
@@ -22343,6 +22446,7 @@
method public void setNextMediaPlayer(android.media.MediaPlayer);
method public void setOnBufferingUpdateListener(android.media.MediaPlayer.OnBufferingUpdateListener);
method public void setOnCompletionListener(android.media.MediaPlayer.OnCompletionListener);
+ method public void setOnDrmConfigListener(android.media.MediaPlayer.OnDrmConfigListener);
method public void setOnDrmInfoListener(android.media.MediaPlayer.OnDrmInfoListener);
method public void setOnDrmInfoListener(android.media.MediaPlayer.OnDrmInfoListener, android.os.Handler);
method public void setOnDrmPreparedListener(android.media.MediaPlayer.OnDrmPreparedListener);
@@ -22407,9 +22511,8 @@
method public abstract void onCompletion(android.media.MediaPlayer);
}
- public static abstract class MediaPlayer.OnDrmConfigCallback {
- ctor public MediaPlayer.OnDrmConfigCallback();
- method public void onDrmConfig(android.media.MediaPlayer);
+ public static abstract interface MediaPlayer.OnDrmConfigListener {
+ method public abstract void onDrmConfig(android.media.MediaPlayer);
}
public static abstract interface MediaPlayer.OnDrmInfoListener {
@@ -22470,6 +22573,7 @@
ctor public MediaRecorder();
method public static final int getAudioSourceMax();
method public int getMaxAmplitude() throws java.lang.IllegalStateException;
+ method public android.os.Bundle getMetrics();
method public android.view.Surface getSurface();
method public void pause() throws java.lang.IllegalStateException;
method public void prepare() throws java.io.IOException, java.lang.IllegalStateException;
@@ -23111,10 +23215,18 @@
field public static final int TONE_SUP_RINGTONE = 23; // 0x17
}
+ public final class UnsupportedCasException extends android.media.MediaCasException {
+ ctor public UnsupportedCasException(java.lang.String);
+ }
+
public final class UnsupportedSchemeException extends android.media.MediaDrmException {
ctor public UnsupportedSchemeException(java.lang.String);
}
+ public abstract interface VolumeAutomation {
+ method public abstract android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
+ }
+
public abstract class VolumeProvider {
ctor public VolumeProvider(int, int, int);
method public final int getCurrentVolume();
@@ -23128,6 +23240,53 @@
field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
}
+ public final class VolumeShaper implements java.lang.AutoCloseable {
+ method public void apply(android.media.VolumeShaper.Operation);
+ method public void close();
+ method public float getVolume();
+ method public void replace(android.media.VolumeShaper.Configuration, android.media.VolumeShaper.Operation, boolean);
+ }
+
+ public static final class VolumeShaper.Configuration implements android.os.Parcelable {
+ method public int describeContents();
+ method public double getDurationMs();
+ method public int getInterpolatorType();
+ method public static int getMaximumCurvePoints();
+ method public float[] getTimes();
+ method public float[] getVolumes();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.media.VolumeShaper.Configuration> CREATOR;
+ field public static final android.media.VolumeShaper.Configuration CUBIC_RAMP;
+ field public static final int INTERPOLATOR_TYPE_CUBIC = 2; // 0x2
+ field public static final int INTERPOLATOR_TYPE_CUBIC_MONOTONIC = 3; // 0x3
+ field public static final int INTERPOLATOR_TYPE_LINEAR = 1; // 0x1
+ field public static final int INTERPOLATOR_TYPE_STEP = 0; // 0x0
+ field public static final android.media.VolumeShaper.Configuration LINEAR_RAMP;
+ field public static final android.media.VolumeShaper.Configuration SCURVE_RAMP;
+ field public static final android.media.VolumeShaper.Configuration SINE_RAMP;
+ }
+
+ public static final class VolumeShaper.Configuration.Builder {
+ ctor public VolumeShaper.Configuration.Builder();
+ ctor public VolumeShaper.Configuration.Builder(android.media.VolumeShaper.Configuration);
+ method public android.media.VolumeShaper.Configuration build();
+ method public android.media.VolumeShaper.Configuration.Builder invertVolumes();
+ method public android.media.VolumeShaper.Configuration.Builder reflectTimes();
+ method public android.media.VolumeShaper.Configuration.Builder scaleToEndVolume(float);
+ method public android.media.VolumeShaper.Configuration.Builder scaleToStartVolume(float);
+ method public android.media.VolumeShaper.Configuration.Builder setCurve(float[], float[]);
+ method public android.media.VolumeShaper.Configuration.Builder setDurationMs(double);
+ method public android.media.VolumeShaper.Configuration.Builder setInterpolatorType(int);
+ }
+
+ public static final class VolumeShaper.Operation 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.media.VolumeShaper.Operation> CREATOR;
+ field public static final android.media.VolumeShaper.Operation PLAY;
+ field public static final android.media.VolumeShaper.Operation REVERSE;
+ }
+
}
package android.media.audiofx {
@@ -23964,6 +24123,9 @@
method public static final android.net.Uri buildChannelUriForPassthroughInput(java.lang.String);
method public static final android.net.Uri buildChannelsUriForInput(java.lang.String);
method public static final java.lang.String buildInputId(android.content.ComponentName);
+ method public static final android.net.Uri buildPreviewProgramUri(long);
+ method public static final android.net.Uri buildPreviewProgramsUriForChannel(long);
+ method public static final android.net.Uri buildPreviewProgramsUriForChannel(android.net.Uri);
method public static final android.net.Uri buildProgramUri(long);
method public static final android.net.Uri buildProgramsUriForChannel(long);
method public static final android.net.Uri buildProgramsUriForChannel(android.net.Uri);
@@ -24022,6 +24184,7 @@
field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
field public static final java.lang.String COLUMN_NETWORK_AFFILIATION = "network_affiliation";
field public static final java.lang.String COLUMN_ORIGINAL_NETWORK_ID = "original_network_id";
field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
@@ -24084,7 +24247,7 @@
field public static final java.lang.String CONTENT_DIRECTORY = "logo";
}
- public static final class TvContract.Programs implements android.media.tv.TvContract.BaseProgramColumns {
+ public static final class TvContract.PreviewPrograms implements android.media.tv.TvContract.BaseProgramColumns {
field public static final java.lang.String ASPECT_RATIO_16_9 = "ASPECT_RATIO_16_9";
field public static final java.lang.String ASPECT_RATIO_1_1 = "ASPECT_RATIO_1_1";
field public static final java.lang.String ASPECT_RATIO_2_3 = "ASPECT_RATIO_2_3";
@@ -24095,10 +24258,8 @@
field public static final java.lang.String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri";
field public static final java.lang.String COLUMN_AUTHOR = "author";
field public static final java.lang.String COLUMN_AVAILABILITY = "availability";
- field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+ field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
field public static final java.lang.String COLUMN_DURATION_MILLIS = "duration_millis";
- field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
- field public static final deprecated java.lang.String COLUMN_EPISODE_NUMBER = "episode_number";
field public static final java.lang.String COLUMN_INTERACTION_COUNT = "interaction_count";
field public static final java.lang.String COLUMN_INTERACTION_TYPE = "interaction_type";
field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
@@ -24109,19 +24270,16 @@
field public static final java.lang.String COLUMN_OFFER_PRICE = "offer_price";
field public static final java.lang.String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
field public static final java.lang.String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
- field public static final java.lang.String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
field public static final java.lang.String COLUMN_RELEASE_DATE = "release_date";
field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
- field public static final deprecated java.lang.String COLUMN_SEASON_NUMBER = "season_number";
field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
- field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
field public static final java.lang.String COLUMN_TYPE = "type";
field public static final java.lang.String COLUMN_WATCH_NEXT_TYPE = "watch_next_type";
field public static final java.lang.String COLUMN_WEIGHT = "weight";
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/program";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/program";
+ field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/preview_program";
+ field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/preview_program";
field public static final android.net.Uri CONTENT_URI;
field public static final java.lang.String INTERACTION_TYPE_FANS = "INTERACTION_TYPE_FANS";
field public static final java.lang.String INTERACTION_TYPE_FOLLOWERS = "INTERACTION_TYPE_FOLLOWERS";
@@ -24150,6 +24308,18 @@
field public static final java.lang.String WATCH_NEXT_TYPE_NEXT = "WATCH_NEXT_TYPE_NEXT";
}
+ public static final class TvContract.Programs implements android.media.tv.TvContract.BaseProgramColumns {
+ field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+ field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+ field public static final deprecated java.lang.String COLUMN_EPISODE_NUMBER = "episode_number";
+ field public static final java.lang.String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
+ field public static final deprecated java.lang.String COLUMN_SEASON_NUMBER = "season_number";
+ field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+ field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/program";
+ field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/program";
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
public static final class TvContract.Programs.Genres {
method public static java.lang.String[] decode(java.lang.String);
method public static java.lang.String encode(java.lang.String...);
@@ -24238,11 +24408,13 @@
field public static final java.lang.String ACTION_BLOCKED_RATINGS_CHANGED = "android.media.tv.action.BLOCKED_RATINGS_CHANGED";
field public static final java.lang.String ACTION_MAKE_CHANNEL_BROWSABLE = "android.media.tv.action.MAKE_CHANNEL_BROWSABLE";
field public static final java.lang.String ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED = "android.media.tv.action.PARENTAL_CONTROLS_ENABLED_CHANGED";
+ field public static final java.lang.String ACTION_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.PROGRAM_BROWSABLE_DISABLED";
field public static final java.lang.String ACTION_QUERY_CONTENT_RATING_SYSTEMS = "android.media.tv.action.QUERY_CONTENT_RATING_SYSTEMS";
field public static final java.lang.String ACTION_SETUP_INPUTS = "android.media.tv.action.SETUP_INPUTS";
field public static final java.lang.String ACTION_VIEW_RECORDING_SCHEDULES = "android.media.tv.action.VIEW_RECORDING_SCHEDULES";
field public static final java.lang.String EXTRA_CHANNEL_ID = "android.media.tv.extra.CHANNEL_ID";
field public static final java.lang.String EXTRA_PACKAGE_NAME = "android.media.tv.extra.PACKAGE_NAME";
+ field public static final java.lang.String EXTRA_PROGRAM_ID = "android.media.tv.extra.PROGRAM_ID";
field public static final int INPUT_STATE_CONNECTED = 0; // 0x0
field public static final int INPUT_STATE_CONNECTED_STANDBY = 1; // 0x1
field public static final int INPUT_STATE_DISCONNECTED = 2; // 0x2
@@ -25994,8 +26166,6 @@
public class DiscoverySession {
method public java.lang.String createNetworkSpecifier(android.net.wifi.aware.PeerHandle, byte[]);
method public void destroy();
- method public static int getMaxSendRetryCount();
- method public void sendMessage(android.net.wifi.aware.PeerHandle, int, byte[], int);
method public void sendMessage(android.net.wifi.aware.PeerHandle, int, byte[]);
}
@@ -31230,10 +31400,8 @@
method public void allocateBytes(java.io.File, long, int) throws java.io.IOException;
method public void allocateBytes(java.io.FileDescriptor, long, int) throws java.io.IOException;
method public long getAllocatableBytes(java.io.File, int) throws java.io.IOException;
- method public long getCacheQuotaBytes();
- method public long getCacheSizeBytes();
- method public long getExternalCacheQuotaBytes();
- method public long getExternalCacheSizeBytes();
+ method public long getCacheQuotaBytes(java.io.File);
+ method public long getCacheSizeBytes(java.io.File);
method public java.lang.String getMountedObbPath(java.lang.String);
method public android.os.storage.StorageVolume getPrimaryStorageVolume();
method public android.os.storage.StorageVolume getStorageVolume(java.io.File);
@@ -33676,6 +33844,7 @@
field public static final int FLAG_SUPPORTS_IS_CHILD = 16; // 0x10
field public static final int FLAG_SUPPORTS_RECENTS = 4; // 0x4
field public static final int FLAG_SUPPORTS_SEARCH = 8; // 0x8
+ field public static final java.lang.String MIME_TYPE_ITEM = "vnd.android.document/root";
}
public abstract class DocumentsProvider extends android.content.ContentProvider {
@@ -34241,7 +34410,7 @@
method public static final deprecated void setLocationProviderEnabled(android.content.ContentResolver, java.lang.String, boolean);
field public static final java.lang.String ACCESSIBILITY_DISPLAY_INVERSION_ENABLED = "accessibility_display_inversion_enabled";
field public static final java.lang.String ACCESSIBILITY_ENABLED = "accessibility_enabled";
- field public static final java.lang.String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password";
+ field public static final deprecated java.lang.String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password";
field public static final deprecated java.lang.String ADB_ENABLED = "adb_enabled";
field public static final java.lang.String ALLOWED_GEOLOCATION_ORIGINS = "allowed_geolocation_origins";
field public static final deprecated java.lang.String ALLOW_MOCK_LOCATION = "mock_location";
@@ -36221,7 +36390,7 @@
}
public static final class Dataset.Builder {
- ctor public Dataset.Builder(java.lang.CharSequence);
+ ctor public Dataset.Builder(android.widget.RemoteViews);
method public android.service.autofill.Dataset build();
method public android.service.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
@@ -36241,10 +36410,10 @@
public static final class FillResponse.Builder {
ctor public FillResponse.Builder();
method public android.service.autofill.FillResponse.Builder addDataset(android.service.autofill.Dataset);
- method public android.service.autofill.FillResponse.Builder addSavableFields(android.view.autofill.AutoFillId...);
method public android.service.autofill.FillResponse build();
- method public android.service.autofill.FillResponse.Builder setAuthentication(android.content.IntentSender);
+ method public android.service.autofill.FillResponse.Builder setAuthentication(android.content.IntentSender, android.widget.RemoteViews);
method public android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle);
+ method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo);
}
public final class SaveCallback {
@@ -36252,6 +36421,23 @@
method public void onSuccess();
}
+ public final class SaveInfo 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.service.autofill.SaveInfo> CREATOR;
+ field public static final int SAVE_DATA_TYPE_ADDRESS = 2; // 0x2
+ field public static final int SAVE_DATA_TYPE_CREDIT_CARD = 3; // 0x3
+ field public static final int SAVE_DATA_TYPE_GENERIC = 0; // 0x0
+ field public static final int SAVE_DATA_TYPE_PASSWORD = 1; // 0x1
+ }
+
+ public static final class SaveInfo.Builder {
+ ctor public SaveInfo.Builder(int);
+ method public android.service.autofill.SaveInfo.Builder addSavableIds(android.view.autofill.AutoFillId...);
+ method public android.service.autofill.SaveInfo build();
+ method public android.service.autofill.SaveInfo.Builder setDescription(java.lang.CharSequence);
+ }
+
}
package android.service.carrier {
@@ -36456,22 +36642,6 @@
package android.service.notification {
- public final class Adjustment implements android.os.Parcelable {
- ctor public Adjustment(java.lang.String, java.lang.String, android.os.Bundle, java.lang.CharSequence, int);
- ctor protected Adjustment(android.os.Parcel);
- method public int describeContents();
- method public java.lang.CharSequence getExplanation();
- method public java.lang.String getKey();
- method public java.lang.String getPackage();
- method public android.os.Bundle getSignals();
- method public int getUser();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.service.notification.Adjustment> CREATOR;
- field public static final java.lang.String KEY_CHANNEL_ID = "key_channel_id";
- field public static final java.lang.String KEY_PEOPLE = "key_people";
- field public static final java.lang.String KEY_SNOOZE_CRITERIA = "key_snooze_criteria";
- }
-
public final class Condition implements android.os.Parcelable {
ctor public Condition(android.net.Uri, java.lang.String, int);
ctor public Condition(android.net.Uri, java.lang.String, java.lang.String, java.lang.String, int, int, int);
@@ -36518,21 +36688,6 @@
field public static final java.lang.String SERVICE_INTERFACE = "android.service.notification.ConditionProviderService";
}
- public abstract class NotificationAssistantService extends android.service.notification.NotificationListenerService {
- ctor public NotificationAssistantService();
- method public final void adjustNotification(android.service.notification.Adjustment);
- method public final void adjustNotifications(java.util.List<android.service.notification.Adjustment>);
- method public void createNotificationChannel(java.lang.String, android.app.NotificationChannel);
- method public void deleteNotificationChannel(java.lang.String, java.lang.String);
- method public java.util.List<android.app.NotificationChannel> getNotificationChannels(java.lang.String);
- method public final android.os.IBinder onBind(android.content.Intent);
- method public abstract android.service.notification.Adjustment onNotificationEnqueued(android.service.notification.StatusBarNotification);
- method public abstract void onNotificationSnoozedUntilContext(android.service.notification.StatusBarNotification, java.lang.String);
- method public final void unsnoozeNotification(java.lang.String);
- method public void updateNotificationChannel(java.lang.String, android.app.NotificationChannel);
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.notification.NotificationAssistantService";
- }
-
public abstract class NotificationListenerService extends android.app.Service {
ctor public NotificationListenerService();
method public final void cancelAllNotifications();
@@ -36561,7 +36716,6 @@
method public static void requestRebind(android.content.ComponentName);
method public final void requestUnbind();
method public final void setNotificationsShown(java.lang.String[]);
- method public final void snoozeNotification(java.lang.String, java.lang.String);
method public final void snoozeNotification(java.lang.String, long);
field public static final int HINT_HOST_DISABLE_CALL_EFFECTS = 4; // 0x4
field public static final int HINT_HOST_DISABLE_EFFECTS = 1; // 0x1
@@ -36598,14 +36752,12 @@
public static class NotificationListenerService.Ranking {
ctor public NotificationListenerService.Ranking();
method public boolean canShowBadge();
- method public java.util.List<java.lang.String> getAdditionalPeople();
method public android.app.NotificationChannel getChannel();
method public int getImportance();
method public java.lang.CharSequence getImportanceExplanation();
method public java.lang.String getKey();
method public java.lang.String getOverrideGroupKey();
method public int getRank();
- method public java.util.List<android.service.notification.SnoozeCriterion> getSnoozeCriteria();
method public int getSuppressedVisualEffects();
method public boolean isAmbient();
method public boolean matchesInterruptionFilter();
@@ -36619,17 +36771,6 @@
field public static final android.os.Parcelable.Creator<android.service.notification.NotificationListenerService.RankingMap> CREATOR;
}
- public final class SnoozeCriterion implements android.os.Parcelable {
- ctor public SnoozeCriterion(java.lang.String, java.lang.CharSequence, java.lang.CharSequence);
- ctor protected SnoozeCriterion(android.os.Parcel);
- method public int describeContents();
- method public java.lang.CharSequence getConfirmation();
- method public java.lang.CharSequence getExplanation();
- method public java.lang.String getId();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.service.notification.SnoozeCriterion> CREATOR;
- }
-
public class StatusBarNotification implements android.os.Parcelable {
ctor public deprecated StatusBarNotification(java.lang.String, java.lang.String, int, java.lang.String, int, int, int, android.app.Notification, android.os.UserHandle, long);
ctor public StatusBarNotification(android.os.Parcel);
@@ -37899,9 +38040,11 @@
method public android.telecom.Call.Details getDetails();
method public android.telecom.Call getParent();
method public java.lang.String getRemainingPostDialSequence();
+ method public android.telecom.Call.RttCall getRttCall();
method public int getState();
method public android.telecom.InCallService.VideoCall getVideoCall();
method public void hold();
+ method public boolean isRttActive();
method public void mergeConference();
method public void phoneAccountSelected(android.telecom.PhoneAccountHandle, boolean);
method public void playDtmfTone(char);
@@ -37913,9 +38056,12 @@
method public void reject(boolean, java.lang.String);
method public final void removeExtras(java.util.List<java.lang.String>);
method public final void removeExtras(java.lang.String...);
+ method public void respondToRttRequest(int, boolean);
method public void sendCallEvent(java.lang.String, android.os.Bundle);
+ method public void sendRttRequest();
method public void splitFromConference();
method public void stopDtmfTone();
+ method public void stopRtt();
method public void swapConference();
method public void unhold();
method public void unregisterCallback(android.telecom.Call.Callback);
@@ -37943,6 +38089,9 @@
method public void onDetailsChanged(android.telecom.Call, android.telecom.Call.Details);
method public void onParentChanged(android.telecom.Call, android.telecom.Call);
method public void onPostDialWait(android.telecom.Call, java.lang.String);
+ method public void onRttModeChanged(android.telecom.Call, int);
+ method public void onRttRequest(android.telecom.Call, int);
+ method public void onRttStatusChanged(android.telecom.Call, boolean, android.telecom.Call.RttCall);
method public void onStateChanged(android.telecom.Call, int);
method public void onVideoCallChanged(android.telecom.Call, android.telecom.InCallService.VideoCall);
}
@@ -37996,6 +38145,19 @@
field public static final int PROPERTY_WIFI = 8; // 0x8
}
+ public static final class Call.RttCall {
+ method public int getRttAudioMode();
+ method public java.lang.String read();
+ method public void setRttMode(int);
+ method public void write(java.lang.String) throws java.io.IOException;
+ field public static final int RTT_MODE_FULL = 1; // 0x1
+ field public static final int RTT_MODE_HCO = 2; // 0x2
+ field public static final int RTT_MODE_VCO = 3; // 0x3
+ }
+
+ public static abstract class Call.RttCall.RttAudioMode implements java.lang.annotation.Annotation {
+ }
+
public final class CallAudioState implements android.os.Parcelable {
ctor public CallAudioState(boolean, int, int);
method public static java.lang.String audioRouteToString(int);
@@ -38367,6 +38529,7 @@
field public static final int CAPABILITY_CALL_SUBJECT = 64; // 0x40
field public static final int CAPABILITY_CONNECTION_MANAGER = 1; // 0x1
field public static final int CAPABILITY_PLACE_EMERGENCY_CALLS = 16; // 0x10
+ field public static final int CAPABILITY_RTT = 4096; // 0x1000
field public static final int CAPABILITY_SELF_MANAGED = 2048; // 0x800
field public static final int CAPABILITY_SIM_SUBSCRIPTION = 4; // 0x4
field public static final int CAPABILITY_SUPPORTS_VIDEO_CALLING = 1024; // 0x400
@@ -38579,6 +38742,7 @@
field public static final java.lang.String EXTRA_NOTIFICATION_PHONE_NUMBER = "android.telecom.extra.NOTIFICATION_PHONE_NUMBER";
field public static final java.lang.String EXTRA_OUTGOING_CALL_EXTRAS = "android.telecom.extra.OUTGOING_CALL_EXTRAS";
field public static final java.lang.String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telecom.extra.PHONE_ACCOUNT_HANDLE";
+ field public static final java.lang.String EXTRA_START_CALL_WITH_RTT = "android.telecom.extra.START_CALL_WITH_RTT";
field public static final java.lang.String EXTRA_START_CALL_WITH_SPEAKERPHONE = "android.telecom.extra.START_CALL_WITH_SPEAKERPHONE";
field public static final java.lang.String EXTRA_START_CALL_WITH_VIDEO_STATE = "android.telecom.extra.START_CALL_WITH_VIDEO_STATE";
field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS";
@@ -39322,6 +39486,8 @@
method public boolean setOperatorBrandOverride(java.lang.String);
method public boolean setPreferredNetworkTypeToGlobal();
method public boolean setVoiceMailNumber(java.lang.String, java.lang.String);
+ method public void setVoicemailRingtoneUri(android.telecom.PhoneAccountHandle, android.net.Uri);
+ method public void setVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle, boolean);
field public static final java.lang.String ACTION_CONFIGURE_VOICEMAIL = "android.telephony.action.CONFIGURE_VOICEMAIL";
field public static final java.lang.String ACTION_PHONE_STATE_CHANGED = "android.intent.action.PHONE_STATE";
field public static final java.lang.String ACTION_RESPOND_VIA_MESSAGE = "android.intent.action.RESPOND_VIA_MESSAGE";
@@ -40148,7 +40314,7 @@
package android.test.suitebuilder {
- public class TestMethod {
+ public deprecated class TestMethod {
ctor public TestMethod(java.lang.reflect.Method, java.lang.Class<? extends junit.framework.TestCase>);
ctor public TestMethod(java.lang.String, java.lang.Class<? extends junit.framework.TestCase>);
ctor public TestMethod(junit.framework.TestCase);
@@ -40159,7 +40325,7 @@
method public java.lang.String getName();
}
- public class TestSuiteBuilder {
+ public deprecated class TestSuiteBuilder {
ctor public TestSuiteBuilder(java.lang.Class);
ctor public TestSuiteBuilder(java.lang.String, java.lang.ClassLoader);
method public android.test.suitebuilder.TestSuiteBuilder addRequirements(java.util.List<com.android.internal.util.Predicate<android.test.suitebuilder.TestMethod>>);
@@ -40172,7 +40338,7 @@
method public android.test.suitebuilder.TestSuiteBuilder named(java.lang.String);
}
- public static class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
+ public static deprecated class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
ctor public TestSuiteBuilder.FailedToCreateTests(java.lang.Exception);
method public void testSuiteConstructionFailed();
}
@@ -42387,30 +42553,51 @@
method public abstract void setValue(T, float);
}
- public final class Half {
+ public final class Half extends java.lang.Number implements java.lang.Comparable {
+ ctor public Half(short);
+ ctor public Half(float);
+ ctor public Half(double);
+ ctor public Half(java.lang.String) throws java.lang.NumberFormatException;
method public static short abs(short);
method public static short ceil(short);
+ method public static int compare(short, short);
+ method public int compareTo(android.util.Half);
method public static short copySign(short, short);
+ method public double doubleValue();
method public static boolean equals(short, short);
+ method public float floatValue();
method public static short floor(short);
method public static int getExponent(short);
method public static int getSign(short);
method public static int getSignificand(short);
method public static boolean greater(short, short);
method public static boolean greaterEquals(short, short);
+ method public static int halfToIntBits(short);
+ method public static int halfToRawIntBits(short);
+ method public static short halfToShortBits(short);
+ method public short halfValue();
+ method public static int hashCode(short);
+ method public static short intBitsToHalf(int);
+ method public int intValue();
method public static boolean isInfinite(short);
+ method public boolean isNaN();
method public static boolean isNaN(short);
method public static boolean isNormalized(short);
method public static boolean less(short, short);
method public static boolean lessEquals(short, short);
+ method public long longValue();
method public static short max(short, short);
method public static short min(short, short);
+ method public static short parseHalf(java.lang.String) throws java.lang.NumberFormatException;
method public static short round(short);
method public static float toFloat(short);
+ method public static short toHalf(float);
method public static java.lang.String toHexString(short);
method public static java.lang.String toString(short);
method public static short trunc(short);
- method public static short valueOf(float);
+ method public static android.util.Half valueOf(short);
+ method public static android.util.Half valueOf(float);
+ method public static android.util.Half valueOf(java.lang.String);
field public static final short EPSILON = 5120; // 0x1400
field public static final short LOWEST_VALUE = -1025; // 0xfffffbff
field public static final int MAX_EXPONENT = 15; // 0xf
@@ -43135,11 +43322,13 @@
field public static final int DRAW_DURATION = 4; // 0x4
field public static final int FIRST_DRAW_FRAME = 9; // 0x9
field public static final int INPUT_HANDLING_DURATION = 1; // 0x1
+ field public static final int INTENDED_VSYNC_TIMESTAMP = 10; // 0xa
field public static final int LAYOUT_MEASURE_DURATION = 3; // 0x3
field public static final int SWAP_BUFFERS_DURATION = 7; // 0x7
field public static final int SYNC_DURATION = 5; // 0x5
field public static final int TOTAL_DURATION = 8; // 0x8
field public static final int UNKNOWN_DELAY_DURATION = 0; // 0x0
+ field public static final int VSYNC_TIMESTAMP = 11; // 0xb
}
public abstract class FrameStats {
@@ -43307,6 +43496,7 @@
field public static final int SOURCE_KEYBOARD = 257; // 0x101
field public static final int SOURCE_MOUSE = 8194; // 0x2002
field public static final int SOURCE_MOUSE_RELATIVE = 131076; // 0x20004
+ field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
field public static final int SOURCE_STYLUS = 16386; // 0x4002
field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
@@ -44103,6 +44293,7 @@
field public static final int AXIS_RX = 12; // 0xc
field public static final int AXIS_RY = 13; // 0xd
field public static final int AXIS_RZ = 14; // 0xe
+ field public static final int AXIS_SCROLL = 26; // 0x1a
field public static final int AXIS_SIZE = 3; // 0x3
field public static final int AXIS_THROTTLE = 19; // 0x13
field public static final int AXIS_TILT = 25; // 0x19
@@ -44510,8 +44701,8 @@
method public void drawableHotspotChanged(float, float);
method protected void drawableStateChanged();
method public android.view.View findFocus();
- method public final android.view.View findViewById(int);
- method public final android.view.View findViewWithTag(java.lang.Object);
+ method public final <T extends android.view.View> T findViewById(int);
+ method public final <T extends android.view.View> T findViewWithTag(java.lang.Object);
method public void findViewsWithText(java.util.ArrayList<android.view.View>, java.lang.CharSequence, int);
method protected deprecated boolean fitSystemWindows(android.graphics.Rect);
method public android.view.View focusSearch(int);
@@ -44526,6 +44717,7 @@
method public float getAlpha();
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
+ method public int getAutoFillMode();
method public android.view.autofill.AutoFillType getAutoFillType();
method public android.view.autofill.AutoFillValue getAutoFillValue();
method public android.graphics.drawable.Drawable getBackground();
@@ -44640,7 +44832,7 @@
method public java.lang.Object getTag(int);
method public int getTextAlignment();
method public int getTextDirection();
- method public final java.lang.CharSequence getTooltipText();
+ method public java.lang.CharSequence getTooltipText();
method public final int getTop();
method protected float getTopFadingEdgeStrength();
method protected int getTopPaddingOffset();
@@ -44765,6 +44957,7 @@
method public boolean onKeyUp(int, android.view.KeyEvent);
method protected void onLayout(boolean, int, int, int, int);
method protected void onMeasure(int, int);
+ method public void onMovedToDisplay(int);
method protected void onOverScrolled(int, int, boolean, boolean);
method public void onPointerCaptureChange(boolean);
method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
@@ -44841,6 +45034,7 @@
method public void setActivated(boolean);
method public void setAlpha(float);
method public void setAnimation(android.view.animation.Animation);
+ method public void setAutoFillMode(int);
method public void setBackground(android.graphics.drawable.Drawable);
method public void setBackgroundColor(int);
method public deprecated void setBackgroundDrawable(android.graphics.drawable.Drawable);
@@ -44946,7 +45140,7 @@
method public void setTag(int, java.lang.Object);
method public void setTextAlignment(int);
method public void setTextDirection(int);
- method public final void setTooltipText(java.lang.CharSequence);
+ method public void setTooltipText(java.lang.CharSequence);
method public final void setTop(int);
method public void setTouchDelegate(android.view.TouchDelegate);
method public final void setTransitionName(java.lang.String);
@@ -44981,6 +45175,9 @@
field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
+ field public static final int AUTO_FILL_MODE_AUTO = 1; // 0x1
+ field public static final int AUTO_FILL_MODE_INHERIT = 0; // 0x0
+ field public static final int AUTO_FILL_MODE_MANUAL = 2; // 0x2
field public static final int DRAG_FLAG_GLOBAL = 256; // 0x100
field public static final int DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION = 64; // 0x40
field public static final int DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION = 128; // 0x80
@@ -45630,6 +45827,7 @@
method public abstract void setAccessibilityFocused(boolean);
method public abstract void setActivated(boolean);
method public abstract void setAlpha(float);
+ method public abstract void setAutoFillOptions(java.lang.String[]);
method public abstract void setAutoFillType(android.view.autofill.AutoFillType);
method public abstract void setAutoFillValue(android.view.autofill.AutoFillValue);
method public abstract void setCheckable(boolean);
@@ -45647,14 +45845,15 @@
method public abstract void setHint(java.lang.CharSequence);
method public abstract void setId(int, java.lang.String, java.lang.String, java.lang.String);
method public abstract void setLongClickable(boolean);
+ method public abstract void setSanitized(boolean);
method public abstract void setSelected(boolean);
method public abstract void setText(java.lang.CharSequence);
method public abstract void setText(java.lang.CharSequence, int, int);
method public abstract void setTextLines(int[], int[]);
method public abstract void setTextStyle(float, int, int, int);
method public abstract void setTransformation(android.graphics.Matrix);
+ method public abstract void setUrl(java.lang.String);
method public abstract void setVisibility(int);
- field public static final int AUTO_FILL_FLAG_SANITIZED = 1; // 0x1
}
public final class ViewStub extends android.view.View {
@@ -47329,7 +47528,7 @@
public final class TextClassificationManager {
method public java.util.List<android.view.textclassifier.TextLanguage> detectLanguages(java.lang.CharSequence);
- method public synchronized android.view.textclassifier.TextClassifier getDefaultTextClassifier();
+ method public android.view.textclassifier.TextClassifier getDefaultTextClassifier();
}
public final class TextClassificationResult {
@@ -50526,11 +50725,9 @@
method public void removeTextChangedListener(android.text.TextWatcher);
method public void setAllCaps(boolean);
method public final void setAutoLinkMask(int);
- method public void setAutoSizeMaxTextSize(int, float);
- method public void setAutoSizeMinTextSize(int, float);
- method public void setAutoSizeStepGranularity(int, float);
- method public void setAutoSizeTextPresetSizes(int[]);
- method public void setAutoSizeTextType(int);
+ method public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setAutoSizeTextTypeWithDefaults(int);
method public void setBreakStrategy(int);
method public void setCompoundDrawablePadding(int);
method public void setCompoundDrawableTintList(android.content.res.ColorStateList);
@@ -50813,6 +51010,8 @@
method public int resolveAdjustedSize(int, int);
method public void resume();
method public void seekTo(int);
+ method public void setAudioAttributes(android.media.AudioAttributes);
+ method public void setAudioFocusRequest(int);
method public void setMediaController(android.widget.MediaController);
method public void setOnCompletionListener(android.media.MediaPlayer.OnCompletionListener);
method public void setOnErrorListener(android.media.MediaPlayer.OnErrorListener);
@@ -50917,7 +51116,7 @@
package com.android.internal.util {
- public abstract interface Predicate<T> {
+ public abstract deprecated interface Predicate<T> {
method public abstract boolean apply(T);
}
@@ -51055,6 +51254,8 @@
field public static final int OP_INT_TO_FLOAT = 130; // 0x82
field public static final int OP_INT_TO_LONG = 129; // 0x81
field public static final int OP_INT_TO_SHORT = 143; // 0x8f
+ field public static final int OP_INVOKE_CUSTOM = 252; // 0xfc
+ field public static final int OP_INVOKE_CUSTOM_RANGE = 253; // 0xfd
field public static final int OP_INVOKE_DIRECT = 112; // 0x70
field public static final deprecated int OP_INVOKE_DIRECT_EMPTY = 240; // 0xf0
field public static final int OP_INVOKE_DIRECT_JUMBO = 9471; // 0x24ff
@@ -51245,7 +51446,7 @@
method public static dalvik.system.DexFile loadDex(java.lang.String, java.lang.String, int) throws java.io.IOException;
}
- public final class InMemoryDexClassLoader extends java.lang.ClassLoader {
+ public final class InMemoryDexClassLoader extends dalvik.system.BaseDexClassLoader {
ctor public InMemoryDexClassLoader(java.nio.ByteBuffer, java.lang.ClassLoader);
}
@@ -54456,7 +54657,6 @@
method public java.lang.Class<?> lookupClass();
method public int lookupModes();
method public java.lang.invoke.MethodHandleInfo revealDirect(java.lang.invoke.MethodHandle);
- method public void throwMakeAccessException(java.lang.String, java.lang.Object) throws java.lang.IllegalAccessException;
method public java.lang.invoke.MethodHandle unreflect(java.lang.reflect.Method) throws java.lang.IllegalAccessException;
method public java.lang.invoke.MethodHandle unreflectConstructor(java.lang.reflect.Constructor<?>) throws java.lang.IllegalAccessException;
method public java.lang.invoke.MethodHandle unreflectGetter(java.lang.reflect.Field) throws java.lang.IllegalAccessException;
diff --git a/api/removed.txt b/api/removed.txt
index ab22b6e..c5dbf8d 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -20,25 +20,14 @@
package android.content {
public abstract class Context {
- method public deprecated android.content.Context createCredentialEncryptedStorageContext();
- method public deprecated android.content.Context createDeviceEncryptedStorageContext();
method public abstract android.content.SharedPreferences getSharedPreferences(java.io.File, int);
method public abstract java.io.File getSharedPreferencesPath(java.lang.String);
- method public deprecated boolean isCredentialEncryptedStorage();
- method public deprecated boolean isDeviceEncryptedStorage();
- method public deprecated boolean migrateDatabaseFrom(android.content.Context, java.lang.String);
- method public deprecated boolean migrateSharedPreferencesFrom(android.content.Context, java.lang.String);
}
}
package android.content.pm {
- public class ApplicationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
- field public deprecated java.lang.String credentialEncryptedDataDir;
- field public deprecated java.lang.String deviceEncryptedDataDir;
- }
-
public class ComponentInfo extends android.content.pm.PackageItemInfo {
field public deprecated boolean encryptionAware;
}
@@ -47,12 +36,6 @@
field public static final int REQUESTED_PERMISSION_REQUIRED = 1; // 0x1
}
- public abstract class PackageManager {
- field public static final deprecated int MATCH_ENCRYPTION_AWARE = 524288; // 0x80000
- field public static final deprecated int MATCH_ENCRYPTION_AWARE_AND_UNAWARE = 786432; // 0xc0000
- field public static final deprecated int MATCH_ENCRYPTION_UNAWARE = 262144; // 0x40000
- }
-
}
package android.database {
@@ -169,10 +152,6 @@
method public android.graphics.drawable.Drawable getBadgedDrawableForUser(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int);
method public android.graphics.drawable.Drawable getBadgedIconForUser(android.graphics.drawable.Drawable, android.os.UserHandle);
method public java.lang.CharSequence getBadgedLabelForUser(java.lang.CharSequence, android.os.UserHandle);
- method public deprecated boolean isUserRunningAndLocked();
- method public deprecated boolean isUserRunningAndLocked(android.os.UserHandle);
- method public deprecated boolean isUserRunningAndUnlocked();
- method public deprecated boolean isUserRunningAndUnlocked(android.os.UserHandle);
}
}
@@ -180,21 +159,16 @@
package android.os.storage {
public class StorageManager {
+ method public deprecated long getCacheQuotaBytes();
+ method public deprecated long getCacheSizeBytes();
+ method public deprecated long getExternalCacheQuotaBytes();
+ method public deprecated long getExternalCacheSizeBytes();
method public android.os.storage.StorageVolume getPrimaryVolume();
method public android.os.storage.StorageVolume[] getVolumeList();
}
}
-package android.preference {
-
- public class PreferenceManager {
- method public deprecated void setStorageCredentialEncrypted();
- method public deprecated void setStorageDeviceEncrypted();
- }
-
-}
-
package android.provider {
public class Browser {
diff --git a/api/system-current.txt b/api/system-current.txt
index eed1718..e00507e 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -211,6 +211,7 @@
field public static final java.lang.String RESTRICTED_VR_ACCESS = "android.permission.RESTRICTED_VR_ACCESS";
field public static final java.lang.String RETRIEVE_WINDOW_CONTENT = "android.permission.RETRIEVE_WINDOW_CONTENT";
field public static final java.lang.String REVOKE_RUNTIME_PERMISSIONS = "android.permission.REVOKE_RUNTIME_PERMISSIONS";
+ field public static final java.lang.String RUN_IN_BACKGROUND = "android.permission.RUN_IN_BACKGROUND";
field public static final java.lang.String SCORE_NETWORKS = "android.permission.SCORE_NETWORKS";
field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";
field public static final java.lang.String SEND_SMS = "android.permission.SEND_SMS";
@@ -248,6 +249,7 @@
field public static final java.lang.String UPDATE_DEVICE_STATS = "android.permission.UPDATE_DEVICE_STATS";
field public static final java.lang.String UPDATE_LOCK = "android.permission.UPDATE_LOCK";
field public static final java.lang.String USER_ACTIVITY = "android.permission.USER_ACTIVITY";
+ field public static final java.lang.String USE_DATA_IN_BACKGROUND = "android.permission.USE_DATA_IN_BACKGROUND";
field public static final 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";
@@ -408,6 +410,7 @@
field public static final int authorities = 16842776; // 0x1010018
field public static final int autoAdvanceViewId = 16843535; // 0x101030f
field public static final int autoCompleteTextViewStyle = 16842859; // 0x101006b
+ field public static final int autoFillMode = 16844116; // 0x1010554
field public static final int autoLink = 16842928; // 0x10100b0
field public static final int autoMirrored = 16843754; // 0x10103ea
field public static final int autoRemoveFromRecents = 16843847; // 0x1010447
@@ -415,7 +418,7 @@
field public static final int autoSizeMinTextSize = 16844088; // 0x1010538
field public static final int autoSizePresetSizes = 16844087; // 0x1010537
field public static final int autoSizeStepGranularity = 16844086; // 0x1010536
- field public static final int autoSizeText = 16844085; // 0x1010535
+ field public static final int autoSizeTextType = 16844085; // 0x1010535
field public static final int autoStart = 16843445; // 0x10102b5
field public static final deprecated int autoText = 16843114; // 0x101016a
field public static final int autoUrlDetect = 16843404; // 0x101028c
@@ -520,6 +523,7 @@
field public static final int colorControlHighlight = 16843820; // 0x101042c
field public static final int colorControlNormal = 16843817; // 0x1010429
field public static final int colorEdgeEffect = 16843982; // 0x10104ce
+ field public static final int colorError = 16844100; // 0x1010544
field public static final int colorFocusedHighlight = 16843663; // 0x101038f
field public static final int colorForeground = 16842800; // 0x1010030
field public static final int colorForegroundInverse = 16843270; // 0x1010206
@@ -1430,7 +1434,6 @@
field public static final int textCheckMarkInverse = 16842823; // 0x1010047
field public static final int textColor = 16842904; // 0x1010098
field public static final int textColorAlertDialogListItem = 16843526; // 0x1010306
- field public static final int textColorError = 16844100; // 0x1010544
field public static final int textColorHighlight = 16842905; // 0x1010099
field public static final int textColorHighlightInverse = 16843599; // 0x101034f
field public static final int textColorHint = 16842906; // 0x101009a
@@ -3777,6 +3780,7 @@
method public void onLowMemory();
method public boolean onMenuItemSelected(int, android.view.MenuItem);
method public boolean onMenuOpened(int, android.view.Menu);
+ method public void onMovedToDisplay(int);
method public void onMultiWindowModeChanged(boolean);
method public boolean onNavigateUp();
method public boolean onNavigateUpFromChild(android.app.Activity);
@@ -4894,6 +4898,7 @@
method public abstract android.app.Fragment getPrimaryNavigationFragment();
method public void invalidateOptionsMenu();
method public abstract boolean isDestroyed();
+ method public abstract boolean isStateSaved();
method public abstract void popBackStack();
method public abstract void popBackStack(java.lang.String, int);
method public abstract void popBackStack(int, int);
@@ -6402,9 +6407,10 @@
method public void addUserRestriction(android.content.ComponentName, java.lang.String);
method public boolean bindDeviceAdminServiceAsUser(android.content.ComponentName, android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle);
method public void clearCrossProfileIntentFilters(android.content.ComponentName);
- method public void clearDeviceOwnerApp(java.lang.String);
+ method public deprecated void clearDeviceOwnerApp(java.lang.String);
method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String);
- method public void clearProfileOwner(android.content.ComponentName);
+ method public deprecated void clearProfileOwner(android.content.ComponentName);
+ method public boolean clearResetPasswordToken(android.content.ComponentName);
method public void clearUserRestriction(android.content.ComponentName, java.lang.String);
method public android.content.Intent createAdminSupportIntent(java.lang.String);
method public android.os.UserHandle createAndManageUser(android.content.ComponentName, java.lang.String, android.content.ComponentName, android.os.PersistableBundle, int);
@@ -6495,6 +6501,7 @@
method public boolean isPackageSuspended(android.content.ComponentName, java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
method public boolean isProfileOwnerApp(java.lang.String);
method public boolean isProvisioningAllowed(java.lang.String);
+ method public boolean isResetPasswordTokenActive(android.content.ComponentName);
method public boolean isSecurityLoggingEnabled(android.content.ComponentName);
method public boolean isUninstallBlocked(android.content.ComponentName, java.lang.String);
method public void lockNow();
@@ -6509,6 +6516,7 @@
method public boolean removeUser(android.content.ComponentName, android.os.UserHandle);
method public boolean requestBugreport(android.content.ComponentName);
method public boolean resetPassword(java.lang.String, int);
+ method public boolean resetPasswordWithToken(android.content.ComponentName, java.lang.String, byte[], int);
method public java.util.List<android.app.admin.NetworkEvent> retrieveNetworkLogs(android.content.ComponentName, long);
method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrievePreRebootSecurityLogs(android.content.ComponentName);
method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrieveSecurityLogs(android.content.ComponentName);
@@ -6559,6 +6567,7 @@
method public void setProfileName(android.content.ComponentName, java.lang.String);
method public void setRecommendedGlobalProxy(android.content.ComponentName, android.net.ProxyInfo);
method public void setRequiredStrongAuthTimeout(android.content.ComponentName, long);
+ method public boolean setResetPasswordToken(android.content.ComponentName, byte[]);
method public void setRestrictionsProvider(android.content.ComponentName, android.content.ComponentName);
method public void setScreenCaptureDisabled(android.content.ComponentName, boolean);
method public void setSecureSetting(android.content.ComponentName, java.lang.String, java.lang.String);
@@ -6574,6 +6583,8 @@
method public void uninstallAllUserCaCerts(android.content.ComponentName);
method public void uninstallCaCert(android.content.ComponentName, byte[]);
method public void wipeData(int);
+ field public static final java.lang.String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED";
+ field public static final java.lang.String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED";
field public static final java.lang.String ACTION_ADD_DEVICE_ADMIN = "android.app.action.ADD_DEVICE_ADMIN";
field public static final java.lang.String ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED = "android.app.action.APPLICATION_DELEGATION_SCOPES_CHANGED";
field public static final java.lang.String ACTION_DEVICE_OWNER_CHANGED = "android.app.action.DEVICE_OWNER_CHANGED";
@@ -6777,6 +6788,7 @@
public static class AssistStructure.ViewNode {
method public float getAlpha();
method public android.view.autofill.AutoFillId getAutoFillId();
+ method public java.lang.String[] getAutoFillOptions();
method public android.view.autofill.AutoFillType getAutoFillType();
method public android.view.autofill.AutoFillValue getAutoFillValue();
method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
@@ -6805,6 +6817,7 @@
method public int getTextStyle();
method public int getTop();
method public android.graphics.Matrix getTransformation();
+ method public java.lang.String getUrl();
method public int getVisibility();
method public int getWidth();
method public boolean isAccessibilityFocused();
@@ -6931,14 +6944,22 @@
field public static final java.lang.String EXTRA_LOG_EVENT_ID = "android.app.backup.extra.LOG_EVENT_ID";
field public static final java.lang.String EXTRA_LOG_EVENT_PACKAGE_NAME = "android.app.backup.extra.LOG_EVENT_PACKAGE_NAME";
field public static final java.lang.String EXTRA_LOG_EVENT_PACKAGE_VERSION = "android.app.backup.extra.LOG_EVENT_PACKAGE_VERSION";
+ field public static final java.lang.String EXTRA_LOG_OLD_VERSION = "android.app.backup.extra.LOG_OLD_VERSION";
field public static final int LOG_EVENT_CATEGORY_AGENT = 2; // 0x2
field public static final int LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY = 3; // 0x3
field public static final int LOG_EVENT_CATEGORY_TRANSPORT = 1; // 0x1
+ field public static final int LOG_EVENT_ID_APP_HAS_NO_AGENT = 28; // 0x1c
+ field public static final int LOG_EVENT_ID_CANT_FIND_AGENT = 30; // 0x1e
field public static final int LOG_EVENT_ID_FULL_BACKUP_TIMEOUT = 4; // 0x4
field public static final int LOG_EVENT_ID_FULL_RESTORE_TIMEOUT = 45; // 0x2d
field public static final int LOG_EVENT_ID_KEY_VALUE_BACKUP_TIMEOUT = 21; // 0x15
field public static final int LOG_EVENT_ID_KEY_VALUE_RESTORE_TIMEOUT = 31; // 0x1f
field public static final int LOG_EVENT_ID_NO_PACKAGES = 49; // 0x31
+ field public static final int LOG_EVENT_ID_NO_RESTORE_METADATA_AVAILABLE = 22; // 0x16
+ field public static final int LOG_EVENT_ID_PACKAGE_NOT_FOUND = 12; // 0xc
+ field public static final int LOG_EVENT_ID_PACKAGE_NOT_PRESENT = 26; // 0x1a
+ field public static final int LOG_EVENT_ID_PACKAGE_TRANSPORT_NOT_PRESENT = 15; // 0xf
+ field public static final int LOG_EVENT_ID_VERSION_OF_BACKUP_OLDER = 36; // 0x24
}
public abstract class BackupObserver {
@@ -7089,6 +7110,7 @@
method public android.app.job.JobInfo.TriggerContentUri[] getTriggerContentUris();
method public boolean isPeriodic();
method public boolean isPersisted();
+ method public boolean isRequireBatteryNotLow();
method public boolean isRequireCharging();
method public boolean isRequireDeviceIdle();
method public void writeToParcel(android.os.Parcel, int);
@@ -7115,6 +7137,7 @@
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 setRequiredNetworkType(int);
+ method public android.app.job.JobInfo.Builder setRequiresBatteryNotLow(boolean);
method public android.app.job.JobInfo.Builder setRequiresCharging(boolean);
method public android.app.job.JobInfo.Builder setRequiresDeviceIdle(boolean);
method public android.app.job.JobInfo.Builder setTransientExtras(android.os.Bundle);
@@ -7169,6 +7192,35 @@
package android.app.usage {
+ public final class CacheQuotaHint implements android.os.Parcelable {
+ ctor public CacheQuotaHint(android.app.usage.CacheQuotaHint.Builder);
+ method public int describeContents();
+ method public long getQuota();
+ method public int getUid();
+ method public android.app.usage.UsageStats getUsageStats();
+ method public java.lang.String getVolumeUuid();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.usage.CacheQuotaHint> CREATOR;
+ field public static final long QUOTA_NOT_SET = -1L; // 0xffffffffffffffffL
+ }
+
+ public static final class CacheQuotaHint.Builder {
+ ctor public CacheQuotaHint.Builder();
+ ctor public CacheQuotaHint.Builder(android.app.usage.CacheQuotaHint);
+ method public android.app.usage.CacheQuotaHint build();
+ method public android.app.usage.CacheQuotaHint.Builder setQuota(long);
+ method public android.app.usage.CacheQuotaHint.Builder setUid(int);
+ method public android.app.usage.CacheQuotaHint.Builder setUsageStats(android.app.usage.UsageStats);
+ method public android.app.usage.CacheQuotaHint.Builder setVolumeUuid(java.lang.String);
+ }
+
+ public abstract class CacheQuotaService extends android.app.Service {
+ ctor public CacheQuotaService();
+ method public android.os.IBinder onBind(android.content.Intent);
+ method public abstract java.util.List<android.app.usage.CacheQuotaHint> onComputeCacheQuotaHints(java.util.List<android.app.usage.CacheQuotaHint>);
+ field public static final java.lang.String SERVICE_INTERFACE = "android.app.usage.CacheQuotaService";
+ }
+
public final class ConfigurationStats implements android.os.Parcelable {
ctor public ConfigurationStats(android.app.usage.ConfigurationStats);
method public int describeContents();
@@ -7256,6 +7308,7 @@
method public long getFreeBytes(java.lang.String);
method public long getTotalBytes(java.lang.String);
method public android.app.usage.ExternalStorageStats queryExternalStatsForUser(java.lang.String, android.os.UserHandle);
+ method public android.app.usage.StorageStats queryStatsForPackage(java.lang.String, java.lang.String, android.os.UserHandle);
method public android.app.usage.StorageStats queryStatsForUid(java.lang.String, int);
method public android.app.usage.StorageStats queryStatsForUser(java.lang.String, android.os.UserHandle);
}
@@ -8981,6 +9034,7 @@
method public abstract android.content.pm.PackageManager getPackageManager();
method public abstract java.lang.String getPackageName();
method public abstract java.lang.String getPackageResourcePath();
+ method public abstract java.io.File getPreloadsFileCache();
method public abstract android.content.res.Resources getResources();
method public abstract android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
method public final java.lang.String getString(int);
@@ -9192,6 +9246,7 @@
method public android.content.pm.PackageManager getPackageManager();
method public java.lang.String getPackageName();
method public java.lang.String getPackageResourcePath();
+ method public java.io.File getPreloadsFileCache();
method public android.content.res.Resources getResources();
method public android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
method public java.lang.Object getSystemService(java.lang.String);
@@ -9462,6 +9517,7 @@
field public static final java.lang.String ACTION_CALL = "android.intent.action.CALL";
field public static final java.lang.String ACTION_CALL_BUTTON = "android.intent.action.CALL_BUTTON";
field public static final java.lang.String ACTION_CAMERA_BUTTON = "android.intent.action.CAMERA_BUTTON";
+ field public static final java.lang.String ACTION_CARRIER_SETUP = "android.intent.action.CARRIER_SETUP";
field public static final java.lang.String ACTION_CHOOSER = "android.intent.action.CHOOSER";
field public static final java.lang.String ACTION_CLEAR_PACKAGE = "android.intent.action.CLEAR_PACKAGE";
field public static final java.lang.String ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS";
@@ -9505,6 +9561,7 @@
field public static final java.lang.String ACTION_MANAGE_PACKAGE_STORAGE = "android.intent.action.MANAGE_PACKAGE_STORAGE";
field public static final java.lang.String ACTION_MANAGE_PERMISSIONS = "android.intent.action.MANAGE_PERMISSIONS";
field public static final java.lang.String ACTION_MANAGE_PERMISSION_APPS = "android.intent.action.MANAGE_PERMISSION_APPS";
+ field public static final java.lang.String ACTION_MASTER_CLEAR_NOTIFICATION = "android.intent.action.MASTER_CLEAR_NOTIFICATION";
field public static final java.lang.String ACTION_MEDIA_BAD_REMOVAL = "android.intent.action.MEDIA_BAD_REMOVAL";
field public static final java.lang.String ACTION_MEDIA_BUTTON = "android.intent.action.MEDIA_BUTTON";
field public static final java.lang.String ACTION_MEDIA_CHECKING = "android.intent.action.MEDIA_CHECKING";
@@ -9541,6 +9598,7 @@
field public static final java.lang.String ACTION_POWER_CONNECTED = "android.intent.action.ACTION_POWER_CONNECTED";
field public static final java.lang.String ACTION_POWER_DISCONNECTED = "android.intent.action.ACTION_POWER_DISCONNECTED";
field public static final java.lang.String ACTION_POWER_USAGE_SUMMARY = "android.intent.action.POWER_USAGE_SUMMARY";
+ field public static final java.lang.String ACTION_PRE_BOOT_COMPLETED = "android.intent.action.PRE_BOOT_COMPLETED";
field public static final java.lang.String ACTION_PROCESS_TEXT = "android.intent.action.PROCESS_TEXT";
field public static final java.lang.String ACTION_PROVIDER_CHANGED = "android.intent.action.PROVIDER_CHANGED";
field public static final java.lang.String ACTION_QUERY_PACKAGE_RESTART = "android.intent.action.QUERY_PACKAGE_RESTART";
@@ -9559,6 +9617,7 @@
field public static final java.lang.String ACTION_SET_WALLPAPER = "android.intent.action.SET_WALLPAPER";
field public static final java.lang.String ACTION_SHOW_APP_INFO = "android.intent.action.SHOW_APP_INFO";
field public static final java.lang.String ACTION_SHUTDOWN = "android.intent.action.ACTION_SHUTDOWN";
+ field public static final java.lang.String ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED";
field public static final java.lang.String ACTION_SYNC = "android.intent.action.SYNC";
field public static final java.lang.String ACTION_SYSTEM_TUTORIAL = "android.intent.action.SYSTEM_TUTORIAL";
field public static final java.lang.String ACTION_TIMEZONE_CHANGED = "android.intent.action.TIMEZONE_CHANGED";
@@ -9664,7 +9723,7 @@
field public static final java.lang.String EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER";
field public static final java.lang.String EXTRA_PROCESS_TEXT = "android.intent.extra.PROCESS_TEXT";
field public static final java.lang.String EXTRA_PROCESS_TEXT_READONLY = "android.intent.extra.PROCESS_TEXT_READONLY";
- field public static final java.lang.String EXTRA_QUICK_VIEW_PLAIN = "android.intent.extra.QUICK_VIEW_PLAIN";
+ field public static final java.lang.String EXTRA_QUICK_VIEW_ADVANCED = "android.intent.extra.QUICK_VIEW_ADVANCED";
field public static final java.lang.String EXTRA_QUIET_MODE = "android.intent.extra.QUIET_MODE";
field public static final java.lang.String EXTRA_REFERRER = "android.intent.extra.REFERRER";
field public static final java.lang.String EXTRA_REFERRER_NAME = "android.intent.extra.REFERRER_NAME";
@@ -10583,10 +10642,12 @@
ctor public LauncherApps.ShortcutQuery();
method public android.content.pm.LauncherApps.ShortcutQuery setActivity(android.content.ComponentName);
method public android.content.pm.LauncherApps.ShortcutQuery setChangedSince(long);
+ method public android.content.pm.LauncherApps.ShortcutQuery setIntent(android.content.Intent);
method public android.content.pm.LauncherApps.ShortcutQuery setPackage(java.lang.String);
method public android.content.pm.LauncherApps.ShortcutQuery setQueryFlags(int);
method public android.content.pm.LauncherApps.ShortcutQuery setShortcutIds(java.util.List<java.lang.String>);
field public static final int FLAG_GET_KEY_FIELDS_ONLY = 4; // 0x4
+ field public static final int FLAG_MATCH_CHOOSER = 16; // 0x10
field public static final int FLAG_MATCH_DYNAMIC = 1; // 0x1
field public static final int FLAG_MATCH_MANIFEST = 8; // 0x8
field public static final int FLAG_MATCH_PINNED = 2; // 0x2
@@ -11210,6 +11271,9 @@
method public int describeContents();
method public android.content.ComponentName getActivity();
method public java.util.Set<java.lang.String> getCategories();
+ method public android.content.ComponentName[] getChooserComponentNames();
+ method public android.os.PersistableBundle getChooserExtras();
+ method public android.content.IntentFilter[] getChooserIntentFilters();
method public java.lang.CharSequence getDisabledMessage();
method public android.os.PersistableBundle getExtras();
method public java.lang.String getId();
@@ -11222,6 +11286,7 @@
method public java.lang.CharSequence getShortLabel();
method public android.os.UserHandle getUserHandle();
method public boolean hasKeyFieldsOnly();
+ method public boolean isChooser();
method public boolean isDeclaredInManifest();
method public boolean isDynamic();
method public boolean isEnabled();
@@ -11234,9 +11299,11 @@
public static class ShortcutInfo.Builder {
ctor public ShortcutInfo.Builder(android.content.Context, java.lang.String);
+ method public android.content.pm.ShortcutInfo.Builder addChooserIntentFilter(android.content.IntentFilter, android.content.ComponentName);
method public android.content.pm.ShortcutInfo build();
method public android.content.pm.ShortcutInfo.Builder setActivity(android.content.ComponentName);
method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.Set<java.lang.String>);
+ method public android.content.pm.ShortcutInfo.Builder setChooserExtras(android.os.PersistableBundle);
method public android.content.pm.ShortcutInfo.Builder setDisabledMessage(java.lang.CharSequence);
method public android.content.pm.ShortcutInfo.Builder setExtras(android.os.PersistableBundle);
method public android.content.pm.ShortcutInfo.Builder setIcon(android.graphics.drawable.Icon);
@@ -13155,6 +13222,7 @@
method public static android.graphics.ColorSpace.Adaptation valueOf(java.lang.String);
method public static final android.graphics.ColorSpace.Adaptation[] values();
enum_constant public static final android.graphics.ColorSpace.Adaptation BRADFORD;
+ enum_constant public static final android.graphics.ColorSpace.Adaptation CIECAT02;
enum_constant public static final android.graphics.ColorSpace.Adaptation VON_KRIES;
}
@@ -13748,6 +13816,7 @@
field public static final deprecated int LA_88 = 10; // 0xa
field public static final deprecated int L_8 = 9; // 0x9
field public static final int OPAQUE = -1; // 0xffffffff
+ field public static final int RGBA_1010102 = 43; // 0x2b
field public static final deprecated int RGBA_4444 = 7; // 0x7
field public static final deprecated int RGBA_5551 = 6; // 0x6
field public static final int RGBA_8888 = 1; // 0x1
@@ -14073,6 +14142,21 @@
package android.graphics.drawable {
+ public class AdaptiveIconDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ method public void draw(android.graphics.Canvas);
+ method public android.graphics.drawable.Drawable getBackground();
+ method public static float getExtraInsetPercentage();
+ method public android.graphics.drawable.Drawable getForeground();
+ method public android.graphics.Path getIconMask();
+ method public int getOpacity();
+ method public void invalidateDrawable(android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setOpacity(int);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+ }
+
public abstract interface Animatable {
method public abstract boolean isRunning();
method public abstract void start();
@@ -14462,21 +14546,6 @@
method public void addLevel(int, int, android.graphics.drawable.Drawable);
}
- public class MaskableIconDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
- method public void draw(android.graphics.Canvas);
- method public android.graphics.drawable.Drawable getBackground();
- method public static float getExtraInsetPercentage();
- method public android.graphics.drawable.Drawable getForeground();
- method public android.graphics.Path getIconMask();
- method public int getOpacity();
- method public void invalidateDrawable(android.graphics.drawable.Drawable);
- method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
- method public void setAlpha(int);
- method public void setColorFilter(android.graphics.ColorFilter);
- method public void setOpacity(int);
- method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
- }
-
public class NinePatchDrawable extends android.graphics.drawable.Drawable {
ctor public deprecated NinePatchDrawable(android.graphics.Bitmap, byte[], android.graphics.Rect, java.lang.String);
ctor public NinePatchDrawable(android.content.res.Resources, android.graphics.Bitmap, byte[], android.graphics.Rect, java.lang.String);
@@ -14590,6 +14659,8 @@
public class ArcShape extends android.graphics.drawable.shapes.RectShape {
ctor public ArcShape(float, float);
+ method public final float getStartAngle();
+ method public final float getSweepAngle();
}
public class OvalShape extends android.graphics.drawable.shapes.RectShape {
@@ -14978,6 +15049,7 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final int BLOB = 33; // 0x21
field public static final android.os.Parcelable.Creator<android.hardware.HardwareBuffer> CREATOR;
+ field public static final int RGBA_1010102 = 43; // 0x2b
field public static final int RGBA_8888 = 1; // 0x1
field public static final int RGBA_FP16 = 22; // 0x16
field public static final int RGBX_8888 = 2; // 0x2
@@ -22246,6 +22318,26 @@
field public static final android.os.Parcelable.Creator<android.media.AudioFocusInfo> CREATOR;
}
+ public final class AudioFocusRequest {
+ method public boolean acceptsDelayedFocusGain();
+ method public android.media.AudioAttributes getAudioAttributes();
+ method public int getFocusGain();
+ method public android.media.AudioManager.OnAudioFocusChangeListener getOnAudioFocusChangeListener();
+ method public android.os.Handler getOnAudioFocusChangeListenerHandler();
+ method public boolean willPauseWhenDucked();
+ }
+
+ public static final class AudioFocusRequest.Builder {
+ ctor public AudioFocusRequest.Builder(int);
+ ctor public AudioFocusRequest.Builder(android.media.AudioFocusRequest);
+ method public android.media.AudioFocusRequest build();
+ method public android.media.AudioFocusRequest.Builder setAcceptsDelayedFocusGain(boolean);
+ method public android.media.AudioFocusRequest.Builder setAudioAttributes(android.media.AudioAttributes);
+ method public android.media.AudioFocusRequest.Builder setFocusGain(int);
+ method public android.media.AudioFocusRequest.Builder setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener, android.os.Handler);
+ method public android.media.AudioFocusRequest.Builder setWillPauseWhenDucked(boolean);
+ }
+
public final class AudioFormat implements android.os.Parcelable {
method public int describeContents();
method public int getChannelCount();
@@ -22323,6 +22415,7 @@
public class AudioManager {
method public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener);
method public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes);
+ method public int abandonAudioFocusRequest(android.media.AudioFocusRequest);
method public void adjustStreamVolume(int, int, int);
method public void adjustSuggestedStreamVolume(int, int, int);
method public void adjustVolume(int, int);
@@ -22361,6 +22454,7 @@
method public deprecated void registerRemoteControlClient(android.media.RemoteControlClient);
method public deprecated boolean registerRemoteController(android.media.RemoteController);
method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int);
+ method public int requestAudioFocus(android.media.AudioFocusRequest);
method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes, int, int) throws java.lang.IllegalArgumentException;
method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes, int, int, android.media.audiopolicy.AudioPolicy) throws java.lang.IllegalArgumentException;
method public deprecated void setBluetoothA2dpOn(boolean);
@@ -22409,6 +22503,8 @@
field public static final int AUDIOFOCUS_LOSS = -1; // 0xffffffff
field public static final int AUDIOFOCUS_LOSS_TRANSIENT = -2; // 0xfffffffe
field public static final int AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK = -3; // 0xfffffffd
+ field public static final int AUDIOFOCUS_NONE = 0; // 0x0
+ field public static final int AUDIOFOCUS_REQUEST_DELAYED = 2; // 0x2
field public static final int AUDIOFOCUS_REQUEST_FAILED = 0; // 0x0
field public static final int AUDIOFOCUS_REQUEST_GRANTED = 1; // 0x1
field public static final int AUDIO_SESSION_ID_GENERATE = 0; // 0x0
@@ -22626,13 +22722,14 @@
field public long nanoTime;
}
- public class AudioTrack implements android.media.AudioRouting {
+ public class AudioTrack implements android.media.AudioRouting android.media.VolumeAutomation {
ctor public deprecated AudioTrack(int, int, int, int, int, int) throws java.lang.IllegalArgumentException;
ctor public deprecated AudioTrack(int, int, int, int, int, int, int) throws java.lang.IllegalArgumentException;
ctor public AudioTrack(android.media.AudioAttributes, android.media.AudioFormat, int, int, int) throws java.lang.IllegalArgumentException;
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
method public deprecated void addOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener, android.os.Handler);
method public int attachAuxEffect(int);
+ method public android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
method public void flush();
method public int getAudioFormat();
method public int getAudioSessionId();
@@ -23100,8 +23197,42 @@
field public static final int STOP_VIDEO_RECORDING = 3; // 0x3
}
+ public final class MediaCas {
+ ctor public MediaCas(int) throws android.media.UnsupportedCasException;
+ method public void closeSession(byte[]);
+ method public static android.media.MediaCas.PluginDescriptor[] enumeratePlugins();
+ method public static boolean isSystemIdSupported(int);
+ method public byte[] openSession(int);
+ method public byte[] openSession(int, int);
+ method public void processEcm(byte[], byte[], int, int);
+ method public void processEcm(byte[], byte[]);
+ method public void processEmm(byte[], int, int);
+ method public void processEmm(byte[]);
+ method public void provision(java.lang.String);
+ method public void refreshEntitlements(int, byte[]);
+ method public void release();
+ method public void sendEvent(int, int, byte[]);
+ method public void setEventListener(android.media.MediaCas.EventListener, android.os.Handler);
+ method public void setPrivateData(byte[]);
+ method public void setSessionPrivateData(byte[], byte[]);
+ }
+
+ public static abstract interface MediaCas.EventListener {
+ method public abstract void onEvent(android.media.MediaCas, int, int, byte[]);
+ }
+
+ public static class MediaCas.PluginDescriptor {
+ method public java.lang.String getName();
+ method public int getSystemId();
+ }
+
+ public class MediaCasException extends java.lang.Exception {
+ ctor public MediaCasException(java.lang.String);
+ }
+
public final class MediaCodec {
method public void configure(android.media.MediaFormat, android.view.Surface, android.media.MediaCrypto, int);
+ method public void configure(android.media.MediaFormat, android.view.Surface, int, android.media.MediaDescrambler);
method public static android.media.MediaCodec createByCodecName(java.lang.String) throws java.io.IOException;
method public static android.media.MediaCodec createDecoderByType(java.lang.String) throws java.io.IOException;
method public static android.media.MediaCodec createEncoderByType(java.lang.String) throws java.io.IOException;
@@ -23141,6 +23272,7 @@
field public static final int BUFFER_FLAG_CODEC_CONFIG = 2; // 0x2
field public static final int BUFFER_FLAG_END_OF_STREAM = 4; // 0x4
field public static final int BUFFER_FLAG_KEY_FRAME = 1; // 0x1
+ field public static final int BUFFER_FLAG_PARTIAL_FRAME = 8; // 0x8
field public static final deprecated int BUFFER_FLAG_SYNC_FRAME = 1; // 0x1
field public static final int CONFIGURE_FLAG_ENCODE = 1; // 0x1
field public static final int CRYPTO_MODE_AES_CBC = 2; // 0x2
@@ -23297,6 +23429,7 @@
field public static final deprecated int COLOR_TI_FormatYUV420PackedSemiPlanar = 2130706688; // 0x7f000100
field public static final java.lang.String FEATURE_AdaptivePlayback = "adaptive-playback";
field public static final java.lang.String FEATURE_IntraRefresh = "intra-refresh";
+ field public static final java.lang.String FEATURE_PartialFrame = "partial-frame";
field public static final java.lang.String FEATURE_SecurePlayback = "secure-playback";
field public static final java.lang.String FEATURE_TunneledPlayback = "tunneled-playback";
field public int[] colorFormats;
@@ -23521,6 +23654,14 @@
method public abstract int readAt(long, byte[], int, int) throws java.io.IOException;
}
+ public final class MediaDescrambler {
+ ctor public MediaDescrambler(int) throws android.media.UnsupportedCasException;
+ method public final int descramble(java.nio.ByteBuffer, int, java.nio.ByteBuffer, int, android.media.MediaCodec.CryptoInfo);
+ method public final void release();
+ method public final boolean requiresSecureDecoderComponent(java.lang.String);
+ method public final void setMediaCasSession(byte[]);
+ }
+
public class MediaDescription implements android.os.Parcelable {
method public int describeContents();
method public java.lang.CharSequence getDescription();
@@ -23677,8 +23818,10 @@
method public final void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public final void setDataSource(java.io.FileDescriptor) throws java.io.IOException;
method public final void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException;
+ method public final void setMediaCas(android.media.MediaCas);
method public void unselectTrack(int);
field public static final int SAMPLE_FLAG_ENCRYPTED = 2; // 0x2
+ field public static final int SAMPLE_FLAG_PARTIAL_FRAME = 4; // 0x4
field public static final int SAMPLE_FLAG_SYNC = 1; // 0x1
field public static final int SEEK_TO_CLOSEST_SYNC = 2; // 0x2
field public static final int SEEK_TO_NEXT_SYNC = 1; // 0x1
@@ -23744,6 +23887,7 @@
field public static final java.lang.String KEY_IS_FORCED_SUBTITLE = "is-forced-subtitle";
field public static final java.lang.String KEY_I_FRAME_INTERVAL = "i-frame-interval";
field public static final java.lang.String KEY_LANGUAGE = "language";
+ field public static final java.lang.String KEY_LATENCY = "latency";
field public static final java.lang.String KEY_LEVEL = "level";
field public static final java.lang.String KEY_MAX_HEIGHT = "max-height";
field public static final java.lang.String KEY_MAX_INPUT_SIZE = "max-input-size";
@@ -23775,6 +23919,7 @@
field public static final java.lang.String MIMETYPE_AUDIO_OPUS = "audio/opus";
field public static final java.lang.String MIMETYPE_AUDIO_QCELP = "audio/qcelp";
field public static final java.lang.String MIMETYPE_AUDIO_RAW = "audio/raw";
+ field public static final java.lang.String MIMETYPE_AUDIO_SCRAMBLED = "audio/scrambled";
field public static final java.lang.String MIMETYPE_AUDIO_VORBIS = "audio/vorbis";
field public static final java.lang.String MIMETYPE_TEXT_CEA_608 = "text/cea-608";
field public static final java.lang.String MIMETYPE_TEXT_VTT = "text/vtt";
@@ -23785,6 +23930,7 @@
field public static final java.lang.String MIMETYPE_VIDEO_MPEG2 = "video/mpeg2";
field public static final java.lang.String MIMETYPE_VIDEO_MPEG4 = "video/mp4v-es";
field public static final java.lang.String MIMETYPE_VIDEO_RAW = "video/raw";
+ field public static final java.lang.String MIMETYPE_VIDEO_SCRAMBLED = "video/scrambled";
field public static final java.lang.String MIMETYPE_VIDEO_VP8 = "video/x-vnd.on2.vp8";
field public static final java.lang.String MIMETYPE_VIDEO_VP9 = "video/x-vnd.on2.vp9";
}
@@ -23925,7 +24071,7 @@
field public static final int MUXER_OUTPUT_WEBM = 1; // 0x1
}
- public class MediaPlayer {
+ public class MediaPlayer implements android.media.VolumeAutomation {
ctor public MediaPlayer();
method public void addTimedTextSource(java.lang.String, java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void addTimedTextSource(android.content.Context, android.net.Uri, java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
@@ -23937,6 +24083,7 @@
method public static android.media.MediaPlayer create(android.content.Context, android.net.Uri, android.view.SurfaceHolder, android.media.AudioAttributes, int);
method public static android.media.MediaPlayer create(android.content.Context, int);
method public static android.media.MediaPlayer create(android.content.Context, int, android.media.AudioAttributes, int);
+ method public android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
method public void deselectTrack(int) throws java.lang.IllegalStateException;
method public int getAudioSessionId();
method public android.media.BufferingParams getBufferingParams();
@@ -23959,7 +24106,7 @@
method public void pause() throws java.lang.IllegalStateException;
method public void prepare() throws java.io.IOException, java.lang.IllegalStateException;
method public void prepareAsync() throws java.lang.IllegalStateException;
- method public void prepareDrm(java.util.UUID, android.media.MediaPlayer.OnDrmConfigCallback) throws android.media.MediaPlayer.ProvisioningErrorException, android.media.ResourceBusyException, android.media.UnsupportedSchemeException;
+ method public void prepareDrm(java.util.UUID) throws android.media.MediaPlayer.ProvisioningErrorException, android.media.ResourceBusyException, android.media.UnsupportedSchemeException;
method public byte[] provideKeyResponse(byte[], byte[]) throws android.media.DeniedByServerException, android.media.MediaPlayer.NoDrmSchemeException;
method public void release();
method public void releaseDrm() throws android.media.MediaPlayer.NoDrmSchemeException;
@@ -23974,6 +24121,7 @@
method public void setAuxEffectSendLevel(float);
method public void setBufferingParams(android.media.BufferingParams);
method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
+ method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>, java.util.List<java.net.HttpCookie>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
method public void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
@@ -23986,6 +24134,7 @@
method public void setNextMediaPlayer(android.media.MediaPlayer);
method public void setOnBufferingUpdateListener(android.media.MediaPlayer.OnBufferingUpdateListener);
method public void setOnCompletionListener(android.media.MediaPlayer.OnCompletionListener);
+ method public void setOnDrmConfigListener(android.media.MediaPlayer.OnDrmConfigListener);
method public void setOnDrmInfoListener(android.media.MediaPlayer.OnDrmInfoListener);
method public void setOnDrmInfoListener(android.media.MediaPlayer.OnDrmInfoListener, android.os.Handler);
method public void setOnDrmPreparedListener(android.media.MediaPlayer.OnDrmPreparedListener);
@@ -24050,9 +24199,8 @@
method public abstract void onCompletion(android.media.MediaPlayer);
}
- public static abstract class MediaPlayer.OnDrmConfigCallback {
- ctor public MediaPlayer.OnDrmConfigCallback();
- method public void onDrmConfig(android.media.MediaPlayer);
+ public static abstract interface MediaPlayer.OnDrmConfigListener {
+ method public abstract void onDrmConfig(android.media.MediaPlayer);
}
public static abstract interface MediaPlayer.OnDrmInfoListener {
@@ -24113,6 +24261,7 @@
ctor public MediaRecorder();
method public static final int getAudioSourceMax();
method public int getMaxAmplitude() throws java.lang.IllegalStateException;
+ method public android.os.Bundle getMetrics();
method public android.view.Surface getSurface();
method public void pause() throws java.lang.IllegalStateException;
method public void prepare() throws java.io.IOException, java.lang.IllegalStateException;
@@ -24765,10 +24914,18 @@
field public static final int TONE_SUP_RINGTONE = 23; // 0x17
}
+ public final class UnsupportedCasException extends android.media.MediaCasException {
+ ctor public UnsupportedCasException(java.lang.String);
+ }
+
public final class UnsupportedSchemeException extends android.media.MediaDrmException {
ctor public UnsupportedSchemeException(java.lang.String);
}
+ public abstract interface VolumeAutomation {
+ method public abstract android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
+ }
+
public abstract class VolumeProvider {
ctor public VolumeProvider(int, int, int);
method public final int getCurrentVolume();
@@ -24782,6 +24939,53 @@
field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
}
+ public final class VolumeShaper implements java.lang.AutoCloseable {
+ method public void apply(android.media.VolumeShaper.Operation);
+ method public void close();
+ method public float getVolume();
+ method public void replace(android.media.VolumeShaper.Configuration, android.media.VolumeShaper.Operation, boolean);
+ }
+
+ public static final class VolumeShaper.Configuration implements android.os.Parcelable {
+ method public int describeContents();
+ method public double getDurationMs();
+ method public int getInterpolatorType();
+ method public static int getMaximumCurvePoints();
+ method public float[] getTimes();
+ method public float[] getVolumes();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.media.VolumeShaper.Configuration> CREATOR;
+ field public static final android.media.VolumeShaper.Configuration CUBIC_RAMP;
+ field public static final int INTERPOLATOR_TYPE_CUBIC = 2; // 0x2
+ field public static final int INTERPOLATOR_TYPE_CUBIC_MONOTONIC = 3; // 0x3
+ field public static final int INTERPOLATOR_TYPE_LINEAR = 1; // 0x1
+ field public static final int INTERPOLATOR_TYPE_STEP = 0; // 0x0
+ field public static final android.media.VolumeShaper.Configuration LINEAR_RAMP;
+ field public static final android.media.VolumeShaper.Configuration SCURVE_RAMP;
+ field public static final android.media.VolumeShaper.Configuration SINE_RAMP;
+ }
+
+ public static final class VolumeShaper.Configuration.Builder {
+ ctor public VolumeShaper.Configuration.Builder();
+ ctor public VolumeShaper.Configuration.Builder(android.media.VolumeShaper.Configuration);
+ method public android.media.VolumeShaper.Configuration build();
+ method public android.media.VolumeShaper.Configuration.Builder invertVolumes();
+ method public android.media.VolumeShaper.Configuration.Builder reflectTimes();
+ method public android.media.VolumeShaper.Configuration.Builder scaleToEndVolume(float);
+ method public android.media.VolumeShaper.Configuration.Builder scaleToStartVolume(float);
+ method public android.media.VolumeShaper.Configuration.Builder setCurve(float[], float[]);
+ method public android.media.VolumeShaper.Configuration.Builder setDurationMs(double);
+ method public android.media.VolumeShaper.Configuration.Builder setInterpolatorType(int);
+ }
+
+ public static final class VolumeShaper.Operation 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.media.VolumeShaper.Operation> CREATOR;
+ field public static final android.media.VolumeShaper.Operation PLAY;
+ field public static final android.media.VolumeShaper.Operation REVERSE;
+ }
+
}
package android.media.audiofx {
@@ -25749,6 +25953,9 @@
method public static final android.net.Uri buildChannelsUriForInput(java.lang.String, boolean);
method public static final android.net.Uri buildChannelsUriForInput(java.lang.String, java.lang.String, boolean);
method public static final java.lang.String buildInputId(android.content.ComponentName);
+ method public static final android.net.Uri buildPreviewProgramUri(long);
+ method public static final android.net.Uri buildPreviewProgramsUriForChannel(long);
+ method public static final android.net.Uri buildPreviewProgramsUriForChannel(android.net.Uri);
method public static final android.net.Uri buildProgramUri(long);
method public static final android.net.Uri buildProgramsUriForChannel(long);
method public static final android.net.Uri buildProgramsUriForChannel(android.net.Uri);
@@ -25760,6 +25967,12 @@
method public static final boolean isChannelUriForTunerInput(android.net.Uri);
method public static final boolean isProgramUri(android.net.Uri);
field public static final java.lang.String AUTHORITY = "android.media.tv";
+ field public static final java.lang.String EXTRA_COLUMN_NAME = "android.media.tv.extra.COLUMN_NAME";
+ field public static final java.lang.String EXTRA_DATA_TYPE = "android.media.tv.extra.DATA_TYPE";
+ field public static final java.lang.String EXTRA_DEFAULT_VALUE = "android.media.tv.extra.DEFAULT_VALUE";
+ field public static final java.lang.String EXTRA_EXISTING_COLUMN_NAMES = "android.media.tv.extra.EXISTING_COLUMN_NAMES";
+ field public static final java.lang.String METHOD_ADD_COLUMN = "add_column";
+ field public static final java.lang.String METHOD_GET_COLUMNS = "get_columns";
}
public static abstract interface TvContract.BaseProgramColumns implements android.media.tv.TvContract.BaseTvColumns {
@@ -25808,6 +26021,7 @@
field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
field public static final java.lang.String COLUMN_LOCKED = "locked";
field public static final java.lang.String COLUMN_NETWORK_AFFILIATION = "network_affiliation";
field public static final java.lang.String COLUMN_ORIGINAL_NETWORK_ID = "original_network_id";
@@ -25873,7 +26087,7 @@
field public static final java.lang.String CONTENT_DIRECTORY = "logo";
}
- public static final class TvContract.Programs implements android.media.tv.TvContract.BaseProgramColumns {
+ public static final class TvContract.PreviewPrograms implements android.media.tv.TvContract.BaseProgramColumns {
field public static final java.lang.String ASPECT_RATIO_16_9 = "ASPECT_RATIO_16_9";
field public static final java.lang.String ASPECT_RATIO_1_1 = "ASPECT_RATIO_1_1";
field public static final java.lang.String ASPECT_RATIO_2_3 = "ASPECT_RATIO_2_3";
@@ -25884,10 +26098,8 @@
field public static final java.lang.String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri";
field public static final java.lang.String COLUMN_AUTHOR = "author";
field public static final java.lang.String COLUMN_AVAILABILITY = "availability";
- field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+ field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
field public static final java.lang.String COLUMN_DURATION_MILLIS = "duration_millis";
- field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
- field public static final deprecated java.lang.String COLUMN_EPISODE_NUMBER = "episode_number";
field public static final java.lang.String COLUMN_INTERACTION_COUNT = "interaction_count";
field public static final java.lang.String COLUMN_INTERACTION_TYPE = "interaction_type";
field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
@@ -25898,20 +26110,17 @@
field public static final java.lang.String COLUMN_OFFER_PRICE = "offer_price";
field public static final java.lang.String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
field public static final java.lang.String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
- field public static final java.lang.String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
field public static final java.lang.String COLUMN_RELEASE_DATE = "release_date";
field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
- field public static final deprecated java.lang.String COLUMN_SEASON_NUMBER = "season_number";
field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
- field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
field public static final java.lang.String COLUMN_TRANSIENT = "transient";
field public static final java.lang.String COLUMN_TYPE = "type";
field public static final java.lang.String COLUMN_WATCH_NEXT_TYPE = "watch_next_type";
field public static final java.lang.String COLUMN_WEIGHT = "weight";
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/program";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/program";
+ field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/preview_program";
+ field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/preview_program";
field public static final android.net.Uri CONTENT_URI;
field public static final java.lang.String INTERACTION_TYPE_FANS = "INTERACTION_TYPE_FANS";
field public static final java.lang.String INTERACTION_TYPE_FOLLOWERS = "INTERACTION_TYPE_FOLLOWERS";
@@ -25940,6 +26149,18 @@
field public static final java.lang.String WATCH_NEXT_TYPE_NEXT = "WATCH_NEXT_TYPE_NEXT";
}
+ public static final class TvContract.Programs implements android.media.tv.TvContract.BaseProgramColumns {
+ field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+ field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+ field public static final deprecated java.lang.String COLUMN_EPISODE_NUMBER = "episode_number";
+ field public static final java.lang.String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
+ field public static final deprecated java.lang.String COLUMN_SEASON_NUMBER = "season_number";
+ field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+ field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/program";
+ field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/program";
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
public static final class TvContract.Programs.Genres {
method public static java.lang.String[] decode(java.lang.String);
method public static java.lang.String encode(java.lang.String...);
@@ -26108,11 +26329,13 @@
field public static final java.lang.String ACTION_BLOCKED_RATINGS_CHANGED = "android.media.tv.action.BLOCKED_RATINGS_CHANGED";
field public static final java.lang.String ACTION_MAKE_CHANNEL_BROWSABLE = "android.media.tv.action.MAKE_CHANNEL_BROWSABLE";
field public static final java.lang.String ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED = "android.media.tv.action.PARENTAL_CONTROLS_ENABLED_CHANGED";
+ field public static final java.lang.String ACTION_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.PROGRAM_BROWSABLE_DISABLED";
field public static final java.lang.String ACTION_QUERY_CONTENT_RATING_SYSTEMS = "android.media.tv.action.QUERY_CONTENT_RATING_SYSTEMS";
field public static final java.lang.String ACTION_SETUP_INPUTS = "android.media.tv.action.SETUP_INPUTS";
field public static final java.lang.String ACTION_VIEW_RECORDING_SCHEDULES = "android.media.tv.action.VIEW_RECORDING_SCHEDULES";
field public static final java.lang.String EXTRA_CHANNEL_ID = "android.media.tv.extra.CHANNEL_ID";
field public static final java.lang.String EXTRA_PACKAGE_NAME = "android.media.tv.extra.PACKAGE_NAME";
+ field public static final java.lang.String EXTRA_PROGRAM_ID = "android.media.tv.extra.PROGRAM_ID";
field public static final int INPUT_STATE_CONNECTED = 0; // 0x0
field public static final int INPUT_STATE_CONNECTED_STANDBY = 1; // 0x1
field public static final int INPUT_STATE_DISCONNECTED = 2; // 0x2
@@ -26758,44 +26981,6 @@
method public void onTetheringStarted();
}
- public final class ConnectivityMetricsEvent implements android.os.Parcelable {
- ctor public ConnectivityMetricsEvent(long, int, int, android.os.Parcelable);
- method public int describeContents();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.ConnectivityMetricsEvent> CREATOR;
- field public final int componentTag;
- field public final android.os.Parcelable data;
- field public final int eventTag;
- field public final long timestamp;
- }
-
- public static final class ConnectivityMetricsEvent.Reference implements android.os.Parcelable {
- ctor public ConnectivityMetricsEvent.Reference(long);
- method public int describeContents();
- method public long getValue();
- method public void readFromParcel(android.os.Parcel);
- method public void setValue(long);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.ConnectivityMetricsEvent.Reference> CREATOR;
- }
-
- public class ConnectivityMetricsLogger {
- ctor public ConnectivityMetricsLogger();
- method public android.net.ConnectivityMetricsEvent[] getEvents(android.net.ConnectivityMetricsEvent.Reference);
- method public void logEvent(long, int, int, android.os.Parcelable);
- method public boolean register(android.app.PendingIntent);
- method public boolean unregister(android.app.PendingIntent);
- field public static final int COMPONENT_TAG_BLUETOOTH = 1; // 0x1
- field public static final int COMPONENT_TAG_CONNECTIVITY = 0; // 0x0
- field public static final int COMPONENT_TAG_TELECOM = 3; // 0x3
- field public static final int COMPONENT_TAG_TELEPHONY = 4; // 0x4
- field public static final int COMPONENT_TAG_WIFI = 2; // 0x2
- field public static final java.lang.String CONNECTIVITY_METRICS_LOGGER_SERVICE = "connectivity_metrics_logger";
- field public static final java.lang.String DATA_KEY_EVENTS_COUNT = "count";
- field public static final int NUMBER_OF_COMPONENTS = 5; // 0x5
- field public static final int TAG_SKIPPED_EVENTS = -1; // 0xffffffff
- }
-
public class Credentials {
ctor public Credentials(int, int, int);
method public int getGid();
@@ -26933,6 +27118,13 @@
public class NetworkBadging {
method public static android.graphics.drawable.Drawable getWifiIcon(int, int, android.content.res.Resources.Theme);
+ field public static final int BADGING_4K = 30; // 0x1e
+ field public static final int BADGING_HD = 20; // 0x14
+ field public static final int BADGING_NONE = 0; // 0x0
+ field public static final int BADGING_SD = 10; // 0xa
+ }
+
+ public static abstract class NetworkBadging.Badging implements java.lang.annotation.Annotation {
}
public final class NetworkCapabilities implements android.os.Parcelable {
@@ -27029,7 +27221,8 @@
}
public abstract class NetworkRecommendationProvider {
- ctor public NetworkRecommendationProvider(android.os.Handler);
+ ctor public deprecated NetworkRecommendationProvider(android.os.Handler);
+ ctor public NetworkRecommendationProvider(android.content.Context, java.util.concurrent.Executor);
method public final android.os.IBinder getBinder();
method public abstract void onRequestRecommendation(android.net.RecommendationRequest, android.net.NetworkRecommendationProvider.ResultCallback);
method public abstract void onRequestScores(android.net.NetworkKey[]);
@@ -27196,10 +27389,10 @@
field public static final java.lang.String ATTRIBUTES_KEY_BADGING_CURVE = "android.net.attributes.key.BADGING_CURVE";
field public static final java.lang.String ATTRIBUTES_KEY_HAS_CAPTIVE_PORTAL = "android.net.attributes.key.HAS_CAPTIVE_PORTAL";
field public static final java.lang.String ATTRIBUTES_KEY_RANKING_SCORE_OFFSET = "android.net.attributes.key.RANKING_SCORE_OFFSET";
- field public static final int BADGING_4K = 30; // 0x1e
- field public static final int BADGING_HD = 20; // 0x14
- field public static final int BADGING_NONE = 0; // 0x0
- field public static final int BADGING_SD = 10; // 0xa
+ field public static final deprecated int BADGING_4K = 30; // 0x1e
+ field public static final deprecated int BADGING_HD = 20; // 0x14
+ field public static final deprecated int BADGING_NONE = 0; // 0x0
+ field public static final deprecated int BADGING_SD = 10; // 0xa
field public static final android.os.Parcelable.Creator<android.net.ScoredNetwork> CREATOR;
field public final android.os.Bundle attributes;
field public final boolean meteredHint;
@@ -27207,7 +27400,7 @@
field public final android.net.RssiCurve rssiCurve;
}
- public static abstract class ScoredNetwork.Badging implements java.lang.annotation.Annotation {
+ public static abstract deprecated class ScoredNetwork.Badging implements java.lang.annotation.Annotation {
}
public class TrafficStats {
@@ -27500,175 +27693,6 @@
}
-package android.net.metrics {
-
- public final class ApfProgramEvent 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.net.metrics.ApfProgramEvent> CREATOR;
- field public static final int FLAG_HAS_IPV4_ADDRESS = 1; // 0x1
- field public static final int FLAG_MULTICAST_FILTER_ON = 0; // 0x0
- field public final int currentRas;
- field public final int filteredRas;
- field public final int flags;
- field public final long lifetime;
- field public final int programLength;
- }
-
- public final class ApfStats 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.net.metrics.ApfStats> CREATOR;
- field public final int droppedRas;
- field public final long durationMs;
- field public final int matchingRas;
- field public final int maxProgramSize;
- field public final int parseErrors;
- field public final int programUpdates;
- field public final int receivedRas;
- field public final int zeroLifetimeRas;
- }
-
- public final class DefaultNetworkEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static void logEvent(int, int[], int, boolean, boolean);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.metrics.DefaultNetworkEvent> CREATOR;
- field public final int netId;
- field public final boolean prevIPv4;
- field public final boolean prevIPv6;
- field public final int prevNetId;
- field public final int[] transportTypes;
- }
-
- public final class DhcpClientEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static void logStateEvent(java.lang.String, java.lang.String);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.metrics.DhcpClientEvent> CREATOR;
- field public final int durationMs;
- field public final java.lang.String ifName;
- field public final java.lang.String msg;
- }
-
- public final class DhcpErrorEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static int errorCodeWithOption(int, int);
- method public static void logParseError(java.lang.String, int);
- method public static void logReceiveError(java.lang.String);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final int BOOTP_TOO_SHORT;
- field public static final int BUFFER_UNDERFLOW;
- field public static final android.os.Parcelable.Creator<android.net.metrics.DhcpErrorEvent> CREATOR;
- field public static final int DHCP_BAD_MAGIC_COOKIE;
- field public static final int DHCP_ERROR = 4; // 0x4
- field public static final int DHCP_INVALID_OPTION_LENGTH;
- field public static final int DHCP_NO_MSG_TYPE;
- field public static final int DHCP_UNKNOWN_MSG_TYPE;
- field public static final int L2_ERROR = 1; // 0x1
- field public static final int L2_TOO_SHORT;
- field public static final int L2_WRONG_ETH_TYPE;
- field public static final int L3_ERROR = 2; // 0x2
- field public static final int L3_INVALID_IP;
- field public static final int L3_NOT_IPV4;
- field public static final int L3_TOO_SHORT;
- field public static final int L4_ERROR = 3; // 0x3
- field public static final int L4_NOT_UDP;
- field public static final int L4_WRONG_PORT;
- field public static final int MISC_ERROR = 5; // 0x5
- field public static final int RECEIVE_ERROR;
- field public final int errorCode;
- field public final java.lang.String ifName;
- }
-
- public final class DnsEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static void logEvent(int, byte[], byte[], int[]);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.metrics.DnsEvent> CREATOR;
- field public final byte[] eventTypes;
- field public final int[] latenciesMs;
- field public final int netId;
- field public final byte[] returnCodes;
- }
-
- public final class IpManagerEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static void logEvent(int, java.lang.String, long);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final int COMPLETE_LIFECYCLE = 3; // 0x3
- field public static final android.os.Parcelable.Creator<android.net.metrics.IpManagerEvent> CREATOR;
- field public static final int PROVISIONING_FAIL = 2; // 0x2
- field public static final int PROVISIONING_OK = 1; // 0x1
- field public final long durationMs;
- field public final int eventType;
- field public final java.lang.String ifName;
- }
-
- public final class IpReachabilityEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static void logNudFailed(java.lang.String);
- method public static void logProbeEvent(java.lang.String, int);
- method public static void logProvisioningLost(java.lang.String);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.metrics.IpReachabilityEvent> CREATOR;
- field public static final int NUD_FAILED = 512; // 0x200
- field public static final int PROBE = 256; // 0x100
- field public static final int PROVISIONING_LOST = 768; // 0x300
- field public final int eventType;
- field public final java.lang.String ifName;
- }
-
- public final class NetworkEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static void logCaptivePortalFound(int, long);
- method public static void logEvent(int, int);
- method public static void logValidated(int, long);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.metrics.NetworkEvent> CREATOR;
- field public static final int NETWORK_CAPTIVE_PORTAL_FOUND = 4; // 0x4
- field public static final int NETWORK_CONNECTED = 1; // 0x1
- field public static final int NETWORK_DISCONNECTED = 7; // 0x7
- field public static final int NETWORK_LINGER = 5; // 0x5
- field public static final int NETWORK_UNLINGER = 6; // 0x6
- field public static final int NETWORK_VALIDATED = 2; // 0x2
- field public static final int NETWORK_VALIDATION_FAILED = 3; // 0x3
- field public final long durationMs;
- field public final int eventType;
- field public final int netId;
- }
-
- public final class RaEvent 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.net.metrics.RaEvent> CREATOR;
- field public final long dnsslLifetime;
- field public final long prefixPreferredLifetime;
- field public final long prefixValidLifetime;
- field public final long rdnssLifetime;
- field public final long routeInfoLifetime;
- field public final long routerLifetime;
- }
-
- public final class ValidationProbeEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static void logEvent(int, long, int, int);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.metrics.ValidationProbeEvent> CREATOR;
- field public static final int DNS_FAILURE = 0; // 0x0
- field public static final int DNS_SUCCESS = 1; // 0x1
- field public static final int PROBE_DNS = 0; // 0x0
- field public static final int PROBE_HTTP = 1; // 0x1
- field public static final int PROBE_HTTPS = 2; // 0x2
- field public static final int PROBE_PAC = 3; // 0x3
- field public final long durationMs;
- field public final int netId;
- field public final int probeType;
- field public final int returnCode;
- }
-
-}
-
package android.net.nsd {
public final class NsdManager {
@@ -28727,8 +28751,6 @@
public class DiscoverySession {
method public java.lang.String createNetworkSpecifier(android.net.wifi.aware.PeerHandle, byte[]);
method public void destroy();
- method public static int getMaxSendRetryCount();
- method public void sendMessage(android.net.wifi.aware.PeerHandle, int, byte[], int);
method public void sendMessage(android.net.wifi.aware.PeerHandle, int, byte[]);
}
@@ -34102,10 +34124,8 @@
method public void allocateBytes(java.io.File, long, int) throws java.io.IOException;
method public void allocateBytes(java.io.FileDescriptor, long, int) throws java.io.IOException;
method public long getAllocatableBytes(java.io.File, int) throws java.io.IOException;
- method public long getCacheQuotaBytes();
- method public long getCacheSizeBytes();
- method public long getExternalCacheQuotaBytes();
- method public long getExternalCacheSizeBytes();
+ method public long getCacheQuotaBytes(java.io.File);
+ method public long getCacheSizeBytes(java.io.File);
method public java.lang.String getMountedObbPath(java.lang.String);
method public android.os.storage.StorageVolume getPrimaryStorageVolume();
method public android.os.storage.StorageVolume getStorageVolume(java.io.File);
@@ -36616,6 +36636,7 @@
field public static final int FLAG_SUPPORTS_IS_CHILD = 16; // 0x10
field public static final int FLAG_SUPPORTS_RECENTS = 4; // 0x4
field public static final int FLAG_SUPPORTS_SEARCH = 8; // 0x8
+ field public static final java.lang.String MIME_TYPE_ITEM = "vnd.android.document/root";
}
public abstract class DocumentsProvider extends android.content.ContentProvider {
@@ -37297,7 +37318,7 @@
method public static final deprecated void setLocationProviderEnabled(android.content.ContentResolver, java.lang.String, boolean);
field public static final java.lang.String ACCESSIBILITY_DISPLAY_INVERSION_ENABLED = "accessibility_display_inversion_enabled";
field public static final java.lang.String ACCESSIBILITY_ENABLED = "accessibility_enabled";
- field public static final java.lang.String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password";
+ field public static final deprecated java.lang.String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password";
field public static final deprecated java.lang.String ADB_ENABLED = "adb_enabled";
field public static final java.lang.String ALLOWED_GEOLOCATION_ORIGINS = "allowed_geolocation_origins";
field public static final deprecated java.lang.String ALLOW_MOCK_LOCATION = "mock_location";
@@ -39289,7 +39310,7 @@
}
public static final class Dataset.Builder {
- ctor public Dataset.Builder(java.lang.CharSequence);
+ ctor public Dataset.Builder(android.widget.RemoteViews);
method public android.service.autofill.Dataset build();
method public android.service.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
@@ -39309,10 +39330,10 @@
public static final class FillResponse.Builder {
ctor public FillResponse.Builder();
method public android.service.autofill.FillResponse.Builder addDataset(android.service.autofill.Dataset);
- method public android.service.autofill.FillResponse.Builder addSavableFields(android.view.autofill.AutoFillId...);
method public android.service.autofill.FillResponse build();
- method public android.service.autofill.FillResponse.Builder setAuthentication(android.content.IntentSender);
+ method public android.service.autofill.FillResponse.Builder setAuthentication(android.content.IntentSender, android.widget.RemoteViews);
method public android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle);
+ method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo);
}
public final class SaveCallback {
@@ -39320,6 +39341,23 @@
method public void onSuccess();
}
+ public final class SaveInfo 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.service.autofill.SaveInfo> CREATOR;
+ field public static final int SAVE_DATA_TYPE_ADDRESS = 2; // 0x2
+ field public static final int SAVE_DATA_TYPE_CREDIT_CARD = 3; // 0x3
+ field public static final int SAVE_DATA_TYPE_GENERIC = 0; // 0x0
+ field public static final int SAVE_DATA_TYPE_PASSWORD = 1; // 0x1
+ }
+
+ public static final class SaveInfo.Builder {
+ ctor public SaveInfo.Builder(int);
+ method public android.service.autofill.SaveInfo.Builder addSavableIds(android.view.autofill.AutoFillId...);
+ method public android.service.autofill.SaveInfo build();
+ method public android.service.autofill.SaveInfo.Builder setDescription(java.lang.CharSequence);
+ }
+
}
package android.service.carrier {
@@ -39831,20 +39869,29 @@
public class TrustAgentService extends android.app.Service {
ctor public TrustAgentService();
+ method public final void addEscrowToken(byte[], android.os.UserHandle);
method public final deprecated void grantTrust(java.lang.CharSequence, long, boolean);
method public final void grantTrust(java.lang.CharSequence, long, int);
+ method public final void isEscrowTokenActive(long, android.os.UserHandle);
method public final android.os.IBinder onBind(android.content.Intent);
method public boolean onConfigure(java.util.List<android.os.PersistableBundle>);
method public void onDeviceLocked();
method public void onDeviceUnlockLockout(long);
method public void onDeviceUnlocked();
+ method public void onEscrowTokenAdded(byte[], long, android.os.UserHandle);
+ method public void onEscrowTokenRemoved(long, boolean);
+ method public void onEscrowTokenStateReceived(long, int);
method public void onTrustTimeout();
method public void onUnlockAttempt(boolean);
+ method public final void removeEscrowToken(long, android.os.UserHandle);
method public final void revokeTrust();
method public final void setManagingTrust(boolean);
+ method public final void unlockUserWithToken(long, byte[], android.os.UserHandle);
field public static final int FLAG_GRANT_TRUST_DISMISS_KEYGUARD = 2; // 0x2
field public static final int FLAG_GRANT_TRUST_INITIATED_BY_USER = 1; // 0x1
field public static final java.lang.String SERVICE_INTERFACE = "android.service.trust.TrustAgentService";
+ field public static final int TOKEN_STATE_ACTIVE = 1; // 0x1
+ field public static final int TOKEN_STATE_INACTIVE = 0; // 0x0
field public static final java.lang.String TRUST_AGENT_META_DATA = "android.service.trust.trustagent";
}
@@ -41038,9 +41085,11 @@
method public android.telecom.Call.Details getDetails();
method public android.telecom.Call getParent();
method public java.lang.String getRemainingPostDialSequence();
+ method public android.telecom.Call.RttCall getRttCall();
method public int getState();
method public android.telecom.InCallService.VideoCall getVideoCall();
method public void hold();
+ method public boolean isRttActive();
method public void mergeConference();
method public void phoneAccountSelected(android.telecom.PhoneAccountHandle, boolean);
method public void playDtmfTone(char);
@@ -41053,9 +41102,12 @@
method public final void removeExtras(java.util.List<java.lang.String>);
method public final void removeExtras(java.lang.String...);
method public deprecated void removeListener(android.telecom.Call.Listener);
+ method public void respondToRttRequest(int, boolean);
method public void sendCallEvent(java.lang.String, android.os.Bundle);
+ method public void sendRttRequest();
method public void splitFromConference();
method public void stopDtmfTone();
+ method public void stopRtt();
method public void swapConference();
method public void unhold();
method public void unregisterCallback(android.telecom.Call.Callback);
@@ -41084,6 +41136,9 @@
method public void onDetailsChanged(android.telecom.Call, android.telecom.Call.Details);
method public void onParentChanged(android.telecom.Call, android.telecom.Call);
method public void onPostDialWait(android.telecom.Call, java.lang.String);
+ method public void onRttModeChanged(android.telecom.Call, int);
+ method public void onRttRequest(android.telecom.Call, int);
+ method public void onRttStatusChanged(android.telecom.Call, boolean, android.telecom.Call.RttCall);
method public void onStateChanged(android.telecom.Call, int);
method public void onVideoCallChanged(android.telecom.Call, android.telecom.InCallService.VideoCall);
}
@@ -41141,6 +41196,19 @@
ctor public Call.Listener();
}
+ public static final class Call.RttCall {
+ method public int getRttAudioMode();
+ method public java.lang.String read();
+ method public void setRttMode(int);
+ method public void write(java.lang.String) throws java.io.IOException;
+ field public static final int RTT_MODE_FULL = 1; // 0x1
+ field public static final int RTT_MODE_HCO = 2; // 0x2
+ field public static final int RTT_MODE_VCO = 3; // 0x3
+ }
+
+ public static abstract class Call.RttCall.RttAudioMode implements java.lang.annotation.Annotation {
+ }
+
public final class CallAudioState implements android.os.Parcelable {
ctor public CallAudioState(boolean, int, int);
method public static java.lang.String audioRouteToString(int);
@@ -41643,6 +41711,7 @@
field public static final int CAPABILITY_CONNECTION_MANAGER = 1; // 0x1
field public static final int CAPABILITY_MULTI_USER = 32; // 0x20
field public static final int CAPABILITY_PLACE_EMERGENCY_CALLS = 16; // 0x10
+ field public static final int CAPABILITY_RTT = 4096; // 0x1000
field public static final int CAPABILITY_SELF_MANAGED = 2048; // 0x800
field public static final int CAPABILITY_SIM_SUBSCRIPTION = 4; // 0x4
field public static final int CAPABILITY_SUPPORTS_VIDEO_CALLING = 1024; // 0x400
@@ -41919,6 +41988,7 @@
field public static final java.lang.String EXTRA_NOTIFICATION_PHONE_NUMBER = "android.telecom.extra.NOTIFICATION_PHONE_NUMBER";
field public static final java.lang.String EXTRA_OUTGOING_CALL_EXTRAS = "android.telecom.extra.OUTGOING_CALL_EXTRAS";
field public static final java.lang.String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telecom.extra.PHONE_ACCOUNT_HANDLE";
+ field public static final java.lang.String EXTRA_START_CALL_WITH_RTT = "android.telecom.extra.START_CALL_WITH_RTT";
field public static final java.lang.String EXTRA_START_CALL_WITH_SPEAKERPHONE = "android.telecom.extra.START_CALL_WITH_SPEAKERPHONE";
field public static final java.lang.String EXTRA_START_CALL_WITH_VIDEO_STATE = "android.telecom.extra.START_CALL_WITH_VIDEO_STATE";
field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS";
@@ -42721,6 +42791,8 @@
method public boolean setRadioPower(boolean);
method public void setVisualVoicemailEnabled(android.telecom.PhoneAccountHandle, boolean);
method public boolean setVoiceMailNumber(java.lang.String, java.lang.String);
+ method public void setVoicemailRingtoneUri(android.telecom.PhoneAccountHandle, android.net.Uri);
+ method public void setVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle, boolean);
method public void silenceRinger();
method public boolean supplyPin(java.lang.String);
method public int[] supplyPinReportResult(java.lang.String);
@@ -43362,6 +43434,7 @@
method public android.content.pm.PackageManager getPackageManager();
method public java.lang.String getPackageName();
method public java.lang.String getPackageResourcePath();
+ method public java.io.File getPreloadsFileCache();
method public android.content.res.Resources getResources();
method public android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
method public java.lang.Object getSystemService(java.lang.String);
@@ -43585,7 +43658,7 @@
package android.test.suitebuilder {
- public class TestMethod {
+ public deprecated class TestMethod {
ctor public TestMethod(java.lang.reflect.Method, java.lang.Class<? extends junit.framework.TestCase>);
ctor public TestMethod(java.lang.String, java.lang.Class<? extends junit.framework.TestCase>);
ctor public TestMethod(junit.framework.TestCase);
@@ -43596,7 +43669,7 @@
method public java.lang.String getName();
}
- public class TestSuiteBuilder {
+ public deprecated class TestSuiteBuilder {
ctor public TestSuiteBuilder(java.lang.Class);
ctor public TestSuiteBuilder(java.lang.String, java.lang.ClassLoader);
method public android.test.suitebuilder.TestSuiteBuilder addRequirements(java.util.List<com.android.internal.util.Predicate<android.test.suitebuilder.TestMethod>>);
@@ -43609,7 +43682,7 @@
method public android.test.suitebuilder.TestSuiteBuilder named(java.lang.String);
}
- public static class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
+ public static deprecated class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
ctor public TestSuiteBuilder.FailedToCreateTests(java.lang.Exception);
method public void testSuiteConstructionFailed();
}
@@ -45825,30 +45898,51 @@
method public abstract void setValue(T, float);
}
- public final class Half {
+ public final class Half extends java.lang.Number implements java.lang.Comparable {
+ ctor public Half(short);
+ ctor public Half(float);
+ ctor public Half(double);
+ ctor public Half(java.lang.String) throws java.lang.NumberFormatException;
method public static short abs(short);
method public static short ceil(short);
+ method public static int compare(short, short);
+ method public int compareTo(android.util.Half);
method public static short copySign(short, short);
+ method public double doubleValue();
method public static boolean equals(short, short);
+ method public float floatValue();
method public static short floor(short);
method public static int getExponent(short);
method public static int getSign(short);
method public static int getSignificand(short);
method public static boolean greater(short, short);
method public static boolean greaterEquals(short, short);
+ method public static int halfToIntBits(short);
+ method public static int halfToRawIntBits(short);
+ method public static short halfToShortBits(short);
+ method public short halfValue();
+ method public static int hashCode(short);
+ method public static short intBitsToHalf(int);
+ method public int intValue();
method public static boolean isInfinite(short);
+ method public boolean isNaN();
method public static boolean isNaN(short);
method public static boolean isNormalized(short);
method public static boolean less(short, short);
method public static boolean lessEquals(short, short);
+ method public long longValue();
method public static short max(short, short);
method public static short min(short, short);
+ method public static short parseHalf(java.lang.String) throws java.lang.NumberFormatException;
method public static short round(short);
method public static float toFloat(short);
+ method public static short toHalf(float);
method public static java.lang.String toHexString(short);
method public static java.lang.String toString(short);
method public static short trunc(short);
- method public static short valueOf(float);
+ method public static android.util.Half valueOf(short);
+ method public static android.util.Half valueOf(float);
+ method public static android.util.Half valueOf(java.lang.String);
field public static final short EPSILON = 5120; // 0x1400
field public static final short LOWEST_VALUE = -1025; // 0xfffffbff
field public static final int MAX_EXPONENT = 15; // 0xf
@@ -46573,11 +46667,13 @@
field public static final int DRAW_DURATION = 4; // 0x4
field public static final int FIRST_DRAW_FRAME = 9; // 0x9
field public static final int INPUT_HANDLING_DURATION = 1; // 0x1
+ field public static final int INTENDED_VSYNC_TIMESTAMP = 10; // 0xa
field public static final int LAYOUT_MEASURE_DURATION = 3; // 0x3
field public static final int SWAP_BUFFERS_DURATION = 7; // 0x7
field public static final int SYNC_DURATION = 5; // 0x5
field public static final int TOTAL_DURATION = 8; // 0x8
field public static final int UNKNOWN_DELAY_DURATION = 0; // 0x0
+ field public static final int VSYNC_TIMESTAMP = 11; // 0xb
}
public abstract class FrameStats {
@@ -46745,6 +46841,7 @@
field public static final int SOURCE_KEYBOARD = 257; // 0x101
field public static final int SOURCE_MOUSE = 8194; // 0x2002
field public static final int SOURCE_MOUSE_RELATIVE = 131076; // 0x20004
+ field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
field public static final int SOURCE_STYLUS = 16386; // 0x4002
field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
@@ -47541,6 +47638,7 @@
field public static final int AXIS_RX = 12; // 0xc
field public static final int AXIS_RY = 13; // 0xd
field public static final int AXIS_RZ = 14; // 0xe
+ field public static final int AXIS_SCROLL = 26; // 0x1a
field public static final int AXIS_SIZE = 3; // 0x3
field public static final int AXIS_THROTTLE = 19; // 0x13
field public static final int AXIS_TILT = 25; // 0x19
@@ -47948,8 +48046,8 @@
method public void drawableHotspotChanged(float, float);
method protected void drawableStateChanged();
method public android.view.View findFocus();
- method public final android.view.View findViewById(int);
- method public final android.view.View findViewWithTag(java.lang.Object);
+ method public final <T extends android.view.View> T findViewById(int);
+ method public final <T extends android.view.View> T findViewWithTag(java.lang.Object);
method public void findViewsWithText(java.util.ArrayList<android.view.View>, java.lang.CharSequence, int);
method protected deprecated boolean fitSystemWindows(android.graphics.Rect);
method public android.view.View focusSearch(int);
@@ -47964,6 +48062,7 @@
method public float getAlpha();
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
+ method public int getAutoFillMode();
method public android.view.autofill.AutoFillType getAutoFillType();
method public android.view.autofill.AutoFillValue getAutoFillValue();
method public android.graphics.drawable.Drawable getBackground();
@@ -48078,7 +48177,7 @@
method public java.lang.Object getTag(int);
method public int getTextAlignment();
method public int getTextDirection();
- method public final java.lang.CharSequence getTooltipText();
+ method public java.lang.CharSequence getTooltipText();
method public final int getTop();
method protected float getTopFadingEdgeStrength();
method protected int getTopPaddingOffset();
@@ -48203,6 +48302,7 @@
method public boolean onKeyUp(int, android.view.KeyEvent);
method protected void onLayout(boolean, int, int, int, int);
method protected void onMeasure(int, int);
+ method public void onMovedToDisplay(int);
method protected void onOverScrolled(int, int, boolean, boolean);
method public void onPointerCaptureChange(boolean);
method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
@@ -48279,6 +48379,7 @@
method public void setActivated(boolean);
method public void setAlpha(float);
method public void setAnimation(android.view.animation.Animation);
+ method public void setAutoFillMode(int);
method public void setBackground(android.graphics.drawable.Drawable);
method public void setBackgroundColor(int);
method public deprecated void setBackgroundDrawable(android.graphics.drawable.Drawable);
@@ -48384,7 +48485,7 @@
method public void setTag(int, java.lang.Object);
method public void setTextAlignment(int);
method public void setTextDirection(int);
- method public final void setTooltipText(java.lang.CharSequence);
+ method public void setTooltipText(java.lang.CharSequence);
method public final void setTop(int);
method public void setTouchDelegate(android.view.TouchDelegate);
method public final void setTransitionName(java.lang.String);
@@ -48419,6 +48520,9 @@
field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
+ field public static final int AUTO_FILL_MODE_AUTO = 1; // 0x1
+ field public static final int AUTO_FILL_MODE_INHERIT = 0; // 0x0
+ field public static final int AUTO_FILL_MODE_MANUAL = 2; // 0x2
field public static final int DRAG_FLAG_GLOBAL = 256; // 0x100
field public static final int DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION = 64; // 0x40
field public static final int DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION = 128; // 0x80
@@ -49068,6 +49172,7 @@
method public abstract void setAccessibilityFocused(boolean);
method public abstract void setActivated(boolean);
method public abstract void setAlpha(float);
+ method public abstract void setAutoFillOptions(java.lang.String[]);
method public abstract void setAutoFillType(android.view.autofill.AutoFillType);
method public abstract void setAutoFillValue(android.view.autofill.AutoFillValue);
method public abstract void setCheckable(boolean);
@@ -49085,14 +49190,15 @@
method public abstract void setHint(java.lang.CharSequence);
method public abstract void setId(int, java.lang.String, java.lang.String, java.lang.String);
method public abstract void setLongClickable(boolean);
+ method public abstract void setSanitized(boolean);
method public abstract void setSelected(boolean);
method public abstract void setText(java.lang.CharSequence);
method public abstract void setText(java.lang.CharSequence, int, int);
method public abstract void setTextLines(int[], int[]);
method public abstract void setTextStyle(float, int, int, int);
method public abstract void setTransformation(android.graphics.Matrix);
+ method public abstract void setUrl(java.lang.String);
method public abstract void setVisibility(int);
- field public static final int AUTO_FILL_FLAG_SANITIZED = 1; // 0x1
}
public final class ViewStub extends android.view.View {
@@ -50770,7 +50876,7 @@
public final class TextClassificationManager {
method public java.util.List<android.view.textclassifier.TextLanguage> detectLanguages(java.lang.CharSequence);
- method public synchronized android.view.textclassifier.TextClassifier getDefaultTextClassifier();
+ method public android.view.textclassifier.TextClassifier getDefaultTextClassifier();
}
public final class TextClassificationResult {
@@ -54328,11 +54434,9 @@
method public void removeTextChangedListener(android.text.TextWatcher);
method public void setAllCaps(boolean);
method public final void setAutoLinkMask(int);
- method public void setAutoSizeMaxTextSize(int, float);
- method public void setAutoSizeMinTextSize(int, float);
- method public void setAutoSizeStepGranularity(int, float);
- method public void setAutoSizeTextPresetSizes(int[]);
- method public void setAutoSizeTextType(int);
+ method public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setAutoSizeTextTypeWithDefaults(int);
method public void setBreakStrategy(int);
method public void setCompoundDrawablePadding(int);
method public void setCompoundDrawableTintList(android.content.res.ColorStateList);
@@ -54615,6 +54719,8 @@
method public int resolveAdjustedSize(int, int);
method public void resume();
method public void seekTo(int);
+ method public void setAudioAttributes(android.media.AudioAttributes);
+ method public void setAudioFocusRequest(int);
method public void setMediaController(android.widget.MediaController);
method public void setOnCompletionListener(android.media.MediaPlayer.OnCompletionListener);
method public void setOnErrorListener(android.media.MediaPlayer.OnErrorListener);
@@ -54719,7 +54825,7 @@
package com.android.internal.util {
- public abstract interface Predicate<T> {
+ public abstract deprecated interface Predicate<T> {
method public abstract boolean apply(T);
}
@@ -54857,6 +54963,8 @@
field public static final int OP_INT_TO_FLOAT = 130; // 0x82
field public static final int OP_INT_TO_LONG = 129; // 0x81
field public static final int OP_INT_TO_SHORT = 143; // 0x8f
+ field public static final int OP_INVOKE_CUSTOM = 252; // 0xfc
+ field public static final int OP_INVOKE_CUSTOM_RANGE = 253; // 0xfd
field public static final int OP_INVOKE_DIRECT = 112; // 0x70
field public static final deprecated int OP_INVOKE_DIRECT_EMPTY = 240; // 0xf0
field public static final int OP_INVOKE_DIRECT_JUMBO = 9471; // 0x24ff
@@ -55047,7 +55155,7 @@
method public static dalvik.system.DexFile loadDex(java.lang.String, java.lang.String, int) throws java.io.IOException;
}
- public final class InMemoryDexClassLoader extends java.lang.ClassLoader {
+ public final class InMemoryDexClassLoader extends dalvik.system.BaseDexClassLoader {
ctor public InMemoryDexClassLoader(java.nio.ByteBuffer, java.lang.ClassLoader);
}
@@ -58258,7 +58366,6 @@
method public java.lang.Class<?> lookupClass();
method public int lookupModes();
method public java.lang.invoke.MethodHandleInfo revealDirect(java.lang.invoke.MethodHandle);
- method public void throwMakeAccessException(java.lang.String, java.lang.Object) throws java.lang.IllegalAccessException;
method public java.lang.invoke.MethodHandle unreflect(java.lang.reflect.Method) throws java.lang.IllegalAccessException;
method public java.lang.invoke.MethodHandle unreflectConstructor(java.lang.reflect.Constructor<?>) throws java.lang.IllegalAccessException;
method public java.lang.invoke.MethodHandle unreflectGetter(java.lang.reflect.Field) throws java.lang.IllegalAccessException;
diff --git a/api/system-removed.txt b/api/system-removed.txt
index 1ba26f5..a3093e2 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -18,25 +18,14 @@
package android.content {
public abstract class Context {
- method public deprecated android.content.Context createCredentialEncryptedStorageContext();
- method public deprecated android.content.Context createDeviceEncryptedStorageContext();
method public abstract android.content.SharedPreferences getSharedPreferences(java.io.File, int);
method public abstract java.io.File getSharedPreferencesPath(java.lang.String);
- method public deprecated boolean isCredentialEncryptedStorage();
- method public deprecated boolean isDeviceEncryptedStorage();
- method public deprecated boolean migrateDatabaseFrom(android.content.Context, java.lang.String);
- method public deprecated boolean migrateSharedPreferencesFrom(android.content.Context, java.lang.String);
}
}
package android.content.pm {
- public class ApplicationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
- field public deprecated java.lang.String credentialEncryptedDataDir;
- field public deprecated java.lang.String deviceEncryptedDataDir;
- }
-
public class ComponentInfo extends android.content.pm.PackageItemInfo {
field public deprecated boolean encryptionAware;
}
@@ -45,12 +34,6 @@
field public static final int REQUESTED_PERMISSION_REQUIRED = 1; // 0x1
}
- public abstract class PackageManager {
- field public static final deprecated int MATCH_ENCRYPTION_AWARE = 524288; // 0x80000
- field public static final deprecated int MATCH_ENCRYPTION_AWARE_AND_UNAWARE = 786432; // 0xc0000
- field public static final deprecated int MATCH_ENCRYPTION_UNAWARE = 262144; // 0x40000
- }
-
}
package android.database {
@@ -163,10 +146,6 @@
method public android.graphics.drawable.Drawable getBadgedDrawableForUser(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int);
method public android.graphics.drawable.Drawable getBadgedIconForUser(android.graphics.drawable.Drawable, android.os.UserHandle);
method public java.lang.CharSequence getBadgedLabelForUser(java.lang.CharSequence, android.os.UserHandle);
- method public deprecated boolean isUserRunningAndLocked();
- method public deprecated boolean isUserRunningAndLocked(android.os.UserHandle);
- method public deprecated boolean isUserRunningAndUnlocked();
- method public deprecated boolean isUserRunningAndUnlocked(android.os.UserHandle);
}
}
@@ -174,21 +153,16 @@
package android.os.storage {
public class StorageManager {
+ method public deprecated long getCacheQuotaBytes();
+ method public deprecated long getCacheSizeBytes();
+ method public deprecated long getExternalCacheQuotaBytes();
+ method public deprecated long getExternalCacheSizeBytes();
method public android.os.storage.StorageVolume getPrimaryVolume();
method public android.os.storage.StorageVolume[] getVolumeList();
}
}
-package android.preference {
-
- public class PreferenceManager {
- method public deprecated void setStorageCredentialEncrypted();
- method public deprecated void setStorageDeviceEncrypted();
- }
-
-}
-
package android.provider {
public class Browser {
diff --git a/api/test-current.txt b/api/test-current.txt
index 114060d..500a056 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -30,7 +30,6 @@
field public static final java.lang.String BIND_INPUT_METHOD = "android.permission.BIND_INPUT_METHOD";
field public static final java.lang.String BIND_MIDI_DEVICE_SERVICE = "android.permission.BIND_MIDI_DEVICE_SERVICE";
field public static final java.lang.String BIND_NFC_SERVICE = "android.permission.BIND_NFC_SERVICE";
- field public static final java.lang.String BIND_NOTIFICATION_ASSISTANT_SERVICE = "android.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE";
field public static final java.lang.String BIND_NOTIFICATION_LISTENER_SERVICE = "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE";
field public static final java.lang.String BIND_PRINT_SERVICE = "android.permission.BIND_PRINT_SERVICE";
field public static final java.lang.String BIND_QUICK_SETTINGS_TILE = "android.permission.BIND_QUICK_SETTINGS_TILE";
@@ -121,6 +120,7 @@
field public static final java.lang.String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES";
field public static final deprecated java.lang.String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES";
field public static final java.lang.String RESTRICTED_VR_ACCESS = "android.permission.RESTRICTED_VR_ACCESS";
+ field public static final java.lang.String RUN_IN_BACKGROUND = "android.permission.RUN_IN_BACKGROUND";
field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";
field public static final java.lang.String SEND_SMS = "android.permission.SEND_SMS";
field public static final java.lang.String SET_ALARM = "com.android.alarm.permission.SET_ALARM";
@@ -139,6 +139,7 @@
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_DATA_IN_BACKGROUND = "android.permission.USE_DATA_IN_BACKGROUND";
field public static final 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";
@@ -296,6 +297,7 @@
field public static final int authorities = 16842776; // 0x1010018
field public static final int autoAdvanceViewId = 16843535; // 0x101030f
field public static final int autoCompleteTextViewStyle = 16842859; // 0x101006b
+ field public static final int autoFillMode = 16844116; // 0x1010554
field public static final int autoLink = 16842928; // 0x10100b0
field public static final int autoMirrored = 16843754; // 0x10103ea
field public static final int autoRemoveFromRecents = 16843847; // 0x1010447
@@ -303,7 +305,7 @@
field public static final int autoSizeMinTextSize = 16844088; // 0x1010538
field public static final int autoSizePresetSizes = 16844087; // 0x1010537
field public static final int autoSizeStepGranularity = 16844086; // 0x1010536
- field public static final int autoSizeText = 16844085; // 0x1010535
+ field public static final int autoSizeTextType = 16844085; // 0x1010535
field public static final int autoStart = 16843445; // 0x10102b5
field public static final deprecated int autoText = 16843114; // 0x101016a
field public static final int autoUrlDetect = 16843404; // 0x101028c
@@ -408,6 +410,7 @@
field public static final int colorControlHighlight = 16843820; // 0x101042c
field public static final int colorControlNormal = 16843817; // 0x1010429
field public static final int colorEdgeEffect = 16843982; // 0x10104ce
+ field public static final int colorError = 16844100; // 0x1010544
field public static final int colorFocusedHighlight = 16843663; // 0x101038f
field public static final int colorForeground = 16842800; // 0x1010030
field public static final int colorForegroundInverse = 16843270; // 0x1010206
@@ -1314,7 +1317,6 @@
field public static final int textCheckMarkInverse = 16842823; // 0x1010047
field public static final int textColor = 16842904; // 0x1010098
field public static final int textColorAlertDialogListItem = 16843526; // 0x1010306
- field public static final int textColorError = 16844100; // 0x1010544
field public static final int textColorHighlight = 16842905; // 0x1010099
field public static final int textColorHighlightInverse = 16843599; // 0x101034f
field public static final int textColorHint = 16842906; // 0x101009a
@@ -3655,6 +3657,7 @@
method public void onLowMemory();
method public boolean onMenuItemSelected(int, android.view.MenuItem);
method public boolean onMenuOpened(int, android.view.Menu);
+ method public void onMovedToDisplay(int);
method public void onMultiWindowModeChanged(boolean);
method public boolean onNavigateUp();
method public boolean onNavigateUpFromChild(android.app.Activity);
@@ -4744,6 +4747,7 @@
method public abstract android.app.Fragment getPrimaryNavigationFragment();
method public void invalidateOptionsMenu();
method public abstract boolean isDestroyed();
+ method public abstract boolean isStateSaved();
method public abstract void popBackStack();
method public abstract void popBackStack(java.lang.String, int);
method public abstract void popBackStack(int, int);
@@ -6214,9 +6218,10 @@
method public void addUserRestriction(android.content.ComponentName, java.lang.String);
method public boolean bindDeviceAdminServiceAsUser(android.content.ComponentName, android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle);
method public void clearCrossProfileIntentFilters(android.content.ComponentName);
- method public void clearDeviceOwnerApp(java.lang.String);
+ method public deprecated void clearDeviceOwnerApp(java.lang.String);
method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String);
- method public void clearProfileOwner(android.content.ComponentName);
+ method public deprecated void clearProfileOwner(android.content.ComponentName);
+ method public boolean clearResetPasswordToken(android.content.ComponentName);
method public void clearUserRestriction(android.content.ComponentName, java.lang.String);
method public android.content.Intent createAdminSupportIntent(java.lang.String);
method public android.os.UserHandle createAndManageUser(android.content.ComponentName, java.lang.String, android.content.ComponentName, android.os.PersistableBundle, int);
@@ -6289,6 +6294,7 @@
method public boolean isApplicationHidden(android.content.ComponentName, java.lang.String);
method public boolean isBackupServiceEnabled(android.content.ComponentName);
method public deprecated boolean isCallerApplicationRestrictionsManagingPackage();
+ method public boolean isDefaultInputMethodSetByOwner(android.os.UserHandle);
method public boolean isDeviceManaged();
method public boolean isDeviceOwnerApp(java.lang.String);
method public boolean isLockTaskPermitted(java.lang.String);
@@ -6298,6 +6304,7 @@
method public boolean isPackageSuspended(android.content.ComponentName, java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
method public boolean isProfileOwnerApp(java.lang.String);
method public boolean isProvisioningAllowed(java.lang.String);
+ method public boolean isResetPasswordTokenActive(android.content.ComponentName);
method public boolean isSecurityLoggingEnabled(android.content.ComponentName);
method public boolean isUninstallBlocked(android.content.ComponentName, java.lang.String);
method public void lockNow();
@@ -6309,6 +6316,7 @@
method public boolean removeUser(android.content.ComponentName, android.os.UserHandle);
method public boolean requestBugreport(android.content.ComponentName);
method public boolean resetPassword(java.lang.String, int);
+ method public boolean resetPasswordWithToken(android.content.ComponentName, java.lang.String, byte[], int);
method public java.util.List<android.app.admin.NetworkEvent> retrieveNetworkLogs(android.content.ComponentName, long);
method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrievePreRebootSecurityLogs(android.content.ComponentName);
method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrieveSecurityLogs(android.content.ComponentName);
@@ -6357,6 +6365,7 @@
method public void setProfileName(android.content.ComponentName, java.lang.String);
method public void setRecommendedGlobalProxy(android.content.ComponentName, android.net.ProxyInfo);
method public void setRequiredStrongAuthTimeout(android.content.ComponentName, long);
+ method public boolean setResetPasswordToken(android.content.ComponentName, byte[]);
method public void setRestrictionsProvider(android.content.ComponentName, android.content.ComponentName);
method public void setScreenCaptureDisabled(android.content.ComponentName, boolean);
method public void setSecureSetting(android.content.ComponentName, java.lang.String, java.lang.String);
@@ -6372,6 +6381,8 @@
method public void uninstallAllUserCaCerts(android.content.ComponentName);
method public void uninstallCaCert(android.content.ComponentName, byte[]);
method public void wipeData(int);
+ field public static final java.lang.String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED";
+ field public static final java.lang.String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED";
field public static final java.lang.String ACTION_ADD_DEVICE_ADMIN = "android.app.action.ADD_DEVICE_ADMIN";
field public static final java.lang.String ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED = "android.app.action.APPLICATION_DELEGATION_SCOPES_CHANGED";
field public static final java.lang.String ACTION_DEVICE_OWNER_CHANGED = "android.app.action.DEVICE_OWNER_CHANGED";
@@ -6563,6 +6574,7 @@
public static class AssistStructure.ViewNode {
method public float getAlpha();
method public android.view.autofill.AutoFillId getAutoFillId();
+ method public java.lang.String[] getAutoFillOptions();
method public android.view.autofill.AutoFillType getAutoFillType();
method public android.view.autofill.AutoFillValue getAutoFillValue();
method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
@@ -6591,6 +6603,7 @@
method public int getTextStyle();
method public int getTop();
method public android.graphics.Matrix getTransformation();
+ method public java.lang.String getUrl();
method public int getVisibility();
method public int getWidth();
method public boolean isAccessibilityFocused();
@@ -6731,6 +6744,7 @@
method public android.app.job.JobInfo.TriggerContentUri[] getTriggerContentUris();
method public boolean isPeriodic();
method public boolean isPersisted();
+ method public boolean isRequireBatteryNotLow();
method public boolean isRequireCharging();
method public boolean isRequireDeviceIdle();
method public void writeToParcel(android.os.Parcel, int);
@@ -6757,6 +6771,7 @@
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 setRequiredNetworkType(int);
+ method public android.app.job.JobInfo.Builder setRequiresBatteryNotLow(boolean);
method public android.app.job.JobInfo.Builder setRequiresCharging(boolean);
method public android.app.job.JobInfo.Builder setRequiresDeviceIdle(boolean);
method public android.app.job.JobInfo.Builder setTransientExtras(android.os.Bundle);
@@ -6897,6 +6912,7 @@
method public long getFreeBytes(java.lang.String);
method public long getTotalBytes(java.lang.String);
method public android.app.usage.ExternalStorageStats queryExternalStatsForUser(java.lang.String, android.os.UserHandle);
+ method public android.app.usage.StorageStats queryStatsForPackage(java.lang.String, java.lang.String, android.os.UserHandle);
method public android.app.usage.StorageStats queryStatsForUid(java.lang.String, int);
method public android.app.usage.StorageStats queryStatsForUser(java.lang.String, android.os.UserHandle);
}
@@ -9056,6 +9072,7 @@
field public static final java.lang.String ACTION_CALL = "android.intent.action.CALL";
field public static final java.lang.String ACTION_CALL_BUTTON = "android.intent.action.CALL_BUTTON";
field public static final java.lang.String ACTION_CAMERA_BUTTON = "android.intent.action.CAMERA_BUTTON";
+ field public static final java.lang.String ACTION_CARRIER_SETUP = "android.intent.action.CARRIER_SETUP";
field public static final java.lang.String ACTION_CHOOSER = "android.intent.action.CHOOSER";
field public static final java.lang.String ACTION_CLEAR_PACKAGE = "android.intent.action.CLEAR_PACKAGE";
field public static final java.lang.String ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS";
@@ -9246,7 +9263,7 @@
field public static final java.lang.String EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER";
field public static final java.lang.String EXTRA_PROCESS_TEXT = "android.intent.extra.PROCESS_TEXT";
field public static final java.lang.String EXTRA_PROCESS_TEXT_READONLY = "android.intent.extra.PROCESS_TEXT_READONLY";
- field public static final java.lang.String EXTRA_QUICK_VIEW_PLAIN = "android.intent.extra.QUICK_VIEW_PLAIN";
+ field public static final java.lang.String EXTRA_QUICK_VIEW_ADVANCED = "android.intent.extra.QUICK_VIEW_ADVANCED";
field public static final java.lang.String EXTRA_QUIET_MODE = "android.intent.extra.QUIET_MODE";
field public static final java.lang.String EXTRA_REFERRER = "android.intent.extra.REFERRER";
field public static final java.lang.String EXTRA_REFERRER_NAME = "android.intent.extra.REFERRER_NAME";
@@ -10120,10 +10137,12 @@
ctor public LauncherApps.ShortcutQuery();
method public android.content.pm.LauncherApps.ShortcutQuery setActivity(android.content.ComponentName);
method public android.content.pm.LauncherApps.ShortcutQuery setChangedSince(long);
+ method public android.content.pm.LauncherApps.ShortcutQuery setIntent(android.content.Intent);
method public android.content.pm.LauncherApps.ShortcutQuery setPackage(java.lang.String);
method public android.content.pm.LauncherApps.ShortcutQuery setQueryFlags(int);
method public android.content.pm.LauncherApps.ShortcutQuery setShortcutIds(java.util.List<java.lang.String>);
field public static final int FLAG_GET_KEY_FIELDS_ONLY = 4; // 0x4
+ field public static final int FLAG_MATCH_CHOOSER = 16; // 0x10
field public static final int FLAG_MATCH_DYNAMIC = 1; // 0x1
field public static final int FLAG_MATCH_MANIFEST = 8; // 0x8
field public static final int FLAG_MATCH_PINNED = 2; // 0x2
@@ -10666,6 +10685,9 @@
method public int describeContents();
method public android.content.ComponentName getActivity();
method public java.util.Set<java.lang.String> getCategories();
+ method public android.content.ComponentName[] getChooserComponentNames();
+ method public android.os.PersistableBundle getChooserExtras();
+ method public android.content.IntentFilter[] getChooserIntentFilters();
method public java.lang.CharSequence getDisabledMessage();
method public android.os.PersistableBundle getExtras();
method public java.lang.String getId();
@@ -10678,6 +10700,7 @@
method public java.lang.CharSequence getShortLabel();
method public android.os.UserHandle getUserHandle();
method public boolean hasKeyFieldsOnly();
+ method public boolean isChooser();
method public boolean isDeclaredInManifest();
method public boolean isDynamic();
method public boolean isEnabled();
@@ -10690,9 +10713,11 @@
public static class ShortcutInfo.Builder {
ctor public ShortcutInfo.Builder(android.content.Context, java.lang.String);
+ method public android.content.pm.ShortcutInfo.Builder addChooserIntentFilter(android.content.IntentFilter, android.content.ComponentName);
method public android.content.pm.ShortcutInfo build();
method public android.content.pm.ShortcutInfo.Builder setActivity(android.content.ComponentName);
method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.Set<java.lang.String>);
+ method public android.content.pm.ShortcutInfo.Builder setChooserExtras(android.os.PersistableBundle);
method public android.content.pm.ShortcutInfo.Builder setDisabledMessage(java.lang.CharSequence);
method public android.content.pm.ShortcutInfo.Builder setExtras(android.os.PersistableBundle);
method public android.content.pm.ShortcutInfo.Builder setIcon(android.graphics.drawable.Icon);
@@ -12598,6 +12623,7 @@
method public static android.graphics.ColorSpace.Adaptation valueOf(java.lang.String);
method public static final android.graphics.ColorSpace.Adaptation[] values();
enum_constant public static final android.graphics.ColorSpace.Adaptation BRADFORD;
+ enum_constant public static final android.graphics.ColorSpace.Adaptation CIECAT02;
enum_constant public static final android.graphics.ColorSpace.Adaptation VON_KRIES;
}
@@ -13191,6 +13217,7 @@
field public static final deprecated int LA_88 = 10; // 0xa
field public static final deprecated int L_8 = 9; // 0x9
field public static final int OPAQUE = -1; // 0xffffffff
+ field public static final int RGBA_1010102 = 43; // 0x2b
field public static final deprecated int RGBA_4444 = 7; // 0x7
field public static final deprecated int RGBA_5551 = 6; // 0x6
field public static final int RGBA_8888 = 1; // 0x1
@@ -13516,6 +13543,22 @@
package android.graphics.drawable {
+ public class AdaptiveIconDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ method public void draw(android.graphics.Canvas);
+ method public android.graphics.drawable.Drawable getBackground();
+ method public static float getExtraInsetPercentage();
+ method public android.graphics.drawable.Drawable getForeground();
+ method public android.graphics.Path getIconMask();
+ method public int getOpacity();
+ method public android.graphics.Region getSafeZone();
+ method public void invalidateDrawable(android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setOpacity(int);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+ }
+
public abstract interface Animatable {
method public abstract boolean isRunning();
method public abstract void start();
@@ -13905,22 +13948,6 @@
method public void addLevel(int, int, android.graphics.drawable.Drawable);
}
- public class MaskableIconDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
- method public void draw(android.graphics.Canvas);
- method public android.graphics.drawable.Drawable getBackground();
- method public static float getExtraInsetPercentage();
- method public android.graphics.drawable.Drawable getForeground();
- method public android.graphics.Path getIconMask();
- method public int getOpacity();
- method public android.graphics.Region getSafeZone();
- method public void invalidateDrawable(android.graphics.drawable.Drawable);
- method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
- method public void setAlpha(int);
- method public void setColorFilter(android.graphics.ColorFilter);
- method public void setOpacity(int);
- method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
- }
-
public class NinePatchDrawable extends android.graphics.drawable.Drawable {
ctor public deprecated NinePatchDrawable(android.graphics.Bitmap, byte[], android.graphics.Rect, java.lang.String);
ctor public NinePatchDrawable(android.content.res.Resources, android.graphics.Bitmap, byte[], android.graphics.Rect, java.lang.String);
@@ -14034,6 +14061,8 @@
public class ArcShape extends android.graphics.drawable.shapes.RectShape {
ctor public ArcShape(float, float);
+ method public final float getStartAngle();
+ method public final float getSweepAngle();
}
public class OvalShape extends android.graphics.drawable.shapes.RectShape {
@@ -14422,6 +14451,7 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final int BLOB = 33; // 0x21
field public static final android.os.Parcelable.Creator<android.hardware.HardwareBuffer> CREATOR;
+ field public static final int RGBA_1010102 = 43; // 0x2b
field public static final int RGBA_8888 = 1; // 0x1
field public static final int RGBA_FP16 = 22; // 0x16
field public static final int RGBX_8888 = 2; // 0x2
@@ -20726,6 +20756,26 @@
field public static final int TYPE_WIRED_HEADSET = 3; // 0x3
}
+ public final class AudioFocusRequest {
+ method public boolean acceptsDelayedFocusGain();
+ method public android.media.AudioAttributes getAudioAttributes();
+ method public int getFocusGain();
+ method public android.media.AudioManager.OnAudioFocusChangeListener getOnAudioFocusChangeListener();
+ method public android.os.Handler getOnAudioFocusChangeListenerHandler();
+ method public boolean willPauseWhenDucked();
+ }
+
+ public static final class AudioFocusRequest.Builder {
+ ctor public AudioFocusRequest.Builder(int);
+ ctor public AudioFocusRequest.Builder(android.media.AudioFocusRequest);
+ method public android.media.AudioFocusRequest build();
+ method public android.media.AudioFocusRequest.Builder setAcceptsDelayedFocusGain(boolean);
+ method public android.media.AudioFocusRequest.Builder setAudioAttributes(android.media.AudioAttributes);
+ method public android.media.AudioFocusRequest.Builder setFocusGain(int);
+ method public android.media.AudioFocusRequest.Builder setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener, android.os.Handler);
+ method public android.media.AudioFocusRequest.Builder setWillPauseWhenDucked(boolean);
+ }
+
public final class AudioFormat implements android.os.Parcelable {
method public int describeContents();
method public int getChannelCount();
@@ -20802,6 +20852,7 @@
public class AudioManager {
method public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener);
+ method public int abandonAudioFocusRequest(android.media.AudioFocusRequest);
method public void adjustStreamVolume(int, int, int);
method public void adjustSuggestedStreamVolume(int, int, int);
method public void adjustVolume(int, int);
@@ -20838,6 +20889,7 @@
method public deprecated void registerRemoteControlClient(android.media.RemoteControlClient);
method public deprecated boolean registerRemoteController(android.media.RemoteController);
method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int);
+ method public int requestAudioFocus(android.media.AudioFocusRequest);
method public deprecated void setBluetoothA2dpOn(boolean);
method public void setBluetoothScoOn(boolean);
method public void setMicrophoneMute(boolean);
@@ -20880,6 +20932,8 @@
field public static final int AUDIOFOCUS_LOSS = -1; // 0xffffffff
field public static final int AUDIOFOCUS_LOSS_TRANSIENT = -2; // 0xfffffffe
field public static final int AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK = -3; // 0xfffffffd
+ field public static final int AUDIOFOCUS_NONE = 0; // 0x0
+ field public static final int AUDIOFOCUS_REQUEST_DELAYED = 2; // 0x2
field public static final int AUDIOFOCUS_REQUEST_FAILED = 0; // 0x0
field public static final int AUDIOFOCUS_REQUEST_GRANTED = 1; // 0x1
field public static final int AUDIO_SESSION_ID_GENERATE = 0; // 0x0
@@ -21076,13 +21130,14 @@
field public long nanoTime;
}
- public class AudioTrack implements android.media.AudioRouting {
+ public class AudioTrack implements android.media.AudioRouting android.media.VolumeAutomation {
ctor public deprecated AudioTrack(int, int, int, int, int, int) throws java.lang.IllegalArgumentException;
ctor public deprecated AudioTrack(int, int, int, int, int, int, int) throws java.lang.IllegalArgumentException;
ctor public AudioTrack(android.media.AudioAttributes, android.media.AudioFormat, int, int, int) throws java.lang.IllegalArgumentException;
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
method public deprecated void addOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener, android.os.Handler);
method public int attachAuxEffect(int);
+ method public android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
method public void flush();
method public int getAudioFormat();
method public int getAudioSessionId();
@@ -21550,8 +21605,42 @@
field public static final int STOP_VIDEO_RECORDING = 3; // 0x3
}
+ public final class MediaCas {
+ ctor public MediaCas(int) throws android.media.UnsupportedCasException;
+ method public void closeSession(byte[]);
+ method public static android.media.MediaCas.PluginDescriptor[] enumeratePlugins();
+ method public static boolean isSystemIdSupported(int);
+ method public byte[] openSession(int);
+ method public byte[] openSession(int, int);
+ method public void processEcm(byte[], byte[], int, int);
+ method public void processEcm(byte[], byte[]);
+ method public void processEmm(byte[], int, int);
+ method public void processEmm(byte[]);
+ method public void provision(java.lang.String);
+ method public void refreshEntitlements(int, byte[]);
+ method public void release();
+ method public void sendEvent(int, int, byte[]);
+ method public void setEventListener(android.media.MediaCas.EventListener, android.os.Handler);
+ method public void setPrivateData(byte[]);
+ method public void setSessionPrivateData(byte[], byte[]);
+ }
+
+ public static abstract interface MediaCas.EventListener {
+ method public abstract void onEvent(android.media.MediaCas, int, int, byte[]);
+ }
+
+ public static class MediaCas.PluginDescriptor {
+ method public java.lang.String getName();
+ method public int getSystemId();
+ }
+
+ public class MediaCasException extends java.lang.Exception {
+ ctor public MediaCasException(java.lang.String);
+ }
+
public final class MediaCodec {
method public void configure(android.media.MediaFormat, android.view.Surface, android.media.MediaCrypto, int);
+ method public void configure(android.media.MediaFormat, android.view.Surface, int, android.media.MediaDescrambler);
method public static android.media.MediaCodec createByCodecName(java.lang.String) throws java.io.IOException;
method public static android.media.MediaCodec createDecoderByType(java.lang.String) throws java.io.IOException;
method public static android.media.MediaCodec createEncoderByType(java.lang.String) throws java.io.IOException;
@@ -21591,6 +21680,7 @@
field public static final int BUFFER_FLAG_CODEC_CONFIG = 2; // 0x2
field public static final int BUFFER_FLAG_END_OF_STREAM = 4; // 0x4
field public static final int BUFFER_FLAG_KEY_FRAME = 1; // 0x1
+ field public static final int BUFFER_FLAG_PARTIAL_FRAME = 8; // 0x8
field public static final deprecated int BUFFER_FLAG_SYNC_FRAME = 1; // 0x1
field public static final int CONFIGURE_FLAG_ENCODE = 1; // 0x1
field public static final int CRYPTO_MODE_AES_CBC = 2; // 0x2
@@ -21747,6 +21837,7 @@
field public static final deprecated int COLOR_TI_FormatYUV420PackedSemiPlanar = 2130706688; // 0x7f000100
field public static final java.lang.String FEATURE_AdaptivePlayback = "adaptive-playback";
field public static final java.lang.String FEATURE_IntraRefresh = "intra-refresh";
+ field public static final java.lang.String FEATURE_PartialFrame = "partial-frame";
field public static final java.lang.String FEATURE_SecurePlayback = "secure-playback";
field public static final java.lang.String FEATURE_TunneledPlayback = "tunneled-playback";
field public int[] colorFormats;
@@ -21971,6 +22062,14 @@
method public abstract int readAt(long, byte[], int, int) throws java.io.IOException;
}
+ public final class MediaDescrambler {
+ ctor public MediaDescrambler(int) throws android.media.UnsupportedCasException;
+ method public final int descramble(java.nio.ByteBuffer, int, java.nio.ByteBuffer, int, android.media.MediaCodec.CryptoInfo);
+ method public final void release();
+ method public final boolean requiresSecureDecoderComponent(java.lang.String);
+ method public final void setMediaCasSession(byte[]);
+ }
+
public class MediaDescription implements android.os.Parcelable {
method public int describeContents();
method public java.lang.CharSequence getDescription();
@@ -22127,8 +22226,10 @@
method public final void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public final void setDataSource(java.io.FileDescriptor) throws java.io.IOException;
method public final void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException;
+ method public final void setMediaCas(android.media.MediaCas);
method public void unselectTrack(int);
field public static final int SAMPLE_FLAG_ENCRYPTED = 2; // 0x2
+ field public static final int SAMPLE_FLAG_PARTIAL_FRAME = 4; // 0x4
field public static final int SAMPLE_FLAG_SYNC = 1; // 0x1
field public static final int SEEK_TO_CLOSEST_SYNC = 2; // 0x2
field public static final int SEEK_TO_NEXT_SYNC = 1; // 0x1
@@ -22194,6 +22295,7 @@
field public static final java.lang.String KEY_IS_FORCED_SUBTITLE = "is-forced-subtitle";
field public static final java.lang.String KEY_I_FRAME_INTERVAL = "i-frame-interval";
field public static final java.lang.String KEY_LANGUAGE = "language";
+ field public static final java.lang.String KEY_LATENCY = "latency";
field public static final java.lang.String KEY_LEVEL = "level";
field public static final java.lang.String KEY_MAX_HEIGHT = "max-height";
field public static final java.lang.String KEY_MAX_INPUT_SIZE = "max-input-size";
@@ -22225,6 +22327,7 @@
field public static final java.lang.String MIMETYPE_AUDIO_OPUS = "audio/opus";
field public static final java.lang.String MIMETYPE_AUDIO_QCELP = "audio/qcelp";
field public static final java.lang.String MIMETYPE_AUDIO_RAW = "audio/raw";
+ field public static final java.lang.String MIMETYPE_AUDIO_SCRAMBLED = "audio/scrambled";
field public static final java.lang.String MIMETYPE_AUDIO_VORBIS = "audio/vorbis";
field public static final java.lang.String MIMETYPE_TEXT_CEA_608 = "text/cea-608";
field public static final java.lang.String MIMETYPE_TEXT_VTT = "text/vtt";
@@ -22235,6 +22338,7 @@
field public static final java.lang.String MIMETYPE_VIDEO_MPEG2 = "video/mpeg2";
field public static final java.lang.String MIMETYPE_VIDEO_MPEG4 = "video/mp4v-es";
field public static final java.lang.String MIMETYPE_VIDEO_RAW = "video/raw";
+ field public static final java.lang.String MIMETYPE_VIDEO_SCRAMBLED = "video/scrambled";
field public static final java.lang.String MIMETYPE_VIDEO_VP8 = "video/x-vnd.on2.vp8";
field public static final java.lang.String MIMETYPE_VIDEO_VP9 = "video/x-vnd.on2.vp9";
}
@@ -22375,7 +22479,7 @@
field public static final int MUXER_OUTPUT_WEBM = 1; // 0x1
}
- public class MediaPlayer {
+ public class MediaPlayer implements android.media.VolumeAutomation {
ctor public MediaPlayer();
method public void addTimedTextSource(java.lang.String, java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void addTimedTextSource(android.content.Context, android.net.Uri, java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
@@ -22387,6 +22491,7 @@
method public static android.media.MediaPlayer create(android.content.Context, android.net.Uri, android.view.SurfaceHolder, android.media.AudioAttributes, int);
method public static android.media.MediaPlayer create(android.content.Context, int);
method public static android.media.MediaPlayer create(android.content.Context, int, android.media.AudioAttributes, int);
+ method public android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
method public void deselectTrack(int) throws java.lang.IllegalStateException;
method public int getAudioSessionId();
method public android.media.BufferingParams getBufferingParams();
@@ -22409,7 +22514,7 @@
method public void pause() throws java.lang.IllegalStateException;
method public void prepare() throws java.io.IOException, java.lang.IllegalStateException;
method public void prepareAsync() throws java.lang.IllegalStateException;
- method public void prepareDrm(java.util.UUID, android.media.MediaPlayer.OnDrmConfigCallback) throws android.media.MediaPlayer.ProvisioningErrorException, android.media.ResourceBusyException, android.media.UnsupportedSchemeException;
+ method public void prepareDrm(java.util.UUID) throws android.media.MediaPlayer.ProvisioningErrorException, android.media.ResourceBusyException, android.media.UnsupportedSchemeException;
method public byte[] provideKeyResponse(byte[], byte[]) throws android.media.DeniedByServerException, android.media.MediaPlayer.NoDrmSchemeException;
method public void release();
method public void releaseDrm() throws android.media.MediaPlayer.NoDrmSchemeException;
@@ -22424,6 +22529,7 @@
method public void setAuxEffectSendLevel(float);
method public void setBufferingParams(android.media.BufferingParams);
method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
+ method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>, java.util.List<java.net.HttpCookie>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
method public void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
@@ -22436,6 +22542,7 @@
method public void setNextMediaPlayer(android.media.MediaPlayer);
method public void setOnBufferingUpdateListener(android.media.MediaPlayer.OnBufferingUpdateListener);
method public void setOnCompletionListener(android.media.MediaPlayer.OnCompletionListener);
+ method public void setOnDrmConfigListener(android.media.MediaPlayer.OnDrmConfigListener);
method public void setOnDrmInfoListener(android.media.MediaPlayer.OnDrmInfoListener);
method public void setOnDrmInfoListener(android.media.MediaPlayer.OnDrmInfoListener, android.os.Handler);
method public void setOnDrmPreparedListener(android.media.MediaPlayer.OnDrmPreparedListener);
@@ -22500,9 +22607,8 @@
method public abstract void onCompletion(android.media.MediaPlayer);
}
- public static abstract class MediaPlayer.OnDrmConfigCallback {
- ctor public MediaPlayer.OnDrmConfigCallback();
- method public void onDrmConfig(android.media.MediaPlayer);
+ public static abstract interface MediaPlayer.OnDrmConfigListener {
+ method public abstract void onDrmConfig(android.media.MediaPlayer);
}
public static abstract interface MediaPlayer.OnDrmInfoListener {
@@ -22563,6 +22669,7 @@
ctor public MediaRecorder();
method public static final int getAudioSourceMax();
method public int getMaxAmplitude() throws java.lang.IllegalStateException;
+ method public android.os.Bundle getMetrics();
method public android.view.Surface getSurface();
method public void pause() throws java.lang.IllegalStateException;
method public void prepare() throws java.io.IOException, java.lang.IllegalStateException;
@@ -23204,10 +23311,18 @@
field public static final int TONE_SUP_RINGTONE = 23; // 0x17
}
+ public final class UnsupportedCasException extends android.media.MediaCasException {
+ ctor public UnsupportedCasException(java.lang.String);
+ }
+
public final class UnsupportedSchemeException extends android.media.MediaDrmException {
ctor public UnsupportedSchemeException(java.lang.String);
}
+ public abstract interface VolumeAutomation {
+ method public abstract android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
+ }
+
public abstract class VolumeProvider {
ctor public VolumeProvider(int, int, int);
method public final int getCurrentVolume();
@@ -23221,6 +23336,53 @@
field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
}
+ public final class VolumeShaper implements java.lang.AutoCloseable {
+ method public void apply(android.media.VolumeShaper.Operation);
+ method public void close();
+ method public float getVolume();
+ method public void replace(android.media.VolumeShaper.Configuration, android.media.VolumeShaper.Operation, boolean);
+ }
+
+ public static final class VolumeShaper.Configuration implements android.os.Parcelable {
+ method public int describeContents();
+ method public double getDurationMs();
+ method public int getInterpolatorType();
+ method public static int getMaximumCurvePoints();
+ method public float[] getTimes();
+ method public float[] getVolumes();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.media.VolumeShaper.Configuration> CREATOR;
+ field public static final android.media.VolumeShaper.Configuration CUBIC_RAMP;
+ field public static final int INTERPOLATOR_TYPE_CUBIC = 2; // 0x2
+ field public static final int INTERPOLATOR_TYPE_CUBIC_MONOTONIC = 3; // 0x3
+ field public static final int INTERPOLATOR_TYPE_LINEAR = 1; // 0x1
+ field public static final int INTERPOLATOR_TYPE_STEP = 0; // 0x0
+ field public static final android.media.VolumeShaper.Configuration LINEAR_RAMP;
+ field public static final android.media.VolumeShaper.Configuration SCURVE_RAMP;
+ field public static final android.media.VolumeShaper.Configuration SINE_RAMP;
+ }
+
+ public static final class VolumeShaper.Configuration.Builder {
+ ctor public VolumeShaper.Configuration.Builder();
+ ctor public VolumeShaper.Configuration.Builder(android.media.VolumeShaper.Configuration);
+ method public android.media.VolumeShaper.Configuration build();
+ method public android.media.VolumeShaper.Configuration.Builder invertVolumes();
+ method public android.media.VolumeShaper.Configuration.Builder reflectTimes();
+ method public android.media.VolumeShaper.Configuration.Builder scaleToEndVolume(float);
+ method public android.media.VolumeShaper.Configuration.Builder scaleToStartVolume(float);
+ method public android.media.VolumeShaper.Configuration.Builder setCurve(float[], float[]);
+ method public android.media.VolumeShaper.Configuration.Builder setDurationMs(double);
+ method public android.media.VolumeShaper.Configuration.Builder setInterpolatorType(int);
+ }
+
+ public static final class VolumeShaper.Operation 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.media.VolumeShaper.Operation> CREATOR;
+ field public static final android.media.VolumeShaper.Operation PLAY;
+ field public static final android.media.VolumeShaper.Operation REVERSE;
+ }
+
}
package android.media.audiofx {
@@ -24057,6 +24219,9 @@
method public static final android.net.Uri buildChannelUriForPassthroughInput(java.lang.String);
method public static final android.net.Uri buildChannelsUriForInput(java.lang.String);
method public static final java.lang.String buildInputId(android.content.ComponentName);
+ method public static final android.net.Uri buildPreviewProgramUri(long);
+ method public static final android.net.Uri buildPreviewProgramsUriForChannel(long);
+ method public static final android.net.Uri buildPreviewProgramsUriForChannel(android.net.Uri);
method public static final android.net.Uri buildProgramUri(long);
method public static final android.net.Uri buildProgramsUriForChannel(long);
method public static final android.net.Uri buildProgramsUriForChannel(android.net.Uri);
@@ -24115,6 +24280,7 @@
field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
field public static final java.lang.String COLUMN_NETWORK_AFFILIATION = "network_affiliation";
field public static final java.lang.String COLUMN_ORIGINAL_NETWORK_ID = "original_network_id";
field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
@@ -24177,7 +24343,7 @@
field public static final java.lang.String CONTENT_DIRECTORY = "logo";
}
- public static final class TvContract.Programs implements android.media.tv.TvContract.BaseProgramColumns {
+ public static final class TvContract.PreviewPrograms implements android.media.tv.TvContract.BaseProgramColumns {
field public static final java.lang.String ASPECT_RATIO_16_9 = "ASPECT_RATIO_16_9";
field public static final java.lang.String ASPECT_RATIO_1_1 = "ASPECT_RATIO_1_1";
field public static final java.lang.String ASPECT_RATIO_2_3 = "ASPECT_RATIO_2_3";
@@ -24188,10 +24354,8 @@
field public static final java.lang.String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri";
field public static final java.lang.String COLUMN_AUTHOR = "author";
field public static final java.lang.String COLUMN_AVAILABILITY = "availability";
- field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+ field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
field public static final java.lang.String COLUMN_DURATION_MILLIS = "duration_millis";
- field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
- field public static final deprecated java.lang.String COLUMN_EPISODE_NUMBER = "episode_number";
field public static final java.lang.String COLUMN_INTERACTION_COUNT = "interaction_count";
field public static final java.lang.String COLUMN_INTERACTION_TYPE = "interaction_type";
field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
@@ -24202,19 +24366,16 @@
field public static final java.lang.String COLUMN_OFFER_PRICE = "offer_price";
field public static final java.lang.String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
field public static final java.lang.String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
- field public static final java.lang.String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
field public static final java.lang.String COLUMN_RELEASE_DATE = "release_date";
field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
- field public static final deprecated java.lang.String COLUMN_SEASON_NUMBER = "season_number";
field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
- field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
field public static final java.lang.String COLUMN_TYPE = "type";
field public static final java.lang.String COLUMN_WATCH_NEXT_TYPE = "watch_next_type";
field public static final java.lang.String COLUMN_WEIGHT = "weight";
- field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/program";
- field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/program";
+ field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/preview_program";
+ field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/preview_program";
field public static final android.net.Uri CONTENT_URI;
field public static final java.lang.String INTERACTION_TYPE_FANS = "INTERACTION_TYPE_FANS";
field public static final java.lang.String INTERACTION_TYPE_FOLLOWERS = "INTERACTION_TYPE_FOLLOWERS";
@@ -24243,6 +24404,18 @@
field public static final java.lang.String WATCH_NEXT_TYPE_NEXT = "WATCH_NEXT_TYPE_NEXT";
}
+ public static final class TvContract.Programs implements android.media.tv.TvContract.BaseProgramColumns {
+ field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+ field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+ field public static final deprecated java.lang.String COLUMN_EPISODE_NUMBER = "episode_number";
+ field public static final java.lang.String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
+ field public static final deprecated java.lang.String COLUMN_SEASON_NUMBER = "season_number";
+ field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+ field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/program";
+ field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/program";
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
public static final class TvContract.Programs.Genres {
method public static java.lang.String[] decode(java.lang.String);
method public static java.lang.String encode(java.lang.String...);
@@ -24331,11 +24504,13 @@
field public static final java.lang.String ACTION_BLOCKED_RATINGS_CHANGED = "android.media.tv.action.BLOCKED_RATINGS_CHANGED";
field public static final java.lang.String ACTION_MAKE_CHANNEL_BROWSABLE = "android.media.tv.action.MAKE_CHANNEL_BROWSABLE";
field public static final java.lang.String ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED = "android.media.tv.action.PARENTAL_CONTROLS_ENABLED_CHANGED";
+ field public static final java.lang.String ACTION_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.PROGRAM_BROWSABLE_DISABLED";
field public static final java.lang.String ACTION_QUERY_CONTENT_RATING_SYSTEMS = "android.media.tv.action.QUERY_CONTENT_RATING_SYSTEMS";
field public static final java.lang.String ACTION_SETUP_INPUTS = "android.media.tv.action.SETUP_INPUTS";
field public static final java.lang.String ACTION_VIEW_RECORDING_SCHEDULES = "android.media.tv.action.VIEW_RECORDING_SCHEDULES";
field public static final java.lang.String EXTRA_CHANNEL_ID = "android.media.tv.extra.CHANNEL_ID";
field public static final java.lang.String EXTRA_PACKAGE_NAME = "android.media.tv.extra.PACKAGE_NAME";
+ field public static final java.lang.String EXTRA_PROGRAM_ID = "android.media.tv.extra.PROGRAM_ID";
field public static final int INPUT_STATE_CONNECTED = 0; // 0x0
field public static final int INPUT_STATE_CONNECTED_STANDBY = 1; // 0x1
field public static final int INPUT_STATE_DISCONNECTED = 2; // 0x2
@@ -26087,8 +26262,6 @@
public class DiscoverySession {
method public java.lang.String createNetworkSpecifier(android.net.wifi.aware.PeerHandle, byte[]);
method public void destroy();
- method public static int getMaxSendRetryCount();
- method public void sendMessage(android.net.wifi.aware.PeerHandle, int, byte[], int);
method public void sendMessage(android.net.wifi.aware.PeerHandle, int, byte[]);
}
@@ -31346,10 +31519,8 @@
method public void allocateBytes(java.io.File, long, int) throws java.io.IOException;
method public void allocateBytes(java.io.FileDescriptor, long, int) throws java.io.IOException;
method public long getAllocatableBytes(java.io.File, int) throws java.io.IOException;
- method public long getCacheQuotaBytes();
- method public long getCacheSizeBytes();
- method public long getExternalCacheQuotaBytes();
- method public long getExternalCacheSizeBytes();
+ method public long getCacheQuotaBytes(java.io.File);
+ method public long getCacheSizeBytes(java.io.File);
method public java.lang.String getMountedObbPath(java.lang.String);
method public android.os.storage.StorageVolume getPrimaryStorageVolume();
method public android.os.storage.StorageVolume getStorageVolume(java.io.File);
@@ -33795,6 +33966,7 @@
field public static final int FLAG_SUPPORTS_IS_CHILD = 16; // 0x10
field public static final int FLAG_SUPPORTS_RECENTS = 4; // 0x4
field public static final int FLAG_SUPPORTS_SEARCH = 8; // 0x8
+ field public static final java.lang.String MIME_TYPE_ITEM = "vnd.android.document/root";
}
public abstract class DocumentsProvider extends android.content.ContentProvider {
@@ -34361,7 +34533,7 @@
method public static final deprecated void setLocationProviderEnabled(android.content.ContentResolver, java.lang.String, boolean);
field public static final java.lang.String ACCESSIBILITY_DISPLAY_INVERSION_ENABLED = "accessibility_display_inversion_enabled";
field public static final java.lang.String ACCESSIBILITY_ENABLED = "accessibility_enabled";
- field public static final java.lang.String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password";
+ field public static final deprecated java.lang.String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password";
field public static final deprecated java.lang.String ADB_ENABLED = "adb_enabled";
field public static final java.lang.String ALLOWED_GEOLOCATION_ORIGINS = "allowed_geolocation_origins";
field public static final deprecated java.lang.String ALLOW_MOCK_LOCATION = "mock_location";
@@ -36357,7 +36529,7 @@
}
public static final class Dataset.Builder {
- ctor public Dataset.Builder(java.lang.CharSequence);
+ ctor public Dataset.Builder(android.widget.RemoteViews);
method public android.service.autofill.Dataset build();
method public android.service.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
@@ -36377,10 +36549,10 @@
public static final class FillResponse.Builder {
ctor public FillResponse.Builder();
method public android.service.autofill.FillResponse.Builder addDataset(android.service.autofill.Dataset);
- method public android.service.autofill.FillResponse.Builder addSavableFields(android.view.autofill.AutoFillId...);
method public android.service.autofill.FillResponse build();
- method public android.service.autofill.FillResponse.Builder setAuthentication(android.content.IntentSender);
+ method public android.service.autofill.FillResponse.Builder setAuthentication(android.content.IntentSender, android.widget.RemoteViews);
method public android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle);
+ method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo);
}
public final class SaveCallback {
@@ -36388,6 +36560,23 @@
method public void onSuccess();
}
+ public final class SaveInfo 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.service.autofill.SaveInfo> CREATOR;
+ field public static final int SAVE_DATA_TYPE_ADDRESS = 2; // 0x2
+ field public static final int SAVE_DATA_TYPE_CREDIT_CARD = 3; // 0x3
+ field public static final int SAVE_DATA_TYPE_GENERIC = 0; // 0x0
+ field public static final int SAVE_DATA_TYPE_PASSWORD = 1; // 0x1
+ }
+
+ public static final class SaveInfo.Builder {
+ ctor public SaveInfo.Builder(int);
+ method public android.service.autofill.SaveInfo.Builder addSavableIds(android.view.autofill.AutoFillId...);
+ method public android.service.autofill.SaveInfo build();
+ method public android.service.autofill.SaveInfo.Builder setDescription(java.lang.CharSequence);
+ }
+
}
package android.service.carrier {
@@ -38035,9 +38224,11 @@
method public android.telecom.Call.Details getDetails();
method public android.telecom.Call getParent();
method public java.lang.String getRemainingPostDialSequence();
+ method public android.telecom.Call.RttCall getRttCall();
method public int getState();
method public android.telecom.InCallService.VideoCall getVideoCall();
method public void hold();
+ method public boolean isRttActive();
method public void mergeConference();
method public void phoneAccountSelected(android.telecom.PhoneAccountHandle, boolean);
method public void playDtmfTone(char);
@@ -38049,9 +38240,12 @@
method public void reject(boolean, java.lang.String);
method public final void removeExtras(java.util.List<java.lang.String>);
method public final void removeExtras(java.lang.String...);
+ method public void respondToRttRequest(int, boolean);
method public void sendCallEvent(java.lang.String, android.os.Bundle);
+ method public void sendRttRequest();
method public void splitFromConference();
method public void stopDtmfTone();
+ method public void stopRtt();
method public void swapConference();
method public void unhold();
method public void unregisterCallback(android.telecom.Call.Callback);
@@ -38079,6 +38273,9 @@
method public void onDetailsChanged(android.telecom.Call, android.telecom.Call.Details);
method public void onParentChanged(android.telecom.Call, android.telecom.Call);
method public void onPostDialWait(android.telecom.Call, java.lang.String);
+ method public void onRttModeChanged(android.telecom.Call, int);
+ method public void onRttRequest(android.telecom.Call, int);
+ method public void onRttStatusChanged(android.telecom.Call, boolean, android.telecom.Call.RttCall);
method public void onStateChanged(android.telecom.Call, int);
method public void onVideoCallChanged(android.telecom.Call, android.telecom.InCallService.VideoCall);
}
@@ -38132,6 +38329,19 @@
field public static final int PROPERTY_WIFI = 8; // 0x8
}
+ public static final class Call.RttCall {
+ method public int getRttAudioMode();
+ method public java.lang.String read();
+ method public void setRttMode(int);
+ method public void write(java.lang.String) throws java.io.IOException;
+ field public static final int RTT_MODE_FULL = 1; // 0x1
+ field public static final int RTT_MODE_HCO = 2; // 0x2
+ field public static final int RTT_MODE_VCO = 3; // 0x3
+ }
+
+ public static abstract class Call.RttCall.RttAudioMode implements java.lang.annotation.Annotation {
+ }
+
public final class CallAudioState implements android.os.Parcelable {
ctor public CallAudioState(boolean, int, int);
method public static java.lang.String audioRouteToString(int);
@@ -38503,6 +38713,7 @@
field public static final int CAPABILITY_CALL_SUBJECT = 64; // 0x40
field public static final int CAPABILITY_CONNECTION_MANAGER = 1; // 0x1
field public static final int CAPABILITY_PLACE_EMERGENCY_CALLS = 16; // 0x10
+ field public static final int CAPABILITY_RTT = 4096; // 0x1000
field public static final int CAPABILITY_SELF_MANAGED = 2048; // 0x800
field public static final int CAPABILITY_SIM_SUBSCRIPTION = 4; // 0x4
field public static final int CAPABILITY_SUPPORTS_VIDEO_CALLING = 1024; // 0x400
@@ -38715,6 +38926,7 @@
field public static final java.lang.String EXTRA_NOTIFICATION_PHONE_NUMBER = "android.telecom.extra.NOTIFICATION_PHONE_NUMBER";
field public static final java.lang.String EXTRA_OUTGOING_CALL_EXTRAS = "android.telecom.extra.OUTGOING_CALL_EXTRAS";
field public static final java.lang.String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telecom.extra.PHONE_ACCOUNT_HANDLE";
+ field public static final java.lang.String EXTRA_START_CALL_WITH_RTT = "android.telecom.extra.START_CALL_WITH_RTT";
field public static final java.lang.String EXTRA_START_CALL_WITH_SPEAKERPHONE = "android.telecom.extra.START_CALL_WITH_SPEAKERPHONE";
field public static final java.lang.String EXTRA_START_CALL_WITH_VIDEO_STATE = "android.telecom.extra.START_CALL_WITH_VIDEO_STATE";
field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS";
@@ -39458,6 +39670,8 @@
method public boolean setOperatorBrandOverride(java.lang.String);
method public boolean setPreferredNetworkTypeToGlobal();
method public boolean setVoiceMailNumber(java.lang.String, java.lang.String);
+ method public void setVoicemailRingtoneUri(android.telecom.PhoneAccountHandle, android.net.Uri);
+ method public void setVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle, boolean);
field public static final java.lang.String ACTION_CONFIGURE_VOICEMAIL = "android.telephony.action.CONFIGURE_VOICEMAIL";
field public static final java.lang.String ACTION_PHONE_STATE_CHANGED = "android.intent.action.PHONE_STATE";
field public static final java.lang.String ACTION_RESPOND_VIA_MESSAGE = "android.intent.action.RESPOND_VIA_MESSAGE";
@@ -40288,7 +40502,7 @@
package android.test.suitebuilder {
- public class TestMethod {
+ public deprecated class TestMethod {
ctor public TestMethod(java.lang.reflect.Method, java.lang.Class<? extends junit.framework.TestCase>);
ctor public TestMethod(java.lang.String, java.lang.Class<? extends junit.framework.TestCase>);
ctor public TestMethod(junit.framework.TestCase);
@@ -40299,7 +40513,7 @@
method public java.lang.String getName();
}
- public class TestSuiteBuilder {
+ public deprecated class TestSuiteBuilder {
ctor public TestSuiteBuilder(java.lang.Class);
ctor public TestSuiteBuilder(java.lang.String, java.lang.ClassLoader);
method public android.test.suitebuilder.TestSuiteBuilder addRequirements(java.util.List<com.android.internal.util.Predicate<android.test.suitebuilder.TestMethod>>);
@@ -40312,7 +40526,7 @@
method public android.test.suitebuilder.TestSuiteBuilder named(java.lang.String);
}
- public static class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
+ public static deprecated class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
ctor public TestSuiteBuilder.FailedToCreateTests(java.lang.Exception);
method public void testSuiteConstructionFailed();
}
@@ -42528,30 +42742,51 @@
method public abstract void setValue(T, float);
}
- public final class Half {
+ public final class Half extends java.lang.Number implements java.lang.Comparable {
+ ctor public Half(short);
+ ctor public Half(float);
+ ctor public Half(double);
+ ctor public Half(java.lang.String) throws java.lang.NumberFormatException;
method public static short abs(short);
method public static short ceil(short);
+ method public static int compare(short, short);
+ method public int compareTo(android.util.Half);
method public static short copySign(short, short);
+ method public double doubleValue();
method public static boolean equals(short, short);
+ method public float floatValue();
method public static short floor(short);
method public static int getExponent(short);
method public static int getSign(short);
method public static int getSignificand(short);
method public static boolean greater(short, short);
method public static boolean greaterEquals(short, short);
+ method public static int halfToIntBits(short);
+ method public static int halfToRawIntBits(short);
+ method public static short halfToShortBits(short);
+ method public short halfValue();
+ method public static int hashCode(short);
+ method public static short intBitsToHalf(int);
+ method public int intValue();
method public static boolean isInfinite(short);
+ method public boolean isNaN();
method public static boolean isNaN(short);
method public static boolean isNormalized(short);
method public static boolean less(short, short);
method public static boolean lessEquals(short, short);
+ method public long longValue();
method public static short max(short, short);
method public static short min(short, short);
+ method public static short parseHalf(java.lang.String) throws java.lang.NumberFormatException;
method public static short round(short);
method public static float toFloat(short);
+ method public static short toHalf(float);
method public static java.lang.String toHexString(short);
method public static java.lang.String toString(short);
method public static short trunc(short);
- method public static short valueOf(float);
+ method public static android.util.Half valueOf(short);
+ method public static android.util.Half valueOf(float);
+ method public static android.util.Half valueOf(java.lang.String);
field public static final short EPSILON = 5120; // 0x1400
field public static final short LOWEST_VALUE = -1025; // 0xfffffbff
field public static final int MAX_EXPONENT = 15; // 0xf
@@ -43440,11 +43675,13 @@
field public static final int DRAW_DURATION = 4; // 0x4
field public static final int FIRST_DRAW_FRAME = 9; // 0x9
field public static final int INPUT_HANDLING_DURATION = 1; // 0x1
+ field public static final int INTENDED_VSYNC_TIMESTAMP = 10; // 0xa
field public static final int LAYOUT_MEASURE_DURATION = 3; // 0x3
field public static final int SWAP_BUFFERS_DURATION = 7; // 0x7
field public static final int SYNC_DURATION = 5; // 0x5
field public static final int TOTAL_DURATION = 8; // 0x8
field public static final int UNKNOWN_DELAY_DURATION = 0; // 0x0
+ field public static final int VSYNC_TIMESTAMP = 11; // 0xb
}
public abstract class FrameStats {
@@ -43612,6 +43849,7 @@
field public static final int SOURCE_KEYBOARD = 257; // 0x101
field public static final int SOURCE_MOUSE = 8194; // 0x2002
field public static final int SOURCE_MOUSE_RELATIVE = 131076; // 0x20004
+ field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
field public static final int SOURCE_STYLUS = 16386; // 0x4002
field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
@@ -44410,6 +44648,7 @@
field public static final int AXIS_RX = 12; // 0xc
field public static final int AXIS_RY = 13; // 0xd
field public static final int AXIS_RZ = 14; // 0xe
+ field public static final int AXIS_SCROLL = 26; // 0x1a
field public static final int AXIS_SIZE = 3; // 0x3
field public static final int AXIS_THROTTLE = 19; // 0x13
field public static final int AXIS_TILT = 25; // 0x19
@@ -44817,8 +45056,8 @@
method public void drawableHotspotChanged(float, float);
method protected void drawableStateChanged();
method public android.view.View findFocus();
- method public final android.view.View findViewById(int);
- method public final android.view.View findViewWithTag(java.lang.Object);
+ method public final <T extends android.view.View> T findViewById(int);
+ method public final <T extends android.view.View> T findViewWithTag(java.lang.Object);
method public void findViewsWithText(java.util.ArrayList<android.view.View>, java.lang.CharSequence, int);
method protected deprecated boolean fitSystemWindows(android.graphics.Rect);
method public android.view.View focusSearch(int);
@@ -44833,6 +45072,7 @@
method public float getAlpha();
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
+ method public int getAutoFillMode();
method public android.view.autofill.AutoFillType getAutoFillType();
method public android.view.autofill.AutoFillValue getAutoFillValue();
method public android.graphics.drawable.Drawable getBackground();
@@ -44947,7 +45187,7 @@
method public java.lang.Object getTag(int);
method public int getTextAlignment();
method public int getTextDirection();
- method public final java.lang.CharSequence getTooltipText();
+ method public java.lang.CharSequence getTooltipText();
method public android.view.View getTooltipView();
method public final int getTop();
method protected float getTopFadingEdgeStrength();
@@ -45073,6 +45313,7 @@
method public boolean onKeyUp(int, android.view.KeyEvent);
method protected void onLayout(boolean, int, int, int, int);
method protected void onMeasure(int, int);
+ method public void onMovedToDisplay(int);
method protected void onOverScrolled(int, int, boolean, boolean);
method public void onPointerCaptureChange(boolean);
method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
@@ -45135,6 +45376,8 @@
method public static int resolveSize(int, int);
method public static int resolveSizeAndState(int, int, int);
method public boolean restoreDefaultFocus();
+ method public boolean restoreFocusInCluster(int);
+ method public boolean restoreFocusNotInCluster();
method public void restoreHierarchyState(android.util.SparseArray<android.os.Parcelable>);
method public void saveHierarchyState(android.util.SparseArray<android.os.Parcelable>);
method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
@@ -45149,6 +45392,7 @@
method public void setActivated(boolean);
method public void setAlpha(float);
method public void setAnimation(android.view.animation.Animation);
+ method public void setAutoFillMode(int);
method public void setBackground(android.graphics.drawable.Drawable);
method public void setBackgroundColor(int);
method public deprecated void setBackgroundDrawable(android.graphics.drawable.Drawable);
@@ -45254,7 +45498,7 @@
method public void setTag(int, java.lang.Object);
method public void setTextAlignment(int);
method public void setTextDirection(int);
- method public final void setTooltipText(java.lang.CharSequence);
+ method public void setTooltipText(java.lang.CharSequence);
method public final void setTop(int);
method public void setTouchDelegate(android.view.TouchDelegate);
method public final void setTransitionName(java.lang.String);
@@ -45289,6 +45533,9 @@
field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
+ field public static final int AUTO_FILL_MODE_AUTO = 1; // 0x1
+ field public static final int AUTO_FILL_MODE_INHERIT = 0; // 0x0
+ field public static final int AUTO_FILL_MODE_MANUAL = 2; // 0x2
field public static final int DRAG_FLAG_GLOBAL = 256; // 0x100
field public static final int DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION = 64; // 0x40
field public static final int DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION = 128; // 0x80
@@ -45942,6 +46189,7 @@
method public abstract void setAccessibilityFocused(boolean);
method public abstract void setActivated(boolean);
method public abstract void setAlpha(float);
+ method public abstract void setAutoFillOptions(java.lang.String[]);
method public abstract void setAutoFillType(android.view.autofill.AutoFillType);
method public abstract void setAutoFillValue(android.view.autofill.AutoFillValue);
method public abstract void setCheckable(boolean);
@@ -45959,14 +46207,15 @@
method public abstract void setHint(java.lang.CharSequence);
method public abstract void setId(int, java.lang.String, java.lang.String, java.lang.String);
method public abstract void setLongClickable(boolean);
+ method public abstract void setSanitized(boolean);
method public abstract void setSelected(boolean);
method public abstract void setText(java.lang.CharSequence);
method public abstract void setText(java.lang.CharSequence, int, int);
method public abstract void setTextLines(int[], int[]);
method public abstract void setTextStyle(float, int, int, int);
method public abstract void setTransformation(android.graphics.Matrix);
+ method public abstract void setUrl(java.lang.String);
method public abstract void setVisibility(int);
- field public static final int AUTO_FILL_FLAG_SANITIZED = 1; // 0x1
}
public final class ViewStub extends android.view.View {
@@ -47643,7 +47892,7 @@
public final class TextClassificationManager {
method public java.util.List<android.view.textclassifier.TextLanguage> detectLanguages(java.lang.CharSequence);
- method public synchronized android.view.textclassifier.TextClassifier getDefaultTextClassifier();
+ method public android.view.textclassifier.TextClassifier getDefaultTextClassifier();
}
public final class TextClassificationResult {
@@ -50847,11 +51096,9 @@
method public void removeTextChangedListener(android.text.TextWatcher);
method public void setAllCaps(boolean);
method public final void setAutoLinkMask(int);
- method public void setAutoSizeMaxTextSize(int, float);
- method public void setAutoSizeMinTextSize(int, float);
- method public void setAutoSizeStepGranularity(int, float);
- method public void setAutoSizeTextPresetSizes(int[]);
- method public void setAutoSizeTextType(int);
+ method public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setAutoSizeTextTypeWithDefaults(int);
method public void setBreakStrategy(int);
method public void setCompoundDrawablePadding(int);
method public void setCompoundDrawableTintList(android.content.res.ColorStateList);
@@ -51142,6 +51389,8 @@
method public int resolveAdjustedSize(int, int);
method public void resume();
method public void seekTo(int);
+ method public void setAudioAttributes(android.media.AudioAttributes);
+ method public void setAudioFocusRequest(int);
method public void setMediaController(android.widget.MediaController);
method public void setOnCompletionListener(android.media.MediaPlayer.OnCompletionListener);
method public void setOnErrorListener(android.media.MediaPlayer.OnErrorListener);
@@ -51246,7 +51495,7 @@
package com.android.internal.util {
- public abstract interface Predicate<T> {
+ public abstract deprecated interface Predicate<T> {
method public abstract boolean apply(T);
}
@@ -51384,6 +51633,8 @@
field public static final int OP_INT_TO_FLOAT = 130; // 0x82
field public static final int OP_INT_TO_LONG = 129; // 0x81
field public static final int OP_INT_TO_SHORT = 143; // 0x8f
+ field public static final int OP_INVOKE_CUSTOM = 252; // 0xfc
+ field public static final int OP_INVOKE_CUSTOM_RANGE = 253; // 0xfd
field public static final int OP_INVOKE_DIRECT = 112; // 0x70
field public static final deprecated int OP_INVOKE_DIRECT_EMPTY = 240; // 0xf0
field public static final int OP_INVOKE_DIRECT_JUMBO = 9471; // 0x24ff
@@ -51574,7 +51825,7 @@
method public static dalvik.system.DexFile loadDex(java.lang.String, java.lang.String, int) throws java.io.IOException;
}
- public final class InMemoryDexClassLoader extends java.lang.ClassLoader {
+ public final class InMemoryDexClassLoader extends dalvik.system.BaseDexClassLoader {
ctor public InMemoryDexClassLoader(java.nio.ByteBuffer, java.lang.ClassLoader);
}
@@ -54785,7 +55036,6 @@
method public java.lang.Class<?> lookupClass();
method public int lookupModes();
method public java.lang.invoke.MethodHandleInfo revealDirect(java.lang.invoke.MethodHandle);
- method public void throwMakeAccessException(java.lang.String, java.lang.Object) throws java.lang.IllegalAccessException;
method public java.lang.invoke.MethodHandle unreflect(java.lang.reflect.Method) throws java.lang.IllegalAccessException;
method public java.lang.invoke.MethodHandle unreflectConstructor(java.lang.reflect.Constructor<?>) throws java.lang.IllegalAccessException;
method public java.lang.invoke.MethodHandle unreflectGetter(java.lang.reflect.Field) throws java.lang.IllegalAccessException;
diff --git a/api/test-removed.txt b/api/test-removed.txt
index ab22b6e..c5dbf8d 100644
--- a/api/test-removed.txt
+++ b/api/test-removed.txt
@@ -20,25 +20,14 @@
package android.content {
public abstract class Context {
- method public deprecated android.content.Context createCredentialEncryptedStorageContext();
- method public deprecated android.content.Context createDeviceEncryptedStorageContext();
method public abstract android.content.SharedPreferences getSharedPreferences(java.io.File, int);
method public abstract java.io.File getSharedPreferencesPath(java.lang.String);
- method public deprecated boolean isCredentialEncryptedStorage();
- method public deprecated boolean isDeviceEncryptedStorage();
- method public deprecated boolean migrateDatabaseFrom(android.content.Context, java.lang.String);
- method public deprecated boolean migrateSharedPreferencesFrom(android.content.Context, java.lang.String);
}
}
package android.content.pm {
- public class ApplicationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
- field public deprecated java.lang.String credentialEncryptedDataDir;
- field public deprecated java.lang.String deviceEncryptedDataDir;
- }
-
public class ComponentInfo extends android.content.pm.PackageItemInfo {
field public deprecated boolean encryptionAware;
}
@@ -47,12 +36,6 @@
field public static final int REQUESTED_PERMISSION_REQUIRED = 1; // 0x1
}
- public abstract class PackageManager {
- field public static final deprecated int MATCH_ENCRYPTION_AWARE = 524288; // 0x80000
- field public static final deprecated int MATCH_ENCRYPTION_AWARE_AND_UNAWARE = 786432; // 0xc0000
- field public static final deprecated int MATCH_ENCRYPTION_UNAWARE = 262144; // 0x40000
- }
-
}
package android.database {
@@ -169,10 +152,6 @@
method public android.graphics.drawable.Drawable getBadgedDrawableForUser(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int);
method public android.graphics.drawable.Drawable getBadgedIconForUser(android.graphics.drawable.Drawable, android.os.UserHandle);
method public java.lang.CharSequence getBadgedLabelForUser(java.lang.CharSequence, android.os.UserHandle);
- method public deprecated boolean isUserRunningAndLocked();
- method public deprecated boolean isUserRunningAndLocked(android.os.UserHandle);
- method public deprecated boolean isUserRunningAndUnlocked();
- method public deprecated boolean isUserRunningAndUnlocked(android.os.UserHandle);
}
}
@@ -180,21 +159,16 @@
package android.os.storage {
public class StorageManager {
+ method public deprecated long getCacheQuotaBytes();
+ method public deprecated long getCacheSizeBytes();
+ method public deprecated long getExternalCacheQuotaBytes();
+ method public deprecated long getExternalCacheSizeBytes();
method public android.os.storage.StorageVolume getPrimaryVolume();
method public android.os.storage.StorageVolume[] getVolumeList();
}
}
-package android.preference {
-
- public class PreferenceManager {
- method public deprecated void setStorageCredentialEncrypted();
- method public deprecated void setStorageDeviceEncrypted();
- }
-
-}
-
package android.provider {
public class Browser {
diff --git a/cmds/idmap/Android.mk b/cmds/idmap/Android.mk
index 50ccb07..eb6da18 100644
--- a/cmds/idmap/Android.mk
+++ b/cmds/idmap/Android.mk
@@ -15,7 +15,7 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := idmap.cpp create.cpp scan.cpp inspect.cpp
+LOCAL_SRC_FILES := idmap.cpp create.cpp inspect.cpp
LOCAL_SHARED_LIBRARIES := liblog libutils libandroidfw
diff --git a/cmds/idmap/idmap.cpp b/cmds/idmap/idmap.cpp
index 3ab1915..d388977 100644
--- a/cmds/idmap/idmap.cpp
+++ b/cmds/idmap/idmap.cpp
@@ -13,8 +13,6 @@
idmap --help \n\
idmap --fd target overlay fd \n\
idmap --path target overlay idmap \n\
- idmap --scan target-package-name-to-look-for path-to-target-apk dir-to-hold-idmaps \\\
- dir-to-scan [additional-dir-to-scan [additional-dir-to-scan [...]]]\n\
idmap --inspect idmap \n\
\n\
DESCRIPTION \n\
@@ -49,11 +47,6 @@
--path: create idmap for target package 'target' (path to apk) and overlay package \n\
'overlay' (path to apk); write results to 'idmap' (path). \n\
\n\
- --scan: non-recursively search directory 'dir-to-scan' (path) for overlay packages with \n\
- target package 'target-package-name-to-look-for' (package name) present at\n\
- 'path-to-target-apk' (path to apk). For each overlay package found, create an\n\
- idmap file in 'dir-to-hold-idmaps' (path). \n\
-\n\
--inspect: decode the binary format of 'idmap' (path) and display the contents in a \n\
debug-friendly format. \n\
\n\
@@ -97,16 +90,6 @@
NOTES \n\
This tool and its expected invocation from installd is modelled on dexopt.";
- bool verify_directory_readable(const char *path)
- {
- return access(path, R_OK | X_OK) == 0;
- }
-
- bool verify_directory_writable(const char *path)
- {
- return access(path, W_OK) == 0;
- }
-
bool verify_file_readable(const char *path)
{
return access(path, R_OK) == 0;
@@ -167,36 +150,6 @@
return idmap_create_path(target_apk_path, overlay_apk_path, idmap_path);
}
- int maybe_scan(const char *target_package_name, const char *target_apk_path,
- const char *idmap_dir, const android::Vector<const char *> *overlay_dirs)
- {
- if (!verify_root_or_system()) {
- fprintf(stderr, "error: permission denied: not user root or user system\n");
- return -1;
- }
-
- if (!verify_file_readable(target_apk_path)) {
- ALOGD("error: failed to read apk %s: %s\n", target_apk_path, strerror(errno));
- return -1;
- }
-
- if (!verify_directory_writable(idmap_dir)) {
- ALOGD("error: no write access to %s: %s\n", idmap_dir, strerror(errno));
- return -1;
- }
-
- const size_t N = overlay_dirs->size();
- for (size_t i = 0; i < N; i++) {
- const char *dir = overlay_dirs->itemAt(i);
- if (!verify_directory_readable(dir)) {
- ALOGD("error: no read access to %s: %s\n", dir, strerror(errno));
- return -1;
- }
- }
-
- return idmap_scan(target_package_name, target_apk_path, idmap_dir, overlay_dirs);
- }
-
int maybe_inspect(const char *idmap_path)
{
// anyone (not just root or system) may do --inspect
@@ -235,14 +188,6 @@
return maybe_create_path(argv[2], argv[3], argv[4]);
}
- if (argc >= 6 && !strcmp(argv[1], "--scan")) {
- android::Vector<const char *> v;
- for (int i = 5; i < argc; i++) {
- v.push(argv[i]);
- }
- return maybe_scan(argv[2], argv[3], argv[4], &v);
- }
-
if (argc == 3 && !strcmp(argv[1], "--inspect")) {
return maybe_inspect(argv[2]);
}
diff --git a/cmds/idmap/idmap.h b/cmds/idmap/idmap.h
index 8d4210b..5914de9 100644
--- a/cmds/idmap/idmap.h
+++ b/cmds/idmap/idmap.h
@@ -25,12 +25,6 @@
int idmap_create_fd(const char *target_apk_path, const char *overlay_apk_path, int fd);
-// Regarding target_package_name: the idmap_scan implementation should
-// be able to extract this from the manifest in target_apk_path,
-// simplifying the external API.
-int idmap_scan(const char *target_package_name, const char *target_apk_path,
- const char *idmap_dir, const android::Vector<const char *> *overlay_dirs);
-
int idmap_inspect(const char *idmap_path);
#endif // _IDMAP_H_
diff --git a/cmds/idmap/scan.cpp b/cmds/idmap/scan.cpp
deleted file mode 100644
index ab6adfb..0000000
--- a/cmds/idmap/scan.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-#include <dirent.h>
-#include <inttypes.h>
-#include <sys/file.h>
-#include <sys/stat.h>
-
-#include "idmap.h"
-
-#include <memory>
-#include <androidfw/ResourceTypes.h>
-#include <androidfw/StreamingZipInflater.h>
-#include <androidfw/ZipFileRO.h>
-#include <private/android_filesystem_config.h> // for AID_SYSTEM
-#include <utils/SortedVector.h>
-#include <utils/String16.h>
-#include <utils/String8.h>
-
-#define NO_OVERLAY_TAG (-1000)
-
-using namespace android;
-
-namespace {
- struct Overlay {
- Overlay() {}
- Overlay(const String8& a, const String8& i, int p) :
- apk_path(a), idmap_path(i), priority(p) {}
-
- bool operator<(Overlay const& rhs) const
- {
- return rhs.priority > priority;
- }
-
- String8 apk_path;
- String8 idmap_path;
- int priority;
- };
-
- bool writePackagesList(const char *filename, const SortedVector<Overlay>& overlayVector)
- {
- // the file is opened for appending so that it doesn't get truncated
- // before we can guarantee mutual exclusion via the flock
- FILE* fout = fopen(filename, "a");
- if (fout == NULL) {
- return false;
- }
-
- if (TEMP_FAILURE_RETRY(flock(fileno(fout), LOCK_EX)) != 0) {
- fclose(fout);
- return false;
- }
-
- if (TEMP_FAILURE_RETRY(ftruncate(fileno(fout), 0)) != 0) {
- TEMP_FAILURE_RETRY(flock(fileno(fout), LOCK_UN));
- fclose(fout);
- return false;
- }
-
- for (size_t i = 0; i < overlayVector.size(); ++i) {
- const Overlay& overlay = overlayVector[i];
- fprintf(fout, "%s %s\n", overlay.apk_path.string(), overlay.idmap_path.string());
- }
-
- TEMP_FAILURE_RETRY(fflush(fout));
- TEMP_FAILURE_RETRY(flock(fileno(fout), LOCK_UN));
- fclose(fout);
-
- // Make file world readable since Zygote (running as root) will read
- // it when creating the initial AssetManger object
- const mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; // 0644
- if (chmod(filename, mode) == -1) {
- unlink(filename);
- return false;
- }
-
- return true;
- }
-
- String8 flatten_path(const char *path)
- {
- String16 tmp(path);
- tmp.replaceAll('/', '@');
- return String8(tmp);
- }
-
- int parse_overlay_tag(const ResXMLTree& parser, const char *target_package_name)
- {
- const size_t N = parser.getAttributeCount();
- String16 target;
- int priority = -1;
- for (size_t i = 0; i < N; ++i) {
- size_t len;
- String16 key(parser.getAttributeName(i, &len));
- if (key == String16("targetPackage")) {
- const char16_t *p = parser.getAttributeStringValue(i, &len);
- if (p != NULL) {
- target = String16(p, len);
- }
- } else if (key == String16("priority")) {
- Res_value v;
- if (parser.getAttributeValue(i, &v) == sizeof(Res_value)) {
- priority = v.data;
- if (priority < 0 || priority > 9999) {
- return -1;
- }
- }
- }
- }
- if (target == String16(target_package_name)) {
- return priority;
- }
- return NO_OVERLAY_TAG;
- }
-
- int parse_manifest(const void *data, size_t size, const char *target_package_name)
- {
- ResXMLTree parser;
- parser.setTo(data, size);
- if (parser.getError() != NO_ERROR) {
- ALOGD("%s failed to init xml parser, error=0x%08x\n", __FUNCTION__, parser.getError());
- return -1;
- }
-
- ResXMLParser::event_code_t type;
- do {
- type = parser.next();
- if (type == ResXMLParser::START_TAG) {
- size_t len;
- String16 tag(parser.getElementName(&len));
- if (tag == String16("overlay")) {
- return parse_overlay_tag(parser, target_package_name);
- }
- }
- } while (type != ResXMLParser::BAD_DOCUMENT && type != ResXMLParser::END_DOCUMENT);
-
- return NO_OVERLAY_TAG;
- }
-
- int parse_apk(const char *path, const char *target_package_name)
- {
- std::unique_ptr<ZipFileRO> zip(ZipFileRO::open(path));
- if (zip.get() == NULL) {
- ALOGW("%s: failed to open zip %s\n", __FUNCTION__, path);
- return -1;
- }
- ZipEntryRO entry;
- if ((entry = zip->findEntryByName("AndroidManifest.xml")) == NULL) {
- ALOGW("%s: failed to find entry AndroidManifest.xml\n", __FUNCTION__);
- return -1;
- }
- uint32_t uncompLen = 0;
- uint16_t method;
- if (!zip->getEntryInfo(entry, &method, &uncompLen, NULL, NULL, NULL, NULL)) {
- ALOGW("%s: failed to read entry info\n", __FUNCTION__);
- return -1;
- }
- if (method != ZipFileRO::kCompressDeflated) {
- ALOGW("%s: cannot handle zip compression method %" PRIu16 "\n", __FUNCTION__, method);
- return -1;
- }
- FileMap *dataMap = zip->createEntryFileMap(entry);
- if (dataMap == NULL) {
- ALOGW("%s: failed to create FileMap\n", __FUNCTION__);
- return -1;
- }
- char *buf = new char[uncompLen];
- if (NULL == buf) {
- ALOGW("%s: failed to allocate %" PRIu32 " byte\n", __FUNCTION__, uncompLen);
- delete dataMap;
- return -1;
- }
- StreamingZipInflater inflater(dataMap, uncompLen);
- if (inflater.read(buf, uncompLen) < 0) {
- ALOGW("%s: failed to inflate %" PRIu32 " byte\n", __FUNCTION__, uncompLen);
- delete[] buf;
- delete dataMap;
- return -1;
- }
-
- int priority = parse_manifest(buf, static_cast<size_t>(uncompLen), target_package_name);
- delete[] buf;
- delete dataMap;
- return priority;
- }
-}
-
-int idmap_scan(const char *target_package_name, const char *target_apk_path,
- const char *idmap_dir, const android::Vector<const char *> *overlay_dirs)
-{
- String8 filename = String8(idmap_dir);
- filename.appendPath("overlays.list");
-
- SortedVector<Overlay> overlayVector;
- const size_t N = overlay_dirs->size();
- for (size_t i = 0; i < N; ++i) {
- const char *overlay_dir = overlay_dirs->itemAt(i);
- DIR *dir = opendir(overlay_dir);
- if (dir == NULL) {
- return EXIT_FAILURE;
- }
-
- struct dirent *dirent;
- while ((dirent = readdir(dir)) != NULL) {
- struct stat st;
- char overlay_apk_path[PATH_MAX + 1];
- snprintf(overlay_apk_path, PATH_MAX, "%s/%s", overlay_dir, dirent->d_name);
- if (stat(overlay_apk_path, &st) < 0) {
- continue;
- }
- if (!S_ISREG(st.st_mode)) {
- continue;
- }
-
- int priority = parse_apk(overlay_apk_path, target_package_name);
- if (priority < 0) {
- continue;
- }
-
- String8 idmap_path(idmap_dir);
- idmap_path.appendPath(flatten_path(overlay_apk_path + 1));
- idmap_path.append("@idmap");
-
- if (idmap_create_path(target_apk_path, overlay_apk_path, idmap_path.string()) != 0) {
- ALOGE("error: failed to create idmap for target=%s overlay=%s idmap=%s\n",
- target_apk_path, overlay_apk_path, idmap_path.string());
- continue;
- }
-
- Overlay overlay(String8(overlay_apk_path), idmap_path, priority);
- overlayVector.add(overlay);
- }
-
- closedir(dir);
- }
-
- if (!writePackagesList(filename.string(), overlayVector)) {
- return EXIT_FAILURE;
- }
-
- return EXIT_SUCCESS;
-}
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index 7015381..1aef363 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -53,6 +53,7 @@
import android.os.HandlerThread;
import android.os.IUserManager;
import android.os.ParcelFileDescriptor;
+import android.os.Process;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.SELinux;
@@ -64,6 +65,7 @@
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.Log;
+import android.util.Pair;
import com.android.internal.content.PackageHelper;
import com.android.internal.util.ArrayUtils;
@@ -401,6 +403,7 @@
* The use of "adb install" or "cmd package install" over "pm install" is highly encouraged.
*/
private int runInstall() throws RemoteException {
+ long startedTime = SystemClock.elapsedRealtime();
final InstallParams params = makeInstallParams();
final String inPath = nextArg();
if (params.sessionParams.sizeBytes == -1 && !STDIN_PATH.equals(inPath)) {
@@ -434,10 +437,12 @@
false /*logSuccess*/) != PackageInstaller.STATUS_SUCCESS) {
return 1;
}
- if (doCommitSession(sessionId, false /*logSuccess*/)
- != PackageInstaller.STATUS_SUCCESS) {
+ Pair<String, Integer> status = doCommitSession(sessionId, false /*logSuccess*/);
+ if (status.second != PackageInstaller.STATUS_SUCCESS) {
return 1;
}
+ Log.i(TAG, "Package " + status.first + " installed in " + (SystemClock.elapsedRealtime()
+ - startedTime) + " ms");
System.out.println("Success");
return 0;
} finally {
@@ -455,7 +460,7 @@
private int runInstallCommit() throws RemoteException {
final int sessionId = Integer.parseInt(nextArg());
- return doCommitSession(sessionId, true /*logSuccess*/);
+ return doCommitSession(sessionId, true /*logSuccess*/).second;
}
private int runInstallCreate() throws RemoteException {
@@ -553,8 +558,12 @@
sessionParams.abiOverride = checkAbiArgument(nextOptionData());
break;
case "--ephemeral":
+ case "--instant":
sessionParams.setInstallAsInstantApp(true /*isInstantApp*/);
break;
+ case "--full":
+ sessionParams.setInstallAsInstantApp(false /*isInstantApp*/);
+ break;
case "--user":
params.userId = UserHandle.parseUserArg(nextOptionData());
break;
@@ -645,7 +654,8 @@
}
}
- private int doCommitSession(int sessionId, boolean logSuccess) throws RemoteException {
+ private Pair<String, Integer> doCommitSession(int sessionId, boolean logSuccess)
+ throws RemoteException {
PackageInstaller.Session session = null;
try {
session = new PackageInstaller.Session(
@@ -665,7 +675,7 @@
System.err.println("Failure ["
+ result.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) + "]");
}
- return status;
+ return new Pair<>(result.getStringExtra(PackageInstaller.EXTRA_PACKAGE_NAME), status);
} finally {
IoUtils.closeQuietly(session);
}
@@ -1004,7 +1014,8 @@
// In non-split user mode, userId can only be SYSTEM
int parentUserId = userId >= 0 ? userId : UserHandle.USER_SYSTEM;
info = mUm.createRestrictedProfile(name, parentUserId);
- mAm.addSharedAccountsFromParentUser(parentUserId, userId);
+ mAm.addSharedAccountsFromParentUser(parentUserId, userId,
+ (Process.myUid() == Process.ROOT_UID) ? "root" : "com.android.shell");
} else if (userId < 0) {
info = mUm.createUser(name, flags);
} else {
diff --git a/cmds/svc/src/com/android/commands/svc/UsbCommand.java b/cmds/svc/src/com/android/commands/svc/UsbCommand.java
index 4dcb05e..adbe9d0 100644
--- a/cmds/svc/src/com/android/commands/svc/UsbCommand.java
+++ b/cmds/svc/src/com/android/commands/svc/UsbCommand.java
@@ -36,8 +36,8 @@
public String longHelp() {
return shortHelp() + "\n"
+ "\n"
- + "usage: svc usb setFunction [function]\n"
- + " Set the current usb function.\n\n"
+ + "usage: svc usb setFunction [function] [usbDataUnlocked=false]\n"
+ + " Set the current usb function and optionally the data lock state.\n\n"
+ " svc usb getFunction\n"
+ " Gets the list of currently enabled functions\n";
}
@@ -49,8 +49,12 @@
if ("setFunction".equals(args[1])) {
IUsbManager usbMgr = IUsbManager.Stub.asInterface(ServiceManager.getService(
Context.USB_SERVICE));
+ boolean unlockData = false;
+ if (args.length >= 4) {
+ unlockData = Boolean.valueOf(args[3]);
+ }
try {
- usbMgr.setCurrentFunction((args.length >=3 ? args[2] : null), false);
+ usbMgr.setCurrentFunction((args.length >=3 ? args[2] : null), unlockData);
} catch (RemoteException e) {
System.err.println("Error communicating with UsbManager: " + e);
}
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index 9e486d5..b4e119e 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -52,6 +52,8 @@
import java.lang.annotation.RetentionPolicy;
import java.util.List;
+import static android.content.pm.PackageManager.FEATURE_FINGERPRINT;
+
/**
* Accessibility services should only be used to assist users with disabilities in using
* Android devices and apps. They run in the background and receive callbacks by the system
@@ -618,7 +620,8 @@
*/
@RequiresPermission(android.Manifest.permission.USE_FINGERPRINT)
public final @Nullable FingerprintGestureController getFingerprintGestureController() {
- if (mFingerprintGestureController == null) {
+ if ((mFingerprintGestureController == null)
+ && getPackageManager().hasSystemFeature(FEATURE_FINGERPRINT)) {
FingerprintManager fingerprintManager = getSystemService(FingerprintManager.class);
if ((fingerprintManager != null) && fingerprintManager.isHardwareDetected()) {
AccessibilityServiceInfo info = getServiceInfo();
diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
index e135ffd..19d1a7d 100644
--- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
+++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
@@ -47,6 +47,8 @@
import java.util.Collections;
import java.util.List;
+import static android.content.pm.PackageManager.FEATURE_FINGERPRINT;
+
/**
* This class describes an {@link AccessibilityService}. The system notifies an
* {@link AccessibilityService} for {@link android.view.accessibility.AccessibilityEvent}s
@@ -1042,8 +1044,7 @@
new CapabilityInfo(CAPABILITY_CAN_PERFORM_GESTURES,
R.string.capability_title_canPerformGestures,
R.string.capability_desc_canPerformGestures));
- if ((context == null)
- || context.getSystemService(FingerprintManager.class).isHardwareDetected()) {
+ if ((context == null) || fingerprintAvailable(context)) {
sAvailableCapabilityInfos.put(CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES,
new CapabilityInfo(CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES,
R.string.capability_title_canCaptureFingerprintGestures,
@@ -1053,6 +1054,10 @@
return sAvailableCapabilityInfos;
}
+ private static boolean fingerprintAvailable(Context context) {
+ return context.getPackageManager().hasSystemFeature(FEATURE_FINGERPRINT)
+ && context.getSystemService(FingerprintManager.class).isHardwareDetected();
+ }
/**
* @hide
*/
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index 0263681..e5df278 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -288,7 +288,8 @@
}
/**
- * Account visibility was not set.
+ * Account visibility was not set. Default visibility value will be used.
+ * See {@link #PACKAGE_NAME_KEY_LEGACY_VISIBLE}, {@link #PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE}
*/
public static final int VISIBILITY_UNDEFINED = 0;
@@ -919,7 +920,14 @@
* Package name must match installed application, or be equal to
* {@link #PACKAGE_NAME_KEY_LEGACY_VISIBLE} or {@link #PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE}.
* <p>
- * See {@link #getAccountVisibility} for possible values.
+ * Possible visibility values:
+ * <ul>
+ * <li>{@link #VISIBILITY_UNDEFINED}</li>
+ * <li>{@link #VISIBILITY_VISIBLE}</li>
+ * <li>{@link #VISIBILITY_USER_MANAGED_VISIBLE}</li>
+ * <li>{@link #VISIBILITY_NOT_VISIBLE}
+ * <li>{@link #VISIBILITY_USER_MANAGED_NOT_VISIBLE}</li>
+ * </ul>
* <p>
* This method requires the caller to have a signature match with the authenticator that owns
* the specified account.
@@ -944,7 +952,6 @@
/**
* Get visibility of certain account for given application. Possible returned values are:
* <ul>
- * <li>{@link #VISIBILITY_UNDEFINED}</li>
* <li>{@link #VISIBILITY_VISIBLE}</li>
* <li>{@link #VISIBILITY_USER_MANAGED_VISIBLE}</li>
* <li>{@link #VISIBILITY_NOT_VISIBLE}
@@ -1802,7 +1809,7 @@
public void addSharedAccountsFromParentUser(UserHandle parentUser, UserHandle user) {
try {
mService.addSharedAccountsFromParentUser(parentUser.getIdentifier(),
- user.getIdentifier());
+ user.getIdentifier(), mContext.getOpPackageName());
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
diff --git a/core/java/android/accounts/IAccountManager.aidl b/core/java/android/accounts/IAccountManager.aidl
index e0fdac1..49cd2c6 100644
--- a/core/java/android/accounts/IAccountManager.aidl
+++ b/core/java/android/accounts/IAccountManager.aidl
@@ -80,7 +80,7 @@
/* Shared accounts */
Account[] getSharedAccountsAsUser(int userId);
boolean removeSharedAccountAsUser(in Account account, int userId);
- void addSharedAccountsFromParentUser(int parentUserId, int userId);
+ void addSharedAccountsFromParentUser(int parentUserId, int userId, String opPackageName);
/* Account renaming. */
void renameAccount(in IAccountManagerResponse response, in Account accountToRename, String newName);
diff --git a/core/java/android/annotation/HalfFloat.java b/core/java/android/annotation/HalfFloat.java
index d3e9f08..256008c 100644
--- a/core/java/android/annotation/HalfFloat.java
+++ b/core/java/android/annotation/HalfFloat.java
@@ -37,7 +37,7 @@
* }</pre>
*
* @see android.util.Half
- * @see android.util.Half#valueOf(float)
+ * @see android.util.Half#toHalf(float)
* @see android.util.Half#toFloat(short)
*
* @hide
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 4449454..0193c5f 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -844,6 +844,8 @@
private boolean mHasCurrentPermissionsRequest;
+ private boolean mAutoFillResetNeeded;
+
private static native String getDlWarning();
/** Return the intent that started this activity. */
@@ -1780,7 +1782,7 @@
getApplication().dispatchActivityStopped(this);
mTranslucentCallback = null;
mCalled = true;
- if (isFinishing() && AutoFillManager.isClientActive(getActivityToken())) {
+ if (isFinishing() && mAutoFillResetNeeded) {
getSystemService(AutoFillManager.class).reset();
}
}
@@ -1980,6 +1982,29 @@
}
}
+ void dispatchMovedToDisplay(int displayId) {
+ updateDisplay(displayId);
+ onMovedToDisplay(displayId);
+ }
+
+ /**
+ * Called by the system when the activity is moved from one display to another without
+ * recreation. This means that this activity is declared to handle all changes to configuration
+ * that happened when it was switched to another display, so it wasn't destroyed and created
+ * again. This call will be followed by {@link #onConfigurationChanged(Configuration)} if the
+ * applied configuration actually changed.
+ *
+ * <p>Use this callback to track changes to the displays if some activity functionality relies
+ * on an association with some display properties.
+ *
+ * @param displayId The id of the display to which activity was moved.
+ *
+ * @see #onConfigurationChanged(Configuration)
+ * @see View#onMovedToDisplay(int)
+ */
+ public void onMovedToDisplay(int displayId) {
+ }
+
/**
* Called by the system when the device configuration changes while your
* activity is running. Note that this will <em>only</em> be called if
@@ -2797,7 +2822,9 @@
return;
}
- if (!mFragments.getFragmentManager().popBackStackImmediate()) {
+ FragmentManager fragmentManager = mFragments.getFragmentManager();
+
+ if (fragmentManager.isStateSaved() || !fragmentManager.popBackStackImmediate()) {
finishAfterTransition();
}
}
@@ -6723,8 +6750,6 @@
mCurrentConfig = config;
mWindow.setColorMode(info.colorMode);
-
- AutoFillManager.addClient(token, this);
}
/** @hide */
@@ -7016,7 +7041,8 @@
}
}
} else if (who.startsWith(AUTO_FILL_AUTH_WHO_PREFIX)) {
- getSystemService(AutoFillManager.class).onAuthenticationResult(data);
+ Intent resultData = (resultCode == Activity.RESULT_OK) ? data : null;
+ getSystemService(AutoFillManager.class).onAuthenticationResult(resultData);
} else {
Fragment frag = mFragments.findFragmentByWho(who);
if (frag != null) {
@@ -7190,6 +7216,12 @@
}
}
+ /** @hide */
+ @Override
+ public void resetableStateAvailable() {
+ mAutoFillResetNeeded = true;
+ }
+
class HostCallbacks extends FragmentHostCallback<Activity> {
public HostCallbacks() {
super(Activity.this /*activity*/);
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index 4e34552..fa64a0f 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -22,7 +22,6 @@
import android.content.IIntentSender;
import android.content.Intent;
import android.content.res.Configuration;
-import android.net.NetworkPolicyManager.UidStateWithSeqObserver;
import android.os.Bundle;
import android.os.IBinder;
import android.service.voice.IVoiceInteractionSession;
@@ -234,16 +233,4 @@
* @see android.view.WindowManager.LayoutParams#TYPE_APPLICATION_OVERLAY
*/
public abstract void setHasOverlayUi(int pid, boolean hasOverlayUi);
-
- /**
- * Set observer which listens to uid state changes. Uid state change along with the sequence
- * number associated with it needs to be passed to {@link UidStateWithSeqObserver}.
- */
- public abstract void setUidStateWithSeqObserver(UidStateWithSeqObserver observer);
-
- /**
- * Notifies that NetworkPolicyManagerService has updated the network policy rules for
- * a specific {@param uid} and {@param procStateSeq}.
- */
- public abstract void notifyNetworkPolicyRulesUpdated(int uid, long procStateSeq);
}
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 1f8e6db..ce9d91f 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -16,6 +16,8 @@
package android.app;
+import static android.view.Display.INVALID_DISPLAY;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.assist.AssistContent;
@@ -178,7 +180,6 @@
public static final boolean DEBUG_CONFIGURATION = false;
private static final boolean DEBUG_SERVICE = false;
private static final boolean DEBUG_MEMORY_TRIM = false;
- private static final boolean DEBUG_NETWORK = false;
private static final boolean DEBUG_PROVIDER = false;
private static final boolean DEBUG_ORDER = false;
private static final long MIN_TIME_BETWEEN_GCS = 5*1000;
@@ -201,55 +202,6 @@
// Whether to invoke an activity callback after delivering new configuration.
private static final boolean REPORT_TO_ACTIVITY = true;
- /**
- * This is the time main thread waits for the NetworkPolicyManagerService to notify
- * that network is unrestricted. After this the app components will be launched anyway.
- */
- private long mWaitForNetworkTimeoutMs;
-
- /**
- * This is only for logging purposes. This will help us identify if the waiting for network
- * is responsible for any lag that user might see.
- */
- private static final int WAIT_FOR_NETWORK_THRESHOLD_MS = 100; // 0.1 sec
-
- /**
- * State indicating that there is no need for any blocking for network.
- */
- public static final int NETWORK_STATE_NO_CHANGE = 0;
-
- /**
- * State indicating that main thread should wait for ActivityManagerService to notify
- * before the app components are launched.
- */
- public static final int NETWORK_STATE_BLOCK = 1;
-
- /**
- * State indicating that any threads waiting for ActivityManagerService to notify should
- * be unblocked.
- */
- public static final int NETWORK_STATE_UNBLOCK = 2;
-
- /**
- * Constant for indicating a invalid sequence number.
- */
- public static final long INVALID_PROC_STATE_SEQ = -1;
-
- /**
- * Current sequence number associated with the process state change.
- */
- @GuardedBy("mNetworkPolicyLock")
- private long mCurProcStateSeq;
-
- /**
- * Indicates whether any component being launched should block for network before
- * proceeding.
- */
- @GuardedBy("mNetworkPolicyLock")
- private boolean mShouldBlockForNetwork;
-
- private Object mNetworkPolicyLock = new Object();
-
private ContextImpl mSystemContext;
static volatile IPackageManager sPackageManager;
@@ -1017,9 +969,16 @@
@Override
public void scheduleActivityConfigurationChanged(
- IBinder token, Configuration overrideConfig, boolean reportToActivity) {
+ IBinder token, Configuration overrideConfig) {
sendMessage(H.ACTIVITY_CONFIGURATION_CHANGED,
- new ActivityConfigChangeData(token, overrideConfig), reportToActivity ? 1 : 0);
+ new ActivityConfigChangeData(token, overrideConfig));
+ }
+
+ @Override
+ public void scheduleActivityMovedToDisplay(IBinder token, int displayId,
+ Configuration overrideConfig) {
+ sendMessage(H.ACTIVITY_MOVED_TO_DISPLAY,
+ new ActivityConfigChangeData(token, overrideConfig), displayId);
}
@Override
@@ -1354,18 +1313,6 @@
}
@Override
- public void setBlockForNetworkState(int blockState, long targetProcStateSeq) {
- synchronized (mNetworkPolicyLock) {
- if (blockState == NETWORK_STATE_UNBLOCK) {
- unblockForNetworkAccessLN(targetProcStateSeq);
- } else if (blockState == NETWORK_STATE_BLOCK) {
- mShouldBlockForNetwork = true;
- }
- mCurProcStateSeq = targetProcStateSeq;
- }
- }
-
- @Override
public void scheduleInstallProvider(ProviderInfo provider) {
sendMessage(H.INSTALL_PROVIDER, provider);
}
@@ -1448,13 +1395,6 @@
public void handleTrustStorageUpdate() {
NetworkSecurityPolicy.getInstance().handleTrustStorageUpdate();
}
-
- @Override
- public void notifyNetworkStateUpdated(long curProcStateSeq) {
- synchronized (mNetworkPolicyLock) {
- unblockForNetworkAccessLN(curProcStateSeq);
- }
- }
}
private int getLifecycleSeq() {
@@ -1521,6 +1461,7 @@
public static final int LOCAL_VOICE_INTERACTION_STARTED = 154;
public static final int ATTACH_AGENT = 155;
public static final int APPLICATION_INFO_CHANGED = 156;
+ public static final int ACTIVITY_MOVED_TO_DISPLAY = 157;
String codeToString(int code) {
if (DEBUG_MESSAGES) {
@@ -1550,6 +1491,7 @@
case DUMP_SERVICE: return "DUMP_SERVICE";
case LOW_MEMORY: return "LOW_MEMORY";
case ACTIVITY_CONFIGURATION_CHANGED: return "ACTIVITY_CONFIGURATION_CHANGED";
+ case ACTIVITY_MOVED_TO_DISPLAY: return "ACTIVITY_MOVED_TO_DISPLAY";
case RELAUNCH_ACTIVITY: return "RELAUNCH_ACTIVITY";
case PROFILER_CONTROL: return "PROFILER_CONTROL";
case CREATE_BACKUP_AGENT: return "CREATE_BACKUP_AGENT";
@@ -1735,7 +1677,13 @@
case ACTIVITY_CONFIGURATION_CHANGED:
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityConfigChanged");
handleActivityConfigurationChanged((ActivityConfigChangeData) msg.obj,
- msg.arg1 == 1 ? REPORT_TO_ACTIVITY : !REPORT_TO_ACTIVITY);
+ INVALID_DISPLAY);
+ Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
+ break;
+ case ACTIVITY_MOVED_TO_DISPLAY:
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityMovedToDisplay");
+ handleActivityConfigurationChanged((ActivityConfigChangeData) msg.obj,
+ msg.arg1 /* displayId */);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;
case PROFILER_CONTROL:
@@ -2146,79 +2094,6 @@
}
}
- void blockForNetworkAccessInForegroundService(long procStateSeq) {
- synchronized (mNetworkPolicyLock) {
- if (mCurProcStateSeq >= procStateSeq) {
- if (mShouldBlockForNetwork) {
- blockForNetworkAccessLN();
- }
- } else {
- mCurProcStateSeq = procStateSeq;
- mShouldBlockForNetwork = true;
- blockForNetworkAccessLN();
- }
- }
- }
-
- /**
- * Block for unrestricted network. It will register a listener to AMS and wait for it to
- * notify that network policy rules are updated. This method is called before relevant app
- * components are launched.
- */
- private void blockForNetworkAccessLN() {
- try {
- if (ActivityManager.getService().registerNetworkRulesUpdateListener(
- mAppThread, mCurProcStateSeq)) {
- try {
- Slog.d(TAG, "Uid: " + mBoundApplication.appInfo.uid
- + " seq: " + mCurProcStateSeq
- + ". Blocking for network. callers: " + Debug.getCallers(3));
- final long blockStartTime = SystemClock.elapsedRealtime();
- mNetworkPolicyLock.wait(mWaitForNetworkTimeoutMs);
- final long totalWaitTime = (SystemClock.elapsedRealtime() - blockStartTime);
- if (totalWaitTime >= mWaitForNetworkTimeoutMs) {
- Slog.wtf(TAG, "Timed out waiting for the network rules to get updated."
- + " Uid: " + mBoundApplication.appInfo.uid + " seq: "
- + mCurProcStateSeq);
- } else if (totalWaitTime >= WAIT_FOR_NETWORK_THRESHOLD_MS) {
- Slog.d(TAG, "Waited for time greater than threshold."
- + " Uid: " + mBoundApplication.appInfo.uid + " seq: "
- + mCurProcStateSeq);
- }
- if (DEBUG_NETWORK) {
- Slog.d(TAG, "Uid: " + mBoundApplication.appInfo.uid
- + " seq: " + mCurProcStateSeq
- + ". Time waited for network: " + totalWaitTime);
- }
- } catch (InterruptedException ignored) {
- }
- }
- } catch (RemoteException ignored) {
- }
- }
-
- public void checkAndBlockForNetworkAccess() {
- synchronized (mNetworkPolicyLock) {
- if (mWaitForNetworkTimeoutMs > 0 && mShouldBlockForNetwork) {
- blockForNetworkAccessLN();
- }
- }
- }
-
- /**
- * Unblock the main thread if it is waiting for network.
- */
- private void unblockForNetworkAccessLN(long procStateSeq) {
- if (mShouldBlockForNetwork && procStateSeq >= mCurProcStateSeq) {
- if (DEBUG_NETWORK) {
- Slog.d(TAG, "Unblocking threads waiting for network. uid: "
- + mBoundApplication.appInfo.uid + " procStateSeq: " + procStateSeq);
- }
- mNetworkPolicyLock.notifyAll();
- mShouldBlockForNetwork = false;
- }
- }
-
ActivityThread() {
mResourcesManager = ResourcesManager.getInstance();
}
@@ -2811,7 +2686,6 @@
activity.mIntent = customIntent;
}
r.lastNonConfigurationInstances = null;
- checkAndBlockForNetworkAccess();
activity.mStartedActivity = false;
int theme = r.activityInfo.getThemeResource();
if (theme != 0) {
@@ -2899,7 +2773,7 @@
for (int id : dm.getDisplayIds()) {
if (id != Display.DEFAULT_DISPLAY) {
Display display =
- dm.getCompatibleDisplay(id, appContext.getDisplayAdjustments(id));
+ dm.getCompatibleDisplay(id, appContext.getResources());
appContext = (ContextImpl) appContext.createDisplayContext(display);
break;
}
@@ -3775,7 +3649,7 @@
if (!r.activity.mFinished && willBeVisible
&& r.activity.mDecor != null && !r.hideForNow) {
if (r.newConfig != null) {
- performConfigurationChangedForActivity(r, r.newConfig, REPORT_TO_ACTIVITY);
+ performConfigurationChangedForActivity(r, r.newConfig);
if (DEBUG_CONFIGURATION) Slog.v(TAG, "Resuming activity "
+ r.activityInfo.name + " with newConfig " + r.activity.mCurrentConfig);
r.newConfig = null;
@@ -4129,7 +4003,7 @@
}
}
if (r.newConfig != null) {
- performConfigurationChangedForActivity(r, r.newConfig, REPORT_TO_ACTIVITY);
+ performConfigurationChangedForActivity(r, r.newConfig);
if (DEBUG_CONFIGURATION) Slog.v(TAG, "Updating activity vis "
+ r.activityInfo.name + " with new config "
+ r.activity.mCurrentConfig);
@@ -4842,17 +4716,32 @@
* @param r ActivityClientRecord representing the Activity.
* @param newBaseConfig The new configuration to use. This may be augmented with
* {@link ActivityClientRecord#overrideConfig}.
- * @param reportToActivity true if the change should be reported to the Activity's callback.
*/
private void performConfigurationChangedForActivity(ActivityClientRecord r,
- Configuration newBaseConfig,
- boolean reportToActivity) {
+ Configuration newBaseConfig) {
+ performConfigurationChangedForActivity(r, newBaseConfig,
+ r.activity.getDisplay().getDisplayId(), false /* movedToDifferentDisplay */);
+ }
+
+ /**
+ * Updates the configuration for an Activity. The ActivityClientRecord's
+ * {@link ActivityClientRecord#overrideConfig} is used to compute the final Configuration for
+ * that Activity. {@link ActivityClientRecord#tmpConfig} is used as a temporary for delivering
+ * the updated Configuration.
+ * @param r ActivityClientRecord representing the Activity.
+ * @param newBaseConfig The new configuration to use. This may be augmented with
+ * {@link ActivityClientRecord#overrideConfig}.
+ * @param displayId The id of the display where the Activity currently resides.
+ * @param movedToDifferentDisplay Indicates if the activity was moved to different display.
+ */
+ private void performConfigurationChangedForActivity(ActivityClientRecord r,
+ Configuration newBaseConfig, int displayId, boolean movedToDifferentDisplay) {
r.tmpConfig.setTo(newBaseConfig);
if (r.overrideConfig != null) {
r.tmpConfig.updateFrom(r.overrideConfig);
}
- performConfigurationChanged(r.activity, r.token, r.tmpConfig, r.overrideConfig,
- reportToActivity);
+ performActivityConfigurationChanged(r.activity, r.tmpConfig, r.overrideConfig, displayId,
+ movedToDifferentDisplay);
freeTextLayoutCachesIfNeeded(r.activity.mCurrentConfig.diff(r.tmpConfig));
}
@@ -4873,37 +4762,58 @@
}
/**
- * Decides whether to update an Activity's configuration and whether to tell the
- * Activity/Component about it.
+ * Decides whether to update a component's configuration and whether to inform it.
* @param cb The component callback to notify of configuration change.
- * @param activityToken The Activity binder token for which this configuration change happened.
- * If the change is global, this is null.
+ * @param newConfig The new configuration.
+ */
+ private void performConfigurationChanged(ComponentCallbacks2 cb, Configuration newConfig) {
+ if (!REPORT_TO_ACTIVITY) {
+ return;
+ }
+
+ // ContextThemeWrappers may override the configuration for that context. We must check and
+ // apply any overrides defined.
+ Configuration contextThemeWrapperOverrideConfig = null;
+ if (cb instanceof ContextThemeWrapper) {
+ final ContextThemeWrapper contextThemeWrapper = (ContextThemeWrapper) cb;
+ contextThemeWrapperOverrideConfig = contextThemeWrapper.getOverrideConfiguration();
+ }
+
+ // Apply the ContextThemeWrapper override if necessary.
+ // NOTE: Make sure the configurations are not modified, as they are treated as immutable
+ // in many places.
+ final Configuration configToReport = createNewConfigAndUpdateIfNotNull(
+ newConfig, contextThemeWrapperOverrideConfig);
+ cb.onConfigurationChanged(configToReport);
+ }
+
+ /**
+ * Decides whether to update an Activity's configuration and whether to inform it.
+ * @param activity The activity to notify of configuration change.
* @param newConfig The new configuration.
* @param amOverrideConfig The override config that differentiates the Activity's configuration
- * from the base global configuration.
- * This is supplied by ActivityManager.
- * @param reportToActivity Notify the Activity of the change.
+ * from the base global configuration. This is supplied by
+ * ActivityManager.
+ * @param displayId Id of the display where activity currently resides.
+ * @param movedToDifferentDisplay Indicates if the activity was moved to different display.
*/
- private void performConfigurationChanged(ComponentCallbacks2 cb,
- IBinder activityToken,
- Configuration newConfig,
- Configuration amOverrideConfig,
- boolean reportToActivity) {
- // Only for Activity objects, check that they actually call up to their
- // superclass implementation. ComponentCallbacks2 is an interface, so
- // we check the runtime type and act accordingly.
- Activity activity = (cb instanceof Activity) ? (Activity) cb : null;
- if (activity != null) {
- activity.mCalled = false;
+ private void performActivityConfigurationChanged(Activity activity, Configuration newConfig,
+ Configuration amOverrideConfig, int displayId, boolean movedToDifferentDisplay) {
+ if (activity == null) {
+ throw new IllegalArgumentException("No activity provided.");
+ }
+ final IBinder activityToken = activity.getActivityToken();
+ if (activityToken == null) {
+ throw new IllegalArgumentException("Activity token not set. Is the activity attached?");
}
boolean shouldChangeConfig = false;
- if ((activity == null) || (activity.mCurrentConfig == null)) {
+ if (activity.mCurrentConfig == null) {
shouldChangeConfig = true;
} else {
- // If the new config is the same as the config this Activity is already
- // running with and the override config also didn't change, then don't
- // bother calling onConfigurationChanged.
+ // If the new config is the same as the config this Activity is already running with and
+ // the override config also didn't change, then don't bother calling
+ // onConfigurationChanged.
int diff = activity.mCurrentConfig.diff(newConfig);
if (diff != 0 || !mResourcesManager.isSameResourcesOverrideConfig(activityToken,
amOverrideConfig)) {
@@ -4912,53 +4822,57 @@
// calling onConfigurationChanged as we're going to destroy it.
if (!mUpdatingSystemConfig
|| (~activity.mActivityInfo.getRealConfigChanged() & diff) == 0
- || !reportToActivity) {
+ || !REPORT_TO_ACTIVITY) {
shouldChangeConfig = true;
}
}
}
+ if (!shouldChangeConfig && !movedToDifferentDisplay) {
+ // Nothing significant, don't proceed with updating and reporting.
+ return;
+ }
+
+ // Propagate the configuration change to ResourcesManager and Activity.
+
+ // ContextThemeWrappers may override the configuration for that context. We must check and
+ // apply any overrides defined.
+ Configuration contextThemeWrapperOverrideConfig = activity.getOverrideConfiguration();
+
+ // We only update an Activity's configuration if this is not a global configuration change.
+ // This must also be done before the callback, or else we violate the contract that the new
+ // resources are available in ComponentCallbacks2#onConfigurationChanged(Configuration).
+ // Also apply the ContextThemeWrapper override if necessary.
+ // NOTE: Make sure the configurations are not modified, as they are treated as immutable in
+ // many places.
+ final Configuration finalOverrideConfig = createNewConfigAndUpdateIfNotNull(
+ amOverrideConfig, contextThemeWrapperOverrideConfig);
+ mResourcesManager.updateResourcesForActivity(activityToken, finalOverrideConfig,
+ displayId, movedToDifferentDisplay);
+
+ activity.mConfigChangeFlags = 0;
+ activity.mCurrentConfig = new Configuration(newConfig);
+
+ if (!REPORT_TO_ACTIVITY) {
+ // Not configured to report to activity.
+ return;
+ }
+
+ if (movedToDifferentDisplay) {
+ activity.dispatchMovedToDisplay(displayId);
+ }
if (shouldChangeConfig) {
- // Propagate the configuration change to the Activity and ResourcesManager.
+ // Apply the ContextThemeWrapper override if necessary.
+ // NOTE: Make sure the configurations are not modified, as they are treated as immutable
+ // in many places.
+ final Configuration configToReport = createNewConfigAndUpdateIfNotNull(
+ newConfig, contextThemeWrapperOverrideConfig);
- // ContextThemeWrappers may override the configuration for that context.
- // We must check and apply any overrides defined.
- Configuration contextThemeWrapperOverrideConfig = null;
- if (cb instanceof ContextThemeWrapper) {
- final ContextThemeWrapper contextThemeWrapper = (ContextThemeWrapper) cb;
- contextThemeWrapperOverrideConfig = contextThemeWrapper.getOverrideConfiguration();
- }
-
- // We only update an Activity's configuration if this is not a global
- // configuration change. This must also be done before the callback,
- // or else we violate the contract that the new resources are available
- // in {@link ComponentCallbacks2#onConfigurationChanged(Configuration)}.
- if (activityToken != null) {
- // Apply the ContextThemeWrapper override if necessary.
- // NOTE: Make sure the configurations are not modified, as they are treated
- // as immutable in many places.
- final Configuration finalOverrideConfig = createNewConfigAndUpdateIfNotNull(
- amOverrideConfig, contextThemeWrapperOverrideConfig);
- mResourcesManager.updateResourcesForActivity(activityToken, finalOverrideConfig);
- }
-
- if (reportToActivity) {
- // Apply the ContextThemeWrapper override if necessary.
- // NOTE: Make sure the configurations are not modified, as they are treated
- // as immutable in many places.
- final Configuration configToReport = createNewConfigAndUpdateIfNotNull(
- newConfig, contextThemeWrapperOverrideConfig);
- cb.onConfigurationChanged(configToReport);
- }
-
- if (activity != null) {
- if (reportToActivity && !activity.mCalled) {
- throw new SuperNotCalledException(
- "Activity " + activity.getLocalClassName() +
- " did not call through to super.onConfigurationChanged()");
- }
- activity.mConfigChangeFlags = 0;
- activity.mCurrentConfig = new Configuration(newConfig);
+ activity.mCalled = false;
+ activity.onConfigurationChanged(configToReport);
+ if (!activity.mCalled) {
+ throw new SuperNotCalledException("Activity " + activity.getLocalClassName() +
+ " did not call through to super.onConfigurationChanged()");
}
}
}
@@ -5036,9 +4950,9 @@
// config and avoid onConfigurationChanged if it hasn't changed.
Activity a = (Activity) cb;
performConfigurationChangedForActivity(mActivities.get(a.getActivityToken()),
- config, REPORT_TO_ACTIVITY);
+ config);
} else {
- performConfigurationChanged(cb, null, config, null, REPORT_TO_ACTIVITY);
+ performConfigurationChanged(cb, config);
}
}
}
@@ -5056,7 +4970,7 @@
LoadedApk apk = ref != null ? ref.get() : null;
if (apk != null) {
final ArrayList<String> oldPaths = new ArrayList<>();
- LoadedApk.makePaths(this, apk.getApplicationInfo(), oldPaths, null /*outLibPaths*/);
+ LoadedApk.makePaths(this, apk.getApplicationInfo(), oldPaths);
apk.updateApplicationInfo(ai, oldPaths);
}
@@ -5064,7 +4978,7 @@
apk = ref != null ? ref.get() : null;
if (apk != null) {
final ArrayList<String> oldPaths = new ArrayList<>();
- LoadedApk.makePaths(this, apk.getApplicationInfo(), oldPaths, null /*outLibPaths*/);
+ LoadedApk.makePaths(this, apk.getApplicationInfo(), oldPaths);
apk.updateApplicationInfo(ai, oldPaths);
}
@@ -5102,18 +5016,43 @@
}
}
- final void handleActivityConfigurationChanged(ActivityConfigChangeData data,
- boolean reportToActivity) {
+ /**
+ * Handle new activity configuration and/or move to a different display.
+ * @param data Configuration update data.
+ * @param displayId Id of the display where activity was moved to, -1 if there was no move and
+ * value didn't change.
+ */
+ private void handleActivityConfigurationChanged(ActivityConfigChangeData data, int displayId) {
ActivityClientRecord r = mActivities.get(data.activityToken);
+ // Check input params.
if (r == null || r.activity == null) {
+ if (DEBUG_CONFIGURATION) Slog.w(TAG, "Not found target activity to report to: " + r);
return;
}
+ final boolean movedToDifferentDisplay = displayId != INVALID_DISPLAY;
+ if (movedToDifferentDisplay) {
+ if (r.activity.getDisplay().getDisplayId() == displayId) {
+ throw new IllegalArgumentException("Activity is already on the target display: "
+ + displayId);
+ }
+ }
- if (DEBUG_CONFIGURATION) Slog.v(TAG, "Handle activity config changed: "
- + r.activityInfo.name + ", with callback=" + reportToActivity);
-
+ // Perform updates.
r.overrideConfig = data.overrideConfig;
- performConfigurationChangedForActivity(r, mCompatConfiguration, reportToActivity);
+ if (movedToDifferentDisplay) {
+ if (DEBUG_CONFIGURATION) Slog.v(TAG, "Handle activity moved to display, activity:"
+ + r.activityInfo.name + ", displayId=" + displayId
+ + ", config=" + data.overrideConfig);
+
+ performConfigurationChangedForActivity(r, mCompatConfiguration, displayId,
+ true /* movedToDifferentDisplay */);
+ final ViewRootImpl viewRoot = r.activity.mDecor.getViewRootImpl();
+ viewRoot.onMovedToDisplay(displayId);
+ } else {
+ if (DEBUG_CONFIGURATION) Slog.v(TAG, "Handle activity config changed: "
+ + r.activityInfo.name + ", config=" + data.overrideConfig);
+ performConfigurationChangedForActivity(r, mCompatConfiguration);
+ }
mSomeActivitiesChanged = true;
}
@@ -5482,9 +5421,6 @@
View.mDebugViewAttributes =
mCoreSettings.getInt(Settings.Global.DEBUG_VIEW_ATTRIBUTES, 0) != 0;
- mWaitForNetworkTimeoutMs = mCoreSettings.getLong(
- Settings.Global.WAIT_FOR_NETWORK_TIMEOUT_MS);
-
/**
* For system applications on userdebug/eng builds, log stack
* traces of disk and network access to dropbox for analysis.
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index fb927e9..6dd31a8 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -357,7 +357,8 @@
public static final String OPSTR_INSTANT_APP_START_FOREGROUND
= "android:instant_app_start_foreground";
- private static final int[] RUNTIME_PERMISSIONS_OPS = {
+ private static final int[] RUNTIME_AND_APPOP_PERMISSIONS_OPS = {
+ // RUNTIME PERMISSIONS
// Contacts
OP_READ_CONTACTS,
OP_WRITE_CONTACTS,
@@ -392,7 +393,13 @@
// Camera
OP_CAMERA,
// Body sensors
- OP_BODY_SENSORS
+ OP_BODY_SENSORS,
+
+ // APPOP PERMISSIONS
+ OP_ACCESS_NOTIFICATIONS,
+ OP_SYSTEM_ALERT_WINDOW,
+ OP_WRITE_SETTINGS,
+ OP_REQUEST_INSTALL_PACKAGES,
};
/**
@@ -926,9 +933,9 @@
AppOpsManager.MODE_ALLOWED, // OP_RUN_IN_BACKGROUND
AppOpsManager.MODE_ALLOWED, // OP_AUDIO_ACCESSIBILITY_VOLUME
AppOpsManager.MODE_ALLOWED,
- AppOpsManager.MODE_DEFAULT, // OP_REQUEST_INSTALL_PACKAGES
+ AppOpsManager.MODE_DEFAULT, // OP_REQUEST_INSTALL_PACKAGES
AppOpsManager.MODE_ALLOWED, // OP_ENTER_PICTURE_IN_PICTURE_ON_HIDE
- AppOpsManager.MODE_DEFAULT, // OP_INSTANT_APP_START_FOREGROUND
+ AppOpsManager.MODE_DEFAULT, // OP_INSTANT_APP_START_FOREGROUND
};
/**
@@ -1018,7 +1025,7 @@
/**
* Mapping from a permission to the corresponding app op.
*/
- private static HashMap<String, Integer> sRuntimePermToOp = new HashMap<>();
+ private static HashMap<String, Integer> sPermToOp = new HashMap<>();
static {
if (sOpToSwitch.length != _NUM_OP) {
@@ -1058,9 +1065,9 @@
sOpStrToOp.put(sOpToString[i], i);
}
}
- for (int op : RUNTIME_PERMISSIONS_OPS) {
+ for (int op : RUNTIME_AND_APPOP_PERMISSIONS_OPS) {
if (sOpPerms[op] != null) {
- sRuntimePermToOp.put(sOpPerms[op], op);
+ sPermToOp.put(sOpPerms[op], op);
}
}
}
@@ -1112,12 +1119,12 @@
/**
* Retrieve the app op code for a permission, or null if there is not one.
- * This API is intended to be used for mapping runtime permissions to the
- * corresponding app op.
+ * This API is intended to be used for mapping runtime or appop permissions
+ * to the corresponding app op.
* @hide
*/
public static int permissionToOpCode(String permission) {
- Integer boxedOpCode = sRuntimePermToOp.get(permission);
+ Integer boxedOpCode = sPermToOp.get(permission);
return boxedOpCode != null ? boxedOpCode : OP_NONE;
}
@@ -1462,7 +1469,7 @@
* @return The app op associated with the permission or null.
*/
public static String permissionToOp(String permission) {
- final Integer opCode = sRuntimePermToOp.get(permission);
+ final Integer opCode = sPermToOp.get(permission);
if (opCode == null) {
return null;
}
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 333e412..0608acb 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -1024,12 +1024,18 @@
}
@Override
- @SuppressWarnings("unchecked")
public List<ProviderInfo> queryContentProviders(String processName,
int uid, int flags) {
+ return queryContentProviders(processName, uid, flags, null);
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public List<ProviderInfo> queryContentProviders(String processName,
+ int uid, int flags, String metaDataKey) {
try {
ParceledListSlice<ProviderInfo> slice =
- mPM.queryContentProviders(processName, uid, flags);
+ mPM.queryContentProviders(processName, uid, flags, metaDataKey);
return slice != null ? slice.getList() : Collections.<ProviderInfo>emptyList();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -1687,7 +1693,7 @@
public int installExistingPackageAsUser(String packageName, int userId)
throws NameNotFoundException {
try {
- int res = mPM.installExistingPackageAsUser(packageName, userId,
+ int res = mPM.installExistingPackageAsUser(packageName, userId, 0 /*installFlags*/,
PackageManager.INSTALL_REASON_UNKNOWN);
if (res == INSTALL_FAILED_INVALID_URI) {
throw new NameNotFoundException("Package " + packageName + " doesn't exist");
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 16989c0..7ee93d0 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -38,6 +38,7 @@
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.AssetManager;
+import android.content.res.CompatResources;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -49,6 +50,7 @@
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
+import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.os.Debug;
import android.os.Environment;
@@ -638,6 +640,15 @@
}
}
+ /**
+ * @hide
+ */
+ @Nullable
+ @Override
+ public File getPreloadsFileCache() {
+ return Environment.getDataPreloadsFileCacheDirectory(getPackageName());
+ }
+
@Override
public File getFileStreamPath(String name) {
return makeFilename(getFilesDir(), name);
@@ -1916,8 +1927,8 @@
final int displayId = mDisplay != null
? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY;
- c.mResources = createResources(mActivityToken, pi, displayId, null,
- getDisplayAdjustments(displayId).getCompatibilityInfo());
+ c.setResources(createResources(mActivityToken, pi, displayId, null,
+ getDisplayAdjustments(displayId).getCompatibilityInfo()));
if (c.mResources != null) {
return c;
}
@@ -1953,8 +1964,8 @@
final int displayId = mDisplay != null
? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY;
- c.mResources = createResources(mActivityToken, pi, displayId, null,
- getDisplayAdjustments(displayId).getCompatibilityInfo());
+ c.setResources(createResources(mActivityToken, pi, displayId, null,
+ getDisplayAdjustments(displayId).getCompatibilityInfo()));
if (c.mResources != null) {
return c;
}
@@ -1981,7 +1992,7 @@
final int displayId = mDisplay != null
? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY;
- context.mResources = ResourcesManager.getInstance().getResources(
+ context.setResources(ResourcesManager.getInstance().getResources(
mActivityToken,
mPackageInfo.getResDir(),
paths,
@@ -1990,7 +2001,7 @@
displayId,
null,
mPackageInfo.getCompatibilityInfo(),
- classLoader);
+ classLoader));
return context;
}
@@ -2004,8 +2015,8 @@
mUser, mFlags, mClassLoader);
final int displayId = mDisplay != null ? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY;
- context.mResources = createResources(mActivityToken, mPackageInfo, displayId,
- overrideConfiguration, getDisplayAdjustments(displayId).getCompatibilityInfo());
+ context.setResources(createResources(mActivityToken, mPackageInfo, displayId,
+ overrideConfiguration, getDisplayAdjustments(displayId).getCompatibilityInfo()));
return context;
}
@@ -2019,8 +2030,8 @@
mUser, mFlags, mClassLoader);
final int displayId = display.getDisplayId();
- context.mResources = createResources(mActivityToken, mPackageInfo, displayId, null,
- getDisplayAdjustments(displayId).getCompatibilityInfo());
+ context.setResources(createResources(mActivityToken, mPackageInfo, displayId, null,
+ getDisplayAdjustments(displayId).getCompatibilityInfo()));
context.mDisplay = display;
return context;
}
@@ -2058,20 +2069,20 @@
@Override
public Display getDisplay() {
- final DisplayAdjustments displayAdjustments = mResources.getDisplayAdjustments();
if (mDisplay == null) {
return mResourcesManager.getAdjustedDisplay(Display.DEFAULT_DISPLAY,
- displayAdjustments);
+ mResources);
}
- if (!mDisplay.getDisplayAdjustments().equals(displayAdjustments)) {
- mDisplay = mResourcesManager.getAdjustedDisplay(mDisplay.getDisplayId(),
- displayAdjustments);
- }
return mDisplay;
}
@Override
+ public void updateDisplay(int displayId) {
+ mDisplay = mResourcesManager.getAdjustedDisplay(displayId, mResources);
+ }
+
+ @Override
public DisplayAdjustments getDisplayAdjustments(int displayId) {
return mResources.getDisplayAdjustments();
}
@@ -2127,7 +2138,7 @@
LoadedApk packageInfo = new LoadedApk(mainThread);
ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, 0,
null);
- context.mResources = packageInfo.getResources();
+ context.setResources(packageInfo.getResources());
context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(),
context.mResourcesManager.getDisplayMetrics());
return context;
@@ -2137,7 +2148,7 @@
if (packageInfo == null) throw new IllegalArgumentException("packageInfo");
ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, 0,
null);
- context.mResources = packageInfo.getResources();
+ context.setResources(packageInfo.getResources());
return context;
}
@@ -2176,7 +2187,7 @@
// Create the base resources for which all configuration contexts for this Activity
// will be rebased upon.
- context.mResources = resourcesManager.createBaseActivityResources(activityToken,
+ context.setResources(resourcesManager.createBaseActivityResources(activityToken,
packageInfo.getResDir(),
splitDirs,
packageInfo.getOverlayDirs(),
@@ -2184,9 +2195,9 @@
displayId,
overrideConfiguration,
compatInfo,
- classLoader);
+ classLoader));
context.mDisplay = resourcesManager.getAdjustedDisplay(displayId,
- context.mResources.getDisplayAdjustments());
+ context.getResources());
return context;
}
@@ -2223,7 +2234,7 @@
if (container != null) {
mBasePackageName = container.mBasePackageName;
mOpPackageName = container.mOpPackageName;
- mResources = container.mResources;
+ setResources(container.mResources);
mDisplay = container.mDisplay;
} else {
mBasePackageName = packageInfo.mPackageName;
@@ -2242,6 +2253,14 @@
mContentResolver = new ApplicationContentResolver(this, mainThread, user);
}
+ void setResources(Resources r) {
+ if (mPackageInfo.getTargetSdkVersion() < VERSION_CODES.O) {
+ mResources = new CompatResources(r, this);
+ } else {
+ mResources = r;
+ }
+ }
+
void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) {
mPackageInfo.installSystemApplicationInfo(info, classLoader);
}
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index d32cf3c..977931a 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -397,6 +397,19 @@
public void invalidateOptionsMenu() { }
/**
+ * Returns {@code true} if the FragmentManager's state has already been saved
+ * by its host. Any operations that would change saved state should not be performed
+ * if this method returns true. For example, any popBackStack() method, such as
+ * {@link #popBackStackImmediate()} or any FragmentTransaction using
+ * {@link FragmentTransaction#commit()} instead of
+ * {@link FragmentTransaction#commitAllowingStateLoss()} will change
+ * the state and will result in an error.
+ *
+ * @return true if this FragmentManager's state has already been saved by its host
+ */
+ public abstract boolean isStateSaved();
+
+ /**
* Callback interface for listening to fragment state changes that happen
* within a given FragmentManager.
*/
@@ -1787,6 +1800,7 @@
}
}
+ @Override
public boolean isStateSaved() {
return mStateSaved;
}
@@ -1911,7 +1925,12 @@
mTmpRecords = new ArrayList<>();
mTmpIsPop = new ArrayList<>();
}
- executePostponedTransaction(null, null);
+ mExecutingActions = true;
+ try {
+ executePostponedTransaction(null, null);
+ } finally {
+ mExecutingActions = false;
+ }
}
public void execSingleAction(OpGenerator action, boolean allowStateLoss) {
@@ -2802,40 +2821,56 @@
public void dispatchCreate() {
mStateSaved = false;
+ mExecutingActions = true;
moveToState(Fragment.CREATED, false);
+ mExecutingActions = false;
}
public void dispatchActivityCreated() {
mStateSaved = false;
+ mExecutingActions = true;
moveToState(Fragment.ACTIVITY_CREATED, false);
+ mExecutingActions = false;
}
public void dispatchStart() {
mStateSaved = false;
+ mExecutingActions = true;
moveToState(Fragment.STARTED, false);
+ mExecutingActions = false;
}
public void dispatchResume() {
mStateSaved = false;
+ mExecutingActions = true;
moveToState(Fragment.RESUMED, false);
+ mExecutingActions = false;
}
public void dispatchPause() {
+ mExecutingActions = true;
moveToState(Fragment.STARTED, false);
+ mExecutingActions = false;
}
public void dispatchStop() {
+ mExecutingActions = true;
moveToState(Fragment.STOPPED, false);
+ mExecutingActions = false;
}
public void dispatchDestroyView() {
+ mExecutingActions = true;
moveToState(Fragment.CREATED, false);
+ mExecutingActions = false;
}
public void dispatchDestroy() {
mDestroyed = true;
execPendingActions();
+ mExecutingActions = true;
moveToState(Fragment.INITIALIZING, false);
+ mExecutingActions = false;
mHost = null;
mContainer = null;
mParent = null;
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 6717491..8538330 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -199,7 +199,7 @@
int getRequestedOrientation(in IBinder token);
void unbindFinished(in IBinder token, in Intent service, boolean doRebind);
void setProcessForeground(in IBinder token, int pid, boolean isForeground);
- long setServiceForeground(in ComponentName className, in IBinder token,
+ void setServiceForeground(in ComponentName className, in IBinder token,
int id, in Notification notification, int flags);
boolean moveActivityTaskToBack(in IBinder token, boolean nonRoot);
void getMemoryInfo(out ActivityManager.MemoryInfo outInfo);
@@ -604,16 +604,6 @@
ActivityManager.TaskSnapshot getTaskSnapshot(int taskId);
void scheduleApplicationInfoChanged(in List<String> packageNames, int userId);
- /**
- * Registers a listener for network rules state. When the network policy rules in
- * NetworkPolicyManagerService are updated, ActivityManagerService will notify these
- * registered listeners.
- *
- * @param procStateSeq The sequence number for which the listener is interested in knowing
- * the network policy rules state.
- * @return true if the listener is registered, false otherwise.
- */
- boolean registerNetworkRulesUpdateListener(IApplicationThread listener, long procStateSeq);
// WARNING: when these transactions are updated, check if they are any callers on the native
// side. If so, make sure they are using the correct transaction ids and arguments.
diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl
index 7378e2b..d5b4668 100644
--- a/core/java/android/app/IApplicationThread.aidl
+++ b/core/java/android/app/IApplicationThread.aidl
@@ -100,8 +100,9 @@
int resultCode, in String data, in Bundle extras, boolean ordered,
boolean sticky, int sendingUser, int processState);
void scheduleLowMemory();
- void scheduleActivityConfigurationChanged(IBinder token, in Configuration overrideConfig,
- boolean reportToActivity);
+ void scheduleActivityConfigurationChanged(IBinder token, in Configuration overrideConfig);
+ void scheduleActivityMovedToDisplay(IBinder token, int displayId,
+ in Configuration overrideConfig);
void scheduleRelaunchActivity(IBinder token, in List<ResultInfo> pendingResults,
in List<ReferrerIntent> pendingNewIntents, int configChanges, boolean notResumed,
in Configuration config, in Configuration overrideConfig, boolean preserveWindow);
@@ -153,6 +154,4 @@
void handleTrustStorageUpdate();
void attachAgent(String path);
void scheduleApplicationInfoChanged(in ApplicationInfo ai);
- void setBlockForNetworkState(int blockState, long procStateSeq);
- void notifyNetworkStateUpdated(long procStateSeq);
}
diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl
index 5e420c0..9834350 100644
--- a/core/java/android/app/ITaskStackListener.aidl
+++ b/core/java/android/app/ITaskStackListener.aidl
@@ -32,9 +32,10 @@
* running in the pinned stack and the activity is not actually started, but the task is either
* brought to the front or a new Intent is delivered to it.
*
- * @param sourceComponent the component name of the activity that initiated the restart attempt
+ * @param launchedFromPackage the package name of the activity that initiated the restart
+ * attempt
*/
- void onPinnedActivityRestartAttempt(in ComponentName sourceComponent);
+ void onPinnedActivityRestartAttempt(String launchedFromPackage);
/**
* Called whenever the pinned stack is done animating a resize.
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index 7ed96af..1c33e38 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -278,7 +278,7 @@
setApplicationInfo(aInfo);
final List<String> newPaths = new ArrayList<>();
- makePaths(mActivityThread, aInfo, newPaths, null /*libPaths*/);
+ makePaths(mActivityThread, aInfo, newPaths);
final List<String> addedPaths = new ArrayList<>(newPaths.size());
if (oldPaths != null) {
@@ -341,8 +341,17 @@
}
}
- public static void makePaths(ActivityThread activityThread, ApplicationInfo aInfo,
- List<String> outZipPaths, List<String> outLibPaths) {
+ public static void makePaths(ActivityThread activityThread,
+ ApplicationInfo aInfo,
+ List<String> outZipPaths) {
+ makePaths(activityThread, false, aInfo, outZipPaths, null);
+ }
+
+ public static void makePaths(ActivityThread activityThread,
+ boolean isBundledApp,
+ ApplicationInfo aInfo,
+ List<String> outZipPaths,
+ List<String> outLibPaths) {
final String appDir = aInfo.sourceDir;
final String libDir = aInfo.nativeLibraryDir;
final String[] sharedLibraries = aInfo.sharedLibraryFiles;
@@ -431,7 +440,7 @@
}
}
- if (aInfo.isSystemApp() && !aInfo.isUpdatedSystemApp()) {
+ if (isBundledApp) {
// Add path to system libraries to libPaths;
// Access to system libs should be limited
// to bundled applications; this is why updated
@@ -614,11 +623,12 @@
// space and initialize to a small value (instead of incurring growth code).
final List<String> zipPaths = new ArrayList<>(10);
final List<String> libPaths = new ArrayList<>(10);
- makePaths(mActivityThread, mApplicationInfo, zipPaths, libPaths);
final boolean isBundledApp = mApplicationInfo.isSystemApp()
&& !mApplicationInfo.isUpdatedSystemApp();
+ makePaths(mActivityThread, isBundledApp, mApplicationInfo, zipPaths, libPaths);
+
String libraryPermittedPath = mDataDir;
if (isBundledApp) {
// This is necessary to grant bundled apps access to
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 45a46b3..64fc44b 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -2702,11 +2702,11 @@
}
/**
- * Specifies the time at which this notification should be canceled, if it is not already
- * canceled.
+ * Specifies a duration in milliseconds after which this notification should be canceled,
+ * if it is not already canceled.
*/
- public Builder setTimeout(long when) {
- mN.mTimeout = when;
+ public Builder setTimeout(long durationMs) {
+ mN.mTimeout = durationMs;
return this;
}
@@ -3684,7 +3684,8 @@
mContext, backgroundColor);
mSecondaryTextColor = NotificationColorUtil.resolveSecondaryColor(
mContext, backgroundColor);
- mActionBarColor = NotificationColorUtil.resolveActionBarColor(backgroundColor);
+ mActionBarColor = NotificationColorUtil.resolveActionBarColor(mContext,
+ backgroundColor);
}
}
@@ -4166,12 +4167,21 @@
mN.extras.putCharSequence(EXTRA_SUB_TEXT, newSummary);
}
}
+ Boolean colorized = (Boolean) mN.extras.get(EXTRA_COLORIZED);
+ mN.extras.putBoolean(EXTRA_COLORIZED, false);
+
RemoteViews header = makeNotificationHeader();
+
if (summary != null) {
mN.extras.putCharSequence(EXTRA_SUB_TEXT, summary);
} else {
mN.extras.remove(EXTRA_SUB_TEXT);
}
+ if (colorized != null) {
+ mN.extras.putBoolean(EXTRA_COLORIZED, colorized);
+ } else {
+ mN.extras.remove(EXTRA_COLORIZED);
+ }
mN.color = color;
return header;
}
diff --git a/core/java/android/app/QueuedWork.java b/core/java/android/app/QueuedWork.java
index 6ee4780..a38fd43 100644
--- a/core/java/android/app/QueuedWork.java
+++ b/core/java/android/app/QueuedWork.java
@@ -16,86 +16,249 @@
package android.app;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Process;
+import android.util.Log;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.LinkedList;
/**
- * Internal utility class to keep track of process-global work that's
- * outstanding and hasn't been finished yet.
+ * Internal utility class to keep track of process-global work that's outstanding and hasn't been
+ * finished yet.
*
- * This was created for writing SharedPreference edits out
- * asynchronously so we'd have a mechanism to wait for the writes in
- * Activity.onPause and similar places, but we may use this mechanism
- * for other things in the future.
+ * New work will be {@link #queue queued}.
+ *
+ * It is possible to add 'finisher'-runnables that are {@link #waitToFinish guaranteed to be run}.
+ * This is used to make sure the work has been finished.
+ *
+ * This was created for writing SharedPreference edits out asynchronously so we'd have a mechanism
+ * to wait for the writes in Activity.onPause and similar places, but we may use this mechanism for
+ * other things in the future.
+ *
+ * The queued asynchronous work is performed on a separate, dedicated thread.
*
* @hide
*/
public class QueuedWork {
+ private static final String LOG_TAG = QueuedWork.class.getSimpleName();
+ private static final boolean DEBUG = true;
- // The set of Runnables that will finish or wait on any async
- // activities started by the application.
- private static final ConcurrentLinkedQueue<Runnable> sPendingWorkFinishers =
- new ConcurrentLinkedQueue<Runnable>();
+ /** Delay for delayed runnables, as big as possible but low enough to be barely perceivable */
+ private static final long DELAY = 100;
- private static ExecutorService sSingleThreadExecutor = null; // lazy, guarded by class
+ /** Lock for this class */
+ private static final Object sLock = new Object();
/**
- * Returns a single-thread Executor shared by the entire process,
- * creating it if necessary.
+ * Used to make sure that only one thread is processing work items at a time. This means that
+ * they are processed in the order added.
+ *
+ * This is separate from {@link #sLock} as this is held the whole time while work is processed
+ * and we do not want to stall the whole class.
*/
- public static ExecutorService singleThreadExecutor() {
- synchronized (QueuedWork.class) {
- if (sSingleThreadExecutor == null) {
- // TODO: can we give this single thread a thread name?
- sSingleThreadExecutor = Executors.newSingleThreadExecutor();
+ private static Object sProcessingWork = new Object();
+
+ /** Finishers {@link #addFinisher added} and not yet {@link #removeFinisher removed} */
+ @GuardedBy("sLock")
+ private static final LinkedList<Runnable> sFinishers = new LinkedList<>();
+
+ /** {@link #getHandler() Lazily} created handler */
+ @GuardedBy("sLock")
+ private static Handler sHandler = null;
+
+ /** Work queued via {@link #queue} */
+ @GuardedBy("sLock")
+ private static final LinkedList<Runnable> sWork = new LinkedList<>();
+
+ /** If new work can be delayed or not */
+ @GuardedBy("sLock")
+ private static boolean sCanDelay = true;
+
+ /**
+ * Lazily create a handler on a separate thread.
+ *
+ * @return the handler
+ */
+ private static Handler getHandler() {
+ synchronized (sLock) {
+ if (sHandler == null) {
+ HandlerThread handlerThread = new HandlerThread("queued-work-looper",
+ Process.THREAD_PRIORITY_FOREGROUND);
+ handlerThread.start();
+
+ sHandler = new QueuedWorkHandler(handlerThread.getLooper());
}
- return sSingleThreadExecutor;
+ return sHandler;
}
}
/**
- * Add a runnable to finish (or wait for) a deferred operation
- * started in this context earlier. Typically finished by e.g.
- * an Activity#onPause. Used by SharedPreferences$Editor#startCommit().
+ * Add a finisher-runnable to wait for {@link #queue asynchronously processed work}.
*
- * Note that this doesn't actually start it running. This is just
- * a scratch set for callers doing async work to keep updated with
- * what's in-flight. In the common case, caller code
- * (e.g. SharedPreferences) will pretty quickly call remove()
- * after an add(). The only time these Runnables are run is from
- * waitToFinish(), below.
+ * Used by SharedPreferences$Editor#startCommit().
+ *
+ * Note that this doesn't actually start it running. This is just a scratch set for callers
+ * doing async work to keep updated with what's in-flight. In the common case, caller code
+ * (e.g. SharedPreferences) will pretty quickly call remove() after an add(). The only time
+ * these Runnables are run is from {@link #waitToFinish}.
+ *
+ * @param finisher The runnable to add as finisher
*/
- public static void add(Runnable finisher) {
- sPendingWorkFinishers.add(finisher);
- }
-
- public static void remove(Runnable finisher) {
- sPendingWorkFinishers.remove(finisher);
+ public static void addFinisher(Runnable finisher) {
+ synchronized (sLock) {
+ sFinishers.add(finisher);
+ }
}
/**
- * Finishes or waits for async operations to complete.
- * (e.g. SharedPreferences$Editor#startCommit writes)
+ * Remove a previously {@link #addFinisher added} finisher-runnable.
*
- * Is called from the Activity base class's onPause(), after
- * BroadcastReceiver's onReceive, after Service command handling,
- * etc. (so async work is never lost)
+ * @param finisher The runnable to remove.
+ */
+ public static void removeFinisher(Runnable finisher) {
+ synchronized (sLock) {
+ sFinishers.remove(finisher);
+ }
+ }
+
+ /**
+ * Trigger queued work to be processed immediately. The queued work is processed on a separate
+ * thread asynchronous. While doing that run and process all finishers on this thread. The
+ * finishers can be implemented in a way to check weather the queued work is finished.
+ *
+ * Is called from the Activity base class's onPause(), after BroadcastReceiver's onReceive,
+ * after Service command handling, etc. (so async work is never lost)
*/
public static void waitToFinish() {
- Runnable toFinish;
- while ((toFinish = sPendingWorkFinishers.poll()) != null) {
- toFinish.run();
+ long startTime = 0;
+ boolean hadMessages = false;
+
+ if (DEBUG) {
+ startTime = System.currentTimeMillis();
+ }
+
+ Handler handler = getHandler();
+
+ synchronized (sLock) {
+ if (handler.hasMessages(QueuedWorkHandler.MSG_RUN)) {
+ // Delayed work will be processed at processPendingWork() below
+ handler.removeMessages(QueuedWorkHandler.MSG_RUN);
+
+ if (DEBUG) {
+ hadMessages = true;
+ Log.d(LOG_TAG, "waiting");
+ }
+ }
+
+ // We should not delay any work as this might delay the finishers
+ sCanDelay = false;
+ }
+
+ processPendingWork();
+
+ try {
+ while (true) {
+ Runnable finisher;
+
+ synchronized (sLock) {
+ finisher = sFinishers.poll();
+ }
+
+ if (finisher == null) {
+ break;
+ }
+
+ finisher.run();
+ }
+ } finally {
+ sCanDelay = true;
+ }
+
+ if (DEBUG) {
+ long waitTime = System.currentTimeMillis() - startTime;
+
+ if (waitTime > 0 || hadMessages) {
+ Log.d(LOG_TAG, "waited " + waitTime + " ms");
+ }
}
}
-
+
/**
- * Returns true if there is pending work to be done. Note that the
- * result is out of data as soon as you receive it, so be careful how you
- * use it.
+ * Queue a work-runnable for processing asynchronously.
+ *
+ * @param work The new runnable to process
+ * @param shouldDelay If the message should be delayed
+ */
+ public static void queue(Runnable work, boolean shouldDelay) {
+ Handler handler = getHandler();
+
+ synchronized (sLock) {
+ sWork.add(work);
+
+ if (shouldDelay && sCanDelay) {
+ handler.sendEmptyMessageDelayed(QueuedWorkHandler.MSG_RUN, DELAY);
+ } else {
+ handler.sendEmptyMessage(QueuedWorkHandler.MSG_RUN);
+ }
+ }
+ }
+
+ /**
+ * @return True iff there is any {@link #queue async work queued}.
*/
public static boolean hasPendingWork() {
- return !sPendingWorkFinishers.isEmpty();
+ synchronized (sLock) {
+ return !sWork.isEmpty();
+ }
}
-
+
+ private static void processPendingWork() {
+ long startTime = 0;
+
+ if (DEBUG) {
+ startTime = System.currentTimeMillis();
+ }
+
+ synchronized (sProcessingWork) {
+ LinkedList<Runnable> work;
+
+ synchronized (sLock) {
+ work = (LinkedList<Runnable>) sWork.clone();
+ sWork.clear();
+
+ // Remove all msg-s as all work will be processed now
+ getHandler().removeMessages(QueuedWorkHandler.MSG_RUN);
+ }
+
+ if (work.size() > 0) {
+ for (Runnable w : work) {
+ w.run();
+ }
+
+ if (DEBUG) {
+ Log.d(LOG_TAG, "processing " + work.size() + " items took " +
+ +(System.currentTimeMillis() - startTime) + " ms");
+ }
+ }
+ }
+ }
+
+ private static class QueuedWorkHandler extends Handler {
+ static final int MSG_RUN = 1;
+
+ QueuedWorkHandler(Looper looper) {
+ super(looper);
+ }
+
+ public void handleMessage(Message msg) {
+ if (msg.what == MSG_RUN) {
+ processPendingWork();
+ }
+ }
+ }
}
diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java
index 94a8990..52ec045 100644
--- a/core/java/android/app/ResourcesManager.java
+++ b/core/java/android/app/ResourcesManager.java
@@ -104,10 +104,17 @@
new WeakHashMap<>();
/**
- * A cache of DisplayId to DisplayAdjustments.
+ * A cache of DisplayId, DisplayAdjustments to Display.
*/
- private final ArrayMap<Pair<Integer, DisplayAdjustments>, WeakReference<Display>> mDisplays =
- new ArrayMap<>();
+ private final ArrayMap<Pair<Integer, DisplayAdjustments>, WeakReference<Display>>
+ mAdjustedDisplays = new ArrayMap<>();
+
+ /**
+ * A cache of DisplayId, Resources to Display. These display adjustments associated with these
+ * {@link Display}s will change as the resources change.
+ */
+ private final ArrayMap<Pair<Integer, Resources>, WeakReference<Display>> mResourceDisplays =
+ new ArrayMap<>();
public static ResourcesManager getInstance() {
synchronized (ResourcesManager.class) {
@@ -201,19 +208,21 @@
/**
* Returns an adjusted {@link Display} object based on the inputs or null if display isn't
- * available.
+ * available. This method is only used within {@link ResourcesManager} to calculate display
+ * metrics based on a set {@link DisplayAdjustments}. All other usages should instead call
+ * {@link ResourcesManager#getAdjustedDisplay(int, Resources)}.
*
* @param displayId display Id.
* @param displayAdjustments display adjustments.
*/
- public Display getAdjustedDisplay(final int displayId,
+ private Display getAdjustedDisplay(final int displayId,
@Nullable DisplayAdjustments displayAdjustments) {
final DisplayAdjustments displayAdjustmentsCopy = (displayAdjustments != null)
? new DisplayAdjustments(displayAdjustments) : new DisplayAdjustments();
final Pair<Integer, DisplayAdjustments> key =
Pair.create(displayId, displayAdjustmentsCopy);
synchronized (this) {
- WeakReference<Display> wd = mDisplays.get(key);
+ WeakReference<Display> wd = mAdjustedDisplays.get(key);
if (wd != null) {
final Display display = wd.get();
if (display != null) {
@@ -227,7 +236,37 @@
}
final Display display = dm.getCompatibleDisplay(displayId, key.second);
if (display != null) {
- mDisplays.put(key, new WeakReference<>(display));
+ mAdjustedDisplays.put(key, new WeakReference<>(display));
+ }
+ return display;
+ }
+ }
+
+ /**
+ * Returns an adjusted {@link Display} object based on the inputs or null if display isn't
+ * available.
+ *
+ * @param displayId display Id.
+ * @param resources The {@link Resources} backing the display adjustments.
+ */
+ public Display getAdjustedDisplay(final int displayId, Resources resources) {
+ final Pair<Integer, Resources> key = Pair.create(displayId, resources);
+ synchronized (this) {
+ WeakReference<Display> wd = mResourceDisplays.get(key);
+ if (wd != null) {
+ final Display display = wd.get();
+ if (display != null) {
+ return display;
+ }
+ }
+ final DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();
+ if (dm == null) {
+ // may be null early in system startup
+ return null;
+ }
+ final Display display = dm.getCompatibleDisplay(displayId, resources);
+ if (display != null) {
+ mResourceDisplays.put(key, new WeakReference<>(display));
}
return display;
}
@@ -316,6 +355,7 @@
final DisplayMetrics dm = getDisplayMetrics(key.mDisplayId, daj);
final Configuration config = generateConfig(key, dm);
final ResourcesImpl impl = new ResourcesImpl(assets, dm, config, daj);
+
if (DEBUG) {
Slog.d(TAG, "- creating impl=" + impl + " with key: " + key);
}
@@ -521,7 +561,8 @@
}
// Update any existing Activity Resources references.
- updateResourcesForActivity(activityToken, overrideConfig);
+ updateResourcesForActivity(activityToken, overrideConfig, displayId,
+ false /* movedToDifferentDisplay */);
// Now request an actual Resources object.
return getOrCreateResources(activityToken, key, classLoader);
@@ -687,9 +728,12 @@
* still valid and will have the updated configuration.
* @param activityToken The Activity token.
* @param overrideConfig The configuration override to update.
+ * @param displayId Id of the display where activity currently resides.
+ * @param movedToDifferentDisplay Indicates if the activity was moved to different display.
*/
public void updateResourcesForActivity(@NonNull IBinder activityToken,
- @Nullable Configuration overrideConfig) {
+ @Nullable Configuration overrideConfig, int displayId,
+ boolean movedToDifferentDisplay) {
try {
Trace.traceBegin(Trace.TRACE_TAG_RESOURCES,
"ResourcesManager#updateResourcesForActivity");
@@ -697,8 +741,9 @@
final ActivityResources activityResources =
getOrCreateActivityResourcesStructLocked(activityToken);
- if (Objects.equals(activityResources.overrideConfig, overrideConfig)) {
- // They are the same, no work to do.
+ if (Objects.equals(activityResources.overrideConfig, overrideConfig)
+ && !movedToDifferentDisplay) {
+ // They are the same and no change of display id, no work to do.
return;
}
@@ -721,7 +766,7 @@
+ Configuration.resourceQualifierString(oldConfig)
+ " to newConfig="
+ Configuration.resourceQualifierString(
- activityResources.overrideConfig),
+ activityResources.overrideConfig) + " displayId=" + displayId,
here);
}
@@ -765,12 +810,12 @@
// Create the new ResourcesKey with the rebased override config.
final ResourcesKey newKey = new ResourcesKey(oldKey.mResDir,
oldKey.mSplitResDirs,
- oldKey.mOverlayDirs, oldKey.mLibDirs, oldKey.mDisplayId,
+ oldKey.mOverlayDirs, oldKey.mLibDirs, displayId,
rebasedOverrideConfig, oldKey.mCompatInfo);
if (DEBUG) {
Slog.d(TAG, "rebasing ref=" + resources + " from oldKey=" + oldKey
- + " to newKey=" + newKey);
+ + " to newKey=" + newKey + ", displayId=" + displayId);
}
ResourcesImpl resourcesImpl = findResourcesImplForKeyLocked(newKey);
@@ -806,7 +851,9 @@
}
int changes = mResConfiguration.updateFrom(config);
// Things might have changed in display manager, so clear the cached displays.
- mDisplays.clear();
+ mAdjustedDisplays.clear();
+ mResourceDisplays.clear();
+
DisplayMetrics defaultDisplayMetrics = getDisplayMetrics();
if (compat != null && (mResCompatibilityInfo == null ||
diff --git a/core/java/android/app/Service.java b/core/java/android/app/Service.java
index 9cd048e..4fe4f98 100644
--- a/core/java/android/app/Service.java
+++ b/core/java/android/app/Service.java
@@ -683,28 +683,26 @@
* flag if killing your service would be disruptive to the user, such as
* if your service is performing background music playback, so the user
* would notice if their music stopped playing.
- *
+ *
* <p>If you need your application to run on platform versions prior to API
* level 5, you can use the following model to call the the older setForeground()
* or this modern method as appropriate:
- *
+ *
* {@sample development/samples/ApiDemos/src/com/example/android/apis/app/ForegroundService.java
* foreground_compatibility}
- *
+ *
* @param id The identifier for this notification as per
* {@link NotificationManager#notify(int, Notification)
* NotificationManager.notify(int, Notification)}; must not be 0.
* @param notification The Notification to be displayed.
- *
+ *
* @see #stopForeground(boolean)
*/
public final void startForeground(int id, Notification notification) {
try {
- final long procStateSeq = mActivityManager.setServiceForeground(
- new ComponentName(this, mClassName), mToken, id, notification, 0);
- if (procStateSeq != ActivityThread.INVALID_PROC_STATE_SEQ && mThread != null) {
- mThread.blockForNetworkAccessInForegroundService(procStateSeq);
- }
+ mActivityManager.setServiceForeground(
+ new ComponentName(this, mClassName), mToken, id,
+ notification, 0);
} catch (RemoteException ex) {
}
}
diff --git a/core/java/android/app/SharedPreferencesImpl.java b/core/java/android/app/SharedPreferencesImpl.java
index 3bb7019..11ba7ee 100644
--- a/core/java/android/app/SharedPreferencesImpl.java
+++ b/core/java/android/app/SharedPreferencesImpl.java
@@ -53,7 +53,7 @@
final class SharedPreferencesImpl implements SharedPreferences {
private static final String TAG = "SharedPreferencesImpl";
- private static final boolean DEBUG = false;
+ private static final boolean DEBUG = true;
private static final Object CONTENT = new Object();
// Lock ordering rules:
@@ -318,6 +318,7 @@
@GuardedBy("mWritingToDiskLock")
volatile boolean writeToDiskResult = false;
+ boolean wasWritten = false;
private MemoryCommitResult(long memoryStateGeneration, @Nullable List<String> keysModified,
@Nullable Set<OnSharedPreferenceChangeListener> listeners,
@@ -328,7 +329,8 @@
this.mapToWriteToDisk = mapToWriteToDisk;
}
- void setDiskWriteResult(boolean result) {
+ void setDiskWriteResult(boolean wasWritten, boolean result) {
+ this.wasWritten = wasWritten;
writeToDiskResult = result;
writtenToDiskLatch.countDown();
}
@@ -396,6 +398,8 @@
}
public void apply() {
+ final long startTime = System.currentTimeMillis();
+
final MemoryCommitResult mcr = commitToMemory();
final Runnable awaitCommit = new Runnable() {
public void run() {
@@ -403,15 +407,21 @@
mcr.writtenToDiskLatch.await();
} catch (InterruptedException ignored) {
}
+
+ if (DEBUG && mcr.wasWritten) {
+ Log.d(TAG, mFile.getName() + ":" + mcr.memoryStateGeneration
+ + " applied after " + (System.currentTimeMillis() - startTime)
+ + " ms");
+ }
}
};
- QueuedWork.add(awaitCommit);
+ QueuedWork.addFinisher(awaitCommit);
Runnable postWriteRunnable = new Runnable() {
public void run() {
awaitCommit.run();
- QueuedWork.remove(awaitCommit);
+ QueuedWork.removeFinisher(awaitCommit);
}
};
@@ -503,13 +513,26 @@
}
public boolean commit() {
+ long startTime = 0;
+
+ if (DEBUG) {
+ startTime = System.currentTimeMillis();
+ }
+
MemoryCommitResult mcr = commitToMemory();
+
SharedPreferencesImpl.this.enqueueDiskWrite(
mcr, null /* sync write on this thread okay */);
try {
mcr.writtenToDiskLatch.await();
} catch (InterruptedException e) {
return false;
+ } finally {
+ if (DEBUG) {
+ Log.d(TAG, mFile.getName() + ":" + mcr.memoryStateGeneration
+ + " committed after " + (System.currentTimeMillis() - startTime)
+ + " ms");
+ }
}
notifyListeners(mcr);
return mcr.writeToDiskResult;
@@ -587,11 +610,7 @@
}
}
- if (DEBUG) {
- Log.d(TAG, "added " + mcr.memoryStateGeneration + " -> " + mFile.getName());
- }
-
- QueuedWork.singleThreadExecutor().execute(writeToDiskRunnable);
+ QueuedWork.queue(writeToDiskRunnable, !isFromSyncCommit);
}
private static FileOutputStream createFileOutputStream(File file) {
@@ -619,8 +638,31 @@
// Note: must hold mWritingToDiskLock
private void writeToFile(MemoryCommitResult mcr, boolean isFromSyncCommit) {
+ long startTime = 0;
+ long existsTime = 0;
+ long backupExistsTime = 0;
+ long outputStreamCreateTime = 0;
+ long writeTime = 0;
+ long fsyncTime = 0;
+ long setPermTime = 0;
+ long fstatTime = 0;
+ long deleteTime = 0;
+
+ if (DEBUG) {
+ startTime = System.currentTimeMillis();
+ }
+
+ boolean fileExists = mFile.exists();
+
+ if (DEBUG) {
+ existsTime = System.currentTimeMillis();
+
+ // Might not be set, hence init them to a default value
+ backupExistsTime = existsTime;
+ }
+
// Rename the current file so it may be used as a backup during the next read
- if (mFile.exists()) {
+ if (fileExists) {
boolean needsWrite = false;
// Only need to write if the disk state is older than this commit
@@ -639,18 +681,21 @@
}
if (!needsWrite) {
- if (DEBUG) {
- Log.d(TAG, "skipped " + mcr.memoryStateGeneration + " -> " + mFile.getName());
- }
- mcr.setDiskWriteResult(true);
+ mcr.setDiskWriteResult(false, true);
return;
}
- if (!mBackupFile.exists()) {
+ boolean backupFileExists = mBackupFile.exists();
+
+ if (DEBUG) {
+ backupExistsTime = System.currentTimeMillis();
+ }
+
+ if (!backupFileExists) {
if (!mFile.renameTo(mBackupFile)) {
Log.e(TAG, "Couldn't rename file " + mFile
+ " to backup file " + mBackupFile);
- mcr.setDiskWriteResult(false);
+ mcr.setDiskWriteResult(false, false);
return;
}
} else {
@@ -663,19 +708,34 @@
// from the backup.
try {
FileOutputStream str = createFileOutputStream(mFile);
+
+ if (DEBUG) {
+ outputStreamCreateTime = System.currentTimeMillis();
+ }
+
if (str == null) {
- mcr.setDiskWriteResult(false);
+ mcr.setDiskWriteResult(false, false);
return;
}
XmlUtils.writeMapXml(mcr.mapToWriteToDisk, str);
+
+ if (DEBUG) {
+ writeTime = System.currentTimeMillis();
+ }
+
FileUtils.sync(str);
if (DEBUG) {
- Log.d(TAG, "wrote " + mcr.memoryStateGeneration + " -> " + mFile.getName());
+ fsyncTime = System.currentTimeMillis();
}
str.close();
ContextImpl.setFilePermissionsFromMode(mFile.getPath(), mMode, 0);
+
+ if (DEBUG) {
+ setPermTime = System.currentTimeMillis();
+ }
+
try {
final StructStat stat = Os.stat(mFile.getPath());
synchronized (mLock) {
@@ -685,12 +745,30 @@
} catch (ErrnoException e) {
// Do nothing
}
+
+ if (DEBUG) {
+ fstatTime = System.currentTimeMillis();
+ }
+
// Writing was successful, delete the backup file if there is one.
mBackupFile.delete();
+ if (DEBUG) {
+ deleteTime = System.currentTimeMillis();
+ }
+
mDiskStateGeneration = mcr.memoryStateGeneration;
- mcr.setDiskWriteResult(true);
+ mcr.setDiskWriteResult(true, true);
+
+ Log.d(TAG, "write: " + (existsTime - startTime) + "/"
+ + (backupExistsTime - startTime) + "/"
+ + (outputStreamCreateTime - startTime) + "/"
+ + (writeTime - startTime) + "/"
+ + (fsyncTime - startTime) + "/"
+ + (setPermTime - startTime) + "/"
+ + (fstatTime - startTime) + "/"
+ + (deleteTime - startTime));
return;
} catch (XmlPullParserException e) {
@@ -698,12 +776,13 @@
} catch (IOException e) {
Log.w(TAG, "writeToFile: Got exception:", e);
}
+
// Clean up an unsuccessfully written file
if (mFile.exists()) {
if (!mFile.delete()) {
Log.e(TAG, "Couldn't clean up partially-written file " + mFile);
}
}
- mcr.setDiskWriteResult(false);
+ mcr.setDiskWriteResult(false, false);
}
}
diff --git a/core/java/android/app/TaskStackListener.java b/core/java/android/app/TaskStackListener.java
index 35c67d3..5a0845f 100644
--- a/core/java/android/app/TaskStackListener.java
+++ b/core/java/android/app/TaskStackListener.java
@@ -35,7 +35,7 @@
}
@Override
- public void onPinnedActivityRestartAttempt(ComponentName sourceComponent) throws RemoteException {
+ public void onPinnedActivityRestartAttempt(String launchedFromPackage) throws RemoteException {
}
@Override
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index f1ccabe..6585793 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -28,6 +28,7 @@
import android.annotation.WorkerThread;
import android.app.Activity;
import android.app.IServiceConnection;
+import android.app.KeyguardManager;
import android.app.admin.SecurityLog.SecurityEvent;
import android.content.ComponentName;
import android.content.Context;
@@ -1773,10 +1774,14 @@
* if any of the accounts have it.
* </ul>
*/
+ @SystemApi
+ @TestApi
public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED =
"android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED";
/** @hide See {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED} */
+ @SystemApi
+ @TestApi
public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED =
"android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED";
@@ -2694,6 +2699,11 @@
* Force a new device unlock password (the password needed to access the entire device, not for
* individual accounts) on the user. This takes effect immediately.
* <p>
+ * <em>For device owner and profile owners targeting SDK level
+ * {@link android.os.Build.VERSION_CODES#O} or above, this API is no longer available and will
+ * throw {@link SecurityException}. Please use the new API {@link #resetPasswordWithToken}
+ * instead. </em>
+ * <p>
* <em>Note: This API has been limited as of {@link android.os.Build.VERSION_CODES#N} for
* device admins that are not device owner and not profile owner.
* The password can now only be changed if there is currently no password set. Device owner
@@ -2740,6 +2750,127 @@
}
/**
+ * Called by a profile or device owner to provision a token which can later be used to reset the
+ * device lockscreen password (if called by device owner), or work challenge (if called by
+ * profile owner), via {@link #resetPasswordWithToken}.
+ * <p>
+ * If the user currently has a lockscreen password, the provisioned token will not be
+ * immediately usable; it only becomes active after the user performs a confirm credential
+ * operation, which can be triggered by {@link KeyguardManager#createConfirmDeviceCredentialIntent}.
+ * If the user has no lockscreen password, the token is activated immediately. In all cases,
+ * the active state of the current token can be checked by {@link #isResetPasswordTokenActive}.
+ * For security reasons, un-activated tokens are only stored in memory and will be lost once
+ * the device reboots. In this case a new token needs to be provisioned again.
+ * <p>
+ * Once provisioned and activated, the token will remain effective even if the user changes
+ * or clears the lockscreen password.
+ * <p>
+ * <em>This token is highly sensitive and should be treated at the same level as user
+ * credentials. In particular, NEVER store this token on device in plaintext, especially in
+ * Device-Encrypted storage if the token will be used to reset password on FBE devices before
+ * user unlocks.
+ * </em>
+ *
+ * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
+ * @param token a secure token a least 32-byte long, which must be generated by a
+ * cryptographically strong random number generator.
+ * @return true if the operation is successful, false otherwise.
+ * @throws IllegalArgumentException if the supplied token is invalid.
+ * @throws SecurityException
+ */
+ public boolean setResetPasswordToken(ComponentName admin, byte[] token) {
+ throwIfParentInstance("setResetPasswordToken");
+ if (mService != null) {
+ try {
+ return mService.setResetPasswordToken(admin, token);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Called by a profile or device owner to revoke the current password reset token.
+ *
+ * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
+ * @return true if the operation is successful, false otherwise.
+ */
+ public boolean clearResetPasswordToken(ComponentName admin) {
+ throwIfParentInstance("clearResetPasswordToken");
+ if (mService != null) {
+ try {
+ return mService.clearResetPasswordToken(admin);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Called by a profile or device owner to check if the current reset password token is active.
+ *
+ * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
+ * @return true if the token is active, false otherwise.
+ * @throws IllegalStateException if no token has been set.
+ */
+ public boolean isResetPasswordTokenActive(ComponentName admin) {
+ throwIfParentInstance("isResetPasswordTokenActive");
+ if (mService != null) {
+ try {
+ return mService.isResetPasswordTokenActive(admin);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Called by device or profile owner to force set a new device unlock password or a work profile
+ * challenge on current user. This takes effect immediately.
+ * <p>
+ * Unlike {@link #resetPassword}, this API can change the password even before the user or
+ * device is unlocked or decrypted. The supplied token must have been previously provisioned via
+ * {@link #setResetPasswordToken}, and in active state {@link #isResetPasswordTokenActive}.
+ * <p>
+ * The given password must be sufficient for the current password quality and length constraints
+ * as returned by {@link #getPasswordQuality(ComponentName)} and
+ * {@link #getPasswordMinimumLength(ComponentName)}; if it does not meet these constraints, then
+ * it will be rejected and false returned. Note that the password may be a stronger quality
+ * (containing alphanumeric characters when the requested quality is only numeric), in which
+ * case the currently active quality will be increased to match.
+ * <p>
+ * Calling with a null or empty password will clear any existing PIN, pattern or password if the
+ * current password constraints allow it.
+ *
+ * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
+ * @param password The new password for the user. Null or empty clears the password.
+ * @param token the password reset token previously provisioned by #setResetPasswordToken.
+ * @param flags May be 0 or combination of {@link #RESET_PASSWORD_REQUIRE_ENTRY} and
+ * {@link #RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT}.
+ * @return Returns true if the password was applied, or false if it is not acceptable for the
+ * current constraints.
+ * @throws SecurityException if the calling application does not own an active administrator
+ * that uses {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD}
+ * @throws IllegalStateException if the provided token is not valid.
+ * @throws IllegalArgumentException if the password does not meet system requirements.
+ */
+ public boolean resetPasswordWithToken(@NonNull ComponentName admin, String password,
+ byte[] token, int flags) {
+ throwIfParentInstance("resetPassword");
+ if (mService != null) {
+ try {
+ return mService.resetPasswordWithToken(admin, password, token, flags);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ return false;
+ }
+
+ /**
* Called by an application that is administering the device to set the maximum time for user
* activity until the device will lock. This limits the length that the user can set. It takes
* effect immediately.
@@ -3215,6 +3346,17 @@
public static final int KEYGUARD_DISABLE_FEATURES_ALL = 0x7fffffff;
/**
+ * Keyguard features that when set on a managed profile that doesn't have its own challenge will
+ * affect the profile's parent user. These can also be set on the managed profile's parent
+ * {@link DevicePolicyManager} instance.
+ *
+ * @hide
+ */
+ public static final int PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER =
+ DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS
+ | DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT;
+
+ /**
* Called by an application that is administering the device to request that the storage system
* be encrypted.
* <p>
@@ -4414,12 +4556,22 @@
/**
* Clears the current device owner. The caller must be the device owner. This function should be
* used cautiously as once it is called it cannot be undone. The device owner can only be set as
- * a part of device setup before setup completes.
+ * a part of device setup, before it completes.
+ * <p>
+ * While some policies previously set by the device owner will be cleared by this method, it is
+ * a best-effort process and some other policies will still remain in place after the device
+ * owner is cleared.
*
* @param packageName The package name of the device owner.
* @throws SecurityException if the caller is not in {@code packageName} or {@code packageName}
* does not own the current device owner component.
+ *
+ * @deprecated This method is expected to be used for testing purposes only. The device owner
+ * will lose control of the device and its data after calling it. In order to protect any
+ * sensitive data that remains on the device, it is advised that the device owner factory resets
+ * the device instead of calling this method. See {@link #wipeData(int)}.
*/
+ @Deprecated
public void clearDeviceOwnerApp(String packageName) {
throwIfParentInstance("clearDeviceOwnerApp");
if (mService != null) {
@@ -4541,15 +4693,23 @@
}
/**
- * Clears the active profile owner and removes all user restrictions. The caller must be from
- * the same package as the active profile owner for this user, otherwise a SecurityException
- * will be thrown.
+ * Clears the active profile owner. The caller must be the profile owner of this user, otherwise
+ * a SecurityException will be thrown. This method is not available to managed profile owners.
* <p>
- * This doesn't work for managed profile owners.
+ * While some policies previously set by the profile owner will be cleared by this method, it is
+ * a best-effort process and some other policies will still remain in place after the profile
+ * owner is cleared.
*
* @param admin The component to remove as the profile owner.
- * @throws SecurityException if {@code admin} is not an active profile owner.
+ * @throws SecurityException if {@code admin} is not an active profile owner, or the method is
+ * being called from a managed profile.
+ *
+ * @deprecated This method is expected to be used for testing purposes only. The profile owner
+ * will lose control of the user and its data after calling it. In order to protect any
+ * sensitive data that remains on this user, it is advised that the profile owner deletes it
+ * instead of calling this method. See {@link #wipeData(int)}.
*/
+ @Deprecated
public void clearProfileOwner(@NonNull ComponentName admin) {
throwIfParentInstance("clearProfileOwner");
if (mService != null) {
@@ -6194,7 +6354,6 @@
* The settings that can be updated by a profile or device owner with this method are:
* <ul>
* <li>{@link Settings.Secure#DEFAULT_INPUT_METHOD}</li>
- * <li>{@link Settings.Secure#INSTALL_NON_MARKET_APPS}</li>
* <li>{@link Settings.Secure#SKIP_FIRST_USE_HINTS}</li>
* </ul>
* <p>
@@ -6203,6 +6362,15 @@
* <li>{@link Settings.Secure#LOCATION_MODE}</li>
* </ul>
*
+ * <strong>Note: Starting from Android O, apps should no longer call this method with the
+ * setting {@link android.provider.Settings.Secure#INSTALL_NON_MARKET_APPS}, which is
+ * deprecated. Instead, device owners or profile owners should use the restriction
+ * {@link UserManager#DISALLOW_INSTALL_UNKNOWN_SOURCES}.
+ * If any app targeting {@link android.os.Build.VERSION_CODES#O} or higher calls this method
+ * with {@link android.provider.Settings.Secure#INSTALL_NON_MARKET_APPS},
+ * an {@link UnsupportedOperationException} is thrown.
+ * </strong>
+ *
* @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.
@@ -7512,6 +7680,7 @@
* @throws SecurityException if {@code admin} is not a device owner.
*/
public void setBackupServiceEnabled(@NonNull ComponentName admin, boolean enabled) {
+ throwIfParentInstance("setBackupServiceEnabled");
try {
mService.setBackupServiceEnabled(admin, enabled);
} catch (RemoteException re) {
@@ -7528,6 +7697,7 @@
* @see #setBackupServiceEnabled
*/
public boolean isBackupServiceEnabled(@NonNull ComponentName admin) {
+ throwIfParentInstance("isBackupServiceEnabled");
try {
return mService.isBackupServiceEnabled(admin);
} catch (RemoteException re) {
@@ -7538,7 +7708,34 @@
/**
* Called by a device owner to control the network logging feature.
*
- * <p> Network logs contain DNS lookup and connect() library call events.
+ * <p> Network logs contain DNS lookup and connect() library call events. The following library
+ * functions are recorded while network logging is active:
+ * <ul>
+ * <li>{@code getaddrinfo()}</li>
+ * <li>{@code gethostbyname()}</li>
+ * <li>{@code connect()}</li>
+ * </ul>
+ *
+ * <p> Network logging is a low-overhead tool for forensics but it is not guaranteed to use
+ * full system call logging; event reporting is enabled by default for all processes but not
+ * strongly enforced.
+ * Events from applications using alternative implementations of libc, making direct kernel
+ * calls, or deliberately obfuscating traffic may not be recorded.
+ *
+ * <p> Some common network events may not be reported. For example:
+ * <ul>
+ * <li>Applications may hardcode IP addresses to reduce the number of DNS lookups, or use
+ * an alternative system for name resolution, and so avoid calling
+ * {@code getaddrinfo()} or {@code gethostbyname}.</li>
+ * <li>Applications may use datagram sockets for performance reasons, for example
+ * for a game client. Calling {@code connect()} is unnecessary for this kind of
+ * socket, so it will not trigger a network event.</li>
+ * </ul>
+ *
+ * <p> It is possible to directly intercept layer 3 traffic leaving the device using an
+ * always-on VPN service.
+ * See {@link #setAlwaysOnVpnPackage(ComponentName, String, boolean)}
+ * and {@link android.net.VpnService} for details.
*
* <p><strong>Note:</strong> The device owner won't be able to retrieve network logs if there
* are unaffiliated secondary users or profiles on the device, regardless of whether the
@@ -7738,4 +7935,27 @@
throw re.rethrowFromSystemServer();
}
}
+
+ /**
+ * Called by the system to find out whether the user's IME was set by the device/profile owner
+ * or the user.
+ *
+ * @param user The user for whom to retrieve information.
+ * @return {@code true} if the user's IME was set by the device or profile owner, {@code false}
+ * otherwise.
+ * @throws SecurityException if the caller does not have permission to retrieve information
+ * about the given user's default IME. Device Owner and Profile Owner can retrieve
+ * information about the user they run on; the System can retrieve information about any
+ * user.
+ *
+ * @hide
+ */
+ @TestApi
+ public boolean isDefaultInputMethodSetByOwner(@NonNull UserHandle user) {
+ try {
+ return mService.isDefaultInputMethodSetByOwner(user);
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
}
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 79fe10e..ec97c2c 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -342,4 +342,11 @@
long getLastSecurityLogRetrievalTime();
long getLastBugReportRequestTime();
long getLastNetworkLogRetrievalTime();
+
+ boolean setResetPasswordToken(in ComponentName admin, in byte[] token);
+ boolean clearResetPasswordToken(in ComponentName admin);
+ boolean isResetPasswordTokenActive(in ComponentName admin);
+ boolean resetPasswordWithToken(in ComponentName admin, String password, in byte[] token, int flags);
+
+ boolean isDefaultInputMethodSetByOwner(in UserHandle user);
}
diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java
index 6591fc9..483a7a1 100644
--- a/core/java/android/app/assist/AssistStructure.java
+++ b/core/java/android/app/assist/AssistStructure.java
@@ -17,13 +17,13 @@
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
-import android.view.ViewStructure;
import android.view.ViewRootImpl;
+import android.view.ViewStructure;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
+import android.view.autofill.AutoFillId;
import android.view.autofill.AutoFillType;
import android.view.autofill.AutoFillValue;
-import android.view.autofill.AutoFillId;
import java.util.ArrayList;
@@ -419,7 +419,7 @@
mDisplayId = root.getDisplayId();
mRoot = new ViewNode();
- ViewNodeBuilder builder = new ViewNodeBuilder(assist, mRoot, false, 0);
+ ViewNodeBuilder builder = new ViewNodeBuilder(assist, mRoot, false);
if ((root.getWindowFlags() & WindowManager.LayoutParams.FLAG_SECURE) != 0) {
if (forAutoFill) {
// NOTE: flags are currently not supported, hence 0
@@ -538,6 +538,7 @@
AutoFillId mAutoFillId;
AutoFillType mAutoFillType;
AutoFillValue mAutoFillValue;
+ String[] mAutoFillOptions;
boolean mSanitized;
int mX;
int mY;
@@ -579,6 +580,7 @@
static final int FLAGS_HAS_EXTRAS = 0x00400000;
static final int FLAGS_HAS_ID = 0x00200000;
static final int FLAGS_HAS_CHILDREN = 0x00100000;
+ static final int FLAGS_HAS_URL = 0x00080000;
static final int FLAGS_ALL_CONTROL = 0xfff00000;
int mFlags;
@@ -587,6 +589,7 @@
CharSequence mContentDescription;
ViewNodeText mText;
+ String mUrl;
Bundle mExtras;
ViewNode[] mChildren;
@@ -616,6 +619,7 @@
mAutoFillId = in.readParcelable(null);
mAutoFillType = in.readParcelable(null);
mAutoFillValue = in.readParcelable(null);
+ mAutoFillOptions = in.readStringArray();
}
if ((flags&FLAGS_HAS_LARGE_COORDS) != 0) {
mX = in.readInt();
@@ -651,6 +655,9 @@
if ((flags&FLAGS_HAS_TEXT) != 0) {
mText = new ViewNodeText(in, (flags&FLAGS_HAS_COMPLEX_TEXT) == 0);
}
+ if ((flags&FLAGS_HAS_URL) != 0) {
+ mUrl = in.readString();
+ }
if ((flags&FLAGS_HAS_EXTRAS) != 0) {
mExtras = in.readBundle();
}
@@ -704,6 +711,9 @@
flags |= FLAGS_HAS_COMPLEX_TEXT;
}
}
+ if (mUrl != null) {
+ flags |= FLAGS_HAS_URL;
+ }
if (mExtras != null) {
flags |= FLAGS_HAS_EXTRAS;
}
@@ -712,7 +722,14 @@
}
pwriter.writeString(mClassName);
- out.writeInt(flags);
+
+ int writtenFlags = flags;
+ if ((flags&FLAGS_HAS_AUTO_FILL_DATA) != 0 && (mSanitized || !sanitizeOnWrite)) {
+ // Remove 'checked' from sanitized auto-fill request.
+ writtenFlags = flags & ~FLAGS_CHECKED;
+ }
+
+ out.writeInt(writtenFlags);
if ((flags&FLAGS_HAS_ID) != 0) {
out.writeInt(mId);
if (mId != 0) {
@@ -730,6 +747,7 @@
out.writeParcelable(mAutoFillType, 0);
final AutoFillValue sanitizedValue = writeSensitive ? mAutoFillValue : null;
out.writeParcelable(sanitizedValue, 0);
+ out.writeStringArray(mAutoFillOptions);
}
if ((flags&FLAGS_HAS_LARGE_COORDS) != 0) {
out.writeInt(mX);
@@ -760,6 +778,9 @@
if ((flags&FLAGS_HAS_TEXT) != 0) {
mText.writeToParcel(out, (flags&FLAGS_HAS_COMPLEX_TEXT) == 0, writeSensitive);
}
+ if ((flags&FLAGS_HAS_URL) != 0) {
+ out.writeString(mUrl);
+ }
if ((flags&FLAGS_HAS_EXTRAS) != 0) {
out.writeBundle(mExtras);
}
@@ -833,6 +854,19 @@
return mAutoFillValue;
}
+ /**
+ * Gets the options that can be used to auto-fill this structure.
+ *
+ * <p>Typically used by nodes whose {@link AutoFillType} is a list to indicate the meaning
+ * of each possible value in the list.
+ *
+ * <p>It's only set when the {@link AssistStructure} is used for auto-filling purposes, not
+ * for assist.
+ */
+ public String[] getAutoFillOptions() {
+ return mAutoFillOptions;
+ }
+
/** @hide */
public boolean isSanitized() {
return mSanitized;
@@ -1040,6 +1074,24 @@
}
/**
+ * Returns the URL represented by this node.
+ *
+ * <p>Typically used in 2 categories of nodes:
+ *
+ * <ol>
+ * <li>Root node (containing the URL of the HTML page)
+ * <li>Child nodes that represent hyperlinks (contains the hyperlink URL).
+ * </ol>
+ *
+ * <strong>WARNING:</strong> a {@link android.service.autofill.AutoFillService} should only
+ * use this URL for auto-fill purposes when it trusts the app generating it (i.e., the app
+ * defined by {@link AssistStructure#getActivityComponent()}).
+ */
+ public String getUrl() {
+ return mUrl;
+ }
+
+ /**
* Returns any text associated with the node that is displayed to the user, or null
* if there is none.
*/
@@ -1162,11 +1214,10 @@
final ViewNode mNode;
final boolean mAsync;
- ViewNodeBuilder(AssistStructure assist, ViewNode node, boolean async, int flags) {
+ ViewNodeBuilder(AssistStructure assist, ViewNode node, boolean async) {
mAssist = assist;
mNode = node;
mAsync = async;
- mNode.mSanitized = (flags & AUTO_FILL_FLAG_SANITIZED) != 0;
}
@Override
@@ -1404,16 +1455,15 @@
ViewNode node = new ViewNode();
setAutoFillId(node, forAutoFill, virtualId);
mNode.mChildren[index] = node;
- return new ViewNodeBuilder(mAssist, node, false, flags);
+ return new ViewNodeBuilder(mAssist, node, false);
}
- private ViewStructure asyncNewChild(int index, boolean forAutoFill, int virtualId,
- int flags) {
+ private ViewStructure asyncNewChild(int index, boolean forAutoFill, int virtualId) {
synchronized (mAssist) {
ViewNode node = new ViewNode();
setAutoFillId(node, forAutoFill, virtualId);
mNode.mChildren[index] = node;
- ViewNodeBuilder builder = new ViewNodeBuilder(mAssist, node, true, flags);
+ ViewNodeBuilder builder = new ViewNodeBuilder(mAssist, node, true);
mAssist.mPendingAsyncChildren.add(builder);
return builder;
}
@@ -1432,12 +1482,12 @@
@Override
public ViewStructure asyncNewChild(int index) {
- return asyncNewChild(index, false, 0, 0);
+ return asyncNewChild(index, false, 0);
}
@Override
public ViewStructure asyncNewChild(int index, int virtualId, int flags) {
- return asyncNewChild(index, true, virtualId, flags);
+ return asyncNewChild(index, true, virtualId);
}
@Override
@@ -1479,6 +1529,11 @@
mNode.mAutoFillValue = value;
}
+ @Override
+ public void setAutoFillOptions(String[] options) {
+ mNode.mAutoFillOptions = options;
+ }
+
/**
* @hide
*/
@@ -1486,6 +1541,11 @@
public void setSanitized(boolean sanitized) {
mNode.mSanitized = sanitized;
}
+
+ @Override
+ public void setUrl(String url) {
+ mNode.mUrl = url;
+ }
}
/** @hide */
@@ -1583,6 +1643,10 @@
Log.i(TAG, prefix + " Text color fg: #" + Integer.toHexString(node.getTextColor())
+ ", bg: #" + Integer.toHexString(node.getTextBackgroundColor()));
}
+ CharSequence url = node.getUrl();
+ if (url != null) {
+ Log.i(TAG, prefix + " URL: " + url);
+ }
String hint = node.getHint();
if (hint != null) {
Log.i(TAG, prefix + " Hint: " + hint);
diff --git a/core/java/android/app/backup/BackupManagerMonitor.java b/core/java/android/app/backup/BackupManagerMonitor.java
index 099878b..d2a623e 100644
--- a/core/java/android/app/backup/BackupManagerMonitor.java
+++ b/core/java/android/app/backup/BackupManagerMonitor.java
@@ -54,15 +54,31 @@
public static final String EXTRA_LOG_EVENT_CATEGORY =
"android.app.backup.extra.LOG_EVENT_CATEGORY";
+ /**
+ * string: when we have event of id LOG_EVENT_ID_VERSION_OF_BACKUP_OLDER we send the version
+ * of the backup.
+ */
+ public static final String EXTRA_LOG_OLD_VERSION =
+ "android.app.backup.extra.LOG_OLD_VERSION";
+
// TODO complete this list with all log messages. And document properly.
public static final int LOG_EVENT_ID_FULL_BACKUP_TIMEOUT = 4;
+ public static final int LOG_EVENT_ID_PACKAGE_NOT_FOUND = 12;
+ public static final int LOG_EVENT_ID_PACKAGE_TRANSPORT_NOT_PRESENT = 15;
public static final int LOG_EVENT_ID_KEY_VALUE_BACKUP_TIMEOUT = 21;
+ public static final int LOG_EVENT_ID_NO_RESTORE_METADATA_AVAILABLE = 22;
+ public static final int LOG_EVENT_ID_PACKAGE_NOT_PRESENT = 26;
+ public static final int LOG_EVENT_ID_APP_HAS_NO_AGENT = 28;
+ public static final int LOG_EVENT_ID_CANT_FIND_AGENT = 30;
public static final int LOG_EVENT_ID_KEY_VALUE_RESTORE_TIMEOUT = 31;
+ public static final int LOG_EVENT_ID_VERSION_OF_BACKUP_OLDER = 36;
public static final int LOG_EVENT_ID_FULL_RESTORE_TIMEOUT = 45;
public static final int LOG_EVENT_ID_NO_PACKAGES = 49;
+
+
/**
* This method will be called each time something important happens on BackupManager.
*
diff --git a/core/java/android/app/job/JobInfo.java b/core/java/android/app/job/JobInfo.java
index 2d6b45d..3887556 100644
--- a/core/java/android/app/job/JobInfo.java
+++ b/core/java/android/app/job/JobInfo.java
@@ -174,12 +174,26 @@
*/
public static final int FLAG_WILL_BE_FOREGROUND = 1 << 0;
+ /**
+ * @hide
+ */
+ public static final int CONSTRAINT_FLAG_CHARGING = 1 << 0;
+
+ /**
+ * @hide
+ */
+ public static final int CONSTRAINT_FLAG_BATTERY_NOT_LOW = 1 << 1;
+
+ /**
+ * @hide
+ */
+ public static final int CONSTRAINT_FLAG_DEVICE_IDLE = 1 << 2;
+
private final int jobId;
private final PersistableBundle extras;
private final Bundle transientExtras;
private final ComponentName service;
- private final boolean requireCharging;
- private final boolean requireDeviceIdle;
+ private final int constraintFlags;
private final TriggerContentUri[] triggerContentUris;
private final long triggerContentUpdateDelay;
private final long triggerContentMaxDelay;
@@ -241,14 +255,28 @@
* Whether this job needs the device to be plugged in.
*/
public boolean isRequireCharging() {
- return requireCharging;
+ return (constraintFlags & CONSTRAINT_FLAG_CHARGING) != 0;
+ }
+
+ /**
+ * Whether this job needs the device's battery level to not be at below the critical threshold.
+ */
+ public boolean isRequireBatteryNotLow() {
+ return (constraintFlags & CONSTRAINT_FLAG_BATTERY_NOT_LOW) != 0;
}
/**
* Whether this job needs the device to be in an Idle maintenance window.
*/
public boolean isRequireDeviceIdle() {
- return requireDeviceIdle;
+ return (constraintFlags & CONSTRAINT_FLAG_DEVICE_IDLE) != 0;
+ }
+
+ /**
+ * @hide
+ */
+ public int getConstraintFlags() {
+ return constraintFlags;
}
/**
@@ -376,8 +404,7 @@
extras = in.readPersistableBundle();
transientExtras = in.readBundle();
service = in.readParcelable(null);
- requireCharging = in.readInt() == 1;
- requireDeviceIdle = in.readInt() == 1;
+ constraintFlags = in.readInt();
triggerContentUris = in.createTypedArray(TriggerContentUri.CREATOR);
triggerContentUpdateDelay = in.readLong();
triggerContentMaxDelay = in.readLong();
@@ -401,8 +428,7 @@
extras = b.mExtras.deepcopy();
transientExtras = b.mTransientExtras.deepcopy();
service = b.mJobService;
- requireCharging = b.mRequiresCharging;
- requireDeviceIdle = b.mRequiresDeviceIdle;
+ constraintFlags = b.mConstraintFlags;
triggerContentUris = b.mTriggerContentUris != null
? b.mTriggerContentUris.toArray(new TriggerContentUri[b.mTriggerContentUris.size()])
: null;
@@ -434,8 +460,7 @@
out.writePersistableBundle(extras);
out.writeBundle(transientExtras);
out.writeParcelable(service, flags);
- out.writeInt(requireCharging ? 1 : 0);
- out.writeInt(requireDeviceIdle ? 1 : 0);
+ out.writeInt(constraintFlags);
out.writeTypedArray(triggerContentUris, flags);
out.writeLong(triggerContentUpdateDelay);
out.writeLong(triggerContentMaxDelay);
@@ -563,8 +588,7 @@
private int mPriority = PRIORITY_DEFAULT;
private int mFlags;
// Requirements.
- private boolean mRequiresCharging;
- private boolean mRequiresDeviceIdle;
+ private int mConstraintFlags;
private int mNetworkType;
private ArrayList<TriggerContentUri> mTriggerContentUris;
private long mTriggerContentUpdateDelay = -1;
@@ -651,7 +675,21 @@
* @param requiresCharging Whether or not the device is plugged in.
*/
public Builder setRequiresCharging(boolean requiresCharging) {
- mRequiresCharging = requiresCharging;
+ mConstraintFlags = (mConstraintFlags&~CONSTRAINT_FLAG_CHARGING)
+ | (requiresCharging ? CONSTRAINT_FLAG_CHARGING : 0);
+ return this;
+ }
+
+ /**
+ * Specify that to run this job, the device's battery level must not be low.
+ * This defaults to false. If true, the job will only run when the battery level
+ * 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.
+ */
+ public Builder setRequiresBatteryNotLow(boolean batteryNotLow) {
+ mConstraintFlags = (mConstraintFlags&~CONSTRAINT_FLAG_BATTERY_NOT_LOW)
+ | (batteryNotLow ? CONSTRAINT_FLAG_BATTERY_NOT_LOW : 0);
return this;
}
@@ -666,7 +704,8 @@
* window.
*/
public Builder setRequiresDeviceIdle(boolean requiresDeviceIdle) {
- mRequiresDeviceIdle = requiresDeviceIdle;
+ mConstraintFlags = (mConstraintFlags&~CONSTRAINT_FLAG_DEVICE_IDLE)
+ | (requiresDeviceIdle ? CONSTRAINT_FLAG_DEVICE_IDLE : 0);
return this;
}
@@ -816,8 +855,8 @@
*/
public JobInfo build() {
// Allow jobs with no constraints - What am I, a database?
- if (!mHasEarlyConstraint && !mHasLateConstraint && !mRequiresCharging &&
- !mRequiresDeviceIdle && mNetworkType == NETWORK_TYPE_NONE &&
+ if (!mHasEarlyConstraint && !mHasLateConstraint && mConstraintFlags == 0 &&
+ mNetworkType == NETWORK_TYPE_NONE &&
mTriggerContentUris == null) {
throw new IllegalArgumentException("You're trying to build a job with no " +
"constraints, this is not allowed.");
@@ -843,7 +882,7 @@
throw new IllegalArgumentException("Can't call setTransientExtras() on a " +
"persisted job");
}
- if (mBackoffPolicySet && mRequiresDeviceIdle) {
+ if (mBackoffPolicySet && (mConstraintFlags & CONSTRAINT_FLAG_DEVICE_IDLE) != 0) {
throw new IllegalArgumentException("An idle mode job will not respect any" +
" back-off policy, so calling setBackoffCriteria with" +
" setRequiresDeviceIdle is an error.");
diff --git a/core/java/android/content/pm/ContainerEncryptionParams.aidl b/core/java/android/app/usage/CacheQuotaHint.aidl
similarity index 74%
copy from core/java/android/content/pm/ContainerEncryptionParams.aidl
copy to core/java/android/app/usage/CacheQuotaHint.aidl
index c13d946..0470ea7 100644
--- a/core/java/android/content/pm/ContainerEncryptionParams.aidl
+++ b/core/java/android/app/usage/CacheQuotaHint.aidl
@@ -1,11 +1,11 @@
/*
- * Copyright 2012, The Android Open Source Project
+ * Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* 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,
@@ -14,6 +14,7 @@
* limitations under the License.
*/
-package android.content.pm;
+package android.app.usage;
-parcelable ContainerEncryptionParams;
+/** {@hide} */
+parcelable CacheQuotaHint;
\ No newline at end of file
diff --git a/core/java/android/app/usage/CacheQuotaHint.java b/core/java/android/app/usage/CacheQuotaHint.java
new file mode 100644
index 0000000..4b6f99b
--- /dev/null
+++ b/core/java/android/app/usage/CacheQuotaHint.java
@@ -0,0 +1,142 @@
+/*
+ * 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.app.usage;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * CacheQuotaRequest represents a triplet of a uid, the volume UUID it is stored upon, and
+ * its usage stats. When processed, it obtains a cache quota as defined by the system which
+ * allows apps to understand how much cache to use.
+ * {@hide}
+ */
+@SystemApi
+public final class CacheQuotaHint implements Parcelable {
+ public static final long QUOTA_NOT_SET = -1;
+ private final String mUuid;
+ private final int mUid;
+ private final UsageStats mUsageStats;
+ private final long mQuota;
+
+ /**
+ * Create a new request.
+ * @param builder A builder for this object.
+ */
+ public CacheQuotaHint(Builder builder) {
+ this.mUuid = builder.mUuid;
+ this.mUid = builder.mUid;
+ this.mUsageStats = builder.mUsageStats;
+ this.mQuota = builder.mQuota;
+ }
+
+ public String getVolumeUuid() {
+ return mUuid;
+ }
+
+ public int getUid() {
+ return mUid;
+ }
+
+ public long getQuota() {
+ return mQuota;
+ }
+
+ public UsageStats getUsageStats() {
+ return mUsageStats;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mUuid);
+ dest.writeInt(mUid);
+ dest.writeLong(mQuota);
+ dest.writeParcelable(mUsageStats, 0);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final class Builder {
+ private String mUuid;
+ private int mUid;
+ private UsageStats mUsageStats;
+ private long mQuota;
+
+ public Builder() {
+ }
+
+ public Builder(CacheQuotaHint hint) {
+ setVolumeUuid(hint.getVolumeUuid());
+ setUid(hint.getUid());
+ setUsageStats(hint.getUsageStats());
+ setQuota(hint.getQuota());
+ }
+
+ public @NonNull Builder setVolumeUuid(@Nullable String uuid) {
+ mUuid = uuid;
+ return this;
+ }
+
+ public @NonNull Builder setUid(int uid) {
+ Preconditions.checkArgumentPositive(uid, "Proposed uid was not positive.");
+ mUid = uid;
+ return this;
+ }
+
+ public @NonNull Builder setUsageStats(@Nullable UsageStats stats) {
+ mUsageStats = stats;
+ return this;
+ }
+
+ public @NonNull Builder setQuota(long quota) {
+ Preconditions.checkArgument((quota >= QUOTA_NOT_SET));
+ mQuota = quota;
+ return this;
+ }
+
+ public @NonNull CacheQuotaHint build() {
+ Preconditions.checkNotNull(mUsageStats);
+ return new CacheQuotaHint(this);
+ }
+ }
+
+ public static final Parcelable.Creator<CacheQuotaHint> CREATOR =
+ new Creator<CacheQuotaHint>() {
+ @Override
+ public CacheQuotaHint createFromParcel(Parcel in) {
+ final Builder builder = new Builder();
+ return builder.setVolumeUuid(in.readString())
+ .setUid(in.readInt())
+ .setQuota(in.readLong())
+ .setUsageStats(in.readParcelable(UsageStats.class.getClassLoader()))
+ .build();
+ }
+
+ @Override
+ public CacheQuotaHint[] newArray(int size) {
+ return new CacheQuotaHint[size];
+ }
+ };
+}
diff --git a/core/java/android/app/usage/CacheQuotaService.java b/core/java/android/app/usage/CacheQuotaService.java
new file mode 100644
index 0000000..b9430ab
--- /dev/null
+++ b/core/java/android/app/usage/CacheQuotaService.java
@@ -0,0 +1,112 @@
+/*
+ * 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.app.usage;
+
+import android.annotation.SystemApi;
+import android.app.Service;
+import android.app.usage.ICacheQuotaService;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.RemoteCallback;
+import android.util.Log;
+import android.util.Pair;
+
+import java.util.List;
+
+/**
+ * CacheQuoteService defines a service which accepts cache quota requests and processes them,
+ * thereby filling out how much quota each request deserves.
+ * {@hide}
+ */
+@SystemApi
+public abstract class CacheQuotaService extends Service {
+ private static final String TAG = "CacheQuotaService";
+
+ /**
+ * The {@link Intent} action that must be declared as handled by a service
+ * in its manifest for the system to recognize it as a quota providing service.
+ */
+ public static final String SERVICE_INTERFACE = "android.app.usage.CacheQuotaService";
+
+ /** {@hide} **/
+ public static final String REQUEST_LIST_KEY = "requests";
+
+ private CacheQuotaServiceWrapper mWrapper;
+ private Handler mHandler;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ mWrapper = new CacheQuotaServiceWrapper();
+ mHandler = new ServiceHandler(getMainLooper());
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return mWrapper;
+ }
+
+ /**
+ * Processes the cache quota list upon receiving a list of requests.
+ * @param requests A list of cache quotas to fulfill.
+ * @return A completed list of cache quota requests.
+ */
+ public abstract List<CacheQuotaHint> onComputeCacheQuotaHints(
+ List<CacheQuotaHint> requests);
+
+ private final class CacheQuotaServiceWrapper extends ICacheQuotaService.Stub {
+ @Override
+ public void computeCacheQuotaHints(
+ RemoteCallback callback, List<CacheQuotaHint> requests) {
+ final Pair<RemoteCallback, List<CacheQuotaHint>> pair =
+ Pair.create(callback, requests);
+ Message msg = mHandler.obtainMessage(ServiceHandler.MSG_SEND_LIST, pair);
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ private final class ServiceHandler extends Handler {
+ public static final int MSG_SEND_LIST = 1;
+
+ public ServiceHandler(Looper looper) {
+ super(looper, null, true);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ final int action = msg.what;
+ switch (action) {
+ case MSG_SEND_LIST:
+ final Pair<RemoteCallback, List<CacheQuotaHint>> pair =
+ (Pair<RemoteCallback, List<CacheQuotaHint>>) msg.obj;
+ List<CacheQuotaHint> processed = onComputeCacheQuotaHints(pair.second);
+ final Bundle data = new Bundle();
+ data.putParcelableList(REQUEST_LIST_KEY, processed);
+
+ final RemoteCallback callback = pair.first;
+ callback.sendResult(data);
+ break;
+ default:
+ Log.w(TAG, "Handling unknown message: " + action);
+ }
+ }
+ }
+}
diff --git a/core/java/android/companion/ICompanionDeviceManagerService.aidl b/core/java/android/app/usage/ICacheQuotaService.aidl
similarity index 66%
copy from core/java/android/companion/ICompanionDeviceManagerService.aidl
copy to core/java/android/app/usage/ICacheQuotaService.aidl
index ff2a7eb..8d984e0 100644
--- a/core/java/android/companion/ICompanionDeviceManagerService.aidl
+++ b/core/java/android/app/usage/ICacheQuotaService.aidl
@@ -14,16 +14,12 @@
* limitations under the License.
*/
-package android.companion;
+package android.app.usage;
-import android.companion.AssociationRequest;
-import android.companion.IOnAssociateCallback;
+import android.os.RemoteCallback;
+import android.app.usage.CacheQuotaHint;
-
-/** @hide */
-interface ICompanionDeviceManagerService {
- void startDiscovery(
- in AssociationRequest request,
- in IOnAssociateCallback callback,
- in String callingPackage);
+/** {@hide} */
+oneway interface ICacheQuotaService {
+ void computeCacheQuotaHints(in RemoteCallback callback, in List<CacheQuotaHint> requests);
}
diff --git a/core/java/android/app/usage/IStorageStatsManager.aidl b/core/java/android/app/usage/IStorageStatsManager.aidl
index 62ebf60..76c0293 100644
--- a/core/java/android/app/usage/IStorageStatsManager.aidl
+++ b/core/java/android/app/usage/IStorageStatsManager.aidl
@@ -21,8 +21,10 @@
/** {@hide} */
interface IStorageStatsManager {
+ boolean isQuotaSupported(String volumeUuid, String callingPackage);
long getTotalBytes(String volumeUuid, String callingPackage);
long getFreeBytes(String volumeUuid, String callingPackage);
+ StorageStats queryStatsForPackage(String volumeUuid, String packageName, int userId, String callingPackage);
StorageStats queryStatsForUid(String volumeUuid, int uid, String callingPackage);
StorageStats queryStatsForUser(String volumeUuid, int userId, String callingPackage);
ExternalStorageStats queryExternalStatsForUser(String volumeUuid, int userId, String callingPackage);
diff --git a/core/java/android/app/usage/StorageStatsManager.java b/core/java/android/app/usage/StorageStatsManager.java
index 9d30771..081ccd9 100644
--- a/core/java/android/app/usage/StorageStatsManager.java
+++ b/core/java/android/app/usage/StorageStatsManager.java
@@ -19,6 +19,7 @@
import android.annotation.WorkerThread;
import android.content.Context;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -46,6 +47,15 @@
mService = Preconditions.checkNotNull(service);
}
+ /** {@hide} */
+ public boolean isQuotaSupported(String volumeUuid) {
+ try {
+ return mService.isQuotaSupported(volumeUuid, mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
/**
* Return the total space on the requested storage volume.
* <p>
@@ -91,6 +101,37 @@
}
/**
+ * Return storage statistics for a specific package on the requested storage
+ * volume.
+ * <p>
+ * This method may take several seconds to calculate the requested values,
+ * so it should only be called from a worker thread.
+ * <p class="note">
+ * Note: if the requested package uses the {@code android:sharedUserId}
+ * manifest feature, this call will be forced into a slower manual
+ * calculation path. If possible, consider always using
+ * {@link #queryStatsForUid(String, int)}, which is typically faster.
+ * </p>
+ *
+ * @param volumeUuid the UUID of the storage volume you're interested in, or
+ * {@code null} to specify the default internal storage.
+ * @param packageName the package name you're interested in.
+ * @param user the user you're interested in.
+ * @see ApplicationInfo#volumeUuid
+ * @see PackageInfo#packageName
+ */
+ @WorkerThread
+ public StorageStats queryStatsForPackage(String volumeUuid, String packageName,
+ UserHandle user) {
+ try {
+ return mService.queryStatsForPackage(volumeUuid, packageName, user.getIdentifier(),
+ mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Return storage statistics for a specific UID on the requested storage
* volume.
* <p>
diff --git a/core/java/android/app/usage/UsageStatsManagerInternal.java b/core/java/android/app/usage/UsageStatsManagerInternal.java
index a6f91fe..08595dd 100644
--- a/core/java/android/app/usage/UsageStatsManagerInternal.java
+++ b/core/java/android/app/usage/UsageStatsManagerInternal.java
@@ -19,7 +19,7 @@
import android.content.ComponentName;
import android.content.res.Configuration;
-import java.io.IOException;
+import java.util.List;
/**
* UsageStatsManager local system service interface.
@@ -127,4 +127,7 @@
public abstract void applyRestoredPayload(int user, String key, byte[] payload);
+ /* Cache Quota Service API */
+ public abstract List<UsageStats> queryUsageStatsForUser(
+ int userId, int interval, long beginTime, long endTime);
}
diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java
index b379c7c..c0c1a4d 100644
--- a/core/java/android/companion/CompanionDeviceManager.java
+++ b/core/java/android/companion/CompanionDeviceManager.java
@@ -29,12 +29,10 @@
/**
* System level service for managing companion devices
*
- * Usage:
- * To obtain an instance call
- * {@link Context#getSystemService}({@link Context#COMPANION_DEVICE_SERVICE})
- *
- * Then, call {@link #associate} to initiate the flow of associating current package
- * with a device selected by user
+ * <p>To obtain an instance call {@link Context#getSystemService}({@link
+ * Context#COMPANION_DEVICE_SERVICE}) Then, call {@link #associate(AssociationRequest,
+ * Callback, Handler)} to initiate the flow of associating current package with a
+ * device selected by user.</p>
*
* @see AssociationRequest
*/
@@ -47,6 +45,14 @@
public static final String EXTRA_DEVICE = "android.companion.extra.DEVICE";
/**
+ * The package name of the companion device discovery component.
+ *
+ * @hide
+ */
+ public static final String COMPANION_DEVICE_DISCOVERY_PACKAGE_NAME =
+ "com.android.companiondevicemanager";
+
+ /**
* A callback to receive once at least one suitable device is found, or the search failed
* (e.g. timed out)
*/
@@ -81,13 +87,20 @@
/**
* Associate this app with a companion device, selected by user
*
- * Once at least one appropriate device is found, {@code callback} will be called with a
+ * <p>Once at least one appropriate device is found, {@code callback} will be called with a
* {@link PendingIntent} that can be used to show the list of available devices for the user
* to select.
* It should be started for result (i.e. using
* {@link android.app.Activity#startIntentSenderForResult}), as the resulting
* {@link android.content.Intent} will contain extra {@link #EXTRA_DEVICE}, with the selected
- * device. (e.g. {@link android.bluetooth.BluetoothDevice})
+ * device. (e.g. {@link android.bluetooth.BluetoothDevice})</p>
+ *
+ * <p>If your app needs to be excluded from battery optimizations (run in the background)
+ * or to have unrestricted data access (use data in the background) you can declare that
+ * you use the {@link android.Manifest.permission#RUN_IN_BACKGROUND} and {@link
+ * android.Manifest.permission#USE_DATA_IN_BACKGROUND} respectively. Note that these
+ * special capabilities have a negative effect on the device's battery and user's data
+ * usage, therefore you should requested them when absolutely necessary.</p>
*
* @param request specific details about this request
* @param callback will be called once there's at least one device found for user to choose from
@@ -106,17 +119,16 @@
try {
mService.associate(
request,
- new IOnAssociateCallback.Stub() {
-
+ new IFindDeviceCallback.Stub() {
@Override
- public void onSuccess(PendingIntent launcher) throws RemoteException {
+ public void onSuccess(PendingIntent launcher) {
finalHandler.post(() -> {
callback.onDeviceFound(launcher.getIntentSender());
});
}
@Override
- public void onFailure(CharSequence reason) throws RemoteException {
+ public void onFailure(CharSequence reason) {
finalHandler.post(() -> callback.onFailure(reason));
}
},
diff --git a/core/java/android/companion/ICompanionDeviceManagerService.aidl b/core/java/android/companion/ICompanionDeviceDiscoveryService.aidl
similarity index 71%
rename from core/java/android/companion/ICompanionDeviceManagerService.aidl
rename to core/java/android/companion/ICompanionDeviceDiscoveryService.aidl
index ff2a7eb..4d77963 100644
--- a/core/java/android/companion/ICompanionDeviceManagerService.aidl
+++ b/core/java/android/companion/ICompanionDeviceDiscoveryService.aidl
@@ -17,13 +17,14 @@
package android.companion;
import android.companion.AssociationRequest;
-import android.companion.IOnAssociateCallback;
-
+import android.companion.ICompanionDeviceDiscoveryServiceCallback;
+import android.companion.IFindDeviceCallback;
/** @hide */
-interface ICompanionDeviceManagerService {
+interface ICompanionDeviceDiscoveryService {
void startDiscovery(
in AssociationRequest request,
- in IOnAssociateCallback callback,
- in String callingPackage);
+ in String callingPackage,
+ in IFindDeviceCallback findCallback,
+ in ICompanionDeviceDiscoveryServiceCallback serviceCallback);
}
diff --git a/core/java/android/companion/ICompanionDeviceManagerServiceCallback.aidl b/core/java/android/companion/ICompanionDeviceDiscoveryServiceCallback.aidl
similarity index 81%
rename from core/java/android/companion/ICompanionDeviceManagerServiceCallback.aidl
rename to core/java/android/companion/ICompanionDeviceDiscoveryServiceCallback.aidl
index c9dd345..7af708e 100644
--- a/core/java/android/companion/ICompanionDeviceManagerServiceCallback.aidl
+++ b/core/java/android/companion/ICompanionDeviceDiscoveryServiceCallback.aidl
@@ -16,9 +16,7 @@
package android.companion;
-import android.bluetooth.BluetoothDevice;
-
/** @hide */
-interface ICompanionDeviceManagerServiceCallback {
- void onDeviceSelected(in BluetoothDevice device);
+interface ICompanionDeviceDiscoveryServiceCallback {
+ void onDeviceSelected(String packageName, int userId);
}
diff --git a/core/java/android/companion/ICompanionDeviceManager.aidl b/core/java/android/companion/ICompanionDeviceManager.aidl
index 065e31b..1d30ada 100644
--- a/core/java/android/companion/ICompanionDeviceManager.aidl
+++ b/core/java/android/companion/ICompanionDeviceManager.aidl
@@ -16,7 +16,7 @@
package android.companion;
-import android.companion.IOnAssociateCallback;
+import android.companion.IFindDeviceCallback;
import android.companion.AssociationRequest;
/**
@@ -26,8 +26,8 @@
*/
interface ICompanionDeviceManager {
void associate(in AssociationRequest request,
- in IOnAssociateCallback callback,
- in String callingPackage); //TODO int userId?
+ in IFindDeviceCallback callback,
+ in String callingPackage);
//TODO add these
// boolean haveNotificationAccess(String packageName);
diff --git a/core/java/android/companion/IOnAssociateCallback.aidl b/core/java/android/companion/IFindDeviceCallback.aidl
similarity index 95%
rename from core/java/android/companion/IOnAssociateCallback.aidl
rename to core/java/android/companion/IFindDeviceCallback.aidl
index 4867eadd..919e1519 100644
--- a/core/java/android/companion/IOnAssociateCallback.aidl
+++ b/core/java/android/companion/IFindDeviceCallback.aidl
@@ -19,7 +19,7 @@
import android.app.PendingIntent;
/** @hide */
-interface IOnAssociateCallback {
+interface IFindDeviceCallback {
void onSuccess(in PendingIntent launcher);
void onFailure(in CharSequence reason);
}
diff --git a/core/java/android/content/BroadcastReceiver.java b/core/java/android/content/BroadcastReceiver.java
index 485d078..c3d6606 100644
--- a/core/java/android/content/BroadcastReceiver.java
+++ b/core/java/android/content/BroadcastReceiver.java
@@ -211,16 +211,16 @@
// of the list to finish the broadcast, so we don't block this
// thread (which may be the main thread) to have it finished.
//
- // Note that we don't need to use QueuedWork.add() with the
+ // Note that we don't need to use QueuedWork.addFinisher() with the
// runnable, since we know the AM is waiting for us until the
// executor gets to it.
- QueuedWork.singleThreadExecutor().execute( new Runnable() {
+ QueuedWork.queue(new Runnable() {
@Override public void run() {
if (ActivityThread.DEBUG_BROADCAST) Slog.i(ActivityThread.TAG,
"Finishing broadcast after work to component " + mToken);
sendFinished(mgr);
}
- });
+ }, false);
} else {
if (ActivityThread.DEBUG_BROADCAST) Slog.i(ActivityThread.TAG,
"Finishing broadcast to component " + mToken);
diff --git a/core/java/android/content/ClipData.java b/core/java/android/content/ClipData.java
index 7096771..6703bd4 100644
--- a/core/java/android/content/ClipData.java
+++ b/core/java/android/content/ClipData.java
@@ -17,6 +17,9 @@
package android.content;
import static android.content.ContentProvider.maybeAddUserId;
+import static android.content.ContentResolver.SCHEME_ANDROID_RESOURCE;
+import static android.content.ContentResolver.SCHEME_CONTENT;
+import static android.content.ContentResolver.SCHEME_FILE;
import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
@@ -353,6 +356,9 @@
}
return builder.toString();
+ } catch (SecurityException e) {
+ Log.w("ClipData", "Failure opening stream", e);
+
} catch (FileNotFoundException e) {
// Unable to open content URI as text... not really an
// error, just something to ignore.
@@ -371,8 +377,14 @@
}
}
- // If we couldn't open the URI as a stream, then the URI itself
- // probably serves fairly well as a textual representation.
+ // If we couldn't open the URI as a stream, use the URI itself as a textual
+ // representation (but not for "content", "android.resource" or "file" schemes).
+ final String scheme = uri.getScheme();
+ if (SCHEME_CONTENT.equals(scheme)
+ || SCHEME_ANDROID_RESOURCE.equals(scheme)
+ || SCHEME_FILE.equals(scheme)) {
+ return "";
+ }
return uri.toString();
}
@@ -536,6 +548,9 @@
return Html.escapeHtml(text);
}
+ } catch (SecurityException e) {
+ Log.w("ClipData", "Failure opening stream", e);
+
} catch (FileNotFoundException e) {
// Unable to open content URI as text... not really an
// error, just something to ignore.
@@ -555,9 +570,15 @@
}
}
- // If we couldn't open the URI as a stream, then we can build
- // some HTML text with the URI itself.
- // probably serves fairly well as a textual representation.
+ // If we couldn't open the URI as a stream, use the URI itself as a textual
+ // representation (but not for "content", "android.resource" or "file" schemes).
+ final String scheme = mUri.getScheme();
+ if (SCHEME_CONTENT.equals(scheme)
+ || SCHEME_ANDROID_RESOURCE.equals(scheme)
+ || SCHEME_FILE.equals(scheme)) {
+ return "";
+ }
+
if (styled) {
return uriToStyledText(mUri.toString());
} else {
@@ -777,7 +798,7 @@
*/
private static String[] getMimeTypes(ContentResolver resolver, Uri uri) {
String[] mimeTypes = null;
- if ("content".equals(uri.getScheme())) {
+ if (SCHEME_CONTENT.equals(uri.getScheme())) {
String realType = resolver.getType(uri);
mimeTypes = resolver.getStreamTypes(uri, "*/*");
if (realType != null) {
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 4480b41..be49f24 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -36,6 +36,7 @@
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.DeadObjectException;
@@ -500,6 +501,12 @@
public ContentResolver(Context context) {
mContext = context != null ? context : ActivityThread.currentApplication();
mPackageName = mContext.getOpPackageName();
+ if (android.os.Process.myUid() == android.os.Process.PHONE_UID) {
+ // STOPSHIP: Telephony needs to fix b/35792675
+ mTargetSdkVersion = Build.VERSION_CODES.N_MR1;
+ } else {
+ mTargetSdkVersion = mContext.getApplicationInfo().targetSdkVersion;
+ }
}
/** @hide */
@@ -1868,13 +1875,18 @@
/**
* Register an observer class that gets callbacks when data identified by a
* given content URI changes.
+ * <p>
+ * Starting in {@link android.os.Build.VERSION_CODES#O}, all content
+ * notifications must be backed by a valid {@link ContentProvider}.
*
- * @param uri The URI to watch for changes. This can be a specific row URI, or a base URI
- * for a whole class of content.
- * @param notifyForDescendants When false, the observer will be notified whenever a
- * change occurs to the exact URI specified by <code>uri</code> or to one of the
- * URI's ancestors in the path hierarchy. When true, the observer will also be notified
- * whenever a change occurs to the URI's descendants in the path hierarchy.
+ * @param uri The URI to watch for changes. This can be a specific row URI,
+ * or a base URI for a whole class of content.
+ * @param notifyForDescendants When false, the observer will be notified
+ * whenever a change occurs to the exact URI specified by
+ * <code>uri</code> or to one of the URI's ancestors in the path
+ * hierarchy. When true, the observer will also be notified
+ * whenever a change occurs to the URI's descendants in the path
+ * hierarchy.
* @param observer The object that receives callbacks when changes occur.
* @see #unregisterContentObserver
*/
@@ -1894,7 +1906,7 @@
ContentObserver observer, @UserIdInt int userHandle) {
try {
getContentService().registerContentObserver(uri, notifyForDescendents,
- observer.getContentObserver(), userHandle);
+ observer.getContentObserver(), userHandle, mTargetSdkVersion);
} catch (RemoteException e) {
}
}
@@ -1918,16 +1930,22 @@
}
/**
- * Notify registered observers that a row was updated and attempt to sync changes
- * to the network.
- * To register, call {@link #registerContentObserver(android.net.Uri , boolean, android.database.ContentObserver) registerContentObserver()}.
- * By default, CursorAdapter objects will get this notification.
+ * Notify registered observers that a row was updated and attempt to sync
+ * changes to the network.
+ * <p>
+ * To observe events sent through this call, use
+ * {@link #registerContentObserver(Uri, boolean, ContentObserver)}.
+ * <p>
+ * Starting in {@link android.os.Build.VERSION_CODES#O}, all content
+ * notifications must be backed by a valid {@link ContentProvider}.
*
* @param uri The uri of the content that was changed.
- * @param observer The observer that originated the change, may be <code>null</null>.
- * The observer that originated the change will only receive the notification if it
- * has requested to receive self-change notifications by implementing
- * {@link ContentObserver#deliverSelfNotifications()} to return true.
+ * @param observer The observer that originated the change, may be
+ * <code>null</null>. The observer that originated the change
+ * will only receive the notification if it has requested to
+ * receive self-change notifications by implementing
+ * {@link ContentObserver#deliverSelfNotifications()} to return
+ * true.
*/
public void notifyChange(@NonNull Uri uri, @Nullable ContentObserver observer) {
notifyChange(uri, observer, true /* sync to network */);
@@ -1935,17 +1953,25 @@
/**
* Notify registered observers that a row was updated.
- * To register, call {@link #registerContentObserver(android.net.Uri , boolean, android.database.ContentObserver) registerContentObserver()}.
- * By default, CursorAdapter objects will get this notification.
- * If syncToNetwork is true, this will attempt to schedule a local sync using the sync
- * adapter that's registered for the authority of the provided uri. No account will be
- * passed to the sync adapter, so all matching accounts will be synchronized.
+ * <p>
+ * To observe events sent through this call, use
+ * {@link #registerContentObserver(Uri, boolean, ContentObserver)}.
+ * <p>
+ * If syncToNetwork is true, this will attempt to schedule a local sync
+ * using the sync adapter that's registered for the authority of the
+ * provided uri. No account will be passed to the sync adapter, so all
+ * matching accounts will be synchronized.
+ * <p>
+ * Starting in {@link android.os.Build.VERSION_CODES#O}, all content
+ * notifications must be backed by a valid {@link ContentProvider}.
*
* @param uri The uri of the content that was changed.
- * @param observer The observer that originated the change, may be <code>null</null>.
- * The observer that originated the change will only receive the notification if it
- * has requested to receive self-change notifications by implementing
- * {@link ContentObserver#deliverSelfNotifications()} to return true.
+ * @param observer The observer that originated the change, may be
+ * <code>null</null>. The observer that originated the change
+ * will only receive the notification if it has requested to
+ * receive self-change notifications by implementing
+ * {@link ContentObserver#deliverSelfNotifications()} to return
+ * true.
* @param syncToNetwork If true, same as {@link #NOTIFY_SYNC_TO_NETWORK}.
* @see #requestSync(android.accounts.Account, String, android.os.Bundle)
*/
@@ -1961,17 +1987,25 @@
/**
* Notify registered observers that a row was updated.
- * To register, call {@link #registerContentObserver(android.net.Uri, boolean, android.database.ContentObserver) registerContentObserver()}.
- * By default, CursorAdapter objects will get this notification.
- * If syncToNetwork is true, this will attempt to schedule a local sync using the sync
- * adapter that's registered for the authority of the provided uri. No account will be
- * passed to the sync adapter, so all matching accounts will be synchronized.
+ * <p>
+ * To observe events sent through this call, use
+ * {@link #registerContentObserver(Uri, boolean, ContentObserver)}.
+ * <p>
+ * If syncToNetwork is true, this will attempt to schedule a local sync
+ * using the sync adapter that's registered for the authority of the
+ * provided uri. No account will be passed to the sync adapter, so all
+ * matching accounts will be synchronized.
+ * <p>
+ * Starting in {@link android.os.Build.VERSION_CODES#O}, all content
+ * notifications must be backed by a valid {@link ContentProvider}.
*
* @param uri The uri of the content that was changed.
- * @param observer The observer that originated the change, may be <code>null</null>.
- * The observer that originated the change will only receive the notification if it
- * has requested to receive self-change notifications by implementing
- * {@link ContentObserver#deliverSelfNotifications()} to return true.
+ * @param observer The observer that originated the change, may be
+ * <code>null</null>. The observer that originated the change
+ * will only receive the notification if it has requested to
+ * receive self-change notifications by implementing
+ * {@link ContentObserver#deliverSelfNotifications()} to return
+ * true.
* @param flags Additional flags: {@link #NOTIFY_SYNC_TO_NETWORK}.
* @see #requestSync(android.accounts.Account, String, android.os.Bundle)
*/
@@ -1997,7 +2031,7 @@
uri, observer == null ? null : observer.getContentObserver(),
observer != null && observer.deliverSelfNotifications(),
syncToNetwork ? NOTIFY_SYNC_TO_NETWORK : 0,
- userHandle);
+ userHandle, mTargetSdkVersion);
} catch (RemoteException e) {
}
}
@@ -2013,7 +2047,7 @@
getContentService().notifyChange(
uri, observer == null ? null : observer.getContentObserver(),
observer != null && observer.deliverSelfNotifications(), flags,
- userHandle);
+ userHandle, mTargetSdkVersion);
} catch (RemoteException e) {
}
}
@@ -2932,6 +2966,7 @@
private final Context mContext;
final String mPackageName;
+ final int mTargetSdkVersion;
private static final String TAG = "ContentResolver";
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 06f7303..aff00c3 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -730,12 +730,6 @@
*/
public abstract boolean moveSharedPreferencesFrom(Context sourceContext, String name);
- /** @removed */
- @Deprecated
- public boolean migrateSharedPreferencesFrom(Context sourceContext, String name) {
- return moveSharedPreferencesFrom(sourceContext, name);
- }
-
/**
* Delete an existing shared preferences file.
*
@@ -1230,6 +1224,16 @@
public abstract File getExternalCacheDir();
/**
+ * Returns absolute path to application-specific directory in the preloaded cache.
+ * <p>Files stored in the cache directory can be deleted when the device runs low on storage.
+ * There is no guarantee when these files will be deleted.
+ * @hide
+ */
+ @Nullable
+ @SystemApi
+ public abstract File getPreloadsFileCache();
+
+ /**
* Returns absolute paths to application-specific directories on all
* shared/external storage devices where the application can place cache
* files it owns. These files are internal to the application, and not
@@ -1441,12 +1445,6 @@
*/
public abstract boolean moveDatabaseFrom(Context sourceContext, String name);
- /** @removed */
- @Deprecated
- public boolean migrateDatabaseFrom(Context sourceContext, String name) {
- return moveDatabaseFrom(sourceContext, name);
- }
-
/**
* Delete an existing private SQLiteDatabase associated with this Context's
* application package.
@@ -4372,12 +4370,6 @@
*/
public abstract Context createDeviceProtectedStorageContext();
- /** @removed */
- @Deprecated
- public Context createDeviceEncryptedStorageContext() {
- return createDeviceProtectedStorageContext();
- }
-
/**
* Return a new Context object for the current Context but whose storage
* APIs are backed by credential-protected storage. This is the default
@@ -4406,12 +4398,6 @@
@SystemApi
public abstract Context createCredentialProtectedStorageContext();
- /** @removed */
- @Deprecated
- public Context createCredentialEncryptedStorageContext() {
- return createCredentialProtectedStorageContext();
- }
-
/**
* Gets the display adjustments holder for this context. This information
* is provided on a per-application or activity basis and is used to simulate lower density
@@ -4429,6 +4415,11 @@
public abstract Display getDisplay();
/**
+ * @hide
+ */
+ public abstract void updateDisplay(int displayId);
+
+ /**
* Indicates whether this Context is restricted.
*
* @return {@code true} if this Context is restricted, {@code false} otherwise.
@@ -4447,12 +4438,6 @@
*/
public abstract boolean isDeviceProtectedStorage();
- /** @removed */
- @Deprecated
- public boolean isDeviceEncryptedStorage() {
- return isDeviceProtectedStorage();
- }
-
/**
* Indicates if the storage APIs of this Context are backed by
* credential-protected storage.
@@ -4463,12 +4448,6 @@
@SystemApi
public abstract boolean isCredentialProtectedStorage();
- /** @removed */
- @Deprecated
- public boolean isCredentialEncryptedStorage() {
- return isCredentialProtectedStorage();
- }
-
/**
* @hide
*/
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index 546bfc4..c932b23 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -281,6 +281,13 @@
return mBase.getDir(name, mode);
}
+
+ /** @hide **/
+ @Override
+ public File getPreloadsFileCache() {
+ return mBase.getPreloadsFileCache();
+ }
+
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
return mBase.openOrCreateDatabase(name, mode, factory);
@@ -865,6 +872,14 @@
return mBase.getDisplay();
}
+ /**
+ * @hide
+ */
+ @Override
+ public void updateDisplay(int displayId) {
+ mBase.updateDisplay(displayId);
+ }
+
@Override
public Context createDeviceProtectedStorageContext() {
return mBase.createDeviceProtectedStorageContext();
diff --git a/core/java/android/content/DialogInterface.java b/core/java/android/content/DialogInterface.java
index 947eac6..511f356 100644
--- a/core/java/android/content/DialogInterface.java
+++ b/core/java/android/content/DialogInterface.java
@@ -19,45 +19,43 @@
import android.view.KeyEvent;
/**
- *
+ * Interface that defines a dialog-type class that can be shown, dismissed, or
+ * canceled, and may have buttons that can be clicked.
*/
-public interface DialogInterface {
- /**
- * The identifier for the positive button.
- */
- public static final int BUTTON_POSITIVE = -1;
+public interface DialogInterface {
+ /** The identifier for the positive button. */
+ int BUTTON_POSITIVE = -1;
- /**
- * The identifier for the negative button.
- */
- public static final int BUTTON_NEGATIVE = -2;
+ /** The identifier for the negative button. */
+ int BUTTON_NEGATIVE = -2;
- /**
- * The identifier for the neutral button.
- */
- public static final int BUTTON_NEUTRAL = -3;
+ /** The identifier for the neutral button. */
+ int BUTTON_NEUTRAL = -3;
- /**
- * @deprecated Use {@link #BUTTON_POSITIVE}
- */
+ /** @deprecated Use {@link #BUTTON_POSITIVE} */
@Deprecated
- public static final int BUTTON1 = BUTTON_POSITIVE;
+ int BUTTON1 = BUTTON_POSITIVE;
+
+ /** @deprecated Use {@link #BUTTON_NEGATIVE} */
+ @Deprecated
+ int BUTTON2 = BUTTON_NEGATIVE;
+
+ /** @deprecated Use {@link #BUTTON_NEUTRAL} */
+ @Deprecated
+ int BUTTON3 = BUTTON_NEUTRAL;
/**
- * @deprecated Use {@link #BUTTON_NEGATIVE}
+ * Cancels the dialog, invoking the {@link OnCancelListener}.
+ * <p>
+ * The {@link OnDismissListener} may also be called if cancellation
+ * dismisses the dialog.
*/
- @Deprecated
- public static final int BUTTON2 = BUTTON_NEGATIVE;
+ void cancel();
/**
- * @deprecated Use {@link #BUTTON_NEUTRAL}
+ * Dismisses the dialog, invoking the {@link OnDismissListener}.
*/
- @Deprecated
- public static final int BUTTON3 = BUTTON_NEUTRAL;
-
- public void cancel();
-
- public void dismiss();
+ void dismiss();
/**
* Interface used to allow the creator of a dialog to run some code when the
@@ -70,11 +68,11 @@
interface OnCancelListener {
/**
* This method will be invoked when the dialog is canceled.
- *
- * @param dialog The dialog that was canceled will be passed into the
- * method.
+ *
+ * @param dialog the dialog that was canceled will be passed into the
+ * method
*/
- public void onCancel(DialogInterface dialog);
+ void onCancel(DialogInterface dialog);
}
/**
@@ -84,11 +82,11 @@
interface OnDismissListener {
/**
* This method will be invoked when the dialog is dismissed.
- *
- * @param dialog The dialog that was dismissed will be passed into the
- * method.
+ *
+ * @param dialog the dialog that was dismissed will be passed into the
+ * method
*/
- public void onDismiss(DialogInterface dialog);
+ void onDismiss(DialogInterface dialog);
}
/**
@@ -99,29 +97,28 @@
/**
* This method will be invoked when the dialog is shown.
*
- * @param dialog The dialog that was shown will be passed into the
- * method.
+ * @param dialog the dialog that was shown will be passed into the
+ * method
*/
- public void onShow(DialogInterface dialog);
+ void onShow(DialogInterface dialog);
}
/**
* Interface used to allow the creator of a dialog to run some code when an
- * item on the dialog is clicked..
+ * item on the dialog is clicked.
*/
interface OnClickListener {
/**
* This method will be invoked when a button in the dialog is clicked.
- *
- * @param dialog The dialog that received the click.
- * @param which The button that was clicked (e.g.
- * {@link DialogInterface#BUTTON1}) or the position
- * of the item clicked.
+ *
+ * @param dialog the dialog that received the click
+ * @param which the button that was clicked (ex.
+ * {@link DialogInterface#BUTTON_POSITIVE}) or the position
+ * of the item clicked
*/
- /* TODO: Change to use BUTTON_POSITIVE after API council */
- public void onClick(DialogInterface dialog, int which);
+ void onClick(DialogInterface dialog, int which);
}
-
+
/**
* Interface used to allow the creator of a dialog to run some code when an
* item in a multi-choice dialog is clicked.
@@ -129,14 +126,15 @@
interface OnMultiChoiceClickListener {
/**
* This method will be invoked when an item in the dialog is clicked.
- *
- * @param dialog The dialog where the selection was made.
- * @param which The position of the item in the list that was clicked.
- * @param isChecked True if the click checked the item, else false.
+ *
+ * @param dialog the dialog where the selection was made
+ * @param which the position of the item in the list that was clicked
+ * @param isChecked {@code true} if the click checked the item, else
+ * {@code false}
*/
- public void onClick(DialogInterface dialog, int which, boolean isChecked);
+ void onClick(DialogInterface dialog, int which, boolean isChecked);
}
-
+
/**
* Interface definition for a callback to be invoked when a key event is
* dispatched to this dialog. The callback will be invoked before the key
@@ -146,13 +144,14 @@
/**
* Called when a key is dispatched to a dialog. This allows listeners to
* get a chance to respond before the dialog.
- *
- * @param dialog The dialog the key has been dispatched to.
- * @param keyCode The code for the physical key that was pressed
- * @param event The KeyEvent object containing full information about
- * the event.
- * @return True if the listener has consumed the event, false otherwise.
+ *
+ * @param dialog the dialog the key has been dispatched to
+ * @param keyCode the code for the physical key that was pressed
+ * @param event the KeyEvent object containing full information about
+ * the event
+ * @return {@code true} if the listener has consumed the event,
+ * {@code false} otherwise
*/
- public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event);
+ boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event);
}
}
diff --git a/core/java/android/content/IContentService.aidl b/core/java/android/content/IContentService.aidl
index 3446e03..c500116 100644
--- a/core/java/android/content/IContentService.aidl
+++ b/core/java/android/content/IContentService.aidl
@@ -42,7 +42,7 @@
* USER_CURRENT are properly handled.
*/
void registerContentObserver(in Uri uri, boolean notifyForDescendants,
- IContentObserver observer, int userHandle);
+ IContentObserver observer, int userHandle, int targetSdkVersion);
/**
* Notify observers of a particular user's view of the provider.
@@ -53,7 +53,7 @@
*/
void notifyChange(in Uri uri, IContentObserver observer,
boolean observerWantsSelfNotifications, int flags,
- int userHandle);
+ int userHandle, int targetSdkVersion);
void requestSync(in Account account, String authority, in Bundle extras);
/**
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 028a7bcf..870db217 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -669,13 +669,14 @@
* preview. {@link #getClipData} contains an optional list of content URIs
* if there is more than one item to preview. {@link #EXTRA_INDEX} is an
* optional index of the URI in the clip data to show first.
- * If {@link #EXTRA_QUICK_VIEW_PLAIN} is true, then the quick viewer should show
- * basic UI without any extra features other than quick viewing the passed items.
- * Especially, the quick viewer should not let users open the passed files
- * in other apps, which includes sharing, opening, editing, printing, etc in the
- * plain mode.
+ * <p>By default quick viewers are supposed to be lightweight and focus on
+ * previewing the content only. They should not expose features such as printing,
+ * opening in an external app, deleting, rotating, casting, etc.
+ * However, if {@link #EXTRA_QUICK_VIEW_ADVANCED} is true, then the quick viewer
+ * may show advanced UI which includes convenience actions suitable for the passed
+ * Uris.
* <p>Output: nothing.
- * @see #EXTRA_QUICK_VIEW_HIDE_DEFAULT_ACTIONS
+ * @see #EXTRA_QUICK_VIEW_ADVANCED
* @see #EXTRA_INDEX
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
@@ -1114,6 +1115,15 @@
public static final String ACTION_SIM_ACTIVATION_REQUEST =
"android.intent.action.SIM_ACTIVATION_REQUEST";
/**
+ * Activity Action: Main entry point for carrier setup apps.
+ * <p>Carrier apps that provide an implementation for this action may be invoked to configure
+ * carrier service and typically require
+ * {@link android.telephony.TelephonyManager#hasCarrierPrivileges() carrier privileges} to
+ * fulfill their duties.
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_CARRIER_SETUP = "android.intent.action.CARRIER_SETUP";
+ /**
* Activity Action: Send a message to someone specified by the data.
* <p>Input: {@link #getData} is URI describing the target.
* <p>Output: nothing.
@@ -2872,6 +2882,7 @@
*
* @hide
*/
+ @SystemApi
public static final String ACTION_PRE_BOOT_COMPLETED =
"android.intent.action.PRE_BOOT_COMPLETED";
@@ -3312,6 +3323,16 @@
public static final String ACTION_MASTER_CLEAR = "android.intent.action.MASTER_CLEAR";
/**
+ * Broadcast intent sent by the RecoverySystem to inform listeners that a master clear (wipe)
+ * is about to be performed.
+ * @hide
+ */
+ @SystemApi
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_MASTER_CLEAR_NOTIFICATION
+ = "android.intent.action.MASTER_CLEAR_NOTIFICATION";
+
+ /**
* Boolean intent extra to be used with {@link #ACTION_MASTER_CLEAR} in order to force a factory
* reset even if {@link android.os.UserManager#DISALLOW_FACTORY_RESET} is set.
*
@@ -3383,6 +3404,17 @@
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_PROCESS_TEXT = "android.intent.action.PROCESS_TEXT";
+
+ /**
+ * Broadcast Action: The sim card state has changed.
+ * For more details see TelephonyIntents.ACTION_SIM_STATE_CHANGED. This is here
+ * because TelephonyIntents is an internal class.
+ * @hide
+ */
+ @SystemApi
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED";
+
/**
* The name of the extra used to define the text to be processed, as a
* CharSequence. Note that this may be a styled CharSequence, so you must use
@@ -4413,19 +4445,15 @@
public static final String EXTRA_INDEX = "android.intent.extra.INDEX";
/**
- * Shows a plain quick viewer UI which doesn't provide any extra features other than
- * quick viewing the items.
- *
- * <p>Especially, the quick viewer should not let users open the quick viewed files
- * in other apps, which includes sharing, opening, editing, printing, etc.
- *
- * <p>This feature is optional, and may not be handled by all quick viewers.
+ * Tells the quick viewer to show additional UI actions suitable for the passed Uris,
+ * such as opening in other apps, sharing, opening, editing, printing, deleting,
+ * casting, etc.
*
* <p>The value is boolean. By default false.
* @see ACTION_QUICK_VIEW
*/
- public static final String EXTRA_QUICK_VIEW_PLAIN =
- "android.intent.extra.QUICK_VIEW_PLAIN";
+ public static final String EXTRA_QUICK_VIEW_ADVANCED =
+ "android.intent.extra.QUICK_VIEW_ADVANCED";
/**
* Optional boolean extra indicating whether quiet mode has been switched on or off.
@@ -9241,6 +9269,13 @@
mClipData.prepareToLeaveProcess(leavingPackage, getFlags());
}
+ if (mExtras != null && !mExtras.isParcelled()) {
+ final Object intent = mExtras.get(Intent.EXTRA_INTENT);
+ if (intent instanceof Intent) {
+ ((Intent) intent).prepareToLeaveProcess(leavingPackage);
+ }
+ }
+
if (mAction != null && mData != null && StrictMode.vmFileUriExposureEnabled()
&& leavingPackage) {
switch (mAction) {
diff --git a/core/java/android/content/IntentFilter.java b/core/java/android/content/IntentFilter.java
index e6cae69..56609eb 100644
--- a/core/java/android/content/IntentFilter.java
+++ b/core/java/android/content/IntentFilter.java
@@ -284,8 +284,6 @@
/** Whether or not the intent filter is visible to ephemeral apps. */
private boolean mVisibleToEphemeral;
- /** Whether or not the intent filter is part of an ephemeral app. */
- private boolean mEphemeral;
// These functions are the start of more optimized code for managing
// the string sets... not yet implemented.
@@ -656,19 +654,10 @@
mVisibleToEphemeral = visibleToEmphemeral;
}
/** @hide */
- public boolean isVisibleToEphemeral() {
+ public boolean isVisibleToInstantApp() {
return mVisibleToEphemeral;
}
- /** @hide */
- public void setEphemeral(boolean ephemeral) {
- mEphemeral = ephemeral;
- }
- /** @hide */
- public boolean isEphemeral() {
- return mEphemeral;
- }
-
/**
* Add a new Intent action to match against. If any actions are included
* in the filter, then an Intent's action must be one of those values for
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 1fa4181..b4d77a0 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -498,11 +498,12 @@
public static final int PRIVATE_FLAG_DIRECT_BOOT_AWARE = 1 << 6;
/**
- * Value for {@link #flags}: {@code true} if the application is blocked via restrictions
- * and for most purposes is considered as not installed.
- * {@hide}
+ * Value for {@link #privateFlags}: {@code true} if the application is installed
+ * as instant app.
+ *
+ * @hide
*/
- public static final int PRIVATE_FLAG_EPHEMERAL = 1 << 7;
+ public static final int PRIVATE_FLAG_INSTANT = 1 << 7;
/**
* When set, at least one component inside this application is direct boot
@@ -681,7 +682,21 @@
*
* {@hide}
*/
- public String seinfo = "default";
+ public String seInfo = "default";
+
+ /**
+ * The seinfo tag generated per-user. This value may change based upon the
+ * user's configuration. For example, when an instant app is installed for
+ * a user. It is an error if this field is ever {@code null} when trying to
+ * start a new process.
+ * <p>NOTE: We need to separate this out because we modify per-user values
+ * multiple times. This needs to be refactored since we're performing more
+ * work than necessary and these values should only be set once. When that
+ * happens, we can merge the per-user value with the seInfo state above.
+ *
+ * {@hide}
+ */
+ public String seInfoUser;
/**
* Paths to all shared libraries this application is linked against. This
@@ -705,10 +720,6 @@
*/
public String deviceProtectedDataDir;
- /** @removed */
- @Deprecated
- public String deviceEncryptedDataDir;
-
/**
* Full path to the credential-protected directory assigned to the package
* for its persistent data.
@@ -718,10 +729,6 @@
@SystemApi
public String credentialProtectedDataDir;
- /** @removed */
- @Deprecated
- public String credentialEncryptedDataDir;
-
/**
* Full path to the directory where native JNI libraries are stored.
*/
@@ -1009,8 +1016,9 @@
if (resourceDirs != null) {
pw.println(prefix + "resourceDirs=" + Arrays.toString(resourceDirs));
}
- if ((flags&DUMP_FLAG_DETAILS) != 0 && seinfo != null) {
- pw.println(prefix + "seinfo=" + seinfo);
+ if ((flags&DUMP_FLAG_DETAILS) != 0 && seInfo != null) {
+ pw.println(prefix + "seinfo=" + seInfo);
+ pw.println(prefix + "seinfoUser=" + seInfoUser);
}
pw.println(prefix + "dataDir=" + dataDir);
if ((flags&DUMP_FLAG_DETAILS) != 0) {
@@ -1120,11 +1128,12 @@
primaryCpuAbi = orig.primaryCpuAbi;
secondaryCpuAbi = orig.secondaryCpuAbi;
resourceDirs = orig.resourceDirs;
- seinfo = orig.seinfo;
+ seInfo = orig.seInfo;
+ seInfoUser = orig.seInfoUser;
sharedLibraryFiles = orig.sharedLibraryFiles;
dataDir = orig.dataDir;
- deviceEncryptedDataDir = deviceProtectedDataDir = orig.deviceProtectedDataDir;
- credentialEncryptedDataDir = credentialProtectedDataDir = orig.credentialProtectedDataDir;
+ deviceProtectedDataDir = orig.deviceProtectedDataDir;
+ credentialProtectedDataDir = orig.credentialProtectedDataDir;
uid = orig.uid;
minSdkVersion = orig.minSdkVersion;
targetSdkVersion = orig.targetSdkVersion;
@@ -1181,7 +1190,8 @@
dest.writeString(primaryCpuAbi);
dest.writeString(secondaryCpuAbi);
dest.writeStringArray(resourceDirs);
- dest.writeString(seinfo);
+ dest.writeString(seInfo);
+ dest.writeString(seInfoUser);
dest.writeStringArray(sharedLibraryFiles);
dest.writeString(dataDir);
dest.writeString(deviceProtectedDataDir);
@@ -1242,11 +1252,12 @@
primaryCpuAbi = source.readString();
secondaryCpuAbi = source.readString();
resourceDirs = source.readStringArray();
- seinfo = source.readString();
+ seInfo = source.readString();
+ seInfoUser = source.readString();
sharedLibraryFiles = source.readStringArray();
dataDir = source.readString();
- deviceEncryptedDataDir = deviceProtectedDataDir = source.readString();
- credentialEncryptedDataDir = credentialProtectedDataDir = source.readString();
+ deviceProtectedDataDir = source.readString();
+ credentialProtectedDataDir = source.readString();
uid = source.readInt();
minSdkVersion = source.readInt();
targetSdkVersion = source.readInt();
@@ -1317,10 +1328,10 @@
return;
}
- deviceEncryptedDataDir = deviceProtectedDataDir = Environment
+ deviceProtectedDataDir = Environment
.getDataUserDePackageDirectory(volumeUuid, userId, packageName)
.getAbsolutePath();
- credentialEncryptedDataDir = credentialProtectedDataDir = Environment
+ credentialProtectedDataDir = Environment
.getDataUserCePackageDirectory(volumeUuid, userId, packageName)
.getAbsolutePath();
@@ -1330,7 +1341,6 @@
} else {
dataDir = credentialProtectedDataDir;
}
- // TODO: modify per-user ephemerality
}
/**
@@ -1415,7 +1425,7 @@
* @hide
*/
public boolean isInstantApp() {
- return (privateFlags & ApplicationInfo.PRIVATE_FLAG_EPHEMERAL) != 0;
+ return (privateFlags & ApplicationInfo.PRIVATE_FLAG_INSTANT) != 0;
}
/**
diff --git a/core/java/android/content/pm/AuxiliaryResolveInfo.java b/core/java/android/content/pm/AuxiliaryResolveInfo.java
new file mode 100644
index 0000000..7d7784a
--- /dev/null
+++ b/core/java/android/content/pm/AuxiliaryResolveInfo.java
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ */
+
+package android.content.pm;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+/**
+ * Auxiliary application resolution response.
+ * <p>
+ * Used when resolution occurs, but, the target is not actually on the device.
+ * This happens resolving instant apps that haven't been installed yet or if
+ * the application consists of multiple feature splits and the needed split
+ * hasn't been installed.
+ * @hide
+ */
+public final class AuxiliaryResolveInfo extends IntentFilter {
+ /** Resolved information returned from the external ephemeral resolver */
+ public final EphemeralResolveInfo resolveInfo;
+ /** The resolved package. Copied from {@link #resolveInfo}. */
+ public final String packageName;
+ /** The resolve split. Copied from the matched filter in {@link #resolveInfo}. */
+ public final String splitName;
+ /** Whether or not ephemeral resolution needs the second phase */
+ public final boolean needsPhaseTwo;
+ /** Opaque token to track the ephemeral application resolution */
+ public final String token;
+ /** The version code of the package */
+ public final int versionCode;
+
+ /** Create a response for installing an instant application. */
+ public AuxiliaryResolveInfo(@NonNull EphemeralResolveInfo resolveInfo,
+ @NonNull IntentFilter orig,
+ @Nullable String splitName,
+ @NonNull String token,
+ boolean needsPhase2) {
+ super(orig);
+ this.resolveInfo = resolveInfo;
+ this.packageName = resolveInfo.getPackageName();
+ this.splitName = splitName;
+ this.token = token;
+ this.needsPhaseTwo = needsPhase2;
+ this.versionCode = resolveInfo.getVersionCode();
+ }
+
+ /** Create a response for installing a split on demand. */
+ public AuxiliaryResolveInfo(@NonNull String packageName,
+ @Nullable String splitName,
+ int versionCode) {
+ super();
+ this.packageName = packageName;
+ this.splitName = splitName;
+ this.versionCode = versionCode;
+ this.resolveInfo = null;
+ this.token = null;
+ this.needsPhaseTwo = false;
+ }
+}
\ No newline at end of file
diff --git a/core/java/android/content/pm/EphemeralRequest.java b/core/java/android/content/pm/EphemeralRequest.java
index 7f2b3ee1..58099c2b 100644
--- a/core/java/android/content/pm/EphemeralRequest.java
+++ b/core/java/android/content/pm/EphemeralRequest.java
@@ -24,24 +24,21 @@
*/
public final class EphemeralRequest {
/** Response from the first phase of ephemeral application resolution */
- public final EphemeralResponse responseObj;
+ public final AuxiliaryResolveInfo responseObj;
/** The original intent that triggered ephemeral application resolution */
public final Intent origIntent;
/** Resolved type of the intent */
public final String resolvedType;
- /** The intent that would launch if there were no ephemeral applications */
- public final Intent launchIntent;
/** The name of the package requesting the ephemeral application */
public final String callingPackage;
/** ID of the user requesting the ephemeral application */
public final int userId;
- public EphemeralRequest(EphemeralResponse responseObj, Intent origIntent,
- String resolvedType, Intent launchIntent, String callingPackage, int userId) {
+ public EphemeralRequest(AuxiliaryResolveInfo responseObj, Intent origIntent,
+ String resolvedType, String callingPackage, int userId) {
this.responseObj = responseObj;
this.origIntent = origIntent;
this.resolvedType = resolvedType;
- this.launchIntent = launchIntent;
this.callingPackage = callingPackage;
this.userId = userId;
}
diff --git a/core/java/android/content/pm/EphemeralResponse.java b/core/java/android/content/pm/EphemeralResponse.java
deleted file mode 100644
index 6e569f7..0000000
--- a/core/java/android/content/pm/EphemeralResponse.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.
- */
-
-package android.content.pm;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.IntentFilter;
-
-/**
- * Ephemeral application resolution response.
- * @hide
- */
-public final class EphemeralResponse extends IntentFilter {
- /** Resolved information returned from the external ephemeral resolver */
- public final EphemeralResolveInfo resolveInfo;
- /** The resolved package. Copied from {@link #resolveInfo}. */
- public final String packageName;
- /** The resolve split. Copied from the matched filter in {@link #resolveInfo}. */
- public final String splitName;
- /** Whether or not ephemeral resolution needs the second phase */
- public final boolean needsPhase2;
- /** Opaque token to track the ephemeral application resolution */
- public final String token;
-
- public EphemeralResponse(@NonNull EphemeralResolveInfo resolveInfo,
- @NonNull IntentFilter orig,
- @Nullable String splitName,
- @NonNull String token,
- boolean needsPhase2) {
- super(orig);
- this.resolveInfo = resolveInfo;
- this.packageName = resolveInfo.getPackageName();
- this.splitName = splitName;
- this.token = token;
- this.needsPhase2 = needsPhase2;
- }
-}
\ No newline at end of file
diff --git a/core/java/android/content/pm/ILauncherApps.aidl b/core/java/android/content/pm/ILauncherApps.aidl
index c08bd1d..41311eb 100644
--- a/core/java/android/content/pm/ILauncherApps.aidl
+++ b/core/java/android/content/pm/ILauncherApps.aidl
@@ -55,7 +55,8 @@
String callingPackage, String packageName, int flags, in UserHandle user);
ParceledListSlice getShortcuts(String callingPackage, long changedSince, String packageName,
- in List shortcutIds, in ComponentName componentName, int flags, in UserHandle user);
+ in List shortcutIds, in ComponentName componentName, in Intent intent, int flags,
+ in UserHandle user);
void pinShortcuts(String callingPackage, String packageName, in List<String> shortcutIds,
in UserHandle user);
boolean startShortcut(String callingPackage, String packageName, String id,
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 9d36a73..147b3e1 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -22,7 +22,6 @@
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
-import android.content.pm.ContainerEncryptionParams;
import android.content.pm.ChangedPackages;
import android.content.pm.InstantAppInfo;
import android.content.pm.FeatureInfo;
@@ -38,7 +37,6 @@
import android.content.pm.InstrumentationInfo;
import android.content.pm.KeySet;
import android.content.pm.PackageInfo;
-import android.content.pm.ManifestDigest;
import android.content.pm.PackageCleanItem;
import android.content.pm.ParceledListSlice;
import android.content.pm.ProviderInfo;
@@ -213,7 +211,7 @@
inout List<ProviderInfo> outInfo);
ParceledListSlice queryContentProviders(
- String processName, int uid, int flags);
+ String processName, int uid, int flags, String metaDataKey);
InstrumentationInfo getInstrumentationInfo(
in ComponentName className, int flags);
@@ -553,7 +551,8 @@
boolean setInstallLocation(int loc);
int getInstallLocation();
- int installExistingPackageAsUser(String packageName, int userId, int installReason);
+ int installExistingPackageAsUser(String packageName, int userId, int installFlags,
+ int installReason);
void verifyPendingInstall(int id, int verificationCode);
void extendVerificationTimeout(int id, int verificationCodeAtTimeout, long millisecondsToDelay);
diff --git a/core/java/android/content/pm/IPinItemRequest.aidl b/core/java/android/content/pm/IPinItemRequest.aidl
index efe2835..eddce58 100644
--- a/core/java/android/content/pm/IPinItemRequest.aidl
+++ b/core/java/android/content/pm/IPinItemRequest.aidl
@@ -16,6 +16,8 @@
package android.content.pm;
import android.os.Bundle;
+import android.appwidget.AppWidgetProviderInfo;
+import android.content.pm.ShortcutInfo;
/**
* {@hide}
@@ -23,4 +25,6 @@
interface IPinItemRequest {
boolean isValid();
boolean accept(in Bundle options);
+ ShortcutInfo getShortcutInfo();
+ AppWidgetProviderInfo getAppWidgetProviderInfo();
}
diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java
index c8f6406..776492a 100644
--- a/core/java/android/content/pm/LauncherApps.java
+++ b/core/java/android/content/pm/LauncherApps.java
@@ -37,6 +37,7 @@
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
+import android.graphics.drawable.AdaptiveIconDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -274,7 +275,18 @@
@Deprecated
public static final int FLAG_GET_MANIFEST = FLAG_MATCH_MANIFEST;
- /** @hide */
+ /**
+ * Include chooser shortcuts in the result.
+ * STOPSHIP TODO: Unless explicitly requesting chooser fields, we should strip out chooser
+ * relevant fields from the Shortcut. This should also be adequately documented.
+ */
+ public static final int FLAG_MATCH_CHOOSER = 1 << 4;
+
+ /**
+ * Does not retrieve CHOOSER only shortcuts.
+ * TODO: Add another flag for MATCH_ALL_PINNED
+ * @hide
+ */
public static final int FLAG_MATCH_ALL_KINDS =
FLAG_GET_DYNAMIC | FLAG_GET_PINNED | FLAG_GET_MANIFEST;
@@ -307,6 +319,7 @@
FLAG_MATCH_DYNAMIC,
FLAG_MATCH_PINNED,
FLAG_MATCH_MANIFEST,
+ FLAG_MATCH_CHOOSER,
FLAG_GET_KEY_FIELDS_ONLY,
})
@Retention(RetentionPolicy.SOURCE)
@@ -323,6 +336,9 @@
@Nullable
ComponentName mActivity;
+ @Nullable
+ Intent mIntent;
+
@QueryFlags
int mQueryFlags;
@@ -367,6 +383,14 @@
}
/**
+ * If non-null, returns only shortcuts with intent filters that match this intent.
+ */
+ public ShortcutQuery setIntent(@Nullable Intent intent) {
+ mIntent = intent;
+ return this;
+ }
+
+ /**
* Set query options. At least one of the {@code MATCH} flags should be set. Otherwise,
* no shortcuts will be returned.
*
@@ -680,7 +704,7 @@
try {
return mService.getShortcuts(mContext.getPackageName(),
query.mChangedSince, query.mPackage, query.mShortcutIds, query.mActivity,
- query.mQueryFlags, user)
+ query.mIntent, query.mQueryFlags, user)
.getList();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -803,7 +827,15 @@
}
try {
final Bitmap bmp = BitmapFactory.decodeFileDescriptor(pfd.getFileDescriptor());
- return (bmp == null) ? null : new BitmapDrawable(mContext.getResources(), bmp);
+ if (bmp != null) {
+ BitmapDrawable dr = new BitmapDrawable(mContext.getResources(), bmp);
+ if (shortcut.hasMaskableBitmap()) {
+ return new AdaptiveIconDrawable(null, dr);
+ } else {
+ return dr;
+ }
+ }
+ return null;
} finally {
try {
pfd.close();
@@ -821,7 +853,8 @@
return loadDrawableResourceFromPackage(shortcut.getPackage(),
icon.getResId(), shortcut.getUserHandle(), density);
}
- case Icon.TYPE_BITMAP: {
+ case Icon.TYPE_BITMAP:
+ case Icon.TYPE_BITMAP_MASKABLE: {
return icon.loadDrawable(mContext);
}
default:
@@ -1281,28 +1314,14 @@
public @interface RequestType {}
private final int mRequestType;
- private final ShortcutInfo mShortcutInfo;
- private final AppWidgetProviderInfo mAppWidgetInfo;
private final IPinItemRequest mInner;
/**
* @hide
*/
- public PinItemRequest(ShortcutInfo shortcutInfo, IPinItemRequest inner) {
- mRequestType = REQUEST_TYPE_SHORTCUT;
- mShortcutInfo = shortcutInfo;
- mAppWidgetInfo = null;
+ public PinItemRequest(IPinItemRequest inner, int type) {
mInner = inner;
- }
-
- /**
- * @hide
- */
- public PinItemRequest(AppWidgetProviderInfo appWidgetInfo, IPinItemRequest inner) {
- mRequestType = REQUEST_TYPE_APPWIDGET;
- mShortcutInfo = null;
- mAppWidgetInfo = appWidgetInfo;
- mInner = inner;
+ mRequestType = type;
}
/**
@@ -1320,7 +1339,11 @@
*/
@Nullable
public ShortcutInfo getShortcutInfo() {
- return mShortcutInfo;
+ try {
+ return mInner.getShortcutInfo();
+ } catch (RemoteException e) {
+ throw e.rethrowAsRuntimeException();
+ }
}
/**
@@ -1329,12 +1352,16 @@
*/
@Nullable
public AppWidgetProviderInfo getAppWidgetProviderInfo(Context context) {
- if (mAppWidgetInfo != null) {
- AppWidgetProviderInfo info = mAppWidgetInfo.clone();
+ try {
+ final AppWidgetProviderInfo info = mInner.getAppWidgetProviderInfo();
+ if (info == null) {
+ return null;
+ }
info.updateDimensions(context.getResources().getDisplayMetrics());
return info;
+ } catch (RemoteException e) {
+ throw e.rethrowAsRuntimeException();
}
- return null;
}
/**
@@ -1371,22 +1398,12 @@
final ClassLoader cl = getClass().getClassLoader();
mRequestType = source.readInt();
- mShortcutInfo = mRequestType == REQUEST_TYPE_SHORTCUT ?
- (ShortcutInfo) source.readParcelable(cl) : null;
- mAppWidgetInfo = mRequestType == REQUEST_TYPE_APPWIDGET ?
- (AppWidgetProviderInfo) source.readParcelable(cl) : null;
mInner = IPinItemRequest.Stub.asInterface(source.readStrongBinder());
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mRequestType);
- if (mRequestType == REQUEST_TYPE_SHORTCUT) {
- dest.writeParcelable(mShortcutInfo, flags);
- }
- if (mRequestType == REQUEST_TYPE_APPWIDGET) {
- dest.writeParcelable(mAppWidgetInfo, flags);
- }
dest.writeStrongBinder(mInner.asBinder());
}
diff --git a/core/java/android/content/pm/ManifestDigest.aidl b/core/java/android/content/pm/ManifestDigest.aidl
deleted file mode 100644
index ebabab0..0000000
--- a/core/java/android/content/pm/ManifestDigest.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2011, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.content.pm;
-
-parcelable ManifestDigest;
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 4de967c..278a6d0 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -1096,9 +1096,11 @@
@SystemApi
public void setInstallAsInstantApp(boolean isInstantApp) {
if (isInstantApp) {
- installFlags |= PackageManager.INSTALL_EPHEMERAL;
+ installFlags |= PackageManager.INSTALL_INSTANT_APP;
+ installFlags &= ~PackageManager.INSTALL_FULL_APP;
} else {
- installFlags &= ~PackageManager.INSTALL_EPHEMERAL;
+ installFlags &= ~PackageManager.INSTALL_INSTANT_APP;
+ installFlags |= PackageManager.INSTALL_FULL_APP;
}
}
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 308153d..0482f51 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -411,17 +411,6 @@
*/
public static final int MATCH_DIRECT_BOOT_AWARE = 0x00080000;
- /** @removed */
- @Deprecated
- public static final int MATCH_ENCRYPTION_UNAWARE = 0x00040000;
- /** @removed */
- @Deprecated
- public static final int MATCH_ENCRYPTION_AWARE = 0x00080000;
- /** @removed */
- @Deprecated
- public static final int MATCH_ENCRYPTION_AWARE_AND_UNAWARE = MATCH_ENCRYPTION_AWARE
- | MATCH_ENCRYPTION_UNAWARE;
-
/**
* Querying flag: include only components from applications that are marked
* with {@link ApplicationInfo#FLAG_SYSTEM}.
@@ -452,17 +441,17 @@
/**
* Internal {@link PackageInfo} flag: include components that are part of an
- * ephemeral app. By default, ephemeral components are not matched.
+ * instant app. By default, instant app components are not matched.
* @hide
*/
- public static final int MATCH_EPHEMERAL = 0x00800000;
+ public static final int MATCH_INSTANT = 0x00800000;
/**
* Internal {@link PackageInfo} flag: include only components that are exposed to
* ephemeral apps.
* @hide
*/
- public static final int MATCH_VISIBLE_TO_EPHEMERAL_ONLY = 0x01000000;
+ public static final int MATCH_VISIBLE_TO_INSTANT_APP_ONLY = 0x01000000;
/**
* Internal flag used to indicate that a system component has done their
@@ -613,7 +602,7 @@
INSTALL_GRANT_RUNTIME_PERMISSIONS,
INSTALL_FORCE_VOLUME_UUID,
INSTALL_FORCE_PERMISSION_PROMPT,
- INSTALL_EPHEMERAL,
+ INSTALL_INSTANT_APP,
INSTALL_DONT_KILL_APP,
})
@Retention(RetentionPolicy.SOURCE)
@@ -624,8 +613,10 @@
* should be installed as forward locked, i.e. only the app itself should
* have access to its code and non-resource assets.
*
+ * @deprecated new installs into ASEC containers are no longer supported.
* @hide
*/
+ @Deprecated
public static final int INSTALL_FORWARD_LOCK = 0x00000001;
/**
@@ -648,8 +639,11 @@
* Flag parameter for {@link #installPackage} to indicate that this package
* must be installed to an ASEC on a {@link VolumeInfo#TYPE_PUBLIC}.
*
+ * @deprecated new installs into ASEC containers are no longer supported;
+ * use adoptable storage instead.
* @hide
*/
+ @Deprecated
public static final int INSTALL_EXTERNAL = 0x00000008;
/**
@@ -714,7 +708,16 @@
*
* @hide
*/
- public static final int INSTALL_EPHEMERAL = 0x00000800;
+ public static final int INSTALL_INSTANT_APP = 0x00000800;
+
+ /**
+ * Flag parameter for {@link #installPackage} to indicate that this package is
+ * to be installed as a heavy weight app. This is fundamentally the opposite of
+ * {@link #INSTALL_INSTANT_APP}.
+ *
+ * @hide
+ */
+ public static final int INSTALL_FULL_APP = 0x00004000;
/**
* Flag parameter for {@link #installPackage} to indicate that this package contains
@@ -1185,12 +1188,12 @@
public static final int INSTALL_FAILED_ABORTED = -115;
/**
- * Installation failed return code: ephemeral app installs are incompatible with some
+ * Installation failed return code: instant app installs are incompatible with some
* other installation flags supplied for the operation; or other circumstances such
- * as trying to upgrade a system app via an ephemeral install.
+ * as trying to upgrade a system app via an instant app install.
* @hide
*/
- public static final int INSTALL_FAILED_EPHEMERAL_INVALID = -116;
+ public static final int INSTALL_FAILED_INSTANT_APP_INVALID = -116;
/** @hide */
@IntDef(flag = true, value = {
@@ -4459,6 +4462,27 @@
String processName, int uid, @ComponentInfoFlags int flags);
/**
+ * Same as {@link #queryContentProviders}, except when {@code metaDataKey} is not null,
+ * it only returns providers which have metadata with the {@code metaDataKey} key.
+ *
+ * <p>DO NOT USE the {@code metaDataKey} parameter, unless you're the contacts provider.
+ * You really shouldn't need it. Other apps should use {@link #queryIntentContentProviders}
+ * instead.
+ *
+ * <p>The {@code metaDataKey} parameter was added to allow the contacts provider to quickly
+ * scan the GAL providers on the device. Unfortunately the discovery protocol used metadata
+ * to mark GAL providers, rather than intent filters, so we can't use
+ * {@link #queryIntentContentProviders} for that.
+ *
+ * @hide
+ */
+ public List<ProviderInfo> queryContentProviders(
+ String processName, int uid, @ComponentInfoFlags int flags, String metaDataKey) {
+ // Provide the default implementation for mocks.
+ return queryContentProviders(processName, uid, flags);
+ }
+
+ /**
* Retrieve all of the information we know about a particular
* instrumentation class.
*
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index 7d59bd6..6272822 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -213,12 +213,11 @@
* @param responseObj The response of the first phase of ephemeral resolution
* @param origIntent The original intent that triggered ephemeral resolution
* @param resolvedType The resolved type of the intent
- * @param launchIntent The intent that would launch if there was no ephemeral application
* @param callingPackage The name of the package requesting the ephemeral application
* @param userId The ID of the user that triggered ephemeral resolution
*/
- public abstract void requestEphemeralResolutionPhaseTwo(EphemeralResponse responseObj,
- Intent origIntent, String resolvedType, Intent launchIntent, String callingPackage,
+ public abstract void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
+ Intent origIntent, String resolvedType, String callingPackage,
int userId);
/**
@@ -307,4 +306,10 @@
*/
public abstract boolean setEnabledOverlayPackages(int userId, String targetPackageName,
List<String> overlayPackageNames);
+
+ /**
+ * Resolves an intent, allowing instant apps to be resolved.
+ */
+ public abstract ResolveInfo resolveIntent(Intent intent, String resolvedType,
+ int flags, int userId);
}
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 7a9aaaf..f801e45 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -720,6 +720,8 @@
public final static int PARSE_COLLECT_CERTIFICATES = 1<<8;
public final static int PARSE_TRUSTED_OVERLAY = 1<<9;
public final static int PARSE_ENFORCE_CODE = 1<<10;
+ /** @deprecated remove when fixing b/34761192 */
+ @Deprecated
public final static int PARSE_IS_EPHEMERAL = 1<<11;
public final static int PARSE_FORCE_SDK = 1<<12;
@@ -2012,10 +2014,6 @@
pkg.applicationInfo.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE;
}
- if ((flags & PARSE_IS_EPHEMERAL) != 0) {
- pkg.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_EPHEMERAL;
- }
-
if (sa.getBoolean(com.android.internal.R.styleable.AndroidManifest_isolatedSplits, false)) {
pkg.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING;
}
@@ -2067,9 +2065,6 @@
com.android.internal.R.styleable.AndroidManifestResourceOverlay);
pkg.mOverlayTarget = sa.getString(
com.android.internal.R.styleable.AndroidManifestResourceOverlay_targetPackage);
- pkg.mOverlayPriority = sa.getInt(
- com.android.internal.R.styleable.AndroidManifestResourceOverlay_priority,
- -1);
sa.recycle();
if (pkg.mOverlayTarget == null) {
@@ -2077,12 +2072,6 @@
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
return null;
}
- if (pkg.mOverlayPriority < 0 || pkg.mOverlayPriority > 9999) {
- outError[0] = "<overlay> priority must be between 0 and 9999";
- mParseError =
- PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
- return null;
- }
XmlUtils.skipCurrentTag(parser);
} else if (tagName.equals(TAG_KEY_SETS)) {
@@ -2691,9 +2680,9 @@
certSha256 = certSha256.replace(":", "").toLowerCase();
pkg.usesStaticLibraries = ArrayUtils.add(pkg.usesStaticLibraries, lname);
pkg.usesStaticLibrariesVersions = ArrayUtils.appendInt(
- pkg.usesStaticLibrariesVersions, version);
+ pkg.usesStaticLibrariesVersions, version, true);
pkg.usesStaticLibrariesCertDigests = ArrayUtils.appendElement(String.class,
- pkg.usesStaticLibrariesCertDigests, certSha256);
+ pkg.usesStaticLibrariesCertDigests, certSha256, true);
XmlUtils.skipCurrentTag(parser);
@@ -2747,15 +2736,15 @@
String cls = clsSeq.toString();
char c = cls.charAt(0);
if (c == '.') {
- return (pkg + cls).intern();
+ return pkg + cls;
}
if (cls.indexOf('.') < 0) {
StringBuilder b = new StringBuilder(pkg);
b.append('.');
b.append(cls);
- return b.toString().intern();
+ return b.toString();
}
- return cls.intern();
+ return cls;
}
private static String buildCompoundName(String pkg,
@@ -2775,7 +2764,7 @@
+ pkg + ": " + nameError;
return null;
}
- return (pkg + proc).intern();
+ return pkg + proc;
}
String nameError = validateName(proc, true, false);
if (nameError != null && !"system".equals(proc)) {
@@ -2783,7 +2772,7 @@
+ pkg + ": " + nameError;
return null;
}
- return proc.intern();
+ return proc;
}
private static String buildProcessName(String pkg, String defProc,
@@ -4149,11 +4138,8 @@
ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE;
}
- final boolean hasVisibleToEphemeral =
- sa.hasValue(R.styleable.AndroidManifestActivity_visibleToInstantApps);
- final boolean isEphemeral = ((flags & PARSE_IS_EPHEMERAL) != 0);
- final boolean visibleToEphemeral = isEphemeral
- || sa.getBoolean(R.styleable.AndroidManifestActivity_visibleToInstantApps, false);
+ final boolean visibleToEphemeral =
+ sa.getBoolean(R.styleable.AndroidManifestActivity_visibleToInstantApps, false);
if (visibleToEphemeral) {
a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL;
}
@@ -4188,8 +4174,6 @@
intent, outError)) {
return null;
}
- intent.setEphemeral(isEphemeral);
- intent.setVisibleToEphemeral(visibleToEphemeral || isWebBrowsableIntent(intent));
if (intent.countActions() == 0) {
Slog.w(TAG, "No actions in intent filter at "
+ mArchiveSourcePath + " "
@@ -4198,7 +4182,8 @@
a.intents.add(intent);
}
// adjust activity flags when we implicitly expose it via a browsable filter
- if (!hasVisibleToEphemeral && intent.isVisibleToEphemeral()) {
+ intent.setVisibleToEphemeral(visibleToEphemeral || isWebBrowsableIntent(intent));
+ if (intent.isVisibleToInstantApp()) {
a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL;
}
} else if (!receiver && parser.getName().equals("preferred")) {
@@ -4207,8 +4192,6 @@
intent, outError)) {
return null;
}
- intent.setEphemeral(isEphemeral);
- intent.setVisibleToEphemeral(visibleToEphemeral || isWebBrowsableIntent(intent));
if (intent.countActions() == 0) {
Slog.w(TAG, "No actions in preferred at "
+ mArchiveSourcePath + " "
@@ -4220,7 +4203,8 @@
owner.preferredActivityFilters.add(intent);
}
// adjust activity flags when we implicitly expose it via a browsable filter
- if (!hasVisibleToEphemeral && intent.isVisibleToEphemeral()) {
+ intent.setVisibleToEphemeral(visibleToEphemeral || isWebBrowsableIntent(intent));
+ if (intent.isVisibleToInstantApp()) {
a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL;
}
} else if (parser.getName().equals("meta-data")) {
@@ -4472,9 +4456,8 @@
}
// TODO add visibleToInstantApps attribute to activity alias
- final boolean isEphemeral = ((flags & PARSE_IS_EPHEMERAL) != 0);
- final boolean visibleToEphemeral = isEphemeral
- || ((a.info.flags & ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL) != 0);
+ final boolean visibleToEphemeral =
+ ((a.info.flags & ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL) != 0);
sa.recycle();
@@ -4502,13 +4485,12 @@
+ mArchiveSourcePath + " "
+ parser.getPositionDescription());
} else {
- intent.setEphemeral(isEphemeral);
- intent.setVisibleToEphemeral(visibleToEphemeral
- || isWebBrowsableIntent(intent));
+ intent.setVisibleToEphemeral(
+ visibleToEphemeral || isWebBrowsableIntent(intent));
a.intents.add(intent);
}
// adjust activity flags when we implicitly expose it via a browsable filter
- if (intent.isVisibleToEphemeral()) {
+ if (intent.isVisibleToInstantApp()) {
a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL;
}
} else if (parser.getName().equals("meta-data")) {
@@ -4649,11 +4631,8 @@
ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE;
}
- final boolean hasVisibleToEphemeral =
- sa.hasValue(R.styleable.AndroidManifestProvider_visibleToInstantApps);
- final boolean isEphemeral = ((flags & PARSE_IS_EPHEMERAL) != 0);
- final boolean visibleToEphemeral = isEphemeral
- || sa.getBoolean(R.styleable.AndroidManifestProvider_visibleToInstantApps, false);
+ final boolean visibleToEphemeral =
+ sa.getBoolean(R.styleable.AndroidManifestProvider_visibleToInstantApps, false);
if (visibleToEphemeral) {
p.info.flags |= ProviderInfo.FLAG_VISIBLE_TO_EPHEMERAL;
}
@@ -4681,7 +4660,7 @@
p.info.authority = cpname.intern();
if (!parseProviderTags(
- res, parser, isEphemeral, hasVisibleToEphemeral, visibleToEphemeral, p, outError)) {
+ res, parser, visibleToEphemeral, p, outError)) {
return null;
}
@@ -4689,8 +4668,7 @@
}
private boolean parseProviderTags(Resources res, XmlResourceParser parser,
- boolean isEphemeral, boolean hasVisibleToEphemeral, boolean visibleToEphemeral,
- Provider outInfo, String[] outError)
+ boolean visibleToEphemeral, Provider outInfo, String[] outError)
throws XmlPullParserException, IOException {
int outerDepth = parser.getDepth();
int type;
@@ -4707,11 +4685,10 @@
intent, outError)) {
return false;
}
- intent.setEphemeral(isEphemeral);
- intent.setVisibleToEphemeral(visibleToEphemeral || isWebBrowsableIntent(intent));
outInfo.intents.add(intent);
// adjust provider flags when we implicitly expose it via a browsable filter
- if (!hasVisibleToEphemeral && intent.isVisibleToEphemeral()) {
+ intent.setVisibleToEphemeral(visibleToEphemeral || isWebBrowsableIntent(intent));
+ if (intent.isVisibleToInstantApp()) {
outInfo.info.flags |= ProviderInfo.FLAG_VISIBLE_TO_EPHEMERAL;
}
@@ -4963,11 +4940,8 @@
ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE;
}
- final boolean hasVisibleToEphemeral =
- sa.hasValue(R.styleable.AndroidManifestService_visibleToInstantApps);
- final boolean isEphemeral = ((flags & PARSE_IS_EPHEMERAL) != 0);
- final boolean visibleToEphemeral = isEphemeral
- || sa.getBoolean(R.styleable.AndroidManifestService_visibleToInstantApps, false);
+ final boolean visibleToEphemeral =
+ sa.getBoolean(R.styleable.AndroidManifestService_visibleToInstantApps, false);
if (visibleToEphemeral) {
s.info.flags |= ServiceInfo.FLAG_VISIBLE_TO_EPHEMERAL;
}
@@ -4999,10 +4973,9 @@
intent, outError)) {
return null;
}
- intent.setEphemeral(isEphemeral);
- intent.setVisibleToEphemeral(visibleToEphemeral || isWebBrowsableIntent(intent));
// adjust activity flags when we implicitly expose it via a browsable filter
- if (!hasVisibleToEphemeral && intent.isVisibleToEphemeral()) {
+ intent.setVisibleToEphemeral(visibleToEphemeral || isWebBrowsableIntent(intent));
+ if (intent.isVisibleToInstantApp()) {
s.info.flags |= ServiceInfo.FLAG_VISIBLE_TO_EPHEMERAL;
}
s.intents.add(intent);
@@ -5101,7 +5074,7 @@
if (v != null) {
if (v.type == TypedValue.TYPE_STRING) {
CharSequence cs = v.coerceToString();
- data.putString(name, cs != null ? cs.toString().intern() : null);
+ data.putString(name, cs != null ? cs.toString() : null);
} else if (v.type == TypedValue.TYPE_INT_BOOLEAN) {
data.putBoolean(name, v.data != 0);
} else if (v.type >= TypedValue.TYPE_FIRST_INT
@@ -5536,7 +5509,6 @@
public String mRequiredAccountType;
public String mOverlayTarget;
- public int mOverlayPriority;
public boolean mTrustedOverlay;
/**
@@ -5884,7 +5856,7 @@
// We use the boot classloader for all classes that we load.
final ClassLoader boot = Object.class.getClassLoader();
- packageName = dest.readString();
+ packageName = dest.readString().intern();
manifestPackageName = dest.readString();
splitNames = dest.readStringArray();
volumeUuid = dest.readString();
@@ -5897,6 +5869,9 @@
splitPrivateFlags = dest.createIntArray();
baseHardwareAccelerated = (dest.readInt() == 1);
applicationInfo = dest.readParcelable(boot);
+ if (applicationInfo.permission != null) {
+ applicationInfo.permission = applicationInfo.permission.intern();
+ }
// We don't serialize the "owner" package and the application info object for each of
// these components, in order to save space and to avoid circular dependencies while
@@ -5917,7 +5892,10 @@
fixupOwner(instrumentation);
dest.readStringList(requestedPermissions);
+ internStringArrayList(requestedPermissions);
protectedBroadcasts = dest.createStringArrayList();
+ internStringArrayList(protectedBroadcasts);
+
parentPackage = dest.readParcelable(boot);
childPackages = new ArrayList<>();
@@ -5927,16 +5905,23 @@
}
staticSharedLibName = dest.readString();
+ if (staticSharedLibName != null) {
+ staticSharedLibName = staticSharedLibName.intern();
+ }
staticSharedLibVersion = dest.readInt();
libraryNames = dest.createStringArrayList();
+ internStringArrayList(libraryNames);
usesLibraries = dest.createStringArrayList();
+ internStringArrayList(usesLibraries);
usesOptionalLibraries = dest.createStringArrayList();
+ internStringArrayList(usesOptionalLibraries);
usesLibraryFiles = dest.readStringArray();
final int libCount = dest.readInt();
if (libCount > 0) {
usesStaticLibraries = new ArrayList<>(libCount);
dest.readStringList(usesStaticLibraries);
+ internStringArrayList(usesStaticLibraries);
usesStaticLibrariesVersions = new int[libCount];
dest.readIntArray(usesStaticLibrariesVersions);
usesStaticLibrariesCertDigests = new String[libCount];
@@ -5955,7 +5940,13 @@
mAppMetaData = dest.readBundle();
mVersionCode = dest.readInt();
mVersionName = dest.readString();
+ if (mVersionName != null) {
+ mVersionName = mVersionName.intern();
+ }
mSharedUserId = dest.readString();
+ if (mSharedUserId != null) {
+ mSharedUserId = mSharedUserId.intern();
+ }
mSharedUserLabel = dest.readInt();
mSignatures = (Signature[]) dest.readParcelableArray(boot, Signature.class);
@@ -5994,7 +5985,6 @@
mRestrictedAccountType = dest.readString();
mRequiredAccountType = dest.readString();
mOverlayTarget = dest.readString();
- mOverlayPriority = dest.readInt();
mTrustedOverlay = (dest.readInt() == 1);
mSigningKeys = (ArraySet<PublicKey>) dest.readArraySet(boot);
mUpgradeKeySets = (ArraySet<String>) dest.readArraySet(boot);
@@ -6006,6 +5996,15 @@
restrictUpdateHash = dest.createByteArray();
}
+ private static void internStringArrayList(List<String> list) {
+ if (list != null) {
+ final int N = list.size();
+ for (int i = 0; i < N; ++i) {
+ list.set(i, list.get(i).intern());
+ }
+ }
+ }
+
/**
* Sets the package owner and the the {@code applicationInfo} for every component
* owner by this package.
@@ -6101,7 +6100,6 @@
dest.writeString(mRestrictedAccountType);
dest.writeString(mRequiredAccountType);
dest.writeString(mOverlayTarget);
- dest.writeInt(mOverlayPriority);
dest.writeInt(mTrustedOverlay ? 1 : 0);
dest.writeArraySet(mSigningKeys);
dest.writeArraySet(mUpgradeKeySets);
@@ -6393,6 +6391,10 @@
super(in);
final ClassLoader boot = Object.class.getClassLoader();
info = in.readParcelable(boot);
+ if (info.group != null) {
+ info.group = info.group.intern();
+ }
+
tree = (in.readInt() == 1);
group = in.readParcelable(boot);
}
@@ -6482,6 +6484,9 @@
if (state.stopped) {
return true;
}
+ if (state.instantApp != p.applicationInfo.isInstantApp()) {
+ return true;
+ }
if ((flags & PackageManager.GET_META_DATA) != 0
&& (metaData != null || p.mAppMetaData != null)) {
return true;
@@ -6517,6 +6522,11 @@
} else {
ai.flags &= ~ApplicationInfo.FLAG_SUSPENDED;
}
+ if (state.instantApp) {
+ ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_INSTANT;
+ } else {
+ ai.privateFlags &= ~ApplicationInfo.PRIVATE_FLAG_INSTANT;
+ }
if (state.hidden) {
ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_HIDDEN;
} else {
@@ -6537,6 +6547,8 @@
if (ai.category == ApplicationInfo.CATEGORY_UNDEFINED) {
ai.category = FallbackCategoryProvider.getFallbackCategory(ai.packageName);
}
+ ai.seInfoUser = SELinuxUtil.assignSeinfoUser(state);
+ ai.resourceDirs = state.resourceDirs;
}
public static ApplicationInfo generateApplicationInfo(Package p, int flags,
@@ -6660,6 +6672,10 @@
for (ActivityIntentInfo aii : intents) {
aii.activity = this;
}
+
+ if (info.permission != null) {
+ info.permission = info.permission.intern();
+ }
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator<Activity>() {
@@ -6744,6 +6760,10 @@
for (ServiceIntentInfo aii : intents) {
aii.service = this;
}
+
+ if (info.permission != null) {
+ info.permission = info.permission.intern();
+ }
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator<Service>() {
@@ -6825,6 +6845,18 @@
for (ProviderIntentInfo aii : intents) {
aii.provider = this;
}
+
+ if (info.readPermission != null) {
+ info.readPermission = info.readPermission.intern();
+ }
+
+ if (info.writePermission != null) {
+ info.writePermission = info.writePermission.intern();
+ }
+
+ if (info.authority != null) {
+ info.authority = info.authority.intern();
+ }
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator<Provider>() {
@@ -6897,6 +6929,14 @@
private Instrumentation(Parcel in) {
super(in);
info = in.readParcelable(Object.class.getClassLoader());
+
+ if (info.targetPackage != null) {
+ info.targetPackage = info.targetPackage.intern();
+ }
+
+ if (info.targetProcess != null) {
+ info.targetProcess = info.targetProcess.intern();
+ }
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator<Instrumentation>() {
diff --git a/core/java/android/content/pm/PackageUserState.java b/core/java/android/content/pm/PackageUserState.java
index e19aa99..ee56a18 100644
--- a/core/java/android/content/pm/PackageUserState.java
+++ b/core/java/android/content/pm/PackageUserState.java
@@ -31,6 +31,8 @@
import com.android.internal.util.ArrayUtils;
+import java.util.Arrays;
+
/**
* Per-user state information about a package.
* @hide
@@ -43,6 +45,7 @@
public boolean hidden; // Is the app restricted by owner / admin
public boolean suspended;
public boolean blockUninstall;
+ public boolean instantApp;
public int enabled;
public String lastDisableAppCaller;
public int domainVerificationStatus;
@@ -53,6 +56,8 @@
public ArraySet<String> disabledComponents;
public ArraySet<String> enabledComponents;
+ public String[] resourceDirs;
+
public PackageUserState() {
installed = true;
hidden = false;
@@ -71,6 +76,7 @@
hidden = o.hidden;
suspended = o.suspended;
blockUninstall = o.blockUninstall;
+ instantApp = o.instantApp;
enabled = o.enabled;
lastDisableAppCaller = o.lastDisableAppCaller;
domainVerificationStatus = o.domainVerificationStatus;
@@ -79,6 +85,8 @@
installReason = o.installReason;
disabledComponents = ArrayUtils.cloneOrNull(o.disabledComponents);
enabledComponents = ArrayUtils.cloneOrNull(o.enabledComponents);
+ resourceDirs =
+ o.resourceDirs == null ? null : Arrays.copyOf(o.resourceDirs, o.resourceDirs.length);
}
/**
@@ -188,6 +196,9 @@
if (blockUninstall != oldState.blockUninstall) {
return false;
}
+ if (instantApp != oldState.instantApp) {
+ return false;
+ }
if (enabled != oldState.enabled) {
return false;
}
diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java
index f8b4570..50f2d53 100644
--- a/core/java/android/content/pm/ResolveInfo.java
+++ b/core/java/android/content/pm/ResolveInfo.java
@@ -61,11 +61,12 @@
public ProviderInfo providerInfo;
/**
- * The ephemeral application that corresponds to this resolution match. This will
- * only be set in specific circumstances.
+ * An auxiliary response that may modify the resolved information. This is
+ * only set under certain circumstances; such as when resolving instant apps
+ * or components defined in un-installed splits.
* @hide
*/
- public EphemeralResponse ephemeralResponse;
+ public AuxiliaryResolveInfo auxiliaryInfo;
/**
* The IntentFilter that was matched for this ResolveInfo.
diff --git a/core/java/android/content/pm/SELinuxUtil.java b/core/java/android/content/pm/SELinuxUtil.java
new file mode 100644
index 0000000..55b5e29
--- /dev/null
+++ b/core/java/android/content/pm/SELinuxUtil.java
@@ -0,0 +1,42 @@
+/*
+ * 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.content.pm;
+
+import com.android.internal.util.ArrayUtils;
+
+/**
+ * Utility methods that need to be used in application space.
+ * @hide
+ */
+public final class SELinuxUtil {
+
+ /** Append to existing seinfo label for instant apps @hide */
+ private static final String INSTANT_APP_STR = ":ephemeralapp";
+
+ /** Append to existing seinfo when modifications are complete @hide */
+ public static final String COMPLETE_STR = ":complete";
+
+ /** @hide */
+ public static String assignSeinfoUser(PackageUserState userState) {
+ String seInfo = "";
+ if (userState.instantApp)
+ seInfo += INSTANT_APP_STR;
+ seInfo += COMPLETE_STR;
+ return seInfo;
+ }
+
+}
diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java
index b4dcdf7..d3d3c66 100644
--- a/core/java/android/content/pm/ShortcutInfo.java
+++ b/core/java/android/content/pm/ShortcutInfo.java
@@ -21,8 +21,10 @@
import android.annotation.UserIdInt;
import android.app.TaskStackBuilder;
import android.content.ComponentName;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.LauncherApps.ShortcutQuery;
import android.content.res.Resources;
import android.content.res.Resources.NotFoundException;
@@ -38,10 +40,12 @@
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.MemInfoReader;
import com.android.internal.util.Preconditions;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -92,6 +96,17 @@
public static final int FLAG_IMMUTABLE = 1 << 8;
/** @hide */
+ public static final int FLAG_MASKABLE_BITMAP = 1 << 9;
+
+ /** @hide */
+ public static final int FLAG_CHOOSER = 1 << 10;
+
+ /**
+ * TODO: Add FLAG_CHOOSER_INFO_OMITTED to reflect that chooser info was omitted in the Shortcut
+ * due to the context in which it was retrieved.
+ * TODO: Add a FLAG_LAUNCHABLE to reflect whether or not the Shortcut has a launchable intent
+ * @hide
+ */
@IntDef(flag = true,
value = {
FLAG_DYNAMIC,
@@ -103,6 +118,8 @@
FLAG_DISABLED,
FLAG_STRINGS_RESOLVED,
FLAG_IMMUTABLE,
+ FLAG_MASKABLE_BITMAP,
+ FLAG_CHOOSER,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ShortcutFlags {}
@@ -197,6 +214,24 @@
@Nullable
private PersistableBundle[] mIntentPersistableExtrases;
+ /**
+ * If used in a chooser, extras that should be added into the intent passed through.
+ */
+ @Nullable
+ private PersistableBundle mChooserExtras;
+
+ /**
+ * Intent filters to be used if the shortcut is to be used in a chooser context.
+ */
+ @Nullable
+ private IntentFilter[] mChooserIntentFilters;
+
+ /**
+ * Component names corresponding to the above intent filters.
+ */
+ @Nullable
+ private ComponentName[] mChooserComponentNames;
+
private int mRank;
/**
@@ -246,6 +281,13 @@
mDisabledMessageResId = b.mDisabledMessageResId;
mCategories = cloneCategories(b.mCategories);
mIntents = cloneIntents(b.mIntents);
+ if (b.mChooserIntentFilters != null) {
+ mChooserIntentFilters = b.mChooserIntentFilters.toArray(new IntentFilter[0]);
+ }
+ if (b.mChooserComponentNames != null) {
+ mChooserComponentNames = b.mChooserComponentNames.toArray(new ComponentName[0]);
+ }
+ mChooserExtras = b.mChooserExtras;
fixUpIntentExtras();
mRank = b.mRank;
mExtras = b.mExtras;
@@ -326,8 +368,28 @@
if (mTitle == null && mTitleResId == 0) {
throw new IllegalArgumentException("Short label must be provided");
}
- Preconditions.checkNotNull(mIntents, "Shortcut Intent must be provided");
- Preconditions.checkArgument(mIntents.length > 0, "Shortcut Intent must be provided");
+
+ // For a shortcut to be valid, there should either be an Intent, or a non-empty set of
+ // intent filters.
+ if (mIntents == null || mIntents.length == 0) {
+ Preconditions.checkNotNull(mChooserIntentFilters,
+ "Intent must be provided if not a chooser target");
+ Preconditions.checkNotNull(mChooserComponentNames,
+ "Intent must be provided if not a chooser target");
+ }
+
+ // If ChooserIntentFilter are provided, they should match the length of the provided
+ // component names.
+ if (mChooserIntentFilters != null) {
+ if (mChooserComponentNames == null
+ || mChooserIntentFilters.length != mChooserComponentNames.length) {
+ throw new IllegalArgumentException("Inconsistent intent filters and "
+ + "component names given");
+ }
+ if (mChooserIntentFilters.length == 0 || mChooserComponentNames.length == 0) {
+ throw new IllegalArgumentException("Empty intent filter and component names given");
+ }
+ }
}
/**
@@ -372,6 +434,10 @@
mDisabledMessageResName = source.mDisabledMessageResName;
mIconResName = source.mIconResName;
}
+ // TODO: Omit these by default and add a new clone flag.
+ mChooserIntentFilters = source.mChooserIntentFilters;
+ mChooserComponentNames = source.mChooserComponentNames;
+ mChooserExtras = source.mChooserExtras;
} else {
// Set this bit.
mFlags |= FLAG_KEY_FIELDS_ONLY;
@@ -499,6 +565,25 @@
}
/**
+ * Whether the shortcut has any intentFilter matching the passed in one.
+ * @hide
+ */
+ @VisibleForTesting
+ public boolean hasMatchingFilter(ContentResolver resolver, Intent intent) {
+ if (mChooserIntentFilters == null) {
+ return false;
+ }
+ for (IntentFilter filter : mChooserIntentFilters) {
+ int match = filter.match(resolver, intent, false, TAG);
+ if (match > 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ /**
* Extract the entry name from a fully-donated resource name.
* e.g. "com.android.app1:drawable/icon1" -> "icon1"
* @hide
@@ -681,6 +766,15 @@
if (source.mExtras != null) {
mExtras = source.mExtras;
}
+ if (source.mChooserExtras != null) {
+ mChooserExtras = source.mChooserExtras;
+ }
+ if (source.mChooserIntentFilters != null) {
+ mChooserIntentFilters = source.mChooserIntentFilters;
+ }
+ if (source.mChooserComponentNames != null) {
+ mChooserComponentNames = source.mChooserComponentNames;
+ }
}
/**
@@ -690,6 +784,7 @@
switch (icon.getType()) {
case Icon.TYPE_RESOURCE:
case Icon.TYPE_BITMAP:
+ case Icon.TYPE_BITMAP_MASKABLE:
break; // OK
default:
throw getInvalidIconException();
@@ -741,6 +836,12 @@
private PersistableBundle mExtras;
+ private PersistableBundle mChooserExtras;
+
+ private List<IntentFilter> mChooserIntentFilters;
+
+ private List<ComponentName> mChooserComponentNames;
+
/**
* Old style constructor.
* @hide
@@ -815,8 +916,9 @@
* <p>Tints set with {@link Icon#setTint} or {@link Icon#setTintList} are not supported
* and will be ignored.
*
- * <p>Only icons created with {@link Icon#createWithBitmap(Bitmap)} and
- * {@link Icon#createWithResource} are supported.
+ * <p>Only icons created with {@link Icon#createWithBitmap(Bitmap)},
+ * {@link Icon#createWithMaskableBitmap(Bitmap)}
+ * and {@link Icon#createWithResource} are supported.
* Other types, such as URI-based icons, are not supported.
*
* @see LauncherApps#getShortcutIconDrawable(ShortcutInfo, int)
@@ -1026,6 +1128,40 @@
}
/**
+ * Extras that can be added which will be added to the Intent used to launch the app if
+ * launched from a chooser context.
+ */
+ @NonNull
+ public Builder setChooserExtras(@NonNull PersistableBundle extras) {
+ mChooserExtras = extras;
+ return this;
+ }
+
+ /**
+ * IntentFilters and the components that should resolve a match for a given chooser target.
+ * If multiple matches are found, the component corresponding to the closest match will be
+ * used.
+ *
+ * @param filter IntendFilter that if matched will have the intent forwarded to the given
+ * component
+ * @param name The component that an intent that passes this filter will resolve to.
+ */
+ public Builder addChooserIntentFilter(@NonNull IntentFilter filter,
+ @NonNull ComponentName name) {
+ Preconditions.checkNotNull(filter, "intent filter cannot be null");
+ Preconditions.checkNotNull(name, "component name cannot be null");
+
+ if (mChooserIntentFilters == null || mChooserComponentNames == null) {
+ mChooserIntentFilters = new ArrayList<>();
+ mChooserComponentNames = new ArrayList<>();
+ }
+
+ mChooserIntentFilters.add(filter);
+ mChooserComponentNames.add(name);
+ return this;
+ }
+
+ /**
* Creates a {@link ShortcutInfo} instance.
*/
@NonNull
@@ -1226,6 +1362,30 @@
}
/**
+ * Retrieve the extras that will be added in to any intent launched through the chooser.
+ */
+ @NonNull
+ public PersistableBundle getChooserExtras() {
+ return mChooserExtras;
+ }
+
+ /**
+ * Retrieve the list of intent filters for chooser targets.
+ */
+ @NonNull
+ public IntentFilter[] getChooserIntentFilters() {
+ return mChooserIntentFilters;
+ }
+
+ /**
+ * Retrieve the list of component names corresponding to the above intent filters.
+ */
+ @NonNull
+ public ComponentName[] getChooserComponentNames() {
+ return mChooserComponentNames;
+ }
+
+ /**
* "Rank" of a shortcut, which is a non-negative, sequential value that's unique for each
* {@link #getActivity} for each of the two types of shortcuts (static and dynamic).
*
@@ -1346,6 +1506,11 @@
return hasFlags(FLAG_PINNED);
}
+ /** Return whether a shortcut can be shown in the chooser. */
+ public boolean isChooser() {
+ return hasFlags(FLAG_CHOOSER);
+ }
+
/**
* Return whether a shortcut is static; that is, whether a shortcut is
* published from AndroidManifest.xml. If {@code true}, the shortcut is
@@ -1374,6 +1539,14 @@
return isPinned() && !(isDynamic() || isManifestShortcut());
}
+ /**
+ * @return true if pinned but neither static nor dynamic.
+ * @hide
+ */
+ public boolean isDynamicOrChooser() {
+ return hasFlags(FLAG_DYNAMIC) || hasFlags(FLAG_CHOOSER);
+ }
+
/** @hide */
public boolean isOriginallyFromManifest() {
return hasFlags(FLAG_IMMUTABLE);
@@ -1442,6 +1615,15 @@
}
/**
+ * Return whether a shortcut's icon is maskable.
+ *
+ * @hide internal/unit tests only
+ */
+ public boolean hasMaskableBitmap() {
+ return hasFlags(FLAG_MASKABLE_BITMAP);
+ }
+
+ /**
* Return whether a shortcut only contains "key" information only or not. If true, only the
* following fields are available.
* <ul>
@@ -1646,6 +1828,19 @@
mCategories.add(source.readString().intern());
}
}
+
+ // We put a placeholder empty array in to keep the parcelable order, but can do away with
+ // them at this point if they're empty.
+ mChooserComponentNames = source.readParcelableArray(cl, ComponentName.class);
+ if (mChooserComponentNames.length == 0) {
+ mChooserComponentNames = null;
+ }
+
+ mChooserIntentFilters = source.readParcelableArray(cl, IntentFilter.class);
+ if (mChooserIntentFilters.length == 0) {
+ mChooserIntentFilters = null;
+ }
+ mChooserExtras = source.readPersistableBundle(cl);
}
@Override
@@ -1692,6 +1887,17 @@
} else {
dest.writeInt(0);
}
+ if (mChooserComponentNames != null) {
+ dest.writeParcelableArray(mChooserComponentNames, flags);
+ } else {
+ dest.writeParcelableArray(new ComponentName[0], flags);
+ }
+ if (mChooserIntentFilters != null) {
+ dest.writeParcelableArray(mChooserIntentFilters, flags);
+ } else {
+ dest.writeParcelableArray(new IntentFilter[0], flags);
+ }
+ dest.writePersistableBundle(mChooserExtras);
}
public static final Creator<ShortcutInfo> CREATOR =
diff --git a/core/java/android/content/pm/ShortcutServiceInternal.java b/core/java/android/content/pm/ShortcutServiceInternal.java
index 87a6d4a..696fe81 100644
--- a/core/java/android/content/pm/ShortcutServiceInternal.java
+++ b/core/java/android/content/pm/ShortcutServiceInternal.java
@@ -44,8 +44,8 @@
getShortcuts(int launcherUserId,
@NonNull String callingPackage, long changedSince,
@Nullable String packageName, @Nullable List<String> shortcutIds,
- @Nullable ComponentName componentName, @ShortcutQuery.QueryFlags int flags,
- int userId);
+ @Nullable ComponentName componentName, @Nullable Intent intent,
+ @ShortcutQuery.QueryFlags int flags, int userId);
public abstract boolean
isPinnedByCaller(int launcherUserId, @NonNull String callingPackage,
diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java
index 37e32ff..4cf55ba 100644
--- a/core/java/android/content/res/AssetManager.java
+++ b/core/java/android/content/res/AssetManager.java
@@ -222,19 +222,21 @@
*/
final boolean getResourceValue(@AnyRes int resId, int densityDpi, @NonNull TypedValue outValue,
boolean resolveRefs) {
- final int block = loadResourceValue(resId, (short) densityDpi, outValue, resolveRefs);
- if (block < 0) {
- return false;
- }
+ synchronized (this) {
+ final int block = loadResourceValue(resId, (short) densityDpi, outValue, resolveRefs);
+ if (block < 0) {
+ return false;
+ }
- // Convert the changing configurations flags populated by native code.
- outValue.changingConfigurations = ActivityInfo.activityInfoConfigNativeToJava(
- outValue.changingConfigurations);
+ // Convert the changing configurations flags populated by native code.
+ outValue.changingConfigurations = ActivityInfo.activityInfoConfigNativeToJava(
+ outValue.changingConfigurations);
- if (outValue.type == TypedValue.TYPE_STRING) {
- outValue.string = mStringBlocks[block].get(outValue.data);
+ if (outValue.type == TypedValue.TYPE_STRING) {
+ outValue.string = mStringBlocks[block].get(outValue.data);
+ }
+ return true;
}
- return true;
}
/**
@@ -244,18 +246,20 @@
* @param resId the resource id of the string array
*/
final CharSequence[] getResourceTextArray(@ArrayRes int resId) {
- final int[] rawInfoArray = getArrayStringInfo(resId);
- final int rawInfoArrayLen = rawInfoArray.length;
- final int infoArrayLen = rawInfoArrayLen / 2;
- int block;
- int index;
- final CharSequence[] retArray = new CharSequence[infoArrayLen];
- for (int i = 0, j = 0; i < rawInfoArrayLen; i = i + 2, j++) {
- block = rawInfoArray[i];
- index = rawInfoArray[i + 1];
- retArray[j] = index >= 0 ? mStringBlocks[block].get(index) : null;
+ synchronized (this) {
+ final int[] rawInfoArray = getArrayStringInfo(resId);
+ final int rawInfoArrayLen = rawInfoArray.length;
+ final int infoArrayLen = rawInfoArrayLen / 2;
+ int block;
+ int index;
+ final CharSequence[] retArray = new CharSequence[infoArrayLen];
+ for (int i = 0, j = 0; i < rawInfoArrayLen; i = i + 2, j++) {
+ block = rawInfoArray[i];
+ index = rawInfoArray[i + 1];
+ retArray[j] = index >= 0 ? mStringBlocks[block].get(index) : null;
+ }
+ return retArray;
}
- return retArray;
}
/**
@@ -320,8 +324,10 @@
}
/*package*/ final CharSequence getPooledStringForCookie(int cookie, int id) {
- // Cookies map to string blocks starting at 1.
- return mStringBlocks[cookie - 1].get(id);
+ synchronized (this) {
+ // Cookies map to string blocks starting at 1.
+ return mStringBlocks[cookie - 1].get(id);
+ }
}
/**
diff --git a/core/java/android/content/res/ColorStateList.java b/core/java/android/content/res/ColorStateList.java
index 273522a..a46db06 100644
--- a/core/java/android/content/res/ColorStateList.java
+++ b/core/java/android/content/res/ColorStateList.java
@@ -508,8 +508,8 @@
}
/**
- * Indicates whether this color state list contains more than one state spec
- * and will change color based on state.
+ * Indicates whether this color state list contains at least one state spec
+ * and the first spec is not empty (e.g. match-all).
*
* @return True if this color state list changes color based on state, false
* otherwise.
@@ -517,7 +517,7 @@
*/
@Override
public boolean isStateful() {
- return mStateSpecs.length > 1;
+ return mStateSpecs.length >= 1 && mStateSpecs[0].length > 0;
}
/**
diff --git a/core/java/android/content/res/CompatResources.java b/core/java/android/content/res/CompatResources.java
new file mode 100644
index 0000000..15575fd
--- /dev/null
+++ b/core/java/android/content/res/CompatResources.java
@@ -0,0 +1,63 @@
+/*
+ * 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.content.res;
+
+import android.annotation.ColorRes;
+import android.annotation.DrawableRes;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * Version of resources generated for apps targeting <26.
+ * @hide
+ */
+public class CompatResources extends Resources {
+
+ private final WeakReference<Context> mContext;
+
+ public CompatResources(Resources base, Context context) {
+ super(base.getClassLoader());
+ setImpl(base.getImpl());
+ mContext = new WeakReference<>(context);
+ }
+
+ @Override
+ public Drawable getDrawable(@DrawableRes int id) throws NotFoundException {
+ return getDrawable(id, getTheme());
+ }
+
+ @Override
+ public Drawable getDrawableForDensity(@DrawableRes int id, int density)
+ throws NotFoundException {
+ return getDrawableForDensity(id, density, getTheme());
+ }
+
+ @Override
+ public int getColor(@ColorRes int id) throws NotFoundException {
+ return getColor(id, getTheme());
+ }
+
+ @Override
+ public ColorStateList getColorStateList(@ColorRes int id) throws NotFoundException {
+ return getColorStateList(id, getTheme());
+ }
+
+ private Theme getTheme() {
+ Context c = mContext.get();
+ return c != null ? c.getTheme() : null;
+ }
+}
diff --git a/core/java/android/hardware/HardwareBuffer.java b/core/java/android/hardware/HardwareBuffer.java
index e97bb2f..7b09e26 100644
--- a/core/java/android/hardware/HardwareBuffer.java
+++ b/core/java/android/hardware/HardwareBuffer.java
@@ -40,21 +40,24 @@
public final class HardwareBuffer implements Parcelable {
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef({RGBA_8888, RGBA_FP16, RGBX_8888, RGB_888, RGB_565, BLOB})
- public @interface Format {};
+ @IntDef({RGBA_8888, RGBA_FP16, RGBA_1010102, RGBX_8888, RGB_888, RGB_565, BLOB})
+ public @interface Format {
+ }
/** Format: 8 bits each red, green, blue, alpha */
- public static final int RGBA_8888 = 1;
+ public static final int RGBA_8888 = 1;
/** Format: 8 bits each red, green, blue, alpha, alpha is always 0xFF */
- public static final int RGBX_8888 = 2;
+ public static final int RGBX_8888 = 2;
/** Format: 8 bits each red, green, blue, no alpha */
- public static final int RGB_888 = 3;
+ public static final int RGB_888 = 3;
/** Format: 5 bits each red and blue, 6 bits green, no alpha */
- public static final int RGB_565 = 4;
+ public static final int RGB_565 = 4;
/** Format: 16 bits each red, green, blue, alpha */
- public static final int RGBA_FP16 = 0x16;
+ public static final int RGBA_FP16 = 0x16;
+ /** Format: 10 bits each red, green, blue, 2 bits alpha */
+ public static final int RGBA_1010102 = 0x2b;
/** Format: opaque format used for raw data transfer; must have a height of 1 */
- public static final int BLOB = 0x21;
+ public static final int BLOB = 0x21;
// Note: do not rename, this field is used by native code
private long mNativeObject;
@@ -107,7 +110,7 @@
* @param width The width in pixels of the buffer
* @param height The height in pixels of the buffer
* @param format The format of each pixel, one of {@link #RGBA_8888}, {@link #RGBA_FP16},
- * {@link #RGBX_8888}, {@link #RGB_565}, {@link #RGB_888}
+ * {@link #RGBX_8888}, {@link #RGB_565}, {@link #RGB_888}, {@link #RGBA_1010102}, {@link #BLOB}
* @param layers The number of layers in the buffer
* @param usage Flags describing how the buffer will be used, one of
* {@link #USAGE0_CPU_READ}, {@link #USAGE0_CPU_READ_OFTEN}, {@link #USAGE0_CPU_WRITE},
@@ -150,15 +153,15 @@
}
/**
- * Private use only. See {@link #create(int, int, int, int, int, long, long)}. May also be
+ * Private use only. See {@link #create(int, int, int, int, long)}. May also be
* called from JNI using an already allocated native <code>HardwareBuffer</code>.
*/
private HardwareBuffer(long nativeObject) {
mNativeObject = nativeObject;
- long nativeSize = NATIVE_HARDWARE_BUFFER_SIZE;
+ ClassLoader loader = HardwareBuffer.class.getClassLoader();
NativeAllocationRegistry registry = new NativeAllocationRegistry(
- HardwareBuffer.class.getClassLoader(), nGetNativeFinalizer(), nativeSize);
+ loader, nGetNativeFinalizer(), NATIVE_HARDWARE_BUFFER_SIZE);
mCleaner = registry.registerNativeAllocation(this, mNativeObject);
}
@@ -186,8 +189,9 @@
/**
* Returns the format of this buffer, one of {@link #RGBA_8888}, {@link #RGBA_FP16},
- * {@link #RGBX_8888}, {@link #RGB_565}, or {@link #RGB_888}.
+ * {@link #RGBX_8888}, {@link #RGB_565}, {@link #RGB_888}, {@link #RGBA_1010102}, {@link #BLOB}.
*/
+ @Format
public int getFormat() {
if (mNativeObject == 0) {
throw new IllegalStateException("This HardwareBuffer has been destroyed and its format "
@@ -291,12 +295,13 @@
* @param format The format to validate.
*
* @return True if <code>format</code> is a supported format. false otherwise.
- * See {@link #create(int, int, int, int, int, long, long)}.a
+ * See {@link #create(int, int, int, int, long)}.
*/
private static boolean isSupportedFormat(@Format int format) {
switch(format) {
case RGBA_8888:
case RGBA_FP16:
+ case RGBA_1010102:
case RGBX_8888:
case RGB_565:
case RGB_888:
diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
index 0e450d7..4d92ab1 100644
--- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
+++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
@@ -1097,7 +1097,6 @@
throws IllegalArgumentException;
private static native int nativeGetTypeFromTag(int tag)
throws IllegalArgumentException;
- private static native void nativeClassInit();
/**
* <p>Perform a 0-copy swap of the internal metadata with another object.</p>
@@ -1289,10 +1288,6 @@
}
static {
- /*
- * We use a class initializer to allow the native code to cache some field offsets
- */
- nativeClassInit();
registerAllMarshalers();
}
}
diff --git a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
index bb0a042..5423ca9 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
@@ -646,7 +646,7 @@
// Special case where the only scene mode listed is AUTO => no scene mode
if (sceneModes != null && sceneModes.size() == 1 &&
- sceneModes.get(0) == Parameters.SCENE_MODE_AUTO) {
+ sceneModes.get(0).equals(Parameters.SCENE_MODE_AUTO)) {
supportedSceneModes = null;
}
diff --git a/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableString.java b/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableString.java
index d2c3908..c81e18d 100644
--- a/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableString.java
+++ b/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableString.java
@@ -33,7 +33,9 @@
private static final String TAG = MarshalQueryableString.class.getSimpleName();
private static final boolean DEBUG = false;
- private static final Charset UTF8_CHARSET = Charset.forName("UTF-8");
+ private static class PreloadHolder {
+ public static final Charset UTF8_CHARSET = Charset.forName("UTF-8");
+ }
private static final byte NUL = (byte)'\0'; // used as string terminator
private class MarshalerString extends Marshaler<String> {
@@ -44,7 +46,7 @@
@Override
public void marshal(String value, ByteBuffer buffer) {
- byte[] arr = value.getBytes(UTF8_CHARSET);
+ byte[] arr = value.getBytes(PreloadHolder.UTF8_CHARSET);
buffer.put(arr);
buffer.put(NUL); // metadata strings are NUL-terminated
@@ -52,7 +54,7 @@
@Override
public int calculateMarshalSize(String value) {
- byte[] arr = value.getBytes(UTF8_CHARSET);
+ byte[] arr = value.getBytes(PreloadHolder.UTF8_CHARSET);
return arr.length + 1; // metadata strings are NUL-terminated
}
@@ -88,7 +90,7 @@
buffer.get(strBytes, /*dstOffset*/0, stringLength + 1); // including null character
// not including null character
- return new String(strBytes, /*offset*/0, stringLength, UTF8_CHARSET);
+ return new String(strBytes, /*offset*/0, stringLength, PreloadHolder.UTF8_CHARSET);
}
@Override
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index 33a9f5e..a529c2f 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -339,8 +339,7 @@
private Display getOrCreateDisplayLocked(int displayId, boolean assumeValid) {
Display display = mDisplays.get(displayId);
if (display == null) {
- display = mGlobal.getCompatibleDisplay(displayId,
- mContext.getDisplayAdjustments(displayId));
+ display = mGlobal.getCompatibleDisplay(displayId, mContext.getResources());
if (display != null) {
mDisplays.put(displayId, display);
}
diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java
index 826eb74..341754c 100644
--- a/core/java/android/hardware/display/DisplayManagerGlobal.java
+++ b/core/java/android/hardware/display/DisplayManagerGlobal.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.content.res.Configuration;
+import android.content.res.Resources;
import android.hardware.display.DisplayManager.DisplayListener;
import android.media.projection.MediaProjection;
import android.media.projection.IMediaProjection;
@@ -181,6 +182,24 @@
}
/**
+ * Gets information about a logical display.
+ *
+ * The display metrics may be adjusted to provide compatibility
+ * for legacy applications or limited screen areas.
+ *
+ * @param displayId The logical display id.
+ * @param resources Resources providing compatibility info.
+ * @return The display object, or null if there is no display with the given id.
+ */
+ public Display getCompatibleDisplay(int displayId, Resources resources) {
+ DisplayInfo displayInfo = getDisplayInfo(displayId);
+ if (displayInfo == null) {
+ return null;
+ }
+ return new Display(this, displayId, displayInfo, resources);
+ }
+
+ /**
* Gets information about a logical display without applying any compatibility metrics.
*
* @param displayId The logical display id.
diff --git a/core/java/android/inputmethodservice/IInputMethodWrapper.java b/core/java/android/inputmethodservice/IInputMethodWrapper.java
index 562f40b..765aff9 100644
--- a/core/java/android/inputmethodservice/IInputMethodWrapper.java
+++ b/core/java/android/inputmethodservice/IInputMethodWrapper.java
@@ -172,12 +172,7 @@
final InputConnection ic = inputContext != null
? new InputConnectionWrapper(mTarget, inputContext, missingMethods) : null;
info.makeCompatible(mTargetSdkVersion);
- if (restarting) {
- inputMethod.restartInput(ic, info);
- } else {
- inputMethod.startInput(ic, info);
- }
- inputMethod.dispatchStartInputWithToken(ic, info, true /* initial */,
+ inputMethod.dispatchStartInputWithToken(ic, info, restarting /* restarting */,
startInputToken);
args.recycle();
return;
diff --git a/core/java/android/inputmethodservice/KeyboardView.java b/core/java/android/inputmethodservice/KeyboardView.java
index d1000ad..13b9206 100644
--- a/core/java/android/inputmethodservice/KeyboardView.java
+++ b/core/java/android/inputmethodservice/KeyboardView.java
@@ -988,49 +988,31 @@
if (mAccessibilityManager.isEnabled()) {
AccessibilityEvent event = AccessibilityEvent.obtain(eventType);
onInitializeAccessibilityEvent(event);
- String text = null;
- // This is very efficient since the properties are cached.
- final boolean speakPassword = Settings.Secure.getIntForUser(
- mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 0,
- UserHandle.USER_CURRENT_OR_SELF) != 0;
- // Add text only if password announcement is enabled or if headset is
- // used to avoid leaking passwords.
- if (speakPassword || mAudioManager.isBluetoothA2dpOn()
- || mAudioManager.isWiredHeadsetOn()) {
- switch (code) {
- case Keyboard.KEYCODE_ALT:
- text = mContext.getString(R.string.keyboardview_keycode_alt);
- break;
- case Keyboard.KEYCODE_CANCEL:
- text = mContext.getString(R.string.keyboardview_keycode_cancel);
- break;
- case Keyboard.KEYCODE_DELETE:
- text = mContext.getString(R.string.keyboardview_keycode_delete);
- break;
- case Keyboard.KEYCODE_DONE:
- text = mContext.getString(R.string.keyboardview_keycode_done);
- break;
- case Keyboard.KEYCODE_MODE_CHANGE:
- text = mContext.getString(R.string.keyboardview_keycode_mode_change);
- break;
- case Keyboard.KEYCODE_SHIFT:
- text = mContext.getString(R.string.keyboardview_keycode_shift);
- break;
- case '\n':
- text = mContext.getString(R.string.keyboardview_keycode_enter);
- break;
- default:
- text = String.valueOf((char) code);
- }
- } else if (!mHeadsetRequiredToHearPasswordsAnnounced) {
- // We want the waring for required head set to be send with both the
- // hover enter and hover exit event, so set the flag after the exit.
- if (eventType == AccessibilityEvent.TYPE_VIEW_HOVER_EXIT) {
- mHeadsetRequiredToHearPasswordsAnnounced = true;
- }
- text = mContext.getString(R.string.keyboard_headset_required_to_hear_password);
- } else {
- text = mContext.getString(R.string.keyboard_password_character_no_headset);
+ final String text;
+ switch (code) {
+ case Keyboard.KEYCODE_ALT:
+ text = mContext.getString(R.string.keyboardview_keycode_alt);
+ break;
+ case Keyboard.KEYCODE_CANCEL:
+ text = mContext.getString(R.string.keyboardview_keycode_cancel);
+ break;
+ case Keyboard.KEYCODE_DELETE:
+ text = mContext.getString(R.string.keyboardview_keycode_delete);
+ break;
+ case Keyboard.KEYCODE_DONE:
+ text = mContext.getString(R.string.keyboardview_keycode_done);
+ break;
+ case Keyboard.KEYCODE_MODE_CHANGE:
+ text = mContext.getString(R.string.keyboardview_keycode_mode_change);
+ break;
+ case Keyboard.KEYCODE_SHIFT:
+ text = mContext.getString(R.string.keyboardview_keycode_shift);
+ break;
+ case '\n':
+ text = mContext.getString(R.string.keyboardview_keycode_enter);
+ break;
+ default:
+ text = String.valueOf((char) code);
}
event.getText().add(text);
mAccessibilityManager.sendAccessibilityEvent(event);
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index acb1d07..1259de6 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -1442,8 +1442,8 @@
l.networkCapabilities = netCap;
l.delay = delay;
l.expireSequenceNumber = 0;
- l.networkRequest = sendRequestForNetwork(netCap, l.networkCallback, 0,
- REQUEST, type);
+ l.networkRequest = sendRequestForNetwork(
+ netCap, l.networkCallback, 0, REQUEST, type, getDefaultHandler());
if (l.networkRequest == null) return null;
sLegacyRequests.put(netCap, l);
sendExpireMsgForFeature(netCap, l.expireSequenceNumber, delay);
@@ -1453,7 +1453,7 @@
private void sendExpireMsgForFeature(NetworkCapabilities netCap, int seqNum, int delay) {
if (delay >= 0) {
Log.d(TAG, "sending expire msg with seqNum " + seqNum + " and delay " + delay);
- CallbackHandler handler = getHandler();
+ CallbackHandler handler = getDefaultHandler();
Message msg = handler.obtainMessage(EXPIRE_LEGACY_REQUEST, seqNum, 0, netCap);
handler.sendMessageDelayed(msg, delay);
}
@@ -2780,6 +2780,10 @@
super(looper);
}
+ CallbackHandler(Handler handler) {
+ this(handler.getLooper());
+ }
+
@Override
public void handleMessage(Message message) {
NetworkRequest request = getObject(message, NetworkRequest.class);
@@ -2889,7 +2893,7 @@
}
}
- private CallbackHandler getHandler() {
+ private CallbackHandler getDefaultHandler() {
synchronized (sCallbacks) {
if (sCallbackHandler == null) {
sCallbackHandler = new CallbackHandler(ConnectivityThread.getInstanceLooper());
@@ -2904,11 +2908,6 @@
private static final int LISTEN = 1;
private static final int REQUEST = 2;
- private NetworkRequest sendRequestForNetwork(NetworkCapabilities need,
- NetworkCallback callback, int timeoutMs, int action, int legacyType) {
- return sendRequestForNetwork(need, callback, timeoutMs, action, legacyType, getHandler());
- }
-
private NetworkRequest sendRequestForNetwork(NetworkCapabilities need, NetworkCallback callback,
int timeoutMs, int action, int legacyType, CallbackHandler handler) {
if (callback == null) {
@@ -2953,9 +2952,10 @@
* @hide
*/
public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback,
- int timeoutMs, int legacyType) {
- sendRequestForNetwork(request.networkCapabilities, networkCallback, timeoutMs, REQUEST,
- legacyType);
+ int timeoutMs, int legacyType, Handler handler) {
+ CallbackHandler cbHandler = new CallbackHandler(handler);
+ NetworkCapabilities nc = request.networkCapabilities;
+ sendRequestForNetwork(nc, networkCallback, timeoutMs, REQUEST, legacyType, cbHandler);
}
/**
@@ -2981,15 +2981,51 @@
* {@link android.provider.Settings.System#canWrite}.</p>
*
* @param request {@link NetworkRequest} describing this request.
- * @param networkCallback The {@link NetworkCallback} to be utilized for this
- * request. Note the callback must not be shared - they
- * uniquely specify this request.
+ * @param networkCallback The {@link NetworkCallback} to be utilized for this request. Note
+ * the callback must not be shared - it uniquely specifies this request.
+ * The callback is invoked on the default internal Handler.
* @throws IllegalArgumentException if {@code request} specifies any mutable
* {@code NetworkCapabilities}.
*/
public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback) {
- requestNetwork(request, networkCallback, 0,
- inferLegacyTypeForNetworkCapabilities(request.networkCapabilities));
+ requestNetwork(request, networkCallback, getDefaultHandler());
+ }
+
+ /**
+ * Request a network to satisfy a set of {@link android.net.NetworkCapabilities}.
+ *
+ * This {@link NetworkRequest} will live until released via
+ * {@link #unregisterNetworkCallback(NetworkCallback)} or the calling application exits.
+ * Status of the request can be followed by listening to the various
+ * callbacks described in {@link NetworkCallback}. The {@link Network}
+ * can be used to direct traffic to the network.
+ * <p>It is presently unsupported to request a network with mutable
+ * {@link NetworkCapabilities} such as
+ * {@link NetworkCapabilities#NET_CAPABILITY_VALIDATED} or
+ * {@link NetworkCapabilities#NET_CAPABILITY_CAPTIVE_PORTAL}
+ * as these {@code NetworkCapabilities} represent states that a particular
+ * network may never attain, and whether a network will attain these states
+ * is unknown prior to bringing up the network so the framework does not
+ * know how to go about satisfing a request with these capabilities.
+ *
+ * <p>This method requires the caller to hold either the
+ * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
+ * or the ability to modify system settings as determined by
+ * {@link android.provider.Settings.System#canWrite}.</p>
+ *
+ * @param request {@link NetworkRequest} describing this request.
+ * @param networkCallback The {@link NetworkCallback} to be utilized for this request. Note
+ * the callback must not be shared - it uniquely specifies this request.
+ * @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
+ * @throws IllegalArgumentException if {@code request} specifies any mutable
+ * {@code NetworkCapabilities}.
+ * @hide
+ */
+ public void requestNetwork(
+ NetworkRequest request, NetworkCallback networkCallback, Handler handler) {
+ int legacyType = inferLegacyTypeForNetworkCapabilities(request.networkCapabilities);
+ CallbackHandler cbHandler = new CallbackHandler(handler);
+ requestNetwork(request, networkCallback, 0, legacyType, cbHandler);
}
/**
@@ -2998,7 +3034,36 @@
*
* This function behaves identically to the non-timedout version, but if a suitable
* network is not found within the given time (in milliseconds) the
- * {@link NetworkCallback#unavailable} callback is called. The request must
+ * {@link NetworkCallback#onUnavailable()} callback is called. The request must
+ * still be released normally by calling {@link #unregisterNetworkCallback(NetworkCallback)}.
+ *
+ * <p>This method requires the caller to hold either the
+ * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
+ * or the ability to modify system settings as determined by
+ * {@link android.provider.Settings.System#canWrite}.</p>
+ *
+ * @param request {@link NetworkRequest} describing this request.
+ * @param networkCallback The {@link NetworkCallback} to be utilized for this request. Note
+ * the callback must not be shared - it uniquely specifies this request.
+ * The callback is invoked on the default internal Handler.
+ * @param timeoutMs The time in milliseconds to attempt looking for a suitable network
+ * before {@link NetworkCallback#onUnavailable()} is called.
+ * @hide
+ */
+ public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback,
+ int timeoutMs) {
+ int legacyType = inferLegacyTypeForNetworkCapabilities(request.networkCapabilities);
+ requestNetwork(request, networkCallback, timeoutMs, legacyType, getDefaultHandler());
+ }
+
+
+ /**
+ * Request a network to satisfy a set of {@link android.net.NetworkCapabilities}, limited
+ * by a timeout.
+ *
+ * This function behaves identically to the non-timedout version, but if a suitable
+ * network is not found within the given time (in milliseconds) the
+ * {@link NetworkCallback#onUnavailable} callback is called. The request must
* still be released normally by calling {@link unregisterNetworkCallback(NetworkCallback)}.
*
* <p>This method requires the caller to hold either the
@@ -3007,30 +3072,22 @@
* {@link android.provider.Settings.System#canWrite}.</p>
*
* @param request {@link NetworkRequest} describing this request.
- * @param networkCallback The callbacks to be utilized for this request. Note
- * the callbacks must not be shared - they uniquely specify
- * this request.
+ * @param networkCallback The {@link NetworkCallback} to be utilized for this request. Note
+ * the callback must not be shared - it uniquely specifies this request.
* @param timeoutMs The time in milliseconds to attempt looking for a suitable network
- * before {@link NetworkCallback#unavailable} is called.
- *
- * TODO: Make timeouts work and then unhide this method.
+ * before {@link NetworkCallback#onUnavailable} is called.
+ * @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
*
* @hide
*/
public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback,
- int timeoutMs) {
- requestNetwork(request, networkCallback, timeoutMs,
- inferLegacyTypeForNetworkCapabilities(request.networkCapabilities));
+ int timeoutMs, Handler handler) {
+ int legacyType = inferLegacyTypeForNetworkCapabilities(request.networkCapabilities);
+ CallbackHandler cbHandler = new CallbackHandler(handler);
+ requestNetwork(request, networkCallback, timeoutMs, legacyType, cbHandler);
}
/**
- * The maximum number of milliseconds the framework will look for a suitable network
- * during a timeout-equiped call to {@link requestNetwork}.
- * {@hide}
- */
- public final static int MAX_NETWORK_REQUEST_TIMEOUT_MS = 100 * 60 * 1000;
-
- /**
* The lookup key for a {@link Network} object included with the intent after
* successfully finding a network for the applications request. Retrieve it with
* {@link android.content.Intent#getParcelableExtra(String)}.
@@ -3141,9 +3198,30 @@
* @param request {@link NetworkRequest} describing this request.
* @param networkCallback The {@link NetworkCallback} that the system will call as suitable
* networks change state.
+ * The callback is invoked on the default internal Handler.
*/
public void registerNetworkCallback(NetworkRequest request, NetworkCallback networkCallback) {
- sendRequestForNetwork(request.networkCapabilities, networkCallback, 0, LISTEN, TYPE_NONE);
+ registerNetworkCallback(request, networkCallback, getDefaultHandler());
+ }
+
+ /**
+ * Registers to receive notifications about all networks which satisfy the given
+ * {@link NetworkRequest}. The callbacks will continue to be called until
+ * either the application exits or link #unregisterNetworkCallback(NetworkCallback)} is called.
+ * <p>This method requires the caller to hold the permission
+ * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
+ *
+ * @param request {@link NetworkRequest} describing this request.
+ * @param networkCallback The {@link NetworkCallback} that the system will call as suitable
+ * networks change state.
+ * @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
+ * @hide
+ */
+ public void registerNetworkCallback(
+ NetworkRequest request, NetworkCallback networkCallback, Handler handler) {
+ CallbackHandler cbHandler = new CallbackHandler(handler);
+ NetworkCapabilities nc = request.networkCapabilities;
+ sendRequestForNetwork(nc, networkCallback, 0, LISTEN, TYPE_NONE, cbHandler);
}
/**
@@ -3195,8 +3273,25 @@
*
* @param networkCallback The {@link NetworkCallback} that the system will call as the
* system default network changes.
+ * The callback is invoked on the default internal Handler.
*/
public void registerDefaultNetworkCallback(NetworkCallback networkCallback) {
+ registerDefaultNetworkCallback(networkCallback, getDefaultHandler());
+ }
+
+ /**
+ * Registers to receive notifications about changes in the system default network. The callbacks
+ * will continue to be called until either the application exits or
+ * {@link #unregisterNetworkCallback(NetworkCallback)} is called.
+ * <p>This method requires the caller to hold the permission
+ * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
+ *
+ * @param networkCallback The {@link NetworkCallback} that the system will call as the
+ * system default network changes.
+ * @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
+ * @hide
+ */
+ public void registerDefaultNetworkCallback(NetworkCallback networkCallback, Handler handler) {
// This works because if the NetworkCapabilities are null,
// ConnectivityService takes them from the default request.
//
@@ -3204,7 +3299,8 @@
// capabilities, this request is guaranteed, at all times, to be
// satisfied by the same network, if any, that satisfies the default
// request, i.e., the system default network.
- sendRequestForNetwork(null, networkCallback, 0, REQUEST, TYPE_NONE);
+ CallbackHandler cbHandler = new CallbackHandler(handler);
+ sendRequestForNetwork(null, networkCallback, 0, REQUEST, TYPE_NONE, cbHandler);
}
/**
diff --git a/core/java/android/net/ConnectivityMetricsEvent.aidl b/core/java/android/net/ConnectivityMetricsEvent.aidl
index a027d7c..1c541dc 100644
--- a/core/java/android/net/ConnectivityMetricsEvent.aidl
+++ b/core/java/android/net/ConnectivityMetricsEvent.aidl
@@ -16,5 +16,5 @@
package android.net;
+/** {@hide} */
parcelable ConnectivityMetricsEvent;
-parcelable ConnectivityMetricsEvent.Reference;
diff --git a/core/java/android/net/ConnectivityMetricsEvent.java b/core/java/android/net/ConnectivityMetricsEvent.java
index eaaef7f..6fdc739 100644
--- a/core/java/android/net/ConnectivityMetricsEvent.java
+++ b/core/java/android/net/ConnectivityMetricsEvent.java
@@ -16,12 +16,10 @@
package android.net;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
/** {@hide} */
-@SystemApi
public final class ConnectivityMetricsEvent implements Parcelable {
/** The time when this event was collected, as returned by System.currentTimeMillis(). */
@@ -67,7 +65,6 @@
return 0;
}
- /** Implement the Parcelable interface */
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(timestamp);
@@ -80,51 +77,4 @@
return String.format("ConnectivityMetricsEvent(%tT.%tL, %d, %d): %s",
timestamp, timestamp, componentTag, eventTag, data);
}
-
- /** {@hide} */
- @SystemApi
- public final static class Reference implements Parcelable {
-
- private long mValue;
-
- public Reference(long ref) {
- this.mValue = ref;
- }
-
- /** Implement the Parcelable interface */
- public static final Parcelable.Creator<Reference> CREATOR
- = new Parcelable.Creator<Reference> (){
- public Reference createFromParcel(Parcel source) {
- return new Reference(source.readLong());
- }
-
- public Reference[] newArray(int size) {
- return new Reference[size];
- }
- };
-
- /** Implement the Parcelable interface */
- @Override
- public int describeContents() {
- return 0;
- }
-
- /** Implement the Parcelable interface */
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeLong(mValue);
- }
-
- public void readFromParcel(Parcel in) {
- mValue = in.readLong();
- }
-
- public long getValue() {
- return mValue;
- }
-
- public void setValue(long val) {
- mValue = val;
- }
- }
}
diff --git a/core/java/android/net/ConnectivityMetricsLogger.java b/core/java/android/net/ConnectivityMetricsLogger.java
deleted file mode 100644
index 9a2d4e0..0000000
--- a/core/java/android/net/ConnectivityMetricsLogger.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * 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.
- */
-package android.net;
-
-import android.annotation.SystemApi;
-import android.app.PendingIntent;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-/** {@hide} */
-@SystemApi
-public class ConnectivityMetricsLogger {
- private static String TAG = "ConnectivityMetricsLogger";
- private static final boolean DBG = true;
-
- public static final String CONNECTIVITY_METRICS_LOGGER_SERVICE = "connectivity_metrics_logger";
-
- // Component Tags
- public static final int COMPONENT_TAG_CONNECTIVITY = 0;
- public static final int COMPONENT_TAG_BLUETOOTH = 1;
- public static final int COMPONENT_TAG_WIFI = 2;
- public static final int COMPONENT_TAG_TELECOM = 3;
- public static final int COMPONENT_TAG_TELEPHONY = 4;
- public static final int NUMBER_OF_COMPONENTS = 5;
-
- // Event Tag
- public static final int TAG_SKIPPED_EVENTS = -1;
-
- public static final String DATA_KEY_EVENTS_COUNT = "count";
-
- /** {@hide} */ protected IConnectivityMetricsLogger mService;
- /** {@hide} */ protected volatile long mServiceUnblockedTimestampMillis;
- private int mNumSkippedEvents;
-
- public ConnectivityMetricsLogger() {
- // TODO: consider not initializing mService in constructor
- this(IConnectivityMetricsLogger.Stub.asInterface(
- ServiceManager.getService(CONNECTIVITY_METRICS_LOGGER_SERVICE)));
- }
-
- /** {@hide} */
- @VisibleForTesting
- public ConnectivityMetricsLogger(IConnectivityMetricsLogger service) {
- mService = service;
- }
-
- /** {@hide} */
- protected boolean checkLoggerService() {
- if (mService != null) {
- return true;
- }
- // Two threads racing here will write the same pointer because getService
- // is idempotent once MetricsLoggerService is initialized.
- mService = IConnectivityMetricsLogger.Stub.asInterface(
- ServiceManager.getService(CONNECTIVITY_METRICS_LOGGER_SERVICE));
- return mService != null;
- }
-
- /**
- * Log a ConnectivityMetricsEvent.
- *
- * This method keeps track of skipped events when MetricsLoggerService throttles input events.
- * It skips logging when MetricsLoggerService is active. When throttling ends, it logs a
- * meta-event containing the number of events dropped. It is not safe to call this method
- * concurrently from different threads.
- *
- * @param timestamp is the epoch timestamp of the event in ms.
- * @param componentTag is the COMPONENT_* constant the event belongs to.
- * @param eventTag is an event type constant whose meaning is specific to the component tag.
- * @param data is a Parcelable instance representing the event.
- */
- public void logEvent(long timestamp, int componentTag, int eventTag, Parcelable data) {
- if (mService == null) {
- if (DBG) {
- Log.d(TAG, "logEvent(" + componentTag + "," + eventTag + ") Service not ready");
- }
- return;
- }
-
- if (mServiceUnblockedTimestampMillis > 0) {
- if (System.currentTimeMillis() < mServiceUnblockedTimestampMillis) {
- // Service is throttling events.
- // Don't send new events because they will be dropped.
- mNumSkippedEvents++;
- return;
- }
- }
-
- ConnectivityMetricsEvent skippedEventsEvent = null;
- if (mNumSkippedEvents > 0) {
- // Log number of skipped events
- Bundle b = new Bundle();
- b.putInt(DATA_KEY_EVENTS_COUNT, mNumSkippedEvents);
-
- // Log the skipped event.
- // TODO: Note that some of the clients push all states events into the server,
- // If we lose some states logged here, we might mess up the statistics happened at the
- // backend. One of the options is to introduce a non-skippable flag for important events
- // that are logged.
- skippedEventsEvent = new ConnectivityMetricsEvent(mServiceUnblockedTimestampMillis,
- componentTag, TAG_SKIPPED_EVENTS, b);
-
- mServiceUnblockedTimestampMillis = 0;
- }
-
- ConnectivityMetricsEvent event = new ConnectivityMetricsEvent(timestamp, componentTag,
- eventTag, data);
-
- try {
- long result;
- if (skippedEventsEvent == null) {
- result = mService.logEvent(event);
- } else {
- result = mService.logEvents(new ConnectivityMetricsEvent[]
- {skippedEventsEvent, event});
- }
-
- if (result == 0) {
- mNumSkippedEvents = 0;
- } else {
- mNumSkippedEvents++;
- if (result > 0) { // events are throttled
- mServiceUnblockedTimestampMillis = result;
- }
- }
- } catch (RemoteException e) {
- Log.e(TAG, "Error logging event", e);
- }
- }
-
- /**
- * Retrieve events
- *
- * @param reference of the last event previously returned. The function will return
- * events following it.
- * If 0 then all events will be returned.
- * After the function call it will contain reference of the
- * last returned event.
- * @return events
- */
- public ConnectivityMetricsEvent[] getEvents(ConnectivityMetricsEvent.Reference reference) {
- try {
- return mService.getEvents(reference);
- } catch (RemoteException e) {
- Log.e(TAG, "IConnectivityMetricsLogger.getEvents", e);
- return null;
- }
- }
-
- /**
- * Register PendingIntent which will be sent when new events are ready to be retrieved.
- */
- public boolean register(PendingIntent newEventsIntent) {
- try {
- return mService.register(newEventsIntent);
- } catch (RemoteException e) {
- Log.e(TAG, "IConnectivityMetricsLogger.register", e);
- return false;
- }
- }
-
- public boolean unregister(PendingIntent newEventsIntent) {
- try {
- mService.unregister(newEventsIntent);
- return true;
- } catch (RemoteException e) {
- Log.e(TAG, "IConnectivityMetricsLogger.unregister", e);
- return false;
- }
- }
-}
diff --git a/core/java/android/net/IConnectivityMetricsLogger.aidl b/core/java/android/net/IConnectivityMetricsLogger.aidl
deleted file mode 100644
index a83a019..0000000
--- a/core/java/android/net/IConnectivityMetricsLogger.aidl
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.
- */
-
-package android.net;
-
-import android.app.PendingIntent;
-import android.net.ConnectivityMetricsEvent;
-
-/** {@hide} */
-interface IConnectivityMetricsLogger {
-
- /**
- * @return 0 on success
- * <0 if error happened
- * >0 timestamp after which new events will be accepted
- */
- long logEvent(in ConnectivityMetricsEvent event);
- long logEvents(in ConnectivityMetricsEvent[] events);
-
- /**
- * @param reference of the last event previously returned. The function will return
- * events following it.
- * If 0 then all events will be returned.
- * After the function call it will contain reference of the last event.
- */
- ConnectivityMetricsEvent[] getEvents(inout ConnectivityMetricsEvent.Reference reference);
-
- boolean register(in PendingIntent newEventsIntent);
- void unregister(in PendingIntent newEventsIntent);
-}
diff --git a/core/java/android/net/INetworkScoreService.aidl b/core/java/android/net/INetworkScoreService.aidl
index f249daf..362ea9d 100644
--- a/core/java/android/net/INetworkScoreService.aidl
+++ b/core/java/android/net/INetworkScoreService.aidl
@@ -18,7 +18,7 @@
import android.net.INetworkScoreCache;
import android.net.NetworkKey;
-import android.net.NetworkScorerAppManager;
+import android.net.NetworkScorerAppData;
import android.net.RecommendationRequest;
import android.net.RecommendationResult;
import android.net.ScoredNetwork;
@@ -135,11 +135,11 @@
/**
* Returns metadata about the active scorer or <code>null</code> if there is no active scorer.
*/
- NetworkScorerAppManager.NetworkScorerAppData getActiveScorer();
+ NetworkScorerAppData getActiveScorer();
/**
* Returns the list of available scorer apps. The list will be empty if there are
* no valid scorers.
*/
- List<NetworkScorerAppManager.NetworkScorerAppData> getAllValidScorers();
+ List<NetworkScorerAppData> getAllValidScorers();
}
diff --git a/core/java/android/net/NetworkBadging.java b/core/java/android/net/NetworkBadging.java
index 5cf2f96..4409d0a 100644
--- a/core/java/android/net/NetworkBadging.java
+++ b/core/java/android/net/NetworkBadging.java
@@ -17,6 +17,7 @@
package android.net;
import android.annotation.DrawableRes;
+import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -25,19 +26,29 @@
import android.content.res.Resources.Theme;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
-import android.net.ScoredNetwork.Badging;
import android.net.wifi.WifiManager;
import android.view.View;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* Utility methods for working with network badging.
*
- * TODO: move ScoredNetwork.Badging and related constants to this class.
- *
* @hide
*/
@SystemApi
public class NetworkBadging {
+
+ @IntDef({BADGING_NONE, BADGING_SD, BADGING_HD, BADGING_4K})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Badging {}
+
+ public static final int BADGING_NONE = 0;
+ public static final int BADGING_SD = 10;
+ public static final int BADGING_HD = 20;
+ public static final int BADGING_4K = 30;
+
private NetworkBadging() {}
/**
@@ -55,7 +66,7 @@
@NonNull public static Drawable getWifiIcon(
@IntRange(from=0, to=4) int signalLevel, @Badging int badging, @Nullable Theme theme) {
Resources resources = Resources.getSystem();
- if (badging == ScoredNetwork.BADGING_NONE) {
+ if (badging == BADGING_NONE) {
return resources.getDrawable(getWifiSignalResource(signalLevel), theme);
}
Drawable[] layers = new Drawable[] {
@@ -131,19 +142,19 @@
*
* @param badging {@see ScoredNetwork#Badging} from {@link ScoredNetwork#calculateBadge(int)}.
* @return the @DrawableRes for the icon or {@link View#NO_ID} for
- * {@link ScoredNetwork#BADGING_NONE}
+ * {@link NetworkBadging#BADGING_NONE}
* @throws IllegalArgumentException for an invalid badging value.
* @hide
*/
@DrawableRes private static int getWifiBadgeResource(@Badging int badging) {
switch (badging) {
- case ScoredNetwork.BADGING_NONE:
+ case BADGING_NONE:
return View.NO_ID;
- case ScoredNetwork.BADGING_SD:
+ case BADGING_SD:
return com.android.internal.R.drawable.ic_signal_wifi_badged_sd;
- case ScoredNetwork.BADGING_HD:
+ case BADGING_HD:
return com.android.internal.R.drawable.ic_signal_wifi_badged_hd;
- case ScoredNetwork.BADGING_4K:
+ case BADGING_4K:
return com.android.internal.R.drawable.ic_signal_wifi_badged_4k;
default:
throw new IllegalArgumentException("No resource found for badge: " + badging);
diff --git a/core/java/android/net/NetworkKey.java b/core/java/android/net/NetworkKey.java
index e5f0bf0..31a74dc 100644
--- a/core/java/android/net/NetworkKey.java
+++ b/core/java/android/net/NetworkKey.java
@@ -24,6 +24,7 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
+import android.util.Log;
import java.util.Objects;
@@ -41,6 +42,8 @@
// etc.) so that clients can pull out these details depending on the type of network.
public class NetworkKey implements Parcelable {
+ private static final String TAG = "NetworkKey";
+
/** A wifi network, for which {@link #wifiKey} will be populated. */
public static final int TYPE_WIFI = 1;
@@ -59,13 +62,28 @@
/**
* Constructs a new NetworkKey for the given wifi {@link ScanResult}.
*
- * @throws IllegalArgumentException if the given ScanResult is malformed
+ * @return A new {@link NetworkKey} instance or <code>null</code> if the given
+ * {@link ScanResult} instance is malformed.
* @hide
*/
- public static NetworkKey createFromScanResult(ScanResult result) {
- return new NetworkKey(
- new WifiKey(
- '"' + result.wifiSsid.toString() + '"', result.BSSID));
+ @Nullable
+ public static NetworkKey createFromScanResult(@Nullable ScanResult result) {
+ if (result != null && result.wifiSsid != null) {
+ final String ssid = result.wifiSsid.toString();
+ final String bssid = result.BSSID;
+ if (!TextUtils.isEmpty(ssid) && !ssid.equals(WifiSsid.NONE)
+ && !TextUtils.isEmpty(bssid)) {
+ WifiKey wifiKey;
+ try {
+ wifiKey = new WifiKey(String.format("\"%s\"", ssid), bssid);
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Unable to create WifiKey.", e);
+ return null;
+ }
+ return new NetworkKey(wifiKey);
+ }
+ }
+ return null;
}
/**
@@ -83,7 +101,14 @@
final String bssid = wifiInfo.getBSSID();
if (!TextUtils.isEmpty(ssid) && !ssid.equals(WifiSsid.NONE)
&& !TextUtils.isEmpty(bssid)) {
- return new NetworkKey(new WifiKey(ssid, bssid));
+ WifiKey wifiKey;
+ try {
+ wifiKey = new WifiKey(ssid, bssid);
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Unable to create WifiKey.", e);
+ return null;
+ }
+ return new NetworkKey(wifiKey);
}
}
return null;
diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java
index 4b184f1..1b715af 100644
--- a/core/java/android/net/NetworkPolicyManager.java
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -19,7 +19,6 @@
import static android.content.pm.PackageManager.GET_SIGNATURES;
import static android.net.NetworkPolicy.CYCLE_NONE;
-import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -66,8 +65,6 @@
*
* See network-policy-restrictions.md for more info.
*/
- /** Not a valid rule */
- public static final int RULE_INVALID = -1;
/** No specific rule was set */
public static final int RULE_NONE = 0;
/** Allow traffic on metered networks. */
@@ -363,8 +360,6 @@
final StringBuilder string = new StringBuilder().append(uidRules).append(" (");
if (uidRules == RULE_NONE) {
string.append("NONE");
- } else if (uidRules == RULE_INVALID) {
- string.append("INVALID");
} else {
string.append(DebugUtils.flagsToString(NetworkPolicyManager.class, "RULE_", uidRules));
}
@@ -386,25 +381,4 @@
string.append(")");
return string.toString();
}
-
- /**
- * @hide
- */
- public static boolean isProcStateAllowedWhileIdleOrPowerSaveMode(int procState) {
- return procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
- }
-
- /**
- * @hide
- */
- public static boolean isProcStateAllowedWhileRestrictBackgroundOn(int procState) {
- return procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
- }
-
- /**
- * @hide
- */
- public interface UidStateWithSeqObserver {
- void onUidStateChangedWithSeq(int uid, int procState, long seq);
- }
}
diff --git a/core/java/android/net/NetworkRecommendationProvider.java b/core/java/android/net/NetworkRecommendationProvider.java
index 8395864..271b0a7 100644
--- a/core/java/android/net/NetworkRecommendationProvider.java
+++ b/core/java/android/net/NetworkRecommendationProvider.java
@@ -1,6 +1,8 @@
package android.net;
+import android.Manifest.permission;
import android.annotation.SystemApi;
+import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
@@ -10,8 +12,10 @@
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.Preconditions;
import java.util.Objects;
+import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;
/**
@@ -32,6 +36,7 @@
/**
* Constructs a new instance.
* @param handler indicates which thread to use when handling requests. Cannot be {@code null}.
+ * @deprecated use {@link #NetworkRecommendationProvider(Context, Executor)}
*/
public NetworkRecommendationProvider(Handler handler) {
if (handler == null) {
@@ -41,6 +46,17 @@
}
/**
+ * Constructs a new instance.
+ * @param context the current context instance. Cannot be {@code null}.
+ * @param executor used to execute the incoming requests. Cannot be {@code null}.
+ */
+ public NetworkRecommendationProvider(Context context, Executor executor) {
+ Preconditions.checkNotNull(context);
+ Preconditions.checkNotNull(executor);
+ mService = new ServiceWrapper(context, executor);
+ }
+
+ /**
* Invoked when a recommendation has been requested.
*
* @param request a {@link RecommendationRequest} instance containing additional
@@ -130,17 +146,28 @@
* A wrapper around INetworkRecommendationProvider that dispatches to the provided Handler.
*/
private final class ServiceWrapper extends INetworkRecommendationProvider.Stub {
+ private final Context mContext;
+ private final Executor mExecutor;
private final Handler mHandler;
ServiceWrapper(Handler handler) {
mHandler = handler;
+ mExecutor = null;
+ mContext = null;
+ }
+
+ ServiceWrapper(Context context, Executor executor) {
+ mContext = context;
+ mExecutor = executor;
+ mHandler = null;
}
@Override
public void requestRecommendation(final RecommendationRequest request,
final IRemoteCallback callback, final int sequence) throws RemoteException {
+ enforceCallingPermission();
if (VERBOSE) Log.v(TAG, "requestRecommendation(seq=" + sequence + ")");
- mHandler.post(new Runnable() {
+ execute(new Runnable() {
@Override
public void run() {
if (VERBOSE) {
@@ -154,8 +181,9 @@
@Override
public void requestScores(final NetworkKey[] networks) throws RemoteException {
+ enforceCallingPermission();
if (networks != null && networks.length > 0) {
- mHandler.post(new Runnable() {
+ execute(new Runnable() {
@Override
public void run() {
onRequestScores(networks);
@@ -163,5 +191,20 @@
});
}
}
+
+ private void execute(Runnable command) {
+ if (mExecutor != null) {
+ mExecutor.execute(command);
+ } else {
+ mHandler.post(command);
+ }
+ }
+
+ private void enforceCallingPermission() {
+ if (mContext != null) {
+ mContext.enforceCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES,
+ "Permission denied.");
+ }
+ }
}
}
diff --git a/core/java/android/net/NetworkScoreManager.java b/core/java/android/net/NetworkScoreManager.java
index 8f3af66..815d480 100644
--- a/core/java/android/net/NetworkScoreManager.java
+++ b/core/java/android/net/NetworkScoreManager.java
@@ -18,7 +18,6 @@
import static android.net.NetworkRecommendationProvider.EXTRA_RECOMMENDATION_RESULT;
-import android.Manifest;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -26,7 +25,6 @@
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
import android.content.Context;
-import android.net.NetworkScorerAppManager.NetworkScorerAppData;
import android.os.Bundle;
import android.os.Handler;
import android.os.RemoteCallback;
@@ -96,17 +94,24 @@
public static final String EXTRA_NETWORKS_TO_SCORE = "networksToScore";
/**
- * Activity action: launch a custom activity for configuring a scorer before enabling it.
- * Scorer applications may choose to specify an activity for this action, in which case the
- * framework will launch that activity which should return RESULT_OK if scoring was enabled.
- *
- * <p>If no activity is included in a scorer which implements this action, the system dialog for
- * selecting a scorer will be shown instead.
+ * Activity action: launch an activity for configuring a provider for the feature that connects
+ * and secures open wifi networks available before enabling it. Applications that enable this
+ * feature must provide an activity for this action. The framework will launch this activity
+ * which must return RESULT_OK if the feature should be enabled.
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_CUSTOM_ENABLE = "android.net.scoring.CUSTOM_ENABLE";
/**
+ * Meta-data specified on a {@link NetworkRecommendationProvider} that specified the package
+ * name of the application that connects and secures open wifi networks automatically. The
+ * specified package must provide an Activity for {@link #ACTION_CUSTOM_ENABLE}.
+ * @hide
+ */
+ public static final String USE_OPEN_WIFI_PACKAGE_META_DATA =
+ "android.net.wifi.use_open_wifi_package";
+
+ /**
* Broadcast action: the active scorer has been changed. Scorer apps may listen to this to
* perform initialization once selected as the active scorer, or clean up unneeded resources
* if another scorer has been selected. This is an explicit broadcast only sent to the
diff --git a/core/java/android/net/NetworkScorerAppManager.aidl b/core/java/android/net/NetworkScorerAppData.aidl
similarity index 91%
rename from core/java/android/net/NetworkScorerAppManager.aidl
rename to core/java/android/net/NetworkScorerAppData.aidl
index d968343..ee7f1d1 100644
--- a/core/java/android/net/NetworkScorerAppManager.aidl
+++ b/core/java/android/net/NetworkScorerAppData.aidl
@@ -16,4 +16,4 @@
package android.net;
-parcelable NetworkScorerAppManager.NetworkScorerAppData;
+parcelable NetworkScorerAppData;
diff --git a/core/java/android/net/NetworkScorerAppData.java b/core/java/android/net/NetworkScorerAppData.java
new file mode 100644
index 0000000..fca0a2e
--- /dev/null
+++ b/core/java/android/net/NetworkScorerAppData.java
@@ -0,0 +1,99 @@
+package android.net;
+
+import android.annotation.Nullable;
+import android.content.ComponentName;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Objects;
+
+/**
+ * Holds metadata about a discovered network scorer/recommendation application.
+ *
+ * @hide
+ */
+public final class NetworkScorerAppData implements Parcelable {
+ /** UID of the scorer app. */
+ public final int packageUid;
+ private final ComponentName mRecommendationService;
+ /**
+ * The {@link ComponentName} of the Activity to start before enabling the "connect to open
+ * wifi networks automatically" feature.
+ */
+ private final ComponentName mEnableUseOpenWifiActivity;
+
+ public NetworkScorerAppData(int packageUid, ComponentName recommendationServiceComp,
+ ComponentName enableUseOpenWifiActivity) {
+ this.packageUid = packageUid;
+ this.mRecommendationService = recommendationServiceComp;
+ this.mEnableUseOpenWifiActivity = enableUseOpenWifiActivity;
+ }
+
+ protected NetworkScorerAppData(Parcel in) {
+ packageUid = in.readInt();
+ mRecommendationService = ComponentName.readFromParcel(in);
+ mEnableUseOpenWifiActivity = ComponentName.readFromParcel(in);
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(packageUid);
+ ComponentName.writeToParcel(mRecommendationService, dest);
+ ComponentName.writeToParcel(mEnableUseOpenWifiActivity, dest);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Creator<NetworkScorerAppData> CREATOR =
+ new Creator<NetworkScorerAppData>() {
+ @Override
+ public NetworkScorerAppData createFromParcel(Parcel in) {
+ return new NetworkScorerAppData(in);
+ }
+
+ @Override
+ public NetworkScorerAppData[] newArray(int size) {
+ return new NetworkScorerAppData[size];
+ }
+ };
+
+ public String getRecommendationServicePackageName() {
+ return mRecommendationService.getPackageName();
+ }
+
+ public ComponentName getRecommendationServiceComponent() {
+ return mRecommendationService;
+ }
+
+ @Nullable
+ public ComponentName getEnableUseOpenWifiActivity() {
+ return mEnableUseOpenWifiActivity;
+ }
+
+ @Override
+ public String toString() {
+ return "NetworkScorerAppData{" +
+ "packageUid=" + packageUid +
+ ", mRecommendationService=" + mRecommendationService +
+ ", mEnableUseOpenWifiActivity=" + mEnableUseOpenWifiActivity +
+ '}';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ NetworkScorerAppData that = (NetworkScorerAppData) o;
+ return packageUid == that.packageUid &&
+ Objects.equals(mRecommendationService, that.mRecommendationService) &&
+ Objects.equals(mEnableUseOpenWifiActivity, that.mEnableUseOpenWifiActivity);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(packageUid, mRecommendationService, mEnableUseOpenWifiActivity);
+ }
+}
diff --git a/core/java/android/net/NetworkScorerAppManager.java b/core/java/android/net/NetworkScorerAppManager.java
deleted file mode 100644
index a166c7f..0000000
--- a/core/java/android/net/NetworkScorerAppManager.java
+++ /dev/null
@@ -1,285 +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 android.net;
-
-import android.Manifest.permission;
-import android.annotation.Nullable;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.internal.R;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Internal class for discovering and managing the network scorer/recommendation application.
- *
- * @hide
- */
-public class NetworkScorerAppManager {
- private static final String TAG = "NetworkScorerAppManager";
- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
- private final Context mContext;
-
- public NetworkScorerAppManager(Context context) {
- mContext = context;
- }
-
- /**
- * Holds metadata about a discovered network scorer/recommendation application.
- */
- public static final class NetworkScorerAppData implements Parcelable {
- /** UID of the scorer app. */
- public final int packageUid;
- private final ComponentName mRecommendationService;
-
- public NetworkScorerAppData(int packageUid, ComponentName recommendationServiceComp) {
- this.packageUid = packageUid;
- this.mRecommendationService = recommendationServiceComp;
- }
-
- protected NetworkScorerAppData(Parcel in) {
- packageUid = in.readInt();
- mRecommendationService = ComponentName.readFromParcel(in);
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(packageUid);
- ComponentName.writeToParcel(mRecommendationService, dest);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- public static final Creator<NetworkScorerAppData> CREATOR =
- new Creator<NetworkScorerAppData>() {
- @Override
- public NetworkScorerAppData createFromParcel(Parcel in) {
- return new NetworkScorerAppData(in);
- }
-
- @Override
- public NetworkScorerAppData[] newArray(int size) {
- return new NetworkScorerAppData[size];
- }
- };
-
- public String getRecommendationServicePackageName() {
- return mRecommendationService.getPackageName();
- }
-
- public ComponentName getRecommendationServiceComponent() {
- return mRecommendationService;
- }
-
- @Override
- public String toString() {
- return "NetworkScorerAppData{" +
- "packageUid=" + packageUid +
- ", mRecommendationService=" + mRecommendationService +
- '}';
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- NetworkScorerAppData that = (NetworkScorerAppData) o;
- return packageUid == that.packageUid &&
- Objects.equals(mRecommendationService, that.mRecommendationService);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(packageUid, mRecommendationService);
- }
- }
-
- /**
- * Returns the list of available scorer apps. The list will be empty if there are
- * no valid scorers.
- */
- public List<NetworkScorerAppData> getAllValidScorers() {
- return Collections.emptyList();
- }
-
- /**
- * @return A {@link NetworkScorerAppData} instance containing information about the
- * best configured network recommendation provider installed or {@code null}
- * if none of the configured packages can recommend networks.
- *
- * <p>A network recommendation provider is any application which:
- * <ul>
- * <li>Is listed in the <code>config_networkRecommendationPackageNames</code> config.
- * <li>Declares the {@link android.Manifest.permission#SCORE_NETWORKS} permission.
- * <li>Includes a Service for {@link NetworkScoreManager#ACTION_RECOMMEND_NETWORKS}.
- * </ul>
- */
- public NetworkScorerAppData getNetworkRecommendationProviderData() {
- // Network recommendation apps can only run as the primary user right now.
- // http://b/23422763
- if (UserHandle.getCallingUserId() != UserHandle.USER_SYSTEM) {
- return null;
- }
-
- final List<String> potentialPkgs = getPotentialRecommendationProviderPackages();
- if (potentialPkgs.isEmpty()) {
- if (DEBUG) {
- Log.d(TAG, "No Network Recommendation Providers specified.");
- }
- return null;
- }
-
- for (int i = 0; i < potentialPkgs.size(); i++) {
- final String potentialPkg = potentialPkgs.get(i);
-
- // Look for the recommendation service class and required receiver.
- final ResolveInfo resolveServiceInfo = findRecommendationService(potentialPkg);
- if (resolveServiceInfo != null) {
- final ComponentName componentName =
- new ComponentName(potentialPkg, resolveServiceInfo.serviceInfo.name);
- return new NetworkScorerAppData(resolveServiceInfo.serviceInfo.applicationInfo.uid,
- componentName);
- } else {
- if (DEBUG) {
- Log.d(TAG, potentialPkg + " does not have the required components, skipping.");
- }
- }
- }
-
- // None of the configured packages are valid.
- return null;
- }
-
- /**
- * @return A priority order list of package names that have been granted the
- * permission needed for them to act as a network recommendation provider.
- * The packages in the returned list may not contain the other required
- * network recommendation provider components so additional checks are required
- * before making a package the network recommendation provider.
- */
- public List<String> getPotentialRecommendationProviderPackages() {
- final String[] packageArray = mContext.getResources().getStringArray(
- R.array.config_networkRecommendationPackageNames);
- if (packageArray == null || packageArray.length == 0) {
- if (DEBUG) {
- Log.d(TAG, "No Network Recommendation Providers specified.");
- }
- return Collections.emptyList();
- }
-
- if (VERBOSE) {
- Log.d(TAG, "Configured packages: " + TextUtils.join(", ", packageArray));
- }
-
- List<String> packages = new ArrayList<>();
- final PackageManager pm = mContext.getPackageManager();
- for (String potentialPkg : packageArray) {
- if (pm.checkPermission(permission.SCORE_NETWORKS, potentialPkg)
- == PackageManager.PERMISSION_GRANTED) {
- packages.add(potentialPkg);
- } else {
- if (DEBUG) {
- Log.d(TAG, potentialPkg + " has not been granted " + permission.SCORE_NETWORKS
- + ", skipping.");
- }
- }
- }
-
- return packages;
- }
-
- private ResolveInfo findRecommendationService(String packageName) {
- final PackageManager pm = mContext.getPackageManager();
- final int resolveFlags = 0;
-
- final Intent serviceIntent = new Intent(NetworkScoreManager.ACTION_RECOMMEND_NETWORKS);
- serviceIntent.setPackage(packageName);
- final ResolveInfo resolveServiceInfo =
- pm.resolveService(serviceIntent, resolveFlags);
-
- if (VERBOSE) {
- Log.d(TAG, "Resolved " + serviceIntent + " to " + resolveServiceInfo);
- }
-
- if (resolveServiceInfo != null && resolveServiceInfo.serviceInfo != null) {
- return resolveServiceInfo;
- }
-
- if (VERBOSE) {
- Log.v(TAG, packageName + " does not have a service for " + serviceIntent);
- }
- return null;
- }
-
- /**
- * Get the application to use for scoring networks.
- *
- * @return the scorer app info or null if scoring is disabled (including if no scorer was ever
- * selected) or if the previously-set scorer is no longer a valid scorer app (e.g. because
- * it was disabled or uninstalled).
- */
- @Nullable
- public NetworkScorerAppData getActiveScorer() {
- if (isNetworkRecommendationsDisabled()) {
- // If recommendations are disabled then there can't be an active scorer.
- return null;
- }
-
- // Otherwise return the recommendation provider (which may be null).
- return getNetworkRecommendationProviderData();
- }
-
- /**
- * Set the specified package as the default scorer application.
- *
- * <p>The caller must have permission to write to {@link android.provider.Settings.Global}.
- *
- * @param packageName the packageName of the new scorer to use. If null, scoring will be
- * disabled. Otherwise, the scorer will only be set if it is a valid scorer application.
- * @return true if the scorer was changed, or false if the package is not a valid scorer or
- * a valid network recommendation provider exists.
- * @deprecated Scorers are now selected from a configured list.
- */
- @Deprecated
- public boolean setActiveScorer(String packageName) {
- return false;
- }
-
- private boolean isNetworkRecommendationsDisabled() {
- final ContentResolver cr = mContext.getContentResolver();
- // A value of 1 indicates enabled.
- return Settings.Global.getInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0) != 1;
- }
-}
diff --git a/core/java/android/net/ScoredNetwork.java b/core/java/android/net/ScoredNetwork.java
index ba0a8b5..a664a8b 100644
--- a/core/java/android/net/ScoredNetwork.java
+++ b/core/java/android/net/ScoredNetwork.java
@@ -41,7 +41,7 @@
* Key used with the {@link #attributes} bundle to define the badging curve.
*
* <p>The badging curve is a {@link RssiCurve} used to map different RSSI values to {@link
- * Badging} enums.
+ * NetworkBadging.Badging} enums.
*/
public static final String ATTRIBUTES_KEY_BADGING_CURVE =
"android.net.attributes.key.BADGING_CURVE";
@@ -70,17 +70,31 @@
public static final String ATTRIBUTES_KEY_RANKING_SCORE_OFFSET =
"android.net.attributes.key.RANKING_SCORE_OFFSET";
+ /** A {@link NetworkKey} uniquely identifying this network. */
+ public final NetworkKey networkKey;
+
+ // TODO(b/35323372): Delete these once external references are switched.
+ /** @deprecated Use {@link NetworkBadging#Badging} instead. */
+ @Deprecated
@IntDef({BADGING_NONE, BADGING_SD, BADGING_HD, BADGING_4K})
@Retention(RetentionPolicy.SOURCE)
public @interface Badging {}
+ /** @deprecated Use {@link NetworkBadging#BADGING_NONE} instead. */
+ @Deprecated
public static final int BADGING_NONE = 0;
- public static final int BADGING_SD = 10;
- public static final int BADGING_HD = 20;
- public static final int BADGING_4K = 30;
- /** A {@link NetworkKey} uniquely identifying this network. */
- public final NetworkKey networkKey;
+ /** @deprecated Use {@link NetworkBadging#BADGING_SD} instead. */
+ @Deprecated
+ public static final int BADGING_SD = 10;
+
+ /** @deprecated Use {@link NetworkBadging#BADGING_HD} instead. */
+ @Deprecated
+ public static final int BADGING_HD = 20;
+
+ /** @deprecated Use {@link NetworkBadging#BADGING_4K} instead. */
+ @Deprecated
+ public static final int BADGING_4K = 30;
/**
* The {@link RssiCurve} representing the scores for this network based on the RSSI.
@@ -276,14 +290,14 @@
}
/**
- * Return the {@link Badging} enum for this network for the given RSSI, derived from the
+ * Return the {@link NetworkBadging.Badging} enum for this network for the given RSSI, derived from the
* badging curve.
*
* <p>If no badging curve is present, {@link #BADGE_NONE} will be returned.
*
* @param rssi The rssi level for which the badge should be calculated
*/
- @Badging
+ @NetworkBadging.Badging
public int calculateBadge(int rssi) {
if (attributes != null && attributes.containsKey(ATTRIBUTES_KEY_BADGING_CURVE)) {
RssiCurve badgingCurve =
@@ -291,7 +305,7 @@
return badgingCurve.lookupScore(rssi);
}
- return BADGING_NONE;
+ return NetworkBadging.BADGING_NONE;
}
public static final Parcelable.Creator<ScoredNetwork> CREATOR =
diff --git a/core/java/android/net/http/SslCertificate.java b/core/java/android/net/http/SslCertificate.java
index 2715af0..4c0f418 100644
--- a/core/java/android/net/http/SslCertificate.java
+++ b/core/java/android/net/http/SslCertificate.java
@@ -506,6 +506,6 @@
if (certificateDate == null) {
return "";
}
- return DateFormat.getDateFormat(context).format(certificateDate);
+ return DateFormat.getMediumDateFormat(context).format(certificateDate);
}
}
diff --git a/core/java/android/net/metrics/ApfProgramEvent.java b/core/java/android/net/metrics/ApfProgramEvent.java
index 258d8e1..c2795a2a 100644
--- a/core/java/android/net/metrics/ApfProgramEvent.java
+++ b/core/java/android/net/metrics/ApfProgramEvent.java
@@ -17,7 +17,6 @@
package android.net.metrics;
import android.annotation.IntDef;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -36,7 +35,6 @@
* the APF program in place with a new APF program.
* {@hide}
*/
-@SystemApi
public final class ApfProgramEvent implements Parcelable {
// Bitflag constants describing what an Apf program filters.
@@ -55,7 +53,6 @@
public final int programLength; // Length of the APF program in bytes
public final int flags; // Bitfield compound of FLAG_* constants
- /** {@hide} */
public ApfProgramEvent(
long lifetime, int filteredRas, int currentRas, int programLength, @Flags int flags) {
this.lifetime = lifetime;
@@ -105,7 +102,6 @@
}
};
- /** {@hide} */
public static @Flags int flagsFor(boolean hasIPv4, boolean multicastFilterOn) {
int bitfield = 0;
if (hasIPv4) {
diff --git a/core/java/android/net/metrics/ApfStats.java b/core/java/android/net/metrics/ApfStats.java
index 8451e53..f8d7fa9 100644
--- a/core/java/android/net/metrics/ApfStats.java
+++ b/core/java/android/net/metrics/ApfStats.java
@@ -16,7 +16,6 @@
package android.net.metrics;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -24,7 +23,6 @@
* An event logged for an interface with APF capabilities when its IpManager state machine exits.
* {@hide}
*/
-@SystemApi
public final class ApfStats implements Parcelable {
public final long durationMs; // time interval in milliseconds these stastistics covers
@@ -36,7 +34,6 @@
public final int programUpdates; // number of APF program updates
public final int maxProgramSize; // maximum APF program size advertised by hardware
- /** {@hide} */
public ApfStats(long durationMs, int receivedRas, int matchingRas, int droppedRas,
int zeroLifetimeRas, int parseErrors, int programUpdates, int maxProgramSize) {
this.durationMs = durationMs;
diff --git a/core/java/android/net/metrics/DefaultNetworkEvent.java b/core/java/android/net/metrics/DefaultNetworkEvent.java
index 9f0bad7..28cf42f 100644
--- a/core/java/android/net/metrics/DefaultNetworkEvent.java
+++ b/core/java/android/net/metrics/DefaultNetworkEvent.java
@@ -16,7 +16,6 @@
package android.net.metrics;
-import android.annotation.SystemApi;
import android.net.NetworkCapabilities;
import android.os.Parcel;
import android.os.Parcelable;
@@ -25,7 +24,6 @@
* An event recorded by ConnectivityService when there is a change in the default network.
* {@hide}
*/
-@SystemApi
public final class DefaultNetworkEvent implements Parcelable {
// The ID of the network that has become the new default or NETID_UNSET if none.
public final int netId;
@@ -38,7 +36,6 @@
public final boolean prevIPv4;
public final boolean prevIPv6;
- /** {@hide} */
public DefaultNetworkEvent(int netId, int[] transportTypes,
int prevNetId, boolean prevIPv4, boolean prevIPv6) {
this.netId = netId;
@@ -106,8 +103,4 @@
return new DefaultNetworkEvent[size];
}
};
-
- public static void logEvent(
- int netId, int[] transports, int prevNetId, boolean hadIPv4, boolean hadIPv6) {
- }
}
diff --git a/core/java/android/net/metrics/DhcpClientEvent.java b/core/java/android/net/metrics/DhcpClientEvent.java
index 4a9ff05..7e30ab5 100644
--- a/core/java/android/net/metrics/DhcpClientEvent.java
+++ b/core/java/android/net/metrics/DhcpClientEvent.java
@@ -16,7 +16,6 @@
package android.net.metrics;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -24,7 +23,6 @@
* An event recorded when a DhcpClient state machine transitions to a new state.
* {@hide}
*/
-@SystemApi
public final class DhcpClientEvent implements Parcelable {
// Names for recording DhcpClient pseudo-state transitions.
@@ -37,7 +35,6 @@
public final String msg;
public final int durationMs;
- /** {@hide} */
public DhcpClientEvent(String ifName, String msg, int durationMs) {
this.ifName = ifName;
this.msg = msg;
@@ -77,7 +74,4 @@
return new DhcpClientEvent[size];
}
};
-
- public static void logStateEvent(String ifName, String state) {
- }
}
diff --git a/core/java/android/net/metrics/DhcpErrorEvent.java b/core/java/android/net/metrics/DhcpErrorEvent.java
index c3abcf7..f34ffdf 100644
--- a/core/java/android/net/metrics/DhcpErrorEvent.java
+++ b/core/java/android/net/metrics/DhcpErrorEvent.java
@@ -16,7 +16,6 @@
package android.net.metrics;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -27,7 +26,6 @@
* Event class used to record error events when parsing DHCP response packets.
* {@hide}
*/
-@SystemApi
public final class DhcpErrorEvent implements Parcelable {
public static final int L2_ERROR = 1;
public static final int L3_ERROR = 2;
@@ -50,12 +48,10 @@
public static final int DHCP_INVALID_OPTION_LENGTH = makeErrorCode(DHCP_ERROR, 3);
public static final int DHCP_NO_MSG_TYPE = makeErrorCode(DHCP_ERROR, 4);
public static final int DHCP_UNKNOWN_MSG_TYPE = makeErrorCode(DHCP_ERROR, 5);
- /** {@hide} */
public static final int DHCP_NO_COOKIE = makeErrorCode(DHCP_ERROR, 6);
public static final int BUFFER_UNDERFLOW = makeErrorCode(MISC_ERROR, 1);
public static final int RECEIVE_ERROR = makeErrorCode(MISC_ERROR, 2);
- /** {@hide} */
public static final int PARSING_ERROR = makeErrorCode(MISC_ERROR, 3);
public final String ifName;
@@ -66,7 +62,6 @@
// byte 3: optional code
public final int errorCode;
- /** {@hide} */
public DhcpErrorEvent(String ifName, int errorCode) {
this.ifName = ifName;
this.errorCode = errorCode;
@@ -99,12 +94,6 @@
}
};
- public static void logParseError(String ifName, int errorCode) {
- }
-
- public static void logReceiveError(String ifName) {
- }
-
public static int errorCodeWithOption(int errorCode, int option) {
return (0xFFFF0000 & errorCode) | (0xFF & option);
}
diff --git a/core/java/android/net/metrics/DnsEvent.java b/core/java/android/net/metrics/DnsEvent.java
index 6176b2c..89ae1c2 100644
--- a/core/java/android/net/metrics/DnsEvent.java
+++ b/core/java/android/net/metrics/DnsEvent.java
@@ -16,7 +16,6 @@
package android.net.metrics;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -24,7 +23,6 @@
* A DNS event recorded by NetdEventListenerService.
* {@hide}
*/
-@SystemApi
final public class DnsEvent implements Parcelable {
public final int netId;
@@ -38,7 +36,6 @@
// queries.
public final int[] latenciesMs;
- /** {@hide} */
public DnsEvent(int netId, byte[] eventTypes, byte[] returnCodes, int[] latenciesMs) {
this.netId = netId;
this.eventTypes = eventTypes;
@@ -82,8 +79,4 @@
return new DnsEvent[size];
}
};
-
- public static void logEvent(
- int netId, byte[] eventTypes, byte[] returnCodes, int[] latenciesMs) {
- }
}
diff --git a/core/java/android/net/metrics/IpManagerEvent.java b/core/java/android/net/metrics/IpManagerEvent.java
index e0a026e..50dda7c 100644
--- a/core/java/android/net/metrics/IpManagerEvent.java
+++ b/core/java/android/net/metrics/IpManagerEvent.java
@@ -17,7 +17,6 @@
package android.net.metrics;
import android.annotation.IntDef;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -32,17 +31,15 @@
* when a network disconnects.
* {@hide}
*/
-@SystemApi
public final class IpManagerEvent implements Parcelable {
- public static final int PROVISIONING_OK = 1;
- public static final int PROVISIONING_FAIL = 2;
- public static final int COMPLETE_LIFECYCLE = 3;
- /** @hide */ public static final int ERROR_STARTING_IPV4 = 4;
- /** @hide */ public static final int ERROR_STARTING_IPV6 = 5;
- /** @hide */ public static final int ERROR_STARTING_IPREACHABILITYMONITOR = 6;
+ public static final int PROVISIONING_OK = 1;
+ public static final int PROVISIONING_FAIL = 2;
+ public static final int COMPLETE_LIFECYCLE = 3;
+ public static final int ERROR_STARTING_IPV4 = 4;
+ public static final int ERROR_STARTING_IPV6 = 5;
+ public static final int ERROR_STARTING_IPREACHABILITYMONITOR = 6;
- /** {@hide} */
@IntDef(value = {
PROVISIONING_OK, PROVISIONING_FAIL, COMPLETE_LIFECYCLE,
ERROR_STARTING_IPV4, ERROR_STARTING_IPV6, ERROR_STARTING_IPREACHABILITYMONITOR,
@@ -54,7 +51,6 @@
public final @EventType int eventType;
public final long durationMs;
- /** {@hide} */
public IpManagerEvent(String ifName, @EventType int eventType, long duration) {
this.ifName = ifName;
this.eventType = eventType;
@@ -90,9 +86,6 @@
}
};
- public static void logEvent(int eventType, String ifName, long durationMs) {
- }
-
@Override
public String toString() {
return String.format("IpManagerEvent(%s, %s, %dms)",
diff --git a/core/java/android/net/metrics/IpReachabilityEvent.java b/core/java/android/net/metrics/IpReachabilityEvent.java
index ee09e22..d69e806 100644
--- a/core/java/android/net/metrics/IpReachabilityEvent.java
+++ b/core/java/android/net/metrics/IpReachabilityEvent.java
@@ -16,7 +16,6 @@
package android.net.metrics;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -28,7 +27,6 @@
* a neighbor probe result.
* {@hide}
*/
-@SystemApi
public final class IpReachabilityEvent implements Parcelable {
// Event types.
@@ -38,9 +36,9 @@
public static final int NUD_FAILED = 2 << 8;
/** Neighbor unreachable after a forced probe, IP provisioning is also lost. */
public static final int PROVISIONING_LOST = 3 << 8;
- /** {@hide} Neighbor unreachable notification from kernel. */
+ /** Neighbor unreachable notification from kernel. */
public static final int NUD_FAILED_ORGANIC = 4 << 8;
- /** {@hide} Neighbor unreachable notification from kernel, IP provisioning is also lost. */
+ /** Neighbor unreachable notification from kernel, IP provisioning is also lost. */
public static final int PROVISIONING_LOST_ORGANIC = 5 << 8;
public final String ifName;
@@ -51,7 +49,6 @@
// byte 3: when byte 2 == PROBE, errno code from RTNetlink or IpReachabilityMonitor.
public final int eventType;
- /** {@hide} */
public IpReachabilityEvent(String ifName, int eventType) {
this.ifName = ifName;
this.eventType = eventType;
@@ -84,18 +81,8 @@
}
};
- public static void logProbeEvent(String ifName, int nlErrorCode) {
- }
-
- public static void logNudFailed(String ifName) {
- }
-
- public static void logProvisioningLost(String ifName) {
- }
-
/**
* Returns the NUD failure event type code corresponding to the given conditions.
- * {@hide}
*/
public static int nudFailureEventType(boolean isFromProbe, boolean isProvisioningLost) {
if (isFromProbe) {
diff --git a/core/java/android/net/metrics/NetworkEvent.java b/core/java/android/net/metrics/NetworkEvent.java
index 0667495..4df3bf0 100644
--- a/core/java/android/net/metrics/NetworkEvent.java
+++ b/core/java/android/net/metrics/NetworkEvent.java
@@ -17,7 +17,6 @@
package android.net.metrics;
import android.annotation.IntDef;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -30,7 +29,6 @@
/**
* {@hide}
*/
-@SystemApi
public final class NetworkEvent implements Parcelable {
public static final int NETWORK_CONNECTED = 1;
@@ -41,16 +39,11 @@
public static final int NETWORK_UNLINGER = 6;
public static final int NETWORK_DISCONNECTED = 7;
- /** {@hide} */
public static final int NETWORK_FIRST_VALIDATION_SUCCESS = 8;
- /** {@hide} */
public static final int NETWORK_REVALIDATION_SUCCESS = 9;
- /** {@hide} */
public static final int NETWORK_FIRST_VALIDATION_PORTAL_FOUND = 10;
- /** {@hide} */
public static final int NETWORK_REVALIDATION_PORTAL_FOUND = 11;
- /** {@hide} */
@IntDef(value = {
NETWORK_CONNECTED,
NETWORK_VALIDATED,
@@ -71,14 +64,12 @@
public final @EventType int eventType;
public final long durationMs;
- /** {@hide} */
public NetworkEvent(int netId, @EventType int eventType, long durationMs) {
this.netId = netId;
this.eventType = eventType;
this.durationMs = durationMs;
}
- /** {@hide} */
public NetworkEvent(int netId, @EventType int eventType) {
this(netId, eventType, 0);
}
@@ -112,15 +103,6 @@
}
};
- public static void logEvent(int netId, int eventType) {
- }
-
- public static void logValidated(int netId, long durationMs) {
- }
-
- public static void logCaptivePortalFound(int netId, long durationMs) {
- }
-
@Override
public String toString() {
return String.format("NetworkEvent(%d, %s, %dms)",
diff --git a/core/java/android/net/metrics/RaEvent.java b/core/java/android/net/metrics/RaEvent.java
index 91bd023..3249f80 100644
--- a/core/java/android/net/metrics/RaEvent.java
+++ b/core/java/android/net/metrics/RaEvent.java
@@ -16,7 +16,6 @@
package android.net.metrics;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -24,10 +23,8 @@
* An event logged when the APF packet socket receives an RA packet.
* {@hide}
*/
-@SystemApi
public final class RaEvent implements Parcelable {
- /** {@hide} */
public static final long NO_LIFETIME = -1L;
// Lifetime in seconds of options found in a single RA packet.
@@ -39,7 +36,6 @@
public final long rdnssLifetime;
public final long dnsslLifetime;
- /** {@hide} */
public RaEvent(long routerLifetime, long prefixValidLifetime, long prefixPreferredLifetime,
long routeInfoLifetime, long rdnssLifetime, long dnsslLifetime) {
this.routerLifetime = routerLifetime;
@@ -96,7 +92,6 @@
}
};
- /** {@hide} */
public static class Builder {
long routerLifetime = NO_LIFETIME;
diff --git a/core/java/android/net/metrics/ValidationProbeEvent.java b/core/java/android/net/metrics/ValidationProbeEvent.java
index a724ec1..70c6e84 100644
--- a/core/java/android/net/metrics/ValidationProbeEvent.java
+++ b/core/java/android/net/metrics/ValidationProbeEvent.java
@@ -17,7 +17,6 @@
package android.net.metrics;
import android.annotation.IntDef;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -31,14 +30,12 @@
* An event recorded by NetworkMonitor when sending a probe for finding captive portals.
* {@hide}
*/
-@SystemApi
public final class ValidationProbeEvent implements Parcelable {
public static final int PROBE_DNS = 0;
public static final int PROBE_HTTP = 1;
public static final int PROBE_HTTPS = 2;
public static final int PROBE_PAC = 3;
- /** {@hide} */
public static final int PROBE_FALLBACK = 4;
public static final int DNS_FAILURE = 0;
@@ -47,7 +44,6 @@
private static final int FIRST_VALIDATION = 1 << 8;
private static final int REVALIDATION = 2 << 8;
- /** {@hide} */
@IntDef(value = {DNS_FAILURE, DNS_SUCCESS})
@Retention(RetentionPolicy.SOURCE)
public @interface ReturnCode {}
@@ -62,7 +58,6 @@
public final int probeType;
public final @ReturnCode int returnCode;
- /** {@hide} */
public ValidationProbeEvent(
int netId, long durationMs, int probeType, @ReturnCode int returnCode) {
this.netId = netId;
@@ -102,24 +97,18 @@
}
};
- /** @hide */
public static int makeProbeType(int probeType, boolean firstValidation) {
return (probeType & 0xff) | (firstValidation ? FIRST_VALIDATION : REVALIDATION);
}
- /** @hide */
public static String getProbeName(int probeType) {
return Decoder.constants.get(probeType & 0xff, "PROBE_???");
}
- /** @hide */
public static String getValidationStage(int probeType) {
return Decoder.constants.get(probeType & 0xff00, "UNKNOWN");
}
- public static void logEvent(int netId, long durationMs, int probeType, int returnCode) {
- }
-
@Override
public String toString() {
return String.format("ValidationProbeEvent(%d, %s:%d %s, %dms)", netId,
diff --git a/core/java/android/os/BatteryManager.java b/core/java/android/os/BatteryManager.java
index 3a441c7..9ffe2fe 100644
--- a/core/java/android/os/BatteryManager.java
+++ b/core/java/android/os/BatteryManager.java
@@ -118,6 +118,13 @@
*/
public static final String EXTRA_CHARGE_COUNTER = "charge_counter";
+ /**
+ * Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}:
+ * Current int sequence number of the update.
+ * {@hide}
+ */
+ public static final String EXTRA_SEQUENCE = "seq";
+
// values for "status" field in the ACTION_BATTERY_CHANGED Intent
public static final int BATTERY_STATUS_UNKNOWN = Constants.BATTERY_STATUS_UNKNOWN;
public static final int BATTERY_STATUS_CHARGING = Constants.BATTERY_STATUS_CHARGING;
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
index 7cdb3ce..39f4d42 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -311,11 +311,6 @@
}
/** {@hide} */
- public static File getDataAppEphemeralDirectory(String volumeUuid) {
- return new File(getDataDirectory(volumeUuid), "app-ephemeral");
- }
-
- /** {@hide} */
public static File getDataUserCeDirectory(String volumeUuid) {
return new File(getDataDirectory(volumeUuid), "user");
}
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java
index 7c015de..af05ee7 100644
--- a/core/java/android/os/FileUtils.java
+++ b/core/java/android/os/FileUtils.java
@@ -432,14 +432,13 @@
*/
public static boolean contains(File dir, File file) {
if (dir == null || file == null) return false;
+ return contains(dir.getAbsolutePath(), file.getAbsolutePath());
+ }
- String dirPath = dir.getAbsolutePath();
- String filePath = file.getAbsolutePath();
-
+ public static boolean contains(String dirPath, String filePath) {
if (dirPath.equals(filePath)) {
return true;
}
-
if (!dirPath.endsWith("/")) {
dirPath += "/";
}
@@ -771,4 +770,17 @@
return dir.mkdir() ? dir : null;
}
+
+ /**
+ * Round the given size of a storage device to a nice round power-of-two
+ * value, such as 256MB or 32GB. This avoids showing weird values like
+ * "29.5GB" in UI.
+ */
+ public static long roundStorageSize(long size) {
+ long res = 1;
+ while (res < size) {
+ res <<= 1;
+ }
+ return res;
+ }
}
diff --git a/core/java/android/os/Looper.java b/core/java/android/os/Looper.java
index d299672..63d3e7a 100644
--- a/core/java/android/os/Looper.java
+++ b/core/java/android/os/Looper.java
@@ -18,8 +18,10 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.os.LooperProto;
import android.util.Log;
import android.util.Printer;
+import android.util.proto.ProtoOutputStream;
/**
* Class used to run a message loop for a thread. Threads by default do
@@ -289,6 +291,16 @@
mQueue.dump(pw, prefix + " ");
}
+ /** @hide */
+ public void writeToProto(ProtoOutputStream proto, long fieldId) {
+ final long looperToken = proto.start(fieldId);
+ proto.write(LooperProto.THREAD_NAME, mThread.getName());
+ proto.write(LooperProto.THREAD_ID, mThread.getId());
+ proto.write(LooperProto.IDENTITY_HASH_CODE, System.identityHashCode(this));
+ mQueue.writeToProto(proto, LooperProto.QUEUE);
+ proto.end(looperToken);
+ }
+
@Override
public String toString() {
return "Looper (" + mThread.getName() + ", tid " + mThread.getId()
diff --git a/core/java/android/os/Message.java b/core/java/android/os/Message.java
index 8c75847..d066db1 100644
--- a/core/java/android/os/Message.java
+++ b/core/java/android/os/Message.java
@@ -16,13 +16,15 @@
package android.os;
+import android.os.MessageProto;
import android.util.TimeUtils;
+import android.util.proto.ProtoOutputStream;
/**
- *
+ *
* Defines a message containing a description and arbitrary data object that can be
* sent to a {@link Handler}. This object contains two extra int fields and an
- * extra object field that allow you to not do allocations in many cases.
+ * extra object field that allow you to not do allocations in many cases.
*
* <p class="note">While the constructor of Message is public, the best way to get
* one of these is to call {@link #obtain Message.obtain()} or one of the
@@ -31,7 +33,7 @@
*/
public final class Message implements Parcelable {
/**
- * User-defined message code so that the recipient can identify
+ * User-defined message code so that the recipient can identify
* what this message is about. Each {@link Handler} has its own name-space
* for message codes, so you do not need to worry about yours conflicting
* with other handlers.
@@ -43,7 +45,7 @@
* {@link #setData(Bundle) setData()} if you only need to store a
* few integer values.
*/
- public int arg1;
+ public int arg1;
/**
* arg1 and arg2 are lower-cost alternatives to using
@@ -58,7 +60,7 @@
* be non-null if it contains a Parcelable of a framework class (not one
* implemented by the application). For other data transfer use
* {@link #setData}.
- *
+ *
* <p>Note that Parcelable objects here are not supported prior to
* the {@link android.os.Build.VERSION_CODES#FROYO} release.
*/
@@ -97,13 +99,13 @@
/*package*/ int flags;
/*package*/ long when;
-
+
/*package*/ Bundle data;
-
+
/*package*/ Handler target;
-
+
/*package*/ Runnable callback;
-
+
// sometimes we store linked lists of these things
/*package*/ Message next;
@@ -216,9 +218,9 @@
}
/**
- * Same as {@link #obtain()}, but sets the values of the <em>target</em>, <em>what</em>,
+ * Same as {@link #obtain()}, but sets the values of the <em>target</em>, <em>what</em>,
* <em>arg1</em>, and <em>arg2</em> members.
- *
+ *
* @param h The <em>target</em> value to set.
* @param what The <em>what</em> value to set.
* @param arg1 The <em>arg1</em> value to set.
@@ -236,9 +238,9 @@
}
/**
- * Same as {@link #obtain()}, but sets the values of the <em>target</em>, <em>what</em>,
+ * Same as {@link #obtain()}, but sets the values of the <em>target</em>, <em>what</em>,
* <em>arg1</em>, <em>arg2</em>, and <em>obj</em> members.
- *
+ *
* @param h The <em>target</em> value to set.
* @param what The <em>what</em> value to set.
* @param arg1 The <em>arg1</em> value to set.
@@ -246,7 +248,7 @@
* @param obj The <em>obj</em> value to set.
* @return A Message object from the global pool.
*/
- public static Message obtain(Handler h, int what,
+ public static Message obtain(Handler h, int what,
int arg1, int arg2, Object obj) {
Message m = obtain();
m.target = h;
@@ -339,7 +341,7 @@
public long getWhen() {
return when;
}
-
+
public void setTarget(Handler target) {
this.target = target;
}
@@ -367,8 +369,8 @@
public Runnable getCallback() {
return callback;
}
-
- /**
+
+ /**
* Obtains a Bundle of arbitrary data associated with this
* event, lazily creating it if necessary. Set this value by calling
* {@link #setData(Bundle)}. Note that when transferring data across
@@ -383,11 +385,11 @@
if (data == null) {
data = new Bundle();
}
-
+
return data;
}
- /**
+ /**
* Like getData(), but does not lazily create the Bundle. A null
* is returned if the Bundle does not already exist. See
* {@link #getData} for further information on this.
@@ -401,7 +403,7 @@
/**
* Sets a Bundle of arbitrary data values. Use arg1 and arg2 members
* as a lower cost way to send a few simple integer values, if you can.
- * @see #getData()
+ * @see #getData()
* @see #peekData()
*/
public void setData(Bundle data) {
@@ -520,6 +522,37 @@
return b.toString();
}
+ void writeToProto(ProtoOutputStream proto, long fieldId) {
+ final long messageToken = proto.start(fieldId);
+ proto.write(MessageProto.WHEN, when);
+
+ if (target != null) {
+ if (callback != null) {
+ proto.write(MessageProto.CALLBACK, callback.getClass().getName());
+ } else {
+ proto.write(MessageProto.WHAT, what);
+ }
+
+ if (arg1 != 0) {
+ proto.write(MessageProto.ARG1, arg1);
+ }
+
+ if (arg2 != 0) {
+ proto.write(MessageProto.ARG2, arg2);
+ }
+
+ if (obj != null) {
+ proto.write(MessageProto.OBJ, obj.toString());
+ }
+
+ proto.write(MessageProto.TARGET, target.getClass().getName());
+ } else {
+ proto.write(MessageProto.BARRIER, arg1);
+ }
+
+ proto.end(messageToken);
+ }
+
public static final Parcelable.Creator<Message> CREATOR
= new Parcelable.Creator<Message>() {
public Message createFromParcel(Parcel source) {
@@ -527,12 +560,12 @@
msg.readFromParcel(source);
return msg;
}
-
+
public Message[] newArray(int size) {
return new Message[size];
}
};
-
+
public int describeContents() {
return 0;
}
diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java
index 4f2e968..2a8c52e 100644
--- a/core/java/android/os/MessageQueue.java
+++ b/core/java/android/os/MessageQueue.java
@@ -18,9 +18,11 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.os.MessageQueueProto;
import android.util.Log;
import android.util.Printer;
import android.util.SparseArray;
+import android.util.proto.ProtoOutputStream;
import java.io.FileDescriptor;
import java.lang.annotation.Retention;
@@ -31,7 +33,7 @@
* Low-level class holding the list of messages to be dispatched by a
* {@link Looper}. Messages are not added directly to a MessageQueue,
* but rather through {@link Handler} objects associated with the Looper.
- *
+ *
* <p>You can retrieve the MessageQueue for the current thread with
* {@link Looper#myQueue() Looper.myQueue()}.
*/
@@ -770,6 +772,18 @@
}
}
+ void writeToProto(ProtoOutputStream proto, long fieldId) {
+ final long messageQueueToken = proto.start(fieldId);
+ synchronized (this) {
+ for (Message msg = mMessages; msg != null; msg = msg.next) {
+ msg.writeToProto(proto, MessageQueueProto.MESSAGES);
+ }
+ proto.write(MessageQueueProto.IS_POLLING_LOCKED, isPollingLocked());
+ proto.write(MessageQueueProto.IS_QUITTING, mQuitting);
+ }
+ proto.end(messageQueueToken);
+ }
+
/**
* Callback interface for discovering when a thread is going to block
* waiting for more messages.
diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java
index 7702c17..8882672 100644
--- a/core/java/android/os/ParcelFileDescriptor.java
+++ b/core/java/android/os/ParcelFileDescriptor.java
@@ -546,6 +546,25 @@
}
/**
+ * Return the filesystem path of the real file on disk that is represented
+ * by the given {@link FileDescriptor}.
+ *
+ * @hide
+ */
+ public static File getFile(FileDescriptor fd) throws IOException {
+ try {
+ final String path = Os.readlink("/proc/self/fd/" + fd.getInt$());
+ if (OsConstants.S_ISREG(Os.stat(path).st_mode)) {
+ return new File(path);
+ } else {
+ throw new IOException("Not a regular file: " + path);
+ }
+ } catch (ErrnoException e) {
+ throw e.rethrowAsIOException();
+ }
+ }
+
+ /**
* Retrieve the actual FileDescriptor associated with this object.
*
* @return Returns the FileDescriptor associated with this object.
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 21c70f9..13a495e 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -1097,40 +1097,6 @@
}
}
- /** @removed */
- @Deprecated
- public boolean isUserRunningAndLocked() {
- return isUserRunningAndLocked(Process.myUserHandle());
- }
-
- /** @removed */
- @Deprecated
- public boolean isUserRunningAndLocked(UserHandle user) {
- try {
- return ActivityManager.getService().isUserRunning(
- user.getIdentifier(), ActivityManager.FLAG_AND_LOCKED);
- } catch (RemoteException re) {
- throw re.rethrowFromSystemServer();
- }
- }
-
- /** @removed */
- @Deprecated
- public boolean isUserRunningAndUnlocked() {
- return isUserRunningAndUnlocked(Process.myUserHandle());
- }
-
- /** @removed */
- @Deprecated
- public boolean isUserRunningAndUnlocked(UserHandle user) {
- try {
- return ActivityManager.getService().isUserRunning(
- user.getIdentifier(), ActivityManager.FLAG_AND_UNLOCKED);
- } catch (RemoteException re) {
- throw re.rethrowFromSystemServer();
- }
- }
-
/**
* Return whether the calling user is running in an "unlocked" state.
* <p>
diff --git a/core/java/android/os/WorkSource.java b/core/java/android/os/WorkSource.java
index f8da87a..ecec448 100644
--- a/core/java/android/os/WorkSource.java
+++ b/core/java/android/os/WorkSource.java
@@ -1,6 +1,8 @@
package android.os;
+import android.os.WorkSourceProto;
import android.util.Log;
+import android.util.proto.ProtoOutputStream;
import java.util.Arrays;
@@ -296,7 +298,7 @@
break;
}
if (mUids[i] == uid) {
- int diff = mNames[i].compareTo(name);
+ int diff = mNames[i].compareTo(name);
if (diff > 0) {
break;
}
@@ -692,6 +694,20 @@
return result.toString();
}
+ /** @hide */
+ public void writeToProto(ProtoOutputStream proto, long fieldId) {
+ final long workSourceToken = proto.start(fieldId);
+ for (int i = 0; i < mNum; i++) {
+ final long contentProto = proto.start(WorkSourceProto.WORK_SOURCE_CONTENTS);
+ proto.write(WorkSourceProto.WorkSourceContentProto.UID, mUids[i]);
+ if (mNames != null) {
+ proto.write(WorkSourceProto.WorkSourceContentProto.NAME, mNames[i]);
+ }
+ proto.end(contentProto);
+ }
+ proto.end(workSourceToken);
+ }
+
public static final Parcelable.Creator<WorkSource> CREATOR
= new Parcelable.Creator<WorkSource>() {
public WorkSource createFromParcel(Parcel in) {
diff --git a/core/java/android/os/storage/IStorageManager.aidl b/core/java/android/os/storage/IStorageManager.aidl
index 9e35bf6..2cc4b71 100644
--- a/core/java/android/os/storage/IStorageManager.aidl
+++ b/core/java/android/os/storage/IStorageManager.aidl
@@ -293,6 +293,6 @@
ParcelFileDescriptor openProxyFileDescriptor(int mountPointId, int fileId, int mode) = 74;
long getCacheQuotaBytes(String volumeUuid, int uid) = 75;
long getCacheSizeBytes(String volumeUuid, int uid) = 76;
- long getAllocatableBytes(String path, int flags) = 77;
- void allocateBytes(String path, long bytes, int flags) = 78;
+ long getAllocatableBytes(String volumeUuid, int flags) = 77;
+ void allocateBytes(String volumeUuid, long bytes, int flags) = 78;
}
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 2a3c03d..a1f8dfb 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -16,6 +16,7 @@
package android.os.storage;
+import static android.net.TrafficStats.GB_IN_BYTES;
import static android.net.TrafficStats.MB_IN_BYTES;
import android.annotation.IntDef;
@@ -675,6 +676,36 @@
}
/** {@hide} */
+ public @Nullable String findUuidForPath(File path) {
+ Preconditions.checkNotNull(path);
+ final String pathString = path.getAbsolutePath();
+ if (FileUtils.contains(Environment.getDataDirectory().getAbsolutePath(), pathString)) {
+ return StorageManager.UUID_PRIVATE_INTERNAL;
+ }
+ try {
+ for (VolumeInfo vol : mStorageManager.getVolumes(0)) {
+ if (vol.path != null && FileUtils.contains(vol.path, pathString)) {
+ // TODO: verify that emulated adopted devices have UUID of
+ // underlying volume
+ return vol.fsUuid;
+ }
+ }
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ throw new IllegalStateException("Failed to find a storage device for " + path);
+ }
+
+ /** {@hide} */
+ public @Nullable File findPathForUuid(String volumeUuid) {
+ final VolumeInfo vol = findVolumeByQualifiedUuid(volumeUuid);
+ if (vol != null) {
+ return vol.getPath();
+ }
+ throw new IllegalStateException("Failed to find a storage device for " + volumeUuid);
+ }
+
+ /** {@hide} */
public @NonNull List<VolumeInfo> getVolumes() {
try {
return Arrays.asList(mStorageManager.getVolumes(0));
@@ -1069,9 +1100,12 @@
throw new IllegalStateException("Missing primary storage");
}
- /** {@hide} */
- private static final int DEFAULT_THRESHOLD_PERCENTAGE = 10;
+ private static final int DEFAULT_THRESHOLD_PERCENTAGE = 5;
private static final long DEFAULT_THRESHOLD_MAX_BYTES = 500 * MB_IN_BYTES;
+
+ private static final int DEFAULT_CACHE_PERCENTAGE = 10;
+ private static final long DEFAULT_CACHE_MAX_BYTES = 5 * GB_IN_BYTES;
+
private static final long DEFAULT_FULL_THRESHOLD_BYTES = MB_IN_BYTES;
/**
@@ -1102,6 +1136,23 @@
}
/**
+ * Return the minimum number of bytes of storage on the device that should
+ * be reserved for cached data.
+ *
+ * @hide
+ */
+ public long getStorageCacheBytes(File path) {
+ final long cachePercent = Settings.Global.getInt(mResolver,
+ Settings.Global.SYS_STORAGE_CACHE_PERCENTAGE, DEFAULT_CACHE_PERCENTAGE);
+ final long cacheBytes = (path.getTotalSpace() * cachePercent) / 100;
+
+ final long maxCacheBytes = Settings.Global.getLong(mResolver,
+ Settings.Global.SYS_STORAGE_CACHE_MAX_BYTES, DEFAULT_CACHE_MAX_BYTES);
+
+ return Math.min(cacheBytes, maxCacheBytes);
+ }
+
+ /**
* Return the number of available bytes at which the given path is
* considered full.
*
@@ -1409,40 +1460,37 @@
}
/**
- * Return quota size in bytes for cached data belonging to the calling app.
+ * Return quota size in bytes for all cached data belonging to the calling
+ * app on the filesystem that hosts the given path.
* <p>
* If your app goes above this quota, your cached files will be some of the
* first to be deleted when additional disk space is needed. Conversely, if
* your app stays under this quota, your cached files will be some of the
* last to be deleted when additional disk space is needed.
* <p>
- * This quota may change over time depending on how frequently the user
+ * This quota will change over time depending on how frequently the user
* interacts with your app, and depending on how much disk space is used.
- * <p>
- * Cached data tracked by this method always includes
- * {@link Context#getCacheDir()} and {@link Context#getCodeCacheDir()}, and
- * it also includes {@link Context#getExternalCacheDir()} if the primary
- * shared/external storage is hosted on the same storage device as your
- * private data.
* <p class="note">
* Note: if your app uses the {@code android:sharedUserId} manifest feature,
* then cached data for all packages in your shared UID is tracked together
* as a single unit.
* </p>
*
- * @see #getCacheSizeBytes()
+ * @see #getCacheSizeBytes(File)
*/
- public long getCacheQuotaBytes() {
+ public long getCacheQuotaBytes(File path) {
try {
+ final String volumeUuid = findUuidForPath(path);
final ApplicationInfo app = mContext.getApplicationInfo();
- return mStorageManager.getCacheQuotaBytes(app.volumeUuid, app.uid);
+ return mStorageManager.getCacheQuotaBytes(volumeUuid, app.uid);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
- * Return total size in bytes of cached data belonging to the calling app.
+ * Return total size in bytes of all cached data belonging to the calling
+ * app on the filesystem that hosts the given path.
* <p>
* Cached data tracked by this method always includes
* {@link Context#getCacheDir()} and {@link Context#getCodeCacheDir()}, and
@@ -1457,67 +1505,38 @@
*
* @see #getCacheQuotaBytes()
*/
- public long getCacheSizeBytes() {
+ public long getCacheSizeBytes(File path) {
try {
+ final String volumeUuid = findUuidForPath(path);
final ApplicationInfo app = mContext.getApplicationInfo();
- return mStorageManager.getCacheSizeBytes(app.volumeUuid, app.uid);
+ return mStorageManager.getCacheSizeBytes(volumeUuid, app.uid);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
- /**
- * Return quota size in bytes for cached data on primary shared/external
- * storage belonging to the calling app.
- * <p>
- * If primary shared/external storage is hosted on the same storage device
- * as your private data, this method will return -1, since all data stored
- * under {@link Context#getExternalCacheDir()} will be counted under
- * {@link #getCacheQuotaBytes()}.
- * <p class="note">
- * Note: if your app uses the {@code android:sharedUserId} manifest feature,
- * then cached data for all packages in your shared UID is tracked together
- * as a single unit.
- * </p>
- */
+ /** @removed */
+ @Deprecated
+ public long getCacheQuotaBytes() {
+ return getCacheQuotaBytes(mContext.getCacheDir());
+ }
+
+ /** @removed */
+ @Deprecated
+ public long getCacheSizeBytes() {
+ return getCacheSizeBytes(mContext.getCacheDir());
+ }
+
+ /** @removed */
+ @Deprecated
public long getExternalCacheQuotaBytes() {
- final ApplicationInfo app = mContext.getApplicationInfo();
- final String primaryUuid = getPrimaryStorageUuid();
- if (Objects.equals(app.volumeUuid, primaryUuid)) {
- return -1;
- }
- try {
- return mStorageManager.getCacheQuotaBytes(primaryUuid, app.uid);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return getCacheQuotaBytes(mContext.getExternalCacheDir());
}
- /**
- * Return total size in bytes of cached data on primary shared/external
- * storage belonging to the calling app.
- * <p>
- * If primary shared/external storage is hosted on the same storage device
- * as your private data, this method will return -1, since all data stored
- * under {@link Context#getExternalCacheDir()} will be counted under
- * {@link #getCacheQuotaBytes()}.
- * <p class="note">
- * Note: if your app uses the {@code android:sharedUserId} manifest feature,
- * then cached data for all packages in your shared UID is tracked together
- * as a single unit.
- * </p>
- */
+ /** @removed */
+ @Deprecated
public long getExternalCacheSizeBytes() {
- final ApplicationInfo app = mContext.getApplicationInfo();
- final String primaryUuid = getPrimaryStorageUuid();
- if (Objects.equals(app.volumeUuid, primaryUuid)) {
- return -1;
- }
- try {
- return mStorageManager.getCacheSizeBytes(primaryUuid, app.uid);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return getCacheSizeBytes(mContext.getExternalCacheDir());
}
/**
@@ -1551,28 +1570,30 @@
* Return the maximum number of new bytes that your app can allocate for
* itself using {@link #allocateBytes(File, long, int)} at the given path.
* This value is typically larger than {@link File#getUsableSpace()}, since
- * the system may automatically delete cached files to satisfy your request.
+ * the system may be willing to delete cached files to satisfy an allocation
+ * request.
* <p>
* This method is best used as a pre-flight check, such as deciding if there
* is enough space to store an entire music album before you allocate space
* for each audio file in the album. Attempts to allocate disk space beyond
- * this value will fail.
+ * the returned value will fail.
* <p class="note">
* Note: if your app uses the {@code android:sharedUserId} manifest feature,
* then allocatable space for all packages in your shared UID is tracked
* together as a single unit.
* </p>
*
- * @param file the directory where you're considering allocating disk space,
+ * @param path the path where you're considering allocating disk space,
* since allocatable space can vary widely depending on the
* underlying storage device.
* @param flags to apply to the request.
* @return the maximum number of new bytes that the calling app can allocate
* using {@link #allocateBytes(File, long, int)}.
*/
- public long getAllocatableBytes(File file, @AllocateFlags int flags) throws IOException {
+ public long getAllocatableBytes(File path, @AllocateFlags int flags) throws IOException {
try {
- return mStorageManager.getAllocatableBytes(file.getAbsolutePath(), flags);
+ final String volumeUuid = findUuidForPath(path);
+ return mStorageManager.getAllocatableBytes(volumeUuid, flags);
} catch (ParcelableException e) {
e.maybeRethrow(IOException.class);
throw new RuntimeException(e);
@@ -1594,14 +1615,15 @@
* {@link #allocateBytes(FileDescriptor, long, int)} which will guarantee
* that bytes are allocated to an opened file.
*
- * @param file the directory where you'd like to allocate disk space.
+ * @param path the path where you'd like to allocate disk space.
* @param bytes the number of bytes to allocate.
* @param flags to apply to the request.
* @see #getAllocatableBytes(File, int)
*/
- public void allocateBytes(File file, long bytes, @AllocateFlags int flags) throws IOException {
+ public void allocateBytes(File path, long bytes, @AllocateFlags int flags) throws IOException {
try {
- mStorageManager.allocateBytes(file.getAbsolutePath(), bytes, flags);
+ final String volumeUuid = findUuidForPath(path);
+ mStorageManager.allocateBytes(volumeUuid, bytes, flags);
} catch (ParcelableException e) {
e.maybeRethrow(IOException.class);
} catch (RemoteException e) {
@@ -1610,37 +1632,39 @@
}
/**
- * Allocate the requested number of bytes for your application to use at the
- * given path. This will cause the system to delete any cached files
+ * Allocate the requested number of bytes for your application to use in the
+ * given open file. This will cause the system to delete any cached files
* necessary to satisfy your request.
* <p>
* Attempts to allocate disk space beyond the value returned by
* {@link #getAllocatableBytes(File, int)} will fail.
* <p>
- * This method guarantees that bytes are allocated to the opened file,
- * otherwise it will throw if fast allocation not possible. Fast allocation
- * is typically only supported in private app data directories, and on
- * shared/external storage devices which are emulated.
+ * This method guarantees that bytes have been allocated to the opened file,
+ * otherwise it will throw if fast allocation is not possible. Fast
+ * allocation is typically only supported in private app data directories,
+ * and on shared/external storage devices which are emulated.
*
- * @param fd the directory where you'd like to allocate disk space.
- * @param bytes the number of bytes to allocate.
+ * @param fd the open file that you'd like to allocate disk space for.
+ * @param bytes the number of bytes to allocate. This is the desired final
+ * size of the open file.
* @param flags to apply to the request.
* @see #getAllocatableBytes(File, int)
* @see Environment#isExternalStorageEmulated(File)
*/
public void allocateBytes(FileDescriptor fd, long bytes, @AllocateFlags int flags)
throws IOException {
- final File file;
- try {
- file = new File(Os.readlink("/proc/self/fd/" + fd.getInt$()));
- } catch (ErrnoException e) {
- throw e.rethrowAsIOException();
- }
+ final File file = ParcelFileDescriptor.getFile(fd);
for (int i = 0; i < 3; i++) {
- allocateBytes(file, bytes, flags);
-
try {
+ final long haveBytes = Os.fstat(fd).st_blocks * 512;
+ final long needBytes = bytes - haveBytes;
+
+ if (needBytes > 0) {
+ allocateBytes(file, needBytes, flags);
+ }
+
Os.posix_fallocate(fd, 0, bytes);
+ return;
} catch (ErrnoException e) {
if (e.errno == OsConstants.ENOSPC) {
Log.w(TAG, "Odd, not enough space; let's try again?");
@@ -1653,8 +1677,8 @@
"Well this is embarassing; we can't allocate " + bytes + " for " + file);
}
- private static final String XATTR_ATOMIC = "user.atomic";
- private static final String XATTR_TOMBSTONE = "user.tombstone";
+ private static final String XATTR_CACHE_ATOMIC = "user.cache_atomic";
+ private static final String XATTR_CACHE_TOMBSTONE = "user.cache_tombstone";
/** {@hide} */
private static void setCacheBehavior(File path, String name, boolean enabled)
@@ -1712,7 +1736,7 @@
* to all contained files and directories.
*/
public void setCacheBehaviorAtomic(File path, boolean atomic) throws IOException {
- setCacheBehavior(path, XATTR_ATOMIC, atomic);
+ setCacheBehavior(path, XATTR_CACHE_ATOMIC, atomic);
}
/**
@@ -1720,7 +1744,7 @@
* {@link #setCacheBehaviorAtomic(File, boolean)}.
*/
public boolean isCacheBehaviorAtomic(File path) throws IOException {
- return isCacheBehavior(path, XATTR_ATOMIC);
+ return isCacheBehavior(path, XATTR_CACHE_ATOMIC);
}
/**
@@ -1740,7 +1764,7 @@
* </p>
*/
public void setCacheBehaviorTombstone(File path, boolean tombstone) throws IOException {
- setCacheBehavior(path, XATTR_TOMBSTONE, tombstone);
+ setCacheBehavior(path, XATTR_CACHE_TOMBSTONE, tombstone);
}
/**
@@ -1748,7 +1772,7 @@
* {@link #setCacheBehaviorTombstone(File, boolean)}.
*/
public boolean isCacheBehaviorTombstone(File path) throws IOException {
- return isCacheBehavior(path, XATTR_TOMBSTONE);
+ return isCacheBehavior(path, XATTR_CACHE_TOMBSTONE);
}
private final Object mFuseAppLoopLock = new Object();
diff --git a/core/java/android/preference/PreferenceActivity.java b/core/java/android/preference/PreferenceActivity.java
index 600d82f..c0c5db6 100644
--- a/core/java/android/preference/PreferenceActivity.java
+++ b/core/java/android/preference/PreferenceActivity.java
@@ -200,6 +200,10 @@
private ViewGroup mPrefsContainer;
+ // Backup of the original activity title. This is used when navigating back to the headers list
+ // in onBackPress to restore the title.
+ private CharSequence mActivityTitle;
+
// Null if in legacy mode.
private ViewGroup mHeadersContainer;
@@ -569,6 +573,7 @@
Bundle initialArguments = getIntent().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
int initialTitle = getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_TITLE, 0);
int initialShortTitle = getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_SHORT_TITLE, 0);
+ mActivityTitle = getTitle();
if (savedInstanceState != null) {
// We are restarting from a previous saved state; used that to
@@ -704,6 +709,9 @@
mPrefsContainer.setVisibility(View.GONE);
mHeadersContainer.setVisibility(View.VISIBLE);
+ if (mActivityTitle != null) {
+ showBreadCrumbs(mActivityTitle, null);
+ }
getListView().clearChoices();
} else {
super.onBackPressed();
diff --git a/core/java/android/preference/PreferenceManager.java b/core/java/android/preference/PreferenceManager.java
index a2f4db6..756c3f4 100644
--- a/core/java/android/preference/PreferenceManager.java
+++ b/core/java/android/preference/PreferenceManager.java
@@ -420,12 +420,6 @@
mSharedPreferences = null;
}
- /** @removed */
- @Deprecated
- public void setStorageDeviceEncrypted() {
- setStorageDeviceProtected();
- }
-
/**
* Explicitly set the storage location used internally by this class to be
* credential-protected storage. This is the default storage area for apps
@@ -445,12 +439,6 @@
mSharedPreferences = null;
}
- /** @removed */
- @Deprecated
- public void setStorageCredentialEncrypted() {
- setStorageCredentialProtected();
- }
-
/**
* Indicates if the storage location used internally by this class is the
* default provided by the hosting {@link Context}.
diff --git a/core/java/android/preference/SeekBarVolumizer.java b/core/java/android/preference/SeekBarVolumizer.java
index 11b9606..ee8eed1 100644
--- a/core/java/android/preference/SeekBarVolumizer.java
+++ b/core/java/android/preference/SeekBarVolumizer.java
@@ -348,8 +348,8 @@
if (msg.what == UPDATE_SLIDER) {
if (mSeekBar != null) {
mLastProgress = msg.arg1;
- mLastAudibleStreamVolume = Math.abs(msg.arg2);
- final boolean muted = msg.arg2 < 0;
+ mLastAudibleStreamVolume = msg.arg2;
+ final boolean muted = ((Boolean)msg.obj).booleanValue();
if (muted != mMuted) {
mMuted = muted;
if (mCallback != null) {
@@ -362,8 +362,7 @@
}
public void postUpdateSlider(int volume, int lastAudibleVolume, boolean mute) {
- final int arg2 = lastAudibleVolume * (mute ? -1 : 1);
- obtainMessage(UPDATE_SLIDER, volume, arg2).sendToTarget();
+ obtainMessage(UPDATE_SLIDER, volume, lastAudibleVolume, new Boolean(mute)).sendToTarget();
}
}
diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java
index a6e6fda..5486162 100644
--- a/core/java/android/provider/DocumentsContract.java
+++ b/core/java/android/provider/DocumentsContract.java
@@ -538,7 +538,9 @@
*/
public static final String COLUMN_MIME_TYPES = "mime_types";
- /** {@hide} */
+ /**
+ * MIME type for a root.
+ */
public static final String MIME_TYPE_ITEM = "vnd.android.document/root";
/**
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 2dfba28..ff86ff3 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3882,6 +3882,7 @@
SCREEN_BRIGHTNESS,
SCREEN_BRIGHTNESS_MODE,
SCREEN_AUTO_BRIGHTNESS_ADJ,
+ SCREEN_BRIGHTNESS_FOR_VR,
VIBRATE_INPUT_DEVICES,
MODE_RINGER_STREAMS_AFFECTED,
TEXT_AUTO_REPLACE,
@@ -4128,20 +4129,20 @@
}
/**
- * System settings which can be accessed by ephemeral apps.
+ * System settings which can be accessed by instant apps.
* @hide
*/
- public static final Set<String> EPHEMERAL_SETTINGS = new ArraySet<>();
+ public static final Set<String> INSTANT_APP_SETTINGS = new ArraySet<>();
static {
- EPHEMERAL_SETTINGS.add(TEXT_AUTO_REPLACE);
- EPHEMERAL_SETTINGS.add(TEXT_AUTO_CAPS);
- EPHEMERAL_SETTINGS.add(TEXT_AUTO_PUNCTUATE);
- EPHEMERAL_SETTINGS.add(TEXT_SHOW_PASSWORD);
- EPHEMERAL_SETTINGS.add(DATE_FORMAT);
- EPHEMERAL_SETTINGS.add(FONT_SCALE);
- EPHEMERAL_SETTINGS.add(HAPTIC_FEEDBACK_ENABLED);
- EPHEMERAL_SETTINGS.add(TIME_12_24);
- EPHEMERAL_SETTINGS.add(SOUND_EFFECTS_ENABLED);
+ INSTANT_APP_SETTINGS.add(TEXT_AUTO_REPLACE);
+ INSTANT_APP_SETTINGS.add(TEXT_AUTO_CAPS);
+ INSTANT_APP_SETTINGS.add(TEXT_AUTO_PUNCTUATE);
+ INSTANT_APP_SETTINGS.add(TEXT_SHOW_PASSWORD);
+ INSTANT_APP_SETTINGS.add(DATE_FORMAT);
+ INSTANT_APP_SETTINGS.add(FONT_SCALE);
+ INSTANT_APP_SETTINGS.add(HAPTIC_FEEDBACK_ENABLED);
+ INSTANT_APP_SETTINGS.add(TIME_12_24);
+ INSTANT_APP_SETTINGS.add(SOUND_EFFECTS_ENABLED);
}
/**
@@ -4634,7 +4635,7 @@
return setLocationModeForUser(resolver, Integer.parseInt(value), userHandle);
}
if (MOVED_TO_GLOBAL.contains(name)) {
- Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"
+ Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Secure"
+ " to android.provider.Settings.Global");
return Global.putStringForUser(resolver, name, value,
tag, makeDefault, userHandle);
@@ -5216,6 +5217,18 @@
public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
/**
+ * A flag to tell {@link com.android.server.devicepolicy.DevicePolicyManagerService} that
+ * the default for {@link #INSTALL_NON_MARKET_APPS} is reversed for this user on OTA. So it
+ * can set the restriction {@link android.os.UserManager#DISALLOW_INSTALL_UNKNOWN_SOURCES}
+ * on behalf of the profile owner if needed to make the change transparent for profile
+ * owners.
+ *
+ * @hide
+ */
+ public static final String UNKNOWN_SOURCES_DEFAULT_REVERSED =
+ "unknown_sources_default_reversed";
+
+ /**
* Comma-separated list of location providers that activities may access. Do not rely on
* this value being present in settings.db or on ContentObserver notifications on the
* corresponding Uri.
@@ -5491,7 +5504,12 @@
/**
* Whether to speak passwords while in accessibility mode.
+ *
+ * @deprecated The speaking of passwords is controlled by individual accessibility services.
+ * Apps should ignore this setting and provide complete information to accessibility
+ * at all times, which was the behavior when this value was {@code true}.
*/
+ @Deprecated
public static final String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password";
/**
@@ -6628,6 +6646,14 @@
"lock_screen_show_notifications";
/**
+ * This preference stores the last stack active task time for each user, which affects what
+ * tasks will be visible in Overview.
+ * @hide
+ */
+ public static final String OVERVIEW_LAST_STACK_ACTIVE_TIME =
+ "overview_last_stack_active_time";
+
+ /**
* List of TV inputs that are currently hidden. This is a string
* containing the IDs of all hidden TV inputs. Each ID is encoded by
* {@link android.net.Uri#encode(String)} and separated by ':'.
@@ -6708,6 +6734,13 @@
"camera_double_twist_to_flip_enabled";
/**
+ * Whether the assist gesture should be enabled.
+ *
+ * @hide
+ */
+ public static final String ASSIST_GESTURE_ENABLED = "assist_gesture_enabled";
+
+ /**
* Control whether Night display is currently activated.
* @hide
*/
@@ -6872,6 +6905,12 @@
public static final String PACKAGE_VERIFIER_STATE = "package_verifier_state";
/**
+ * Specifies additional package name for broadcasting the CMAS messages.
+ * @hide
+ */
+ public static final String CMAS_ADDITIONAL_BROADCAST_PKG = "cmas_additional_broadcast_pkg";
+
+ /**
* This are the settings to be backed up.
*
* NOTE: Settings are backed up and restored in the order they appear
@@ -6958,7 +6997,8 @@
DOZE_PULSE_ON_PICK_UP,
DOZE_PULSE_ON_DOUBLE_TAP,
NFC_PAYMENT_DEFAULT_COMPONENT,
- AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN
+ AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
+ ASSIST_GESTURE_ENABLED
};
/**
@@ -6988,17 +7028,17 @@
}
/**
- * Secure settings which can be accessed by ephemeral apps.
+ * Secure settings which can be accessed by instant apps.
* @hide
*/
- public static final Set<String> EPHEMERAL_SETTINGS = new ArraySet<>();
+ public static final Set<String> INSTANT_APP_SETTINGS = new ArraySet<>();
static {
- EPHEMERAL_SETTINGS.add(ENABLED_ACCESSIBILITY_SERVICES);
- EPHEMERAL_SETTINGS.add(ACCESSIBILITY_SPEAK_PASSWORD);
- EPHEMERAL_SETTINGS.add(ACCESSIBILITY_DISPLAY_INVERSION_ENABLED);
+ INSTANT_APP_SETTINGS.add(ENABLED_ACCESSIBILITY_SERVICES);
+ INSTANT_APP_SETTINGS.add(ACCESSIBILITY_SPEAK_PASSWORD);
+ INSTANT_APP_SETTINGS.add(ACCESSIBILITY_DISPLAY_INVERSION_ENABLED);
- EPHEMERAL_SETTINGS.add(DEFAULT_INPUT_METHOD);
- EPHEMERAL_SETTINGS.add(ENABLED_INPUT_METHODS);
+ INSTANT_APP_SETTINGS.add(DEFAULT_INPUT_METHOD);
+ INSTANT_APP_SETTINGS.add(ENABLED_INPUT_METHODS);
}
/**
@@ -8224,6 +8264,15 @@
public static final String CURATE_SAVED_OPEN_NETWORKS = "curate_saved_open_networks";
/**
+ * The package name of the application that connect and secures high quality open wifi
+ * networks automatically.
+ *
+ * Type: string package name or null if the feature is either not provided or disabled.
+ * @hide
+ */
+ public static final String USE_OPEN_WIFI_PACKAGE = "use_open_wifi_package";
+
+ /**
* The number of milliseconds the {@link com.android.server.NetworkScoreService}
* will give a recommendation request to complete before returning a default response.
*
@@ -8233,6 +8282,16 @@
public static final String NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS =
"network_recommendation_request_timeout_ms";
+ /**
+ * The expiration time in milliseconds for the {@link android.net.WifiKey} request cache in
+ * {@link com.android.server.wifi.RecommendedNetworkEvaluator}.
+ *
+ * Type: long
+ * @hide
+ */
+ public static final String RECOMMENDED_NETWORK_EVALUATOR_CACHE_EXPIRY_MS =
+ "recommended_network_evaluator_cache_expiry_ms";
+
/**
* Settings to allow BLE scans to be enabled even when Bluetooth is turned off for
* connectivity.
@@ -8561,6 +8620,24 @@
SYS_STORAGE_FULL_THRESHOLD_BYTES = "sys_storage_full_threshold_bytes";
/**
+ * Minimum percentage of storage on the device that is reserved for
+ * cached data.
+ *
+ * @hide
+ */
+ public static final String
+ SYS_STORAGE_CACHE_PERCENTAGE = "sys_storage_cache_percentage";
+
+ /**
+ * Maximum bytes of storage on the device that is reserved for cached
+ * data.
+ *
+ * @hide
+ */
+ public static final String
+ SYS_STORAGE_CACHE_MAX_BYTES = "sys_storage_cache_max_bytes";
+
+ /**
* The maximum reconnect delay for short network outages or when the
* network is suspended due to phone use.
*
@@ -9573,16 +9650,6 @@
public static final String RETAIL_DEMO_MODE_CONSTANTS = "retail_demo_mode_constants";
/**
- * When blocked for the network policy rules to get updated, the maximum time that the
- * {@link ActivityThread} have to wait before unblocking.
- *
- * Type: long
- *
- * @hide
- */
- public static final String WAIT_FOR_NETWORK_TIMEOUT_MS = "wait_for_network_timeout_ms";
-
- /**
* The reason for the settings database being downgraded. This is only for
* troubleshooting purposes and its value should not be interpreted in any way.
*
@@ -9637,6 +9704,7 @@
CURATE_SAVED_OPEN_NETWORKS,
WIFI_WAKEUP_ENABLED,
WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
+ USE_OPEN_WIFI_PACKAGE,
WIFI_WATCHDOG_POOR_NETWORK_TEST_ENABLED,
EMERGENCY_TONE,
CALL_AUTO_RETRY,
@@ -10136,16 +10204,16 @@
public static final String CELL_ON = "cell_on";
/**
- * Global settings which can be accessed by ephemeral apps.
+ * Global settings which can be accessed by instant apps.
* @hide
*/
- public static final Set<String> EPHEMERAL_SETTINGS = new ArraySet<>();
+ public static final Set<String> INSTANT_APP_SETTINGS = new ArraySet<>();
static {
- EPHEMERAL_SETTINGS.add(WAIT_FOR_DEBUGGER);
- EPHEMERAL_SETTINGS.add(DEVICE_PROVISIONED);
- EPHEMERAL_SETTINGS.add(DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES);
- EPHEMERAL_SETTINGS.add(DEVELOPMENT_FORCE_RTL);
- EPHEMERAL_SETTINGS.add(EPHEMERAL_COOKIE_MAX_SIZE_BYTES);
+ INSTANT_APP_SETTINGS.add(WAIT_FOR_DEBUGGER);
+ INSTANT_APP_SETTINGS.add(DEVICE_PROVISIONED);
+ INSTANT_APP_SETTINGS.add(DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES);
+ INSTANT_APP_SETTINGS.add(DEVELOPMENT_FORCE_RTL);
+ INSTANT_APP_SETTINGS.add(EPHEMERAL_COOKIE_MAX_SIZE_BYTES);
}
/**
@@ -10165,6 +10233,13 @@
* @hide
*/
public static final String ENABLE_DISKSTATS_LOGGING = "enable_diskstats_logging";
+
+ /**
+ * Whether the cache quota calculation task is enabled/disabled.
+ * @hide
+ */
+ public static final String ENABLE_CACHE_QUOTA_CALCULATION =
+ "enable_cache_quota_calculation";
}
/**
diff --git a/core/java/android/service/autofill/Dataset.java b/core/java/android/service/autofill/Dataset.java
index bd38c7f..d76d444 100644
--- a/core/java/android/service/autofill/Dataset.java
+++ b/core/java/android/service/autofill/Dataset.java
@@ -16,6 +16,8 @@
package android.service.autofill;
+import static android.view.autofill.Helper.DEBUG;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.IntentSender;
@@ -23,6 +25,7 @@
import android.os.Parcelable;
import android.view.autofill.AutoFillId;
import android.view.autofill.AutoFillValue;
+import android.widget.RemoteViews;
import com.android.internal.util.Preconditions;
import java.util.ArrayList;
@@ -33,34 +36,28 @@
* <p>It contains:
*
* <ol>
- * <li>A name used to identify the dataset in the UI.
- * <li>A list of id/value pairs for the fields that can be auto-filled.
- * <li>A list of savable ids in addition to the ones with a provided value.
+ * <li>A list of values for input fields.
+ * <li>A presentation view to visualize.
+ * <li>An optional intent to authenticate.
* </ol>
*
* @see android.service.autofill.FillResponse for examples.
*/
public final class Dataset implements Parcelable {
- private static final boolean DEBUG = false;
- private final CharSequence mName;
private final ArrayList<AutoFillId> mFieldIds;
private final ArrayList<AutoFillValue> mFieldValues;
+ private final RemoteViews mPresentation;
private final IntentSender mAuthentication;
private Dataset(Builder builder) {
- mName = builder.mName;
mFieldIds = builder.mFieldIds;
mFieldValues = builder.mFieldValues;
+ mPresentation = builder.mPresentation;
mAuthentication = builder.mAuthentication;
}
/** @hide */
- public @NonNull CharSequence getName() {
- return mName;
- }
-
- /** @hide */
public @Nullable ArrayList<AutoFillId> getFieldIds() {
return mFieldIds;
}
@@ -71,6 +68,11 @@
}
/** @hide */
+ public @Nullable RemoteViews getPresentation() {
+ return mPresentation;
+ }
+
+ /** @hide */
public @Nullable IntentSender getAuthentication() {
return mAuthentication;
}
@@ -84,11 +86,12 @@
public String toString() {
if (!DEBUG) return super.toString();
- final StringBuilder builder = new StringBuilder("Dataset [name=").append(mName)
+ return new StringBuilder("Dataset [")
.append(", fieldIds=").append(mFieldIds)
.append(", fieldValues=").append(mFieldValues)
- .append(", hasAuthentication=").append(mAuthentication != null);
- return builder.append(']').toString();
+ .append(", hasPresentation=").append(mPresentation != null)
+ .append(", hasAuthentication=").append(mAuthentication != null)
+ .append(']').toString();
}
/**
@@ -96,21 +99,20 @@
* one value for a field or set an authentication intent.
*/
public static final class Builder {
- private CharSequence mName;
private ArrayList<AutoFillId> mFieldIds;
private ArrayList<AutoFillValue> mFieldValues;
+ private RemoteViews mPresentation;
private IntentSender mAuthentication;
private boolean mDestroyed;
/**
* Creates a new builder.
*
- * @param name Name used to identify the dataset in the UI. Typically it's the same value as
- * the first field in the dataset (like username or email address) or a user-provided name
- * (like "My Work Address").
+ * @param presentation The presentation used to visualize this dataset.
*/
- public Builder(@NonNull CharSequence name) {
- mName = Preconditions.checkStringNotEmpty(name, "name cannot be empty or null");
+ public Builder(@NonNull RemoteViews presentation) {
+ Preconditions.checkNotNull(presentation, "presentation must be non-null");
+ mPresentation = presentation;
}
/**
@@ -119,7 +121,7 @@
* <p>This method is called when you need to provide an authentication
* UI for the data set. For example, when a data set contains credit card information
* (such as number, expiration date, and verification code), you can display UI
- * asking for the verification code to before filing in the data). Even if the
+ * asking for the verification code before filing in the data. Even if the
* data set is completely populated the system will launch the specified authentication
* intent and will need your approval to fill it in. Since the data set is "locked"
* until the user authenticates it, typically this data set name is masked
@@ -136,7 +138,7 @@
* android.app.Activity#RESULT_OK} and provide the fully populated {@link Dataset
* dataset} by setting it to the {@link
* android.view.autofill.AutoFillManager#EXTRA_AUTHENTICATION_RESULT} extra. For example,
- * if you provided an credit card information without the CVV for the data set in the
+ * if you provided credit card information without the CVV for the data set in the
* {@link FillResponse response} then the returned data set should contain the
* CVV entry.</p>
*
@@ -145,6 +147,7 @@
* platform needs to fill in the authentication arguments.</p>
*
* @param authentication Intent to an activity with your authentication flow.
+ * @return This builder.
*
* @see android.app.PendingIntent
*/
@@ -160,6 +163,7 @@
* @param id id returned by {@link
* android.app.assist.AssistStructure.ViewNode#getAutoFillId()}.
* @param value value to be auto filled.
+ * @return This builder.
*/
public @NonNull Builder setValue(@NonNull AutoFillId id, @NonNull AutoFillValue value) {
throwIfDestroyed();
@@ -182,14 +186,18 @@
/**
* Creates a new {@link Dataset} instance. You should not interact
- * with this builder once this method is called.
+ * with this builder once this method is called. It is required
+ * that you specified at least one field. Also it is mandatory to
+ * provide a presentation view to visualize the data set in the UI.
+ *
+ * @return The built dataset.
*/
public @NonNull Dataset build() {
throwIfDestroyed();
mDestroyed = true;
- if (mFieldIds == null && mAuthentication == null) {
+ if (mFieldIds == null) {
throw new IllegalArgumentException(
- "at least one value or an authentication must be set");
+ "at least one value must be set");
}
return new Dataset(this);
}
@@ -212,9 +220,9 @@
@Override
public void writeToParcel(Parcel parcel, int flags) {
- parcel.writeCharSequence(mName);
- parcel.writeTypedArrayList(mFieldIds, 0);
- parcel.writeTypedArrayList(mFieldValues, 0);
+ parcel.writeParcelable(mPresentation, flags);
+ parcel.writeTypedArrayList(mFieldIds, flags);
+ parcel.writeTypedArrayList(mFieldValues, flags);
parcel.writeParcelable(mAuthentication, flags);
}
@@ -224,7 +232,7 @@
// Always go through the builder to ensure the data ingested by
// the system obeys the contract of the builder to avoid attacks
// using specially crafted parcels.
- final Builder builder = new Builder(parcel.readCharSequence());
+ final Builder builder = new Builder(parcel.readParcelable(null));
final ArrayList<AutoFillId> ids = parcel.readTypedArrayList(null);
final ArrayList<AutoFillValue> values = parcel.readTypedArrayList(null);
final int idCount = (ids != null) ? ids.size() : 0;
diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java
index ea36e64..ba75c8b 100644
--- a/core/java/android/service/autofill/FillResponse.java
+++ b/core/java/android/service/autofill/FillResponse.java
@@ -15,21 +15,24 @@
*/
package android.service.autofill;
+import static android.view.autofill.Helper.DEBUG;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.IntentSender;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
-import android.util.ArraySet;
import android.view.autofill.AutoFillId;
import android.view.autofill.AutoFillManager;
+import android.widget.RemoteViews;
+
+import java.util.ArrayList;
/**
* Response for a {@link
* AutoFillService#onFillRequest(android.app.assist.AssistStructure,
- * Bundle, android.os.CancellationSignal, FillCallback)} and
- * authentication requests.
+ * Bundle, android.os.CancellationSignal, FillCallback)}.
*
* <p>The response typically contains one or more {@link Dataset}s, each representing a set of
* fields that can be auto-filled together, and the Android system displays a dataset picker UI
@@ -41,7 +44,7 @@
*
* <pre class="prettyprint">
* new FillResponse.Builder()
- * .add(new Dataset.Builder("homer")
+ * .add(new Dataset.Builder(createPresentation())
* .setTextFieldValue(id1, "homer")
* .setTextFieldValue(id2, "D'OH!")
* .build())
@@ -52,11 +55,11 @@
*
* <pre class="prettyprint">
* new FillResponse.Builder()
- * .add(new Dataset.Builder("Homer's Account")
+ * .add(new Dataset.Builder(createFirstPresentation())
* .setTextFieldValue(id1, "homer")
* .setTextFieldValue(id2, "D'OH!")
* .build())
- * .add(new Dataset.Builder("Bart's Account")
+ * .add(new Dataset.Builder(createSecondPresentation())
* .setTextFieldValue(id1, "elbarto")
* .setTextFieldValue(id2, "cowabonga")
* .build())
@@ -65,28 +68,30 @@
*
* <p>If the user does not have any data associated with this {@link android.app.Activity} but
* the service wants to offer the user the option to save the data that was entered, then the
- * service could populate the response with {@code savableIds} instead of {@link Dataset}s:
+ * service could populate the response with a {@link SaveInfo} instead of {@link Dataset}s:
*
* <pre class="prettyprint">
* new FillResponse.Builder()
- * .addSavableFields(id1, id2)
+ * .setSaveInfo(new SaveInfo.Builder(SaveInfo.SAVE_INFO_TYPE_CREDENTIALS)
+ * .addSavableFields(id1, id2))
* .build();
* </pre>
*
* <p>Similarly, there might be cases where the user data on the service is enough to populate some
* fields but not all, and the service would still be interested on saving the other fields. In this
- * scenario, the service could populate the response with both {@link Dataset}s and {@code
- * savableIds}:
+ * scenario, the service could populate the response with both {@link Dataset}s and
+ * {@link SaveInfo}:
*
* <pre class="prettyprint">
* new FillResponse.Builder()
- * .add(new Dataset.Builder("Homer")
+ * .add(new Dataset.Builder(createPresentation())
* .setTextFieldValue(id1, "Homer") // first name
* .setTextFieldValue(id2, "Simpson") // last name
* .setTextFieldValue(id3, "742 Evergreen Terrace") // street
* .setTextFieldValue(id4, "Springfield") // city
* .build())
- * .addSavableFields(id5, id6) // state and zipcode
+ * .setSaveInfo(new SaveInfo.Builder(SaveInfo.SAVE_INFO_TYPE_ADDRESS)
+ * .addSavableFields(id5, id6)) // state and zipcode
* .build();
*
* </pre>
@@ -108,27 +113,27 @@
*
* <pre class="prettyprint">
* new FillResponse.Builder()
- * .add(new Dataset.Builder("Homer")
+ * .add(new Dataset.Builder(createFirstPresentation())
* .setTextFieldValue(id1, "Homer")
* .setTextFieldValue(id2, "Simpson")
* .build())
- * .add(new Dataset.Builder("Bart")
+ * .add(new Dataset.Builder(createSecondPresentation())
* .setTextFieldValue(id1, "Bart")
* .setTextFieldValue(id2, "Simpson")
* .build())
* .build();
* </pre>
*
- * <p>Then after the user picks the {@code Homer} dataset and taps the {@code Street} field to
+ * <p>Then after the user picks the second dataset and taps the street field to
* trigger another auto-fill request, the second response could be:
*
* <pre class="prettyprint">
* new FillResponse.Builder()
- * .add(new Dataset.Builder("Home")
+ * .add(new Dataset.Builder(createThirdPresentation())
* .setTextFieldValue(id3, "742 Evergreen Terrace")
* .setTextFieldValue(id4, "Springfield")
* .build())
- * .add(new Dataset.Builder("Work")
+ * .add(new Dataset.Builder(createFourthPresentation())
* .setTextFieldValue(id3, "Springfield Power Plant")
* .setTextFieldValue(id4, "Springfield")
* .build())
@@ -136,33 +141,67 @@
* </pre>
*
* <p>The service could require user authentication at the {@link FillResponse} or the
- * {@link Dataset} level, prior to auto-filling an activity - see {@link FillResponse.Builder
- * #setAuthentication(IntentSender)} and {@link Dataset.Builder#setAuthentication(IntentSender)}.
- * It is recommended that you encrypt only the sensitive data but leave the labels unencrypted
- * which would allow you to provide the dataset names to the user and if they choose one
- * them challenge the user to onAuthenticate. For example, if the user has a home and a work
- * address the Home and Work labels could be stored unencrypted as they don't have any sensitive
- * data while the address data is in an encrypted storage. If the user chooses Home, then the
- * platform will start your authentication flow. If you encrypt all data and require auth
- * at the response level the user will have to interact with the fill UI to trigger a request
- * for the datasets as they don't see Home and Work options which will trigger your auth
- * flow and after successfully authenticating the user will be presented with the Home and
- * Work options where they can pick one. Hence, you have flexibility how to implement your
- * auth while storing labels non-encrypted and data encrypted provides a better user
- * experience.</p>
+ * {@link Dataset} level, prior to auto-filling an activity - see
+ * {@link FillResponse.Builder#setAuthentication(IntentSender, RemoteViews)} and
+ * {@link Dataset.Builder#setAuthentication(IntentSender)}.
+ *
+ * <p>It is recommended that you encrypt only the sensitive data but leave the labels unencrypted
+ * which would allow you to provide a dataset presentation views with labels and if the user
+ * chooses one of them challenge the user to authenticate. For example, if the user has a
+ * home and a work address the Home and Work labels could be stored unencrypted as they don't
+ * have any sensitive data while the address data is in an encrypted storage. If the user
+ * chooses Home, then the platform will start your authentication flow. If you encrypt all
+ * data and require auth at the response level the user will have to interact with the fill
+ * UI to trigger a request for the datasets (as they don't see the presentation views for the
+ * possible options) which will start your auth flow and after successfully authenticating
+ * the user will be presented with the Home and Work options to pick one. Hence, you have
+ * flexibility how to implement your auth while storing labels non-encrypted and data
+ * encrypted provides a better user experience.</p>
*/
public final class FillResponse implements Parcelable {
- private static final boolean DEBUG = false;
- private final ArraySet<Dataset> mDatasets;
- private final ArraySet<AutoFillId> mSavableIds;
+ private final ArrayList<Dataset> mDatasets;
+ private final SaveInfo mSaveInfo;
private final Bundle mExtras;
+ private final RemoteViews mPresentation;
private final IntentSender mAuthentication;
private FillResponse(@NonNull Builder builder) {
mDatasets = builder.mDatasets;
- mSavableIds = builder.mSavableIds;
+
+ if (false) {
+ // TODO(b/33197203, 35727295): this is how mSaveInfo will be set once we don't support
+ // FillResponse.setSavableIds()
+ mSaveInfo = builder.mSaveInfo;
+ if (mSaveInfo != null) {
+ mSaveInfo.addSavableIds(mDatasets);
+ if (mSaveInfo.getSavableIds() == null) {
+ throw new IllegalArgumentException(
+ "need to provide at least one savable id on SaveInfo");
+ }
+ }
+ } else {
+ // Temporary workaround to support FillResponse.setSavableIds()
+ SaveInfo saveInfo = builder.mSaveInfoBuilder != null ? builder.mSaveInfoBuilder.build()
+ : builder.mSaveInfo;
+
+ // Handle the the case where service didn't call setSavableIds() because it would
+ // contain just the ids from the datasets.
+ if (saveInfo == null && mDatasets != null) {
+ saveInfo = new SaveInfo.Builder(SaveInfo.SAVE_DATA_TYPE_GENERIC).build();
+ }
+ if (saveInfo != null) {
+ saveInfo.addSavableIds(mDatasets);
+ if (saveInfo.getSavableIds() == null) {
+ throw new IllegalArgumentException(
+ "need to provide at least one savable id on SaveInfo");
+ }
+ }
+ mSaveInfo = saveInfo;
+ }
+
mExtras = builder.mExtras;
+ mPresentation = builder.mPresentation;
mAuthentication = builder.mAuthentication;
}
@@ -172,13 +211,18 @@
}
/** @hide */
- public @Nullable ArraySet<Dataset> getDatasets() {
+ public @Nullable ArrayList<Dataset> getDatasets() {
return mDatasets;
}
/** @hide */
- public @Nullable ArraySet<AutoFillId> getSavableIds() {
- return mSavableIds;
+ public @Nullable SaveInfo getSaveInfo() {
+ return mSaveInfo;
+ }
+
+ /** @hide */
+ public @Nullable RemoteViews getPresentation() {
+ return mPresentation;
}
/** @hide */
@@ -188,23 +232,20 @@
/**
* Builder for {@link FillResponse} objects. You must to provide at least
- * one dataset or set an authentication intent.
+ * one dataset or set an authentication intent with a presentation view.
*/
public static final class Builder {
- private ArraySet<Dataset> mDatasets;
- private ArraySet<AutoFillId> mSavableIds;
+ private ArrayList<Dataset> mDatasets;
+ // TODO(b/33197203, 35727295): temporary builder use by deprecated addSavableIds() method,
+ // should be removed once that method is gone
+ private SaveInfo.Builder mSaveInfoBuilder;
+ private SaveInfo mSaveInfo;
private Bundle mExtras;
+ private RemoteViews mPresentation;
private IntentSender mAuthentication;
private boolean mDestroyed;
/**
- * Creates a new {@link FillResponse} builder.
- */
- public Builder() {
-
- }
-
- /**
* Requires a fill response authentication before auto-filling the activity with
* any data set in this response.
*
@@ -214,14 +255,15 @@
* auth on the data set level leading to a better user experience. Note that if you
* use sensitive data as a label, for example an email address, then it should also
* be encrypted. The provided {@link android.app.PendingIntent intent} must be an
- * activity which implements your authentication flow.</p>
+ * activity which implements your authentication flow. Also if you provide an auth
+ * intent you also need to specify the presentation view to be shown in the fill UI
+ * for the user to trigger your authentication flow.</p>
*
* <p>When a user triggers auto-fill, the system launches the provided intent
- * whose extras will have the {@link
- * AutoFillManager#EXTRA_ASSIST_STRUCTURE screen
+ * whose extras will have the {@link AutoFillManager#EXTRA_ASSIST_STRUCTURE screen
* content}. Once you complete your authentication flow you should set the activity
- * result to {@link android.app.Activity#RESULT_OK} and provide the fully populated {@link
- * FillResponse response} by setting it to the {@link
+ * result to {@link android.app.Activity#RESULT_OK} and provide the fully populated
+ * {@link FillResponse response} by setting it to the {@link
* AutoFillManager#EXTRA_AUTHENTICATION_RESULT} extra.
* For example, if you provided an empty {@link FillResponse resppnse} because the
* user's data was locked and marked that the response needs an authentication then
@@ -229,25 +271,36 @@
* available data sets some of which may need to be further authenticated, for
* example a credit card whose CVV needs to be entered.</p>
*
+ * <p>If you provide an authentication intent you must also provide a presentation
+ * which is used to visualize visualize the response for triggering the authentication
+ * flow.</p>
+ *
* <p></><strong>Note:</strong> Do not make the provided pending intent
* immutable by using {@link android.app.PendingIntent#FLAG_IMMUTABLE} as the
* platform needs to fill in the authentication arguments.</p>
*
* @param authentication Intent to an activity with your authentication flow.
+ * @param presentation The presentation to visualize the response.
+ * @return This builder.
*
* @see android.app.PendingIntent#getIntentSender()
*/
- public @NonNull Builder setAuthentication(@Nullable IntentSender authentication) {
+ public @NonNull Builder setAuthentication(@Nullable IntentSender authentication,
+ @Nullable RemoteViews presentation) {
throwIfDestroyed();
+ if (authentication == null ^ presentation == null) {
+ throw new IllegalArgumentException("authentication and presentation"
+ + " must be both non-null or null");
+ }
mAuthentication = authentication;
+ mPresentation = presentation;
return this;
}
/**
- * Adds a new {@link Dataset} to this response. Adding a dataset with the
- * same id updates the existing one.
+ * Adds a new {@link Dataset} to this response.
*
- * @throws IllegalArgumentException if a dataset with same {@code name} already exists.
+ * @return This builder.
*/
public@NonNull Builder addDataset(@Nullable Dataset dataset) {
throwIfDestroyed();
@@ -255,48 +308,42 @@
return this;
}
if (mDatasets == null) {
- mDatasets = new ArraySet<>();
- }
- final int datasetCount = mDatasets.size();
- for (int i = 0; i < datasetCount; i++) {
- if (mDatasets.valueAt(i).getName().equals(dataset.getName())) {
- throw new IllegalArgumentException("Duplicate dataset name: "
- + dataset.getName());
- }
+ mDatasets = new ArrayList<>();
}
if (!mDatasets.add(dataset)) {
return this;
}
- final int fieldCount = dataset.getFieldIds().size();
- for (int i = 0; i < fieldCount; i++) {
- final AutoFillId id = dataset.getFieldIds().get(i);
- if (mSavableIds == null) {
- mSavableIds = new ArraySet<>();
- }
- mSavableIds.add(id);
+ return this;
+ }
+
+ /** @hide */
+ // TODO(b/33197203, 35727295): remove when not used by clients
+ public @NonNull Builder addSavableFields(@Nullable AutoFillId... ids) {
+ throwIfDestroyed();
+ if (mSaveInfo != null) {
+ throw new IllegalStateException("setSaveInfo() already called");
}
+ if (mSaveInfoBuilder == null) {
+ mSaveInfoBuilder = new SaveInfo.Builder(SaveInfo.SAVE_DATA_TYPE_GENERIC);
+ }
+ mSaveInfoBuilder.addSavableIds(ids);
+
return this;
}
/**
- * Adds ids of additional fields that the service would be interested to save (through
- * {@link AutoFillService#onSaveRequest(
- * android.app.assist.AssistStructure, Bundle, SaveCallback)})
- * but were not indirectly set through {@link #addDataset(Dataset)}.
+ * Sets the {@link SaveInfo} associated with this response.
*
- * <p>See {@link FillResponse} for examples.
+ * <p>See {@link FillResponse} for more info.
+ *
+ * @return This builder.
*/
- public @NonNull Builder addSavableFields(@Nullable AutoFillId... ids) {
+ public @NonNull Builder setSaveInfo(@NonNull SaveInfo saveInfo) {
throwIfDestroyed();
- if (ids == null) {
- return this;
+ if (mSaveInfoBuilder != null) {
+ throw new IllegalStateException("addSavableFields() already called");
}
- for (AutoFillId id : ids) {
- if (mSavableIds == null) {
- mSavableIds = new ArraySet<>();
- }
- mSavableIds.add(id);
- }
+ mSaveInfo = saveInfo;
return this;
}
@@ -305,10 +352,11 @@
* manipulate this response. For example, they are passed to subsequent
* calls to {@link AutoFillService#onFillRequest(
* android.app.assist.AssistStructure, Bundle, android.os.CancellationSignal,
- * FillCallback)} and {@link
- * AutoFillService#onSaveRequest(
- * android.app.assist.AssistStructure, Bundle,
- * SaveCallback)}.
+ * FillCallback)} and {@link AutoFillService#onSaveRequest(
+ * android.app.assist.AssistStructure, Bundle, SaveCallback)}.
+ *
+ * @param extras The response extras.
+ * @return This builder.
*/
public Builder setExtras(Bundle extras) {
throwIfDestroyed();
@@ -317,10 +365,20 @@
}
/**
- * Builds a new {@link FillResponse} instance.
+ * Builds a new {@link FillResponse} instance. You must provide at least
+ * one dataset or some savable ids or an authentication with a presentation
+ * view.
+ *
+ * @return A built response.
*/
public FillResponse build() {
throwIfDestroyed();
+
+ if (mAuthentication == null && mDatasets == null && mSaveInfoBuilder == null
+ && mSaveInfo == null) {
+ throw new IllegalArgumentException("need to provide at least one DataSet or a "
+ + "SaveInfo or an authentication with a presentation");
+ }
mDestroyed = true;
return new FillResponse(this);
}
@@ -338,12 +396,14 @@
@Override
public String toString() {
if (!DEBUG) return super.toString();
- final StringBuilder builder = new StringBuilder(
+
+ return new StringBuilder(
"FillResponse: [datasets=").append(mDatasets)
- .append(", savableIds=").append(mSavableIds)
+ .append(", saveInfo=").append(mSaveInfo)
.append(", hasExtras=").append(mExtras != null)
- .append(", hasAuthentication=").append(mAuthentication != null);
- return builder.append(']').toString();
+ .append(", hasPresentation=").append(mPresentation != null)
+ .append(", hasAuthentication=").append(mAuthentication != null)
+ .toString();
}
/////////////////////////////////////
@@ -357,10 +417,11 @@
@Override
public void writeToParcel(Parcel parcel, int flags) {
- parcel.writeTypedArraySet(mDatasets, 0);
- parcel.writeTypedArraySet(mSavableIds, 0);
- parcel.writeParcelable(mExtras, 0);
- parcel.writeParcelable(mAuthentication, 0);
+ parcel.writeTypedArrayList(mDatasets, flags);
+ parcel.writeParcelable(mSaveInfo, flags);
+ parcel.writeParcelable(mExtras, flags);
+ parcel.writeParcelable(mAuthentication, flags);
+ parcel.writeParcelable(mPresentation, flags);
}
public static final Parcelable.Creator<FillResponse> CREATOR =
@@ -371,18 +432,15 @@
// the system obeys the contract of the builder to avoid attacks
// using specially crafted parcels.
final Builder builder = new Builder();
- final ArraySet<Dataset> datasets = parcel.readTypedArraySet(null);
+ final ArrayList<Dataset> datasets = parcel.readTypedArrayList(null);
final int datasetCount = (datasets != null) ? datasets.size() : 0;
for (int i = 0; i < datasetCount; i++) {
- builder.addDataset(datasets.valueAt(i));
+ builder.addDataset(datasets.get(i));
}
- final ArraySet<AutoFillId> fillIds = parcel.readTypedArraySet(null);
- final int fillIdCount = (fillIds != null) ? fillIds.size() : 0;
- for (int i = 0; i < fillIdCount; i++) {
- builder.addSavableFields(fillIds.valueAt(i));
- }
+ builder.setSaveInfo(parcel.readParcelable(null));
builder.setExtras(parcel.readParcelable(null));
- builder.setAuthentication(parcel.readParcelable(null));
+ builder.setAuthentication(parcel.readParcelable(null),
+ parcel.readParcelable(null));
return builder.build();
}
diff --git a/core/java/android/net/NetworkScorerAppManager.aidl b/core/java/android/service/autofill/SaveInfo.aidl
similarity index 88%
copy from core/java/android/net/NetworkScorerAppManager.aidl
copy to core/java/android/service/autofill/SaveInfo.aidl
index d968343..8cda608 100644
--- a/core/java/android/net/NetworkScorerAppManager.aidl
+++ b/core/java/android/service/autofill/SaveInfo.aidl
@@ -14,6 +14,6 @@
* limitations under the License.
*/
-package android.net;
+package android.service.autofill;
-parcelable NetworkScorerAppManager.NetworkScorerAppData;
+parcelable SaveInfo;
diff --git a/core/java/android/service/autofill/SaveInfo.java b/core/java/android/service/autofill/SaveInfo.java
new file mode 100644
index 0000000..096f28b
--- /dev/null
+++ b/core/java/android/service/autofill/SaveInfo.java
@@ -0,0 +1,263 @@
+/*
+ * 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.service.autofill;
+
+import static android.view.autofill.Helper.DEBUG;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.ArraySet;
+import android.view.autofill.AutoFillId;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+
+/**
+ * Information used to indicate that a service is interested on saving the user-inputed data for
+ * future use.
+ *
+ * <p>A {@link SaveInfo} is always associated with a {@link FillResponse}.
+ *
+ * <p>A {@link SaveInfo} must define the type it represents, and contain at least one
+ * {@code savableId}. A {@code savableId} is the {@link AutoFillId} of a view the service is
+ * interested to save in a {@code onSaveRequest()}; the ids of all {@link Dataset} present in the
+ * {@link FillResponse} associated with this {@link SaveInfo} are already marked as savable,
+ * but additional ids can be added through {@link Builder#addSavableIds(AutoFillId...)}.
+ *
+ * <p>See {@link AutoFillService#onSaveRequest(android.app.assist.AssistStructure, Bundle,
+ * SaveCallback)} and {@link FillResponse} for more info.
+ */
+public final class SaveInfo implements Parcelable {
+
+ /**
+ * Type used on when the service can save the contents of an activity, but cannot describe what
+ * the content is for.
+ */
+ public static final int SAVE_DATA_TYPE_GENERIC = 0;
+
+ /**
+ * Type used when the {@link FillResponse} represents user credentials that have a password.
+ */
+ public static final int SAVE_DATA_TYPE_PASSWORD = 1;
+
+
+ /**
+ * Type used on when the {@link FillResponse} represents a physical address (such as street,
+ * city, state, etc).
+ */
+ public static final int SAVE_DATA_TYPE_ADDRESS = 2;
+
+ /**
+ * Type used when the {@link FillResponse} represents a credit card.
+ */
+ public static final int SAVE_DATA_TYPE_CREDIT_CARD = 3;
+
+ private final @SaveDataType int mType;
+ private ArraySet<AutoFillId> mSavableIds;
+ private final CharSequence mDescription;
+
+ /** @hide */
+ @IntDef({
+ SAVE_DATA_TYPE_GENERIC,
+ SAVE_DATA_TYPE_PASSWORD,
+ SAVE_DATA_TYPE_ADDRESS,
+ SAVE_DATA_TYPE_CREDIT_CARD
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface SaveDataType {
+ }
+
+ private SaveInfo(Builder builder) {
+ mType = builder.mType;
+ mSavableIds = builder.mSavableIds;
+ mDescription = builder.mDescription;
+ }
+
+ /** @hide */
+ public @Nullable ArraySet<AutoFillId> getSavableIds() {
+ return mSavableIds;
+ }
+
+ /** @hide */
+ public int getType() {
+ return mType;
+ }
+
+ /** @hide */
+ public CharSequence getDescription() {
+ return mDescription;
+ }
+
+ /** @hide */
+ public void addSavableIds(@Nullable ArrayList<Dataset> datasets) {
+ if (datasets != null) {
+ for (Dataset dataset : datasets) {
+ final ArrayList<AutoFillId> ids = dataset.getFieldIds();
+ if (ids != null) {
+ final int fieldCount = ids.size();
+ for (int i = 0; i < fieldCount; i++) {
+ final AutoFillId id = ids.get(i);
+ if (mSavableIds == null) {
+ mSavableIds = new ArraySet<>();
+ }
+ mSavableIds.add(id);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * A builder for {@link SaveInfo} objects.
+ */
+ public static final class Builder {
+
+ private final @SaveDataType int mType;
+ private ArraySet<AutoFillId> mSavableIds;
+ private CharSequence mDescription;
+ private boolean mDestroyed;
+
+ /**
+ * Creates a new builder.
+ *
+ * @param type the type of information the associated {@link FillResponse} represents. Must
+ * be {@link SaveInfo#SAVE_DATA_TYPE_GENERIC}, {@link SaveInfo#SAVE_DATA_TYPE_PASSWORD},
+ * {@link SaveInfo#SAVE_DATA_TYPE_ADDRESS}, or {@link SaveInfo#SAVE_DATA_TYPE_CREDIT_CARD};
+ * otherwise it will assume {@link SaveInfo#SAVE_DATA_TYPE_GENERIC}.
+ */
+ public Builder(@SaveDataType int type) {
+ switch (type) {
+ case SAVE_DATA_TYPE_PASSWORD:
+ case SAVE_DATA_TYPE_ADDRESS:
+ case SAVE_DATA_TYPE_CREDIT_CARD:
+ mType = type;
+ break;
+ default:
+ mType = SAVE_DATA_TYPE_GENERIC;
+ }
+ }
+
+ /**
+ * Adds ids of additional views the service would be interested to save, but were not
+ * indirectly set through {@link FillResponse.Builder#addDataset(Dataset)}.
+ *
+ * @param ids The savable ids.
+ * @return This builder.
+ *
+ * @see FillResponse
+ */
+ public @NonNull Builder addSavableIds(@Nullable AutoFillId... ids) {
+ throwIfDestroyed();
+
+ if (ids == null) {
+ return this;
+ }
+ for (AutoFillId id : ids) {
+ if (mSavableIds == null) {
+ mSavableIds = new ArraySet<>();
+ }
+ mSavableIds.add(id);
+ }
+ return this;
+ }
+
+ /**
+ * Sets an optional description to be shown in the UI when the user is asked to save.
+ *
+ * <p>Typically, it describes how the data will be stored by the service, so it can help
+ * users to decide whether they can trust the service to save their data.
+ *
+ * @param description a succint description.
+ * @return This Builder.
+ */
+ public @NonNull Builder setDescription(@Nullable CharSequence description) {
+ mDescription = description;
+ return this;
+ }
+
+ /**
+ * Builds a new {@link SaveInfo} instance.
+ */
+ public SaveInfo build() {
+ throwIfDestroyed();
+ mDestroyed = true;
+ return new SaveInfo(this);
+ }
+
+ private void throwIfDestroyed() {
+ if (mDestroyed) {
+ throw new IllegalStateException("Already called #build()");
+ }
+ }
+
+ }
+
+ /////////////////////////////////////
+ // Object "contract" methods. //
+ /////////////////////////////////////
+ @Override
+ public String toString() {
+ if (!DEBUG) return super.toString();
+
+ return new StringBuilder("SaveInfo: [type=").append(mType)
+ .append(", savableIds=").append(mSavableIds)
+ .append("]").toString();
+ }
+
+ /////////////////////////////////////
+ // Parcelable "contract" methods. //
+ /////////////////////////////////////
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeInt(mType);
+ parcel.writeTypedArraySet(mSavableIds, flags);
+ parcel.writeCharSequence(mDescription);
+ }
+
+ public static final Parcelable.Creator<SaveInfo> CREATOR = new Parcelable.Creator<SaveInfo>() {
+ @Override
+ public SaveInfo createFromParcel(Parcel parcel) {
+ // Always go through the builder to ensure the data ingested by
+ // the system obeys the contract of the builder to avoid attacks
+ // using specially crafted parcels.
+ final Builder builder = new Builder(parcel.readInt());
+ final ArraySet<AutoFillId> savableIds = parcel.readTypedArraySet(null);
+ final int savableIdsCount = (savableIds != null) ? savableIds.size() : 0;
+ for (int i = 0; i < savableIdsCount; i++) {
+ builder.addSavableIds(savableIds.valueAt(i));
+ }
+ builder.setDescription(parcel.readCharSequence());
+ return builder.build();
+ }
+
+ @Override
+ public SaveInfo[] newArray(int size) {
+ return new SaveInfo[size];
+ }
+ };
+}
diff --git a/core/java/android/service/notification/Adjustment.java b/core/java/android/service/notification/Adjustment.java
index 9728fda..e39d53f 100644
--- a/core/java/android/service/notification/Adjustment.java
+++ b/core/java/android/service/notification/Adjustment.java
@@ -15,6 +15,8 @@
*/
package android.service.notification;
+import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.app.NotificationChannel;
import android.os.Bundle;
import android.os.Parcel;
@@ -22,7 +24,10 @@
/**
* Ranking updates from the Assistant.
+ * @hide
*/
+@SystemApi
+@TestApi
public final class Adjustment implements Parcelable {
private final String mPackage;
private final String mKey;
diff --git a/core/java/android/service/notification/NotificationAssistantService.java b/core/java/android/service/notification/NotificationAssistantService.java
index de86b2d..46609df 100644
--- a/core/java/android/service/notification/NotificationAssistantService.java
+++ b/core/java/android/service/notification/NotificationAssistantService.java
@@ -19,6 +19,8 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SdkConstant;
+import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.app.NotificationChannel;
import android.content.Context;
import android.content.Intent;
@@ -35,7 +37,10 @@
/**
* A service that helps the user manage notifications.
+ * @hide
*/
+@SystemApi
+@TestApi
public abstract class NotificationAssistantService extends NotificationListenerService {
private static final String TAG = "NotificationAssistants";
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index e5abdac..8a83b7a 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -16,6 +16,7 @@
package android.service.notification;
+import android.annotation.TestApi;
import android.app.NotificationChannel;
import android.os.Handler;
import android.os.Looper;
@@ -528,7 +529,10 @@
* @param key The key of the notification to snooze
* @param snoozeCriterionId The{@link SnoozeCriterion#getId()} of a context to snooze the
* notification until.
+ * @hide
*/
+ @SystemApi
+ @TestApi
public final void snoozeNotification(String key, String snoozeCriterionId) {
if (!isBound()) return;
try {
@@ -543,20 +547,20 @@
* Inform the notification manager about snoozing a specific notification.
* <p>
* Use this if your listener has a user interface that allows the user to snooze a notification
- * until a given time. It should be called after the user snoozes a single notification using
+ * for a time. It should be called after the user snoozes a single notification using
* your UI; upon being informed, the notification manager will actually remove the notification
* and you will get an {@link #onNotificationRemoved(StatusBarNotification)} callback. When the
* snoozing period expires, you will get a
* {@link #onNotificationPosted(StatusBarNotification, RankingMap)} callback for the
* notification.
* @param key The key of the notification to snooze
- * @param snoozeUntil A time in the future, in milliseconds.
+ * @param durationMs A duration to snooze the notification for, in milliseconds.
*/
- public final void snoozeNotification(String key, long snoozeUntil) {
+ public final void snoozeNotification(String key, long durationMs) {
if (!isBound()) return;
try {
getNotificationInterface().snoozeNotificationUntilFromListener(
- mWrapper, key, snoozeUntil);
+ mWrapper, key, durationMs);
} catch (android.os.RemoteException ex) {
Log.v(TAG, "Unable to contact notification manager", ex);
}
@@ -1257,7 +1261,10 @@
/**
* If the {@link NotificationAssistantService} has added people to this notification, then
* this will be non-null.
+ * @hide
*/
+ @SystemApi
+ @TestApi
public List<String> getAdditionalPeople() {
return mOverridePeople;
}
@@ -1266,7 +1273,10 @@
* Returns snooze criteria provided by the {@link NotificationAssistantService}. If your
* user interface displays options for snoozing notifications these criteria should be
* displayed as well.
+ * @hide
*/
+ @SystemApi
+ @TestApi
public List<SnoozeCriterion> getSnoozeCriteria() {
return mSnoozeCriteria;
}
diff --git a/core/java/android/service/notification/SnoozeCriterion.java b/core/java/android/service/notification/SnoozeCriterion.java
index f37f1ae..bd93eff 100644
--- a/core/java/android/service/notification/SnoozeCriterion.java
+++ b/core/java/android/service/notification/SnoozeCriterion.java
@@ -15,13 +15,18 @@
*/
package android.service.notification;
+import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Represents an option to be shown to users for snoozing a notification until a given context
* instead of for a fixed amount of time.
+ * @hide
*/
+@SystemApi
+@TestApi
public final class SnoozeCriterion implements Parcelable {
private final String mId;
private final CharSequence mExplanation;
diff --git a/core/java/android/service/trust/ITrustAgentService.aidl b/core/java/android/service/trust/ITrustAgentService.aidl
index 22b4d09..21661db 100644
--- a/core/java/android/service/trust/ITrustAgentService.aidl
+++ b/core/java/android/service/trust/ITrustAgentService.aidl
@@ -16,6 +16,7 @@
package android.service.trust;
import android.os.PersistableBundle;
+import android.os.UserHandle;
import android.service.trust.ITrustAgentServiceCallback;
/**
@@ -30,4 +31,7 @@
oneway void onDeviceUnlocked();
oneway void onConfigure(in List<PersistableBundle> options, IBinder token);
oneway void setCallback(ITrustAgentServiceCallback callback);
+ oneway void onEscrowTokenAdded(in byte[] token, long handle, in UserHandle user);
+ oneway void onTokenStateReceived(long handle, int tokenState);
+ oneway void onEscrowTokenRemoved(long handle, boolean successful);
}
diff --git a/core/java/android/service/trust/ITrustAgentServiceCallback.aidl b/core/java/android/service/trust/ITrustAgentServiceCallback.aidl
index ec66cc8..14df7cb 100644
--- a/core/java/android/service/trust/ITrustAgentServiceCallback.aidl
+++ b/core/java/android/service/trust/ITrustAgentServiceCallback.aidl
@@ -28,4 +28,8 @@
void revokeTrust();
void setManagingTrust(boolean managingTrust);
void onConfigureCompleted(boolean result, IBinder token);
+ void addEscrowToken(in byte[] token, int userId);
+ void isEscrowTokenActive(long handle, int userId);
+ void removeEscrowToken(long handle, int userId);
+ void unlockUserWithToken(long handle, in byte[] token, int userId);
}
diff --git a/core/java/android/service/trust/TrustAgentService.java b/core/java/android/service/trust/TrustAgentService.java
index 0d5177d..2b37a23 100644
--- a/core/java/android/service/trust/TrustAgentService.java
+++ b/core/java/android/service/trust/TrustAgentService.java
@@ -23,16 +23,20 @@
import android.app.Service;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
+import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
+import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
+import android.os.Message;
import android.os.PersistableBundle;
import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
import android.util.Log;
import android.util.Slog;
-
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
@@ -118,13 +122,44 @@
public @interface GrantTrustFlags {}
+ /**
+ * Int enum indicating that escrow token is active.
+ * See {@link #onEscrowTokenStateReceived(long, int)}
+ *
+ */
+ public static final int TOKEN_STATE_ACTIVE = 1;
+
+ /**
+ * Int enum indicating that escow token is inactive.
+ * See {@link #onEscrowTokenStateReceived(long, int)}
+ *
+ */
+ public static final int TOKEN_STATE_INACTIVE = 0;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag = true,
+ value = {
+ TOKEN_STATE_ACTIVE,
+ TOKEN_STATE_INACTIVE,
+ })
+ public @interface TokenState {}
+
private static final int MSG_UNLOCK_ATTEMPT = 1;
private static final int MSG_CONFIGURE = 2;
private static final int MSG_TRUST_TIMEOUT = 3;
private static final int MSG_DEVICE_LOCKED = 4;
private static final int MSG_DEVICE_UNLOCKED = 5;
private static final int MSG_UNLOCK_LOCKOUT = 6;
+ private static final int MSG_ESCROW_TOKEN_ADDED = 7;
+ private static final int MSG_ESCROW_TOKEN_STATE_RECEIVED = 8;
+ private static final int MSG_ESCROW_TOKEN_REMOVED = 9;
+ private static final String EXTRA_TOKEN = "token";
+ private static final String EXTRA_TOKEN_HANDLE = "token_handle";
+ private static final String EXTRA_USER_HANDLE = "user_handle";
+ private static final String EXTRA_TOKEN_STATE = "token_state";
+ private static final String EXTRA_TOKEN_REMOVED_RESULT = "token_removed_result";
/**
* Class containing raw data for a given configuration request.
*/
@@ -155,7 +190,7 @@
case MSG_UNLOCK_LOCKOUT:
onDeviceUnlockLockout(msg.arg1);
break;
- case MSG_CONFIGURE:
+ case MSG_CONFIGURE: {
ConfigurationData data = (ConfigurationData) msg.obj;
boolean result = onConfigure(data.options);
if (data.token != null) {
@@ -168,6 +203,7 @@
}
}
break;
+ }
case MSG_TRUST_TIMEOUT:
onTrustTimeout();
break;
@@ -177,6 +213,28 @@
case MSG_DEVICE_UNLOCKED:
onDeviceUnlocked();
break;
+ case MSG_ESCROW_TOKEN_ADDED: {
+ Bundle data = msg.getData();
+ byte[] token = data.getByteArray(EXTRA_TOKEN);
+ long handle = data.getLong(EXTRA_TOKEN_HANDLE);
+ UserHandle user = (UserHandle) data.getParcelable(EXTRA_USER_HANDLE);
+ onEscrowTokenAdded(token, handle, user);
+ break;
+ }
+ case MSG_ESCROW_TOKEN_STATE_RECEIVED: {
+ Bundle data = msg.getData();
+ long handle = data.getLong(EXTRA_TOKEN_HANDLE);
+ int tokenState = data.getInt(EXTRA_TOKEN_STATE, TOKEN_STATE_INACTIVE);
+ onEscrowTokenStateReceived(handle, tokenState);
+ break;
+ }
+ case MSG_ESCROW_TOKEN_REMOVED: {
+ Bundle data = msg.getData();
+ long handle = data.getLong(EXTRA_TOKEN_HANDLE);
+ boolean success = data.getBoolean(EXTRA_TOKEN_REMOVED_RESULT);
+ onEscrowTokenRemoved(handle, success);
+ break;
+ }
}
}
};
@@ -245,6 +303,38 @@
public void onDeviceUnlockLockout(long timeoutMs) {
}
+ /**
+ * Called when an escrow token is added for user userId.
+ *
+ * @param token the added token
+ * @param handle the handle to the corresponding internal synthetic password. A user is unlocked
+ * by presenting both handle and escrow token.
+ * @param user the user to which the escrow token is added.
+ *
+ */
+ public void onEscrowTokenAdded(byte[] token, long handle, UserHandle user) {
+ }
+
+ /**
+ * Called when an escrow token state is received upon request.
+ *
+ * @param handle the handle to the internal synthetic password.
+ * @param state the state of the requested escrow token, see {@link TokenState}.
+ *
+ */
+ public void onEscrowTokenStateReceived(long handle, @TokenState int tokenState) {
+ }
+
+ /**
+ * Called when an escrow token is removed.
+ *
+ * @param handle the handle to the removed the synthetic password.
+ * @param successful whether the removing operaiton is achieved.
+ *
+ */
+ public void onEscrowTokenRemoved(long handle, boolean successful) {
+ }
+
private void onError(String msg) {
Slog.v(TAG, "Remote exception while " + msg);
}
@@ -257,7 +347,7 @@
* <p>Agents that support configuration options should overload this method and return 'true'.
*
* @param options The aggregated list of options or an empty list if no restrictions apply.
- * @return true if the {@link TrustAgentService} supports configuration options.
+ * @return true if the {@link } supports configuration options.
*/
public boolean onConfigure(List<PersistableBundle> options) {
return false;
@@ -373,6 +463,106 @@
}
}
+ /**
+ * Call to add an escrow token to derive a synthetic password. A synthetic password is an
+ * alternaive to the user-set password/pin/pattern in order to unlock encrypted disk. An escrow
+ * token can be taken and internally derive the synthetic password. The new added token will not
+ * be acivated until the user input the correct PIN/Passcode/Password once.
+ *
+ * Result will be return by callback {@link #onEscrowTokenAdded(long, int)}
+ *
+ * @param token an escrow token of high entropy.
+ * @param user the user which the escrow token will be added to.
+ *
+ */
+ public final void addEscrowToken(byte[] token, UserHandle user) {
+ synchronized (mLock) {
+ if (mCallback == null) {
+ Slog.w(TAG, "Cannot add escrow token if the agent is not connecting to framework");
+ throw new IllegalStateException("Trust agent is not connected");
+ }
+ try {
+ mCallback.addEscrowToken(token, user.getIdentifier());
+ } catch (RemoteException e) {
+ onError("calling addEscrowToken");
+ }
+ }
+ }
+
+ /**
+ * Call to check the active state of an escrow token.
+ *
+ * Result will be return in callback {@link #onEscrowTokenStateReceived(long, boolean)}
+ *
+ * @param handle the handle of escrow token to the internal synthetic password.
+ * @param user the user which the escrow token is added to.
+ *
+ */
+ public final void isEscrowTokenActive(long handle, UserHandle user) {
+ synchronized (mLock) {
+ if (mCallback == null) {
+ Slog.w(TAG, "Cannot add escrow token if the agent is not connecting to framework");
+ throw new IllegalStateException("Trust agent is not connected");
+ }
+ try {
+ mCallback.isEscrowTokenActive(handle, user.getIdentifier());
+ } catch (RemoteException e) {
+ onError("calling isEscrowTokenActive");
+ }
+ }
+ }
+
+ /**
+ * Call to remove the escrow token.
+ *
+ * Result will be return in callback {@link #onEscrowTokenRemoved(long, boolean)}
+ *
+ * @param handle the handle of escrow tokent to the internal synthetic password.
+ * @param user the user id which the escrow token is added to.
+ *
+ */
+ public final void removeEscrowToken(long handle, UserHandle user) {
+ synchronized (mLock) {
+ if (mCallback == null) {
+ Slog.w(TAG, "Cannot add escrow token if the agent is not connecting to framework");
+ throw new IllegalStateException("Trust agent is not connected");
+ }
+ try {
+ mCallback.removeEscrowToken(handle, user.getIdentifier());
+ } catch (RemoteException e) {
+ onError("callling removeEscrowToken");
+ }
+ }
+ }
+
+ /**
+ * Call to unlock user's FBE.
+ *
+ * @param handle the handle of escrow tokent to the internal synthetic password.
+ * @param token the escrow token
+ * @param user the user about to be unlocked.
+ *
+ */
+ public final void unlockUserWithToken(long handle, byte[] token, UserHandle user) {
+ UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
+ if (um.isUserUnlocked()) {
+ Slog.i(TAG, "User already unlocked");
+ return;
+ }
+
+ synchronized (mLock) {
+ if (mCallback == null) {
+ Slog.w(TAG, "Cannot add escrow token if the agent is not connecting to framework");
+ throw new IllegalStateException("Trust agent is not connected");
+ }
+ try {
+ mCallback.unlockUserWithToken(handle, token, user.getIdentifier());
+ } catch (RemoteException e) {
+ onError("calling unlockUserWithToken");
+ }
+ }
+ }
+
@Override
public final IBinder onBind(Intent intent) {
if (DEBUG) Slog.v(TAG, "onBind() intent = " + intent);
@@ -430,6 +620,28 @@
}
}
}
- }
+ @Override
+ public void onEscrowTokenAdded(byte[] token, long handle, UserHandle user) {
+ Message msg = mHandler.obtainMessage(MSG_ESCROW_TOKEN_ADDED);
+ msg.getData().putByteArray(EXTRA_TOKEN, token);
+ msg.getData().putLong(EXTRA_TOKEN_HANDLE, handle);
+ msg.getData().putParcelable(EXTRA_USER_HANDLE, user);
+ msg.sendToTarget();
+ }
+
+ public void onTokenStateReceived(long handle, int tokenState) {
+ Message msg = mHandler.obtainMessage(MSG_ESCROW_TOKEN_STATE_RECEIVED);
+ msg.getData().putLong(EXTRA_TOKEN_HANDLE, handle);
+ msg.getData().putInt(EXTRA_TOKEN_STATE, tokenState);
+ msg.sendToTarget();
+ }
+
+ public void onEscrowTokenRemoved(long handle, boolean successful) {
+ Message msg = mHandler.obtainMessage(MSG_ESCROW_TOKEN_REMOVED);
+ msg.getData().putLong(EXTRA_TOKEN_HANDLE, handle);
+ msg.getData().putBoolean(EXTRA_TOKEN_REMOVED_RESULT, successful);
+ msg.sendToTarget();
+ }
+ }
}
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 64f0222..483a49b 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -289,7 +289,7 @@
public void resized(Rect frame, Rect overscanInsets, Rect contentInsets,
Rect visibleInsets, Rect stableInsets, Rect outsets, boolean reportDraw,
Configuration newConfig, Rect backDropRect, boolean forceLayout,
- boolean alwaysConsumeNavBar) {
+ boolean alwaysConsumeNavBar, int displayId) {
Message msg = mCaller.obtainMessageIO(MSG_WINDOW_RESIZED,
reportDraw ? 1 : 0, outsets);
mCaller.sendMessage(msg);
diff --git a/core/java/android/text/Emoji.java b/core/java/android/text/Emoji.java
index b6d720d..83810b0 100644
--- a/core/java/android/text/Emoji.java
+++ b/core/java/android/text/Emoji.java
@@ -164,6 +164,8 @@
public static int VARIATION_SELECTOR_16 = 0xFE0F;
+ public static int CANCEL_TAG = 0xE007F;
+
// Returns true if the given code point is regional indicator symbol.
public static boolean isRegionalIndicatorSymbol(int codepoint) {
return 0x1F1E6 <= codepoint && codepoint <= 0x1F1FF;
@@ -188,4 +190,13 @@
public static boolean isKeycapBase(int codePoint) {
return ('0' <= codePoint && codePoint <= '9') || codePoint == '#' || codePoint == '*';
}
+
+ /**
+ * Returns true if the character can be a part of tag_spec in emoji tag sequence.
+ *
+ * Note that 0xE007F (CANCEL TAG) is not included.
+ */
+ public static boolean isTagSpecChar(int codePoint) {
+ return 0xE0020 <= codePoint && codePoint <= 0xE007E;
+ }
}
diff --git a/core/java/android/text/Hyphenator.java b/core/java/android/text/Hyphenator.java
index 356804e..80ec03e 100644
--- a/core/java/android/text/Hyphenator.java
+++ b/core/java/android/text/Hyphenator.java
@@ -189,7 +189,9 @@
// TODO: replace this with a discovery-based method that looks into /system/usr/hyphen-data
String[] availableLanguages = {
"as",
+ "bg",
"bn",
+ "cu",
"cy",
"da",
"de-1901", "de-1996", "de-CH-1901",
diff --git a/core/java/android/text/SpannableStringInternal.java b/core/java/android/text/SpannableStringInternal.java
index 60d8a0f..4b02df86 100644
--- a/core/java/android/text/SpannableStringInternal.java
+++ b/core/java/android/text/SpannableStringInternal.java
@@ -53,16 +53,12 @@
* @param end End index in the source object.
*/
private final void copySpans(Spanned src, int start, int end) {
- final Object[] spans = src.getSpans(start, end, Object.class);
+ Object[] spans = src.getSpans(start, end, Object.class);
for (int i = 0; i < spans.length; i++) {
- if (spans[i] instanceof NoCopySpan) {
- continue;
- }
-
int st = src.getSpanStart(spans[i]);
int en = src.getSpanEnd(spans[i]);
- final int fl = src.getSpanFlags(spans[i]);
+ int fl = src.getSpanFlags(spans[i]);
if (st < start)
st = start;
@@ -82,42 +78,33 @@
* @param end End index in the source object.
*/
private final void copySpans(SpannableStringInternal src, int start, int end) {
- int count = 0;
- boolean includesNoCopySpan = false;
- final int[] srcData = src.mSpanData;
- final Object[] srcSpans = src.mSpans;
- final int limit = src.mSpanCount;
-
- for (int i = 0; i < limit; i++) {
- int spanStart = srcData[i * COLUMNS + START];
- int spanEnd = srcData[i * COLUMNS + END];
- if (isOutOfCopyRange(start, end, spanStart, spanEnd)) continue;
- if (srcSpans[i] instanceof NoCopySpan) {
- includesNoCopySpan = true;
- continue;
- }
- count++;
- }
-
- if (count == 0) return;
-
- if (!includesNoCopySpan && start == 0 && end == src.length()) {
+ if (start == 0 && end == src.length()) {
mSpans = ArrayUtils.newUnpaddedObjectArray(src.mSpans.length);
mSpanData = new int[src.mSpanData.length];
mSpanCount = src.mSpanCount;
System.arraycopy(src.mSpans, 0, mSpans, 0, src.mSpans.length);
System.arraycopy(src.mSpanData, 0, mSpanData, 0, mSpanData.length);
} else {
+ int count = 0;
+ int[] srcData = src.mSpanData;
+ int limit = src.mSpanCount;
+ for (int i = 0; i < limit; i++) {
+ int spanStart = srcData[i * COLUMNS + START];
+ int spanEnd = srcData[i * COLUMNS + END];
+ if (isOutOfCopyRange(start, end, spanStart, spanEnd)) continue;
+ count++;
+ }
+
+ if (count == 0) return;
+
+ Object[] srcSpans = src.mSpans;
mSpanCount = count;
mSpans = ArrayUtils.newUnpaddedObjectArray(mSpanCount);
mSpanData = new int[mSpans.length * COLUMNS];
for (int i = 0, j = 0; i < limit; i++) {
int spanStart = srcData[i * COLUMNS + START];
int spanEnd = srcData[i * COLUMNS + END];
- if (isOutOfCopyRange(start, end, spanStart, spanEnd)
- || srcSpans[i] instanceof NoCopySpan) {
- continue;
- }
+ if (isOutOfCopyRange(start, end, spanStart, spanEnd)) continue;
if (spanStart < start) spanStart = start;
if (spanEnd > end) spanEnd = end;
diff --git a/core/java/android/text/method/BaseKeyListener.java b/core/java/android/text/method/BaseKeyListener.java
index 90559dc..5f0a46d 100644
--- a/core/java/android/text/method/BaseKeyListener.java
+++ b/core/java/android/text/method/BaseKeyListener.java
@@ -145,8 +145,11 @@
// The number of following RIS code points is even.
final int STATE_EVEN_NUMBERED_RIS = 11;
+ // The offset is in emoji tag sequence.
+ final int STATE_IN_TAG_SEQUENCE = 12;
+
// The state machine has been stopped.
- final int STATE_FINISHED = 12;
+ final int STATE_FINISHED = 13;
int deleteCharCount = 0; // Char count to be deleted by backspace.
int lastSeenVSCharCount = 0; // Char count of previous variation selector.
@@ -173,6 +176,8 @@
state = STATE_BEFORE_KEYCAP;
} else if (Emoji.isEmoji(codePoint)) {
state = STATE_BEFORE_EMOJI;
+ } else if (codePoint == Emoji.CANCEL_TAG) {
+ state = STATE_IN_TAG_SEQUENCE;
} else {
state = STATE_FINISHED;
}
@@ -275,6 +280,20 @@
state = STATE_FINISHED;
}
break;
+ case STATE_IN_TAG_SEQUENCE:
+ if (Emoji.isTagSpecChar(codePoint)) {
+ deleteCharCount += 2; /* Char count of emoji tag spec character. */
+ // Keep the same state.
+ } else if (Emoji.isEmoji(codePoint)) {
+ deleteCharCount += Character.charCount(codePoint);
+ state = STATE_FINISHED;
+ } else {
+ // Couldn't find tag_base character. Delete the last tag_term character.
+ deleteCharCount = 2; // for U+E007F
+ state = STATE_FINISHED;
+ }
+ // TODO: Need handle emoji variation selectors. Issue 35224297
+ break;
default:
throw new IllegalArgumentException("state " + state + " is unknown");
}
diff --git a/core/java/android/transition/Fade.java b/core/java/android/transition/Fade.java
index b0de711..38b89dc 100644
--- a/core/java/android/transition/Fade.java
+++ b/core/java/android/transition/Fade.java
@@ -103,6 +103,7 @@
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Fade);
int fadingMode = a.getInt(R.styleable.Fade_fadingMode, getMode());
setMode(fadingMode);
+ a.recycle();
}
@Override
diff --git a/core/java/android/transition/TransitionInflater.java b/core/java/android/transition/TransitionInflater.java
index 4c5a717..0cc981e 100644
--- a/core/java/android/transition/TransitionInflater.java
+++ b/core/java/android/transition/TransitionInflater.java
@@ -276,9 +276,11 @@
transition.addTarget(clazz);
}
} catch (ClassNotFoundException e) {
+ a.recycle();
throw new RuntimeException("Could not create " + className, e);
}
}
+ a.recycle();
} else {
throw new RuntimeException("Unknown scene name: " + parser.getName());
}
diff --git a/core/java/android/util/Half.java b/core/java/android/util/Half.java
index e4f8dd1..84c2e83 100644
--- a/core/java/android/util/Half.java
+++ b/core/java/android/util/Half.java
@@ -17,9 +17,13 @@
package android.util;
import android.annotation.HalfFloat;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+
+import sun.misc.FloatingDecimal;
/**
- * <p>Half is a utility class to manipulate half-precision 16-bit
+ * <p>The {@code Half} class is a wrapper and a utility class to manipulate half-precision 16-bit
* <a href="https://en.wikipedia.org/wiki/Half-precision_floating-point_format">IEEE 754</a>
* floating point data types (also called fp16 or binary16). A half-precision float can be
* created from or converted to single-precision floats, and is stored in a short data type.
@@ -88,7 +92,7 @@
* <p>This table shows that numbers higher than 1024 lose all fractional precision.</p>
*/
@SuppressWarnings("SimplifiableIfStatement")
-public final class Half {
+public final class Half extends Number implements Comparable<Half> {
/**
* The number of bits used to represent a half-precision float value.
*/
@@ -164,7 +168,332 @@
private static final int FP32_DENORMAL_MAGIC = 126 << 23;
private static final float FP32_DENORMAL_FLOAT = Float.intBitsToFloat(FP32_DENORMAL_MAGIC);
- private Half() {
+ private final @HalfFloat short mValue;
+
+ /**
+ * Constructs a newly allocated {@code Half} object that represents the
+ * half-precision float type argument.
+ *
+ * @param value The value to be represented by the {@code Half}
+ */
+ public Half(@HalfFloat short value) {
+ mValue = value;
+ }
+
+ /**
+ * Constructs a newly allocated {@code Half} object that represents the
+ * argument converted to a half-precision float.
+ *
+ * @param value The value to be represented by the {@code Half}
+ *
+ * @see #toHalf(float)
+ */
+ public Half(float value) {
+ mValue = toHalf(value);
+ }
+
+ /**
+ * Constructs a newly allocated {@code Half} object that
+ * represents the argument converted to a half-precision float.
+ *
+ * @param value The value to be represented by the {@code Half}
+ *
+ * @see #toHalf(float)
+ */
+ public Half(double value) {
+ mValue = toHalf((float) value);
+ }
+
+ /**
+ * <p>Constructs a newly allocated {@code Half} object that represents the
+ * half-precision float value represented by the string.
+ * The string is converted to a half-precision float value as if by the
+ * {@link #valueOf(String)} method.</p>
+ *
+ * <p>Calling this constructor is equivalent to calling:</p>
+ * <pre>
+ * new Half(Float.parseFloat(value))
+ * </pre>
+ *
+ * @param value A string to be converted to a {@code Half}
+ * @throws NumberFormatException if the string does not contain a parsable number
+ *
+ * @see Float#valueOf(java.lang.String)
+ * @see #toHalf(float)
+ */
+ public Half(@NonNull String value) throws NumberFormatException {
+ mValue = toHalf(Float.parseFloat(value));
+ }
+
+ /**
+ * Returns the half-precision value of this {@code Half} as a {@code short}
+ * containing the bit representation described in {@link Half}.
+ *
+ * @return The half-precision float value represented by this object
+ */
+ public @HalfFloat short halfValue() {
+ return mValue;
+ }
+
+ /**
+ * Returns the value of this {@code Half} as a {@code byte} after
+ * a narrowing primitive conversion.
+ *
+ * @return The half-precision float value represented by this object
+ * converted to type {@code byte}
+ */
+ @Override
+ public byte byteValue() {
+ return (byte) toFloat(mValue);
+ }
+
+ /**
+ * Returns the value of this {@code Half} as a {@code short} after
+ * a narrowing primitive conversion.
+ *
+ * @return The half-precision float value represented by this object
+ * converted to type {@code short}
+ */
+ @Override
+ public short shortValue() {
+ return (short) toFloat(mValue);
+ }
+
+ /**
+ * Returns the value of this {@code Half} as a {@code int} after
+ * a narrowing primitive conversion.
+ *
+ * @return The half-precision float value represented by this object
+ * converted to type {@code int}
+ */
+ @Override
+ public int intValue() {
+ return (int) toFloat(mValue);
+ }
+
+ /**
+ * Returns the value of this {@code Half} as a {@code long} after
+ * a narrowing primitive conversion.
+ *
+ * @return The half-precision float value represented by this object
+ * converted to type {@code long}
+ */
+ @Override
+ public long longValue() {
+ return (long) toFloat(mValue);
+ }
+
+ /**
+ * Returns the value of this {@code Half} as a {@code float} after
+ * a widening primitive conversion.
+ *
+ * @return The half-precision float value represented by this object
+ * converted to type {@code float}
+ */
+ @Override
+ public float floatValue() {
+ return toFloat(mValue);
+ }
+
+ /**
+ * Returns the value of this {@code Half} as a {@code double} after
+ * a widening primitive conversion.
+ *
+ * @return The half-precision float value represented by this object
+ * converted to type {@code double}
+ */
+ @Override
+ public double doubleValue() {
+ return toFloat(mValue);
+ }
+
+ /**
+ * Returns true if this {@code Half} value represents a Not-a-Number,
+ * false otherwise.
+ *
+ * @return True if the value is a NaN, false otherwise
+ */
+ public boolean isNaN() {
+ return isNaN(mValue);
+ }
+
+ /**
+ * Compares this object against the specified object. The result is {@code true}
+ * if and only if the argument is not {@code null} and is a {@code Half} object
+ * that represents the same half-precision value as the this object. Two
+ * half-precision values are considered to be the same if and only if the method
+ * {@link #halfToIntBits(short)} returns an identical {@code int} value for both.
+ *
+ * @param o The object to compare
+ * @return True if the objects are the same, false otherwise
+ *
+ * @see #halfToIntBits(short)
+ */
+ @Override
+ public boolean equals(@Nullable Object o) {
+ return (o instanceof Half) &&
+ (halfToIntBits(((Half) o).mValue) == halfToIntBits(mValue));
+ }
+
+ /**
+ * Returns a hash code for this {@code Half} object. The result is the
+ * integer bit representation, exactly as produced by the method
+ * {@link #halfToIntBits(short)}, of the primitive half-precision float
+ * value represented by this {@code Half} object.
+ *
+ * @return A hash code value for this object
+ */
+ @Override
+ public int hashCode() {
+ return hashCode(mValue);
+ }
+
+ /**
+ * Returns a string representation of the specified half-precision
+ * float value. See {@link #toString(short)} for more information.
+ *
+ * @return A string representation of this {@code Half} object
+ */
+ @NonNull
+ @Override
+ public String toString() {
+ return toString(mValue);
+ }
+
+ /**
+ * <p>Compares the two specified half-precision float values. The following
+ * conditions apply during the comparison:</p>
+ *
+ * <ul>
+ * <li>{@link #NaN} is considered by this method to be equal to itself and greater
+ * than all other half-precision float values (including {@code #POSITIVE_INFINITY})</li>
+ * <li>{@link #POSITIVE_ZERO} is considered by this method to be greater than
+ * {@link #NEGATIVE_ZERO}.</li>
+ * </ul>
+ *
+ * @param h The half-precision float value to compare to the half-precision value
+ * represented by this {@code Half} object
+ *
+ * @return The value {@code 0} if {@code x} is numerically equal to {@code y}; a
+ * value less than {@code 0} if {@code x} is numerically less than {@code y};
+ * and a value greater than {@code 0} if {@code x} is numerically greater
+ * than {@code y}
+ */
+ @Override
+ public int compareTo(@NonNull Half h) {
+ return compare(mValue, h.mValue);
+ }
+
+ /**
+ * Returns a hash code for a half-precision float value.
+ *
+ * @param h The value to hash
+ *
+ * @return A hash code value for a half-precision float value
+ */
+ public static int hashCode(@HalfFloat short h) {
+ return halfToIntBits(h);
+ }
+
+ /**
+ * <p>Compares the two specified half-precision float values. The following
+ * conditions apply during the comparison:</p>
+ *
+ * <ul>
+ * <li>{@link #NaN} is considered by this method to be equal to itself and greater
+ * than all other half-precision float values (including {@code #POSITIVE_INFINITY})</li>
+ * <li>{@link #POSITIVE_ZERO} is considered by this method to be greater than
+ * {@link #NEGATIVE_ZERO}.</li>
+ * </ul>
+ *
+ * @param x The first half-precision float value to compare.
+ * @param y The second half-precision float value to compare
+ *
+ * @return The value {@code 0} if {@code x} is numerically equal to {@code y}, a
+ * value less than {@code 0} if {@code x} is numerically less than {@code y},
+ * and a value greater than {@code 0} if {@code x} is numerically greater
+ * than {@code y}
+ */
+ public static int compare(@HalfFloat short x, @HalfFloat short y) {
+ if (less(x, y)) return -1;
+ if (greater(x, y)) return 1;
+
+ // Collapse NaNs, akin to halfToIntBits(), but we want to keep
+ // (signed) short value types to preserve the ordering of -0.0
+ // and +0.0
+ short xBits = (x & FP16_COMBINED) > FP16_EXPONENT_MAX ? NaN : x;
+ short yBits = (y & FP16_COMBINED) > FP16_EXPONENT_MAX ? NaN : y;
+
+ return (xBits == yBits ? 0 : (xBits < yBits ? -1 : 1));
+ }
+
+ /**
+ * <p>Returns a representation of the specified half-precision float value
+ * according to the bit layout described in {@link Half}.</p>
+ *
+ * <p>Similar to {@link #halfToIntBits(short)}, this method collapses all
+ * possible Not-a-Number values to a single canonical Not-a-Number value
+ * defined by {@link #NaN}.</p>
+ *
+ * @param h A half-precision float value
+ * @return The bits that represent the half-precision float value
+ *
+ * @see #halfToIntBits(short)
+ */
+ public static @HalfFloat short halfToShortBits(@HalfFloat short h) {
+ return (h & FP16_COMBINED) > FP16_EXPONENT_MAX ? NaN : h;
+ }
+
+ /**
+ * <p>Returns a representation of the specified half-precision float value
+ * according to the bit layout described in {@link Half}.</p>
+ *
+ * <p>Unlike {@link #halfToRawIntBits(short)}, this method collapses all
+ * possible Not-a-Number values to a single canonical Not-a-Number value
+ * defined by {@link #NaN}.</p>
+ *
+ * @param h A half-precision float value
+ * @return The bits that represent the half-precision float value
+ *
+ * @see #halfToRawIntBits(short)
+ * @see #halfToShortBits(short)
+ * @see #intBitsToHalf(int)
+ */
+ public static int halfToIntBits(@HalfFloat short h) {
+ return (h & FP16_COMBINED) > FP16_EXPONENT_MAX ? NaN : h & 0xffff;
+ }
+
+ /**
+ * <p>Returns a representation of the specified half-precision float value
+ * according to the bit layout described in {@link Half}.</p>
+ *
+ * <p>The argument is considered to be a representation of a half-precision
+ * float value according to the bit layout described in {@link Half}. The 16
+ * most significant bits of the returned value are set to 0.</p>
+ *
+ * @param h A half-precision float value
+ * @return The bits that represent the half-precision float value
+ *
+ * @see #halfToIntBits(short)
+ * @see #intBitsToHalf(int)
+ */
+ public static int halfToRawIntBits(@HalfFloat short h) {
+ return h & 0xffff;
+ }
+
+ /**
+ * <p>Returns the half-precision float value corresponding to a given
+ * bit representation.</p>
+ *
+ * <p>The argument is considered to be a representation of a half-precision
+ * float value according to the bit layout described in {@link Half}. The 16
+ * most significant bits of the argument are ignored.</p>
+ *
+ * @param bits An integer
+ * @return The half-precision float value with the same bit pattern
+ */
+ public static @HalfFloat short intBitsToHalf(int bits) {
+ return (short) (bits & 0xffff);
}
/**
@@ -509,7 +838,7 @@
* infinity, false otherwise.
*
* @param h A half-precision float value
- * @return true if the value is positive infinity or negative infinity,
+ * @return True if the value is positive infinity or negative infinity,
* false otherwise
*/
public static boolean isInfinite(@HalfFloat short h) {
@@ -521,7 +850,7 @@
* a Not-a-Number, false otherwise.
*
* @param h A half-precision float value
- * @return true if the value is a NaN, false otherwise
+ * @return True if the value is a NaN, false otherwise
*/
public static boolean isNaN(@HalfFloat short h) {
return (h & FP16_COMBINED) > FP16_EXPONENT_MAX;
@@ -535,7 +864,7 @@
* number, this method returns false.
*
* @param h A half-precision float value
- * @return true if the value is normalized, false otherwise
+ * @return True if the value is normalized, false otherwise
*/
public static boolean isNormalized(@HalfFloat short h) {
return (h & FP16_EXPONENT_MAX) != 0 && (h & FP16_EXPONENT_MAX) != FP16_EXPONENT_MAX;
@@ -608,7 +937,7 @@
* @return A half-precision float value
*/
@SuppressWarnings("StatementWithEmptyBody")
- public static @HalfFloat short valueOf(float f) {
+ public static @HalfFloat short toHalf(float f) {
int bits = Float.floatToRawIntBits(f);
int s = (bits >>> FP32_SIGN_SHIFT );
int e = (bits >>> FP32_EXPONENT_SHIFT) & FP32_EXPONENT_MASK;
@@ -650,6 +979,57 @@
}
/**
+ * Returns a {@code Half} instance representing the specified
+ * half-precision float value.
+ *
+ * @param h A half-precision float value
+ * @return a {@code Half} instance representing {@code h}
+ */
+ public static @NonNull Half valueOf(@HalfFloat short h) {
+ return new Half(h);
+ }
+
+ /**
+ * Returns a {@code Half} instance representing the specified float value.
+ *
+ * @param f A float value
+ * @return a {@code Half} instance representing {@code f}
+ */
+ public static @NonNull Half valueOf(float f) {
+ return new Half(f);
+ }
+
+ /**
+ * Returns a {@code Half} instance representing the specified string value.
+ * Calling this method is equivalent to calling
+ * <code>toHalf(Float.parseString(h))</code>. See {@link Float#valueOf(String)}
+ * for more information on the format of the string representation.
+ *
+ * @param s The string to be parsed
+ * @return a {@code Half} instance representing {@code h}
+ * @throws NumberFormatException if the string does not contain a parsable
+ * half-precision float value
+ */
+ public static @NonNull Half valueOf(@NonNull String s) {
+ return new Half(s);
+ }
+
+ /**
+ * Returns the half-precision float value represented by the specified string.
+ * Calling this method is equivalent to calling
+ * <code>toHalf(Float.parseString(h))</code>. See {@link Float#valueOf(String)}
+ * for more information on the format of the string representation.
+ *
+ * @param s The string to be parsed
+ * @return A half-precision float value represented by the string
+ * @throws NumberFormatException if the string does not contain a parsable
+ * half-precision float value
+ */
+ public static @HalfFloat short parseHalf(@NonNull String s) throws NumberFormatException {
+ return toHalf(FloatingDecimal.parseFloat(s));
+ }
+
+ /**
* Returns a string representation of the specified half-precision
* float value. Calling this method is equivalent to calling
* <code>Float.toString(toFloat(h))</code>. See {@link Float#toString(float)}
@@ -658,6 +1038,7 @@
* @param h A half-precision float value
* @return A string representation of the specified value
*/
+ @NonNull
public static String toString(@HalfFloat short h) {
return Float.toString(toFloat(h));
}
@@ -688,6 +1069,7 @@
* @param h A half-precision float value
* @return A hexadecimal string representation of the specified value
*/
+ @NonNull
public static String toHexString(@HalfFloat short h) {
StringBuilder o = new StringBuilder();
diff --git a/core/java/android/util/Spline.java b/core/java/android/util/Spline.java
index bed3a60..1037096 100644
--- a/core/java/android/util/Spline.java
+++ b/core/java/android/util/Spline.java
@@ -166,10 +166,10 @@
+ "monotonic Y values.");
}
float h = (float) Math.hypot(a, b);
- if (h > 9f) {
+ if (h > 3f) {
float t = 3f / h;
- m[i] = t * a * d[i];
- m[i + 1] = t * b * d[i];
+ m[i] *= t;
+ m[i + 1] *= t;
}
}
}
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 83b6a52..7ec7ba7 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -21,6 +21,7 @@
import android.annotation.IntDef;
import android.annotation.RequiresPermission;
import android.content.res.CompatibilityInfo;
+import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Rect;
@@ -71,7 +72,8 @@
private final String mAddress;
private final int mOwnerUid;
private final String mOwnerPackageName;
- private final DisplayAdjustments mDisplayAdjustments;
+ private final Resources mResources;
+ private DisplayAdjustments mDisplayAdjustments;
private DisplayInfo mDisplayInfo; // never null
private boolean mIsValid;
@@ -355,19 +357,39 @@
/**
* Internal method to create a display.
+ * The display created with this method will have a static {@link DisplayAdjustments} applied.
* Applications should use {@link android.view.WindowManager#getDefaultDisplay()}
* or {@link android.hardware.display.DisplayManager#getDisplay}
* to get a display object.
*
* @hide
*/
- public Display(DisplayManagerGlobal global,
- int displayId, DisplayInfo displayInfo /*not null*/,
+ public Display(DisplayManagerGlobal global, int displayId, /*@NotNull*/ DisplayInfo displayInfo,
DisplayAdjustments daj) {
+ this(global, displayId, displayInfo, daj, null /*res*/);
+ }
+
+ /**
+ * Internal method to create a display.
+ * The display created with this method will be adjusted based on the adjustments in the
+ * supplied {@link Resources}.
+ *
+ * @hide
+ */
+ public Display(DisplayManagerGlobal global, int displayId, /*@NotNull*/ DisplayInfo displayInfo,
+ Resources res) {
+ this(global, displayId, displayInfo, null /*daj*/, res);
+ }
+
+ private Display(DisplayManagerGlobal global, int displayId,
+ /*@NotNull*/ DisplayInfo displayInfo, DisplayAdjustments daj, Resources res) {
mGlobal = global;
mDisplayId = displayId;
mDisplayInfo = displayInfo;
- mDisplayAdjustments = new DisplayAdjustments(daj);
+ mResources = res;
+ mDisplayAdjustments = mResources != null
+ ? new DisplayAdjustments(mResources.getConfiguration())
+ : daj != null ? new DisplayAdjustments(daj) : null;
mIsValid = true;
// Cache properties that cannot change as long as the display is valid.
@@ -512,6 +534,13 @@
* @hide
*/
public DisplayAdjustments getDisplayAdjustments() {
+ if (mResources != null) {
+ final DisplayAdjustments currentAdjustements = mResources.getDisplayAdjustments();
+ if (!mDisplayAdjustments.equals(currentAdjustements)) {
+ mDisplayAdjustments = new DisplayAdjustments(currentAdjustements);
+ }
+ }
+
return mDisplayAdjustments;
}
@@ -562,7 +591,7 @@
public void getSize(Point outSize) {
synchronized (this) {
updateDisplayInfoLocked();
- mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments);
+ mDisplayInfo.getAppMetrics(mTempMetrics, getDisplayAdjustments());
outSize.x = mTempMetrics.widthPixels;
outSize.y = mTempMetrics.heightPixels;
}
@@ -577,7 +606,7 @@
public void getRectSize(Rect outSize) {
synchronized (this) {
updateDisplayInfoLocked();
- mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments);
+ mDisplayInfo.getAppMetrics(mTempMetrics, getDisplayAdjustments());
outSize.set(0, 0, mTempMetrics.widthPixels, mTempMetrics.heightPixels);
}
}
@@ -908,7 +937,7 @@
public void getMetrics(DisplayMetrics outMetrics) {
synchronized (this) {
updateDisplayInfoLocked();
- mDisplayInfo.getAppMetrics(outMetrics, mDisplayAdjustments);
+ mDisplayInfo.getAppMetrics(outMetrics, getDisplayAdjustments());
}
}
@@ -1017,7 +1046,7 @@
long now = SystemClock.uptimeMillis();
if (now > mLastCachedAppSizeUpdate + CACHED_APP_SIZE_DURATION_MILLIS) {
updateDisplayInfoLocked();
- mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments);
+ mDisplayInfo.getAppMetrics(mTempMetrics, getDisplayAdjustments());
mCachedAppWidthCompat = mTempMetrics.widthPixels;
mCachedAppHeightCompat = mTempMetrics.heightPixels;
mLastCachedAppSizeUpdate = now;
@@ -1029,7 +1058,7 @@
public String toString() {
synchronized (this) {
updateDisplayInfoLocked();
- mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments);
+ mDisplayInfo.getAppMetrics(mTempMetrics, getDisplayAdjustments());
return "Display id " + mDisplayId + ": " + mDisplayInfo
+ ", " + mTempMetrics + ", isValid=" + mIsValid;
}
diff --git a/core/java/android/view/FocusFinder.java b/core/java/android/view/FocusFinder.java
index 7fde8a6..ad06141 100644
--- a/core/java/android/view/FocusFinder.java
+++ b/core/java/android/view/FocusFinder.java
@@ -117,7 +117,7 @@
public View findNextKeyboardNavigationCluster(
@NonNull View root,
@Nullable View currentCluster,
- int direction) {
+ @View.FocusDirection int direction) {
View next = null;
final ArrayList<View> clusters = mTempList;
@@ -206,7 +206,7 @@
View root,
View currentCluster,
List<View> clusters,
- int direction) {
+ @View.FocusDirection int direction) {
final int count = clusters.size();
switch (direction) {
@@ -732,27 +732,17 @@
getRect(first, mFirstRect);
getRect(second, mSecondRect);
- if (mFirstRect.top < mSecondRect.top) {
- return -1;
- } else if (mFirstRect.top > mSecondRect.top) {
- return 1;
- } else if (mFirstRect.left < mSecondRect.left) {
- return mIsLayoutRtl ? 1 : -1;
- } else if (mFirstRect.left > mSecondRect.left) {
- return mIsLayoutRtl ? -1 : 1;
- } else if (mFirstRect.bottom < mSecondRect.bottom) {
- return -1;
- } else if (mFirstRect.bottom > mSecondRect.bottom) {
- return 1;
- } else if (mFirstRect.right < mSecondRect.right) {
- return mIsLayoutRtl ? 1 : -1;
- } else if (mFirstRect.right > mSecondRect.right) {
- return mIsLayoutRtl ? -1 : 1;
+ boolean overlapsVertically = (mFirstRect.top < mSecondRect.top
+ && mFirstRect.bottom > mSecondRect.top)
+ || (mFirstRect.top > mSecondRect.top
+ && mFirstRect.top < mSecondRect.bottom);
+ boolean alignedVertically = (mFirstRect.left > mSecondRect.left)
+ == (mFirstRect.right < mSecondRect.right);
+ if (overlapsVertically && !alignedVertically) {
+ int rtl = mIsLayoutRtl ? -1 : 1;
+ return rtl * (mFirstRect.left - mSecondRect.left);
} else {
- // The view are distinct but completely coincident so we consider
- // them equal for our purposes. Since the sort is stable, this
- // means that the views will retain their layout order relative to one another.
- return 0;
+ return mFirstRect.top - mSecondRect.top;
}
}
diff --git a/core/java/android/view/FrameMetrics.java b/core/java/android/view/FrameMetrics.java
index 92f0e8f..358a2d1 100644
--- a/core/java/android/view/FrameMetrics.java
+++ b/core/java/android/view/FrameMetrics.java
@@ -132,6 +132,26 @@
*/
public static final int FIRST_DRAW_FRAME = 9;
+ /**
+ * Metric identifier for the timestamp of the intended vsync for this frame.
+ * <p>
+ * The intended start point for the frame. If this value is different from
+ * {@link #VSYNC_TIMESTAMP}, there was work occurring on the UI thread that
+ * prevented it from responding to the vsync signal in a timely fashion.
+ * </p>
+ */
+ public static final int INTENDED_VSYNC_TIMESTAMP = 10;
+
+ /**
+ * Metric identifier for the timestamp of the actual vsync for this frame.
+ * <p>
+ * The time value that was used in all the vsync listeners and drawing for
+ * the frame (Choreographer frame callbacks, animations,
+ * {@link View#getDrawingTime()}, etc…)
+ * </p>
+ */
+ public static final int VSYNC_TIMESTAMP = 11;
+
private static final int FRAME_INFO_FLAG_FIRST_DRAW = 1 << 0;
/**
@@ -151,6 +171,8 @@
SWAP_BUFFERS_DURATION,
TOTAL_DURATION,
FIRST_DRAW_FRAME,
+ INTENDED_VSYNC_TIMESTAMP,
+ VSYNC_TIMESTAMP,
})
@Retention(RetentionPolicy.SOURCE)
public @interface Metric {}
@@ -261,7 +283,7 @@
* @return the value of the metric or -1 if it is not available.
*/
public long getMetric(@Metric int id) {
- if (id < UNKNOWN_DELAY_DURATION || id > FIRST_DRAW_FRAME) {
+ if (id < UNKNOWN_DELAY_DURATION || id > VSYNC_TIMESTAMP) {
return -1;
}
@@ -271,6 +293,10 @@
if (id == FIRST_DRAW_FRAME) {
return (mTimingData[Index.FLAGS] & FRAME_INFO_FLAG_FIRST_DRAW) != 0 ? 1 : 0;
+ } else if (id == INTENDED_VSYNC_TIMESTAMP) {
+ return mTimingData[Index.INTENDED_VSYNC];
+ } else if (id == VSYNC_TIMESTAMP) {
+ return mTimingData[Index.VSYNC];
}
int durationsIdx = 2 * id;
diff --git a/core/java/android/view/IGraphicsStats.aidl b/core/java/android/view/IGraphicsStats.aidl
index c235eb2..e6b750b 100644
--- a/core/java/android/view/IGraphicsStats.aidl
+++ b/core/java/android/view/IGraphicsStats.aidl
@@ -17,10 +17,11 @@
package android.view;
import android.os.ParcelFileDescriptor;
+import android.view.IGraphicsStatsCallback;
/**
* @hide
*/
interface IGraphicsStats {
- ParcelFileDescriptor requestBufferForProcess(String packageName, IBinder token);
+ ParcelFileDescriptor requestBufferForProcess(String packageName, IGraphicsStatsCallback callback);
}
diff --git a/core/java/android/net/NetworkScorerAppManager.aidl b/core/java/android/view/IGraphicsStatsCallback.aidl
similarity index 82%
copy from core/java/android/net/NetworkScorerAppManager.aidl
copy to core/java/android/view/IGraphicsStatsCallback.aidl
index d968343..f70e141 100644
--- a/core/java/android/net/NetworkScorerAppManager.aidl
+++ b/core/java/android/view/IGraphicsStatsCallback.aidl
@@ -14,6 +14,11 @@
* limitations under the License.
*/
-package android.net;
+package android.view;
-parcelable NetworkScorerAppManager.NetworkScorerAppData;
+/**
+ * @hide
+ */
+oneway interface IGraphicsStatsCallback {
+ void onRotateGraphicsStatsBuffer();
+}
diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl
index 10b1e19..14b2abe 100644
--- a/core/java/android/view/IWindow.aidl
+++ b/core/java/android/view/IWindow.aidl
@@ -50,7 +50,7 @@
void resized(in Rect frame, in Rect overscanInsets, in Rect contentInsets,
in Rect visibleInsets, in Rect stableInsets, in Rect outsets, boolean reportDraw,
in Configuration newConfig, in Rect backDropFrame, boolean forceLayout,
- boolean alwaysConsumeNavBar);
+ boolean alwaysConsumeNavBar, int displayId);
void moved(int newX, int newY);
void dispatchAppVisibility(boolean visible);
void dispatchGetNewSurface();
diff --git a/core/java/android/view/InputDevice.java b/core/java/android/view/InputDevice.java
index 035d48f..ea2434e 100644
--- a/core/java/android/view/InputDevice.java
+++ b/core/java/android/view/InputDevice.java
@@ -268,7 +268,6 @@
* those of a scroll wheel.
*
* @see #SOURCE_CLASS_NONE
- * {@hide}
*/
public static final int SOURCE_ROTARY_ENCODER = 0x00400000 | SOURCE_CLASS_NONE;
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java
index 2129039..5f55bdc 100644
--- a/core/java/android/view/MotionEvent.java
+++ b/core/java/android/view/MotionEvent.java
@@ -1008,7 +1008,6 @@
* </p>
*
* @see #getAxisValue(int, int)
- * {@hide}
*/
public static final int AXIS_SCROLL = 26;
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index cf8da17..b718696 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -508,9 +508,9 @@
nativeSetAlpha(mNativeObject, alpha);
}
- public void setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) {
+ public void setMatrix(float dsdx, float dtdx, float dtdy, float dsdy) {
checkNotReleased();
- nativeSetMatrix(mNativeObject, dsdx, dtdx, dsdy, dtdy);
+ nativeSetMatrix(mNativeObject, dsdx, dtdx, dtdy, dsdy);
}
public void setWindowCrop(Rect crop) {
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 018be86..d2577d4 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -818,7 +818,7 @@
public void resized(Rect frame, Rect overscanInsets, Rect contentInsets,
Rect visibleInsets, Rect stableInsets, Rect outsets, boolean reportDraw,
Configuration newConfig, Rect backDropRect, boolean forceLayout,
- boolean alwaysConsumeNavBar) {
+ boolean alwaysConsumeNavBar, int displayId) {
SurfaceView surfaceView = mSurfaceView.get();
if (surfaceView != null) {
if (DEBUG) Log.v(TAG, surfaceView + " got resized: w=" + frame.width()
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index 4ceb236..c66bf874 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -25,9 +25,9 @@
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.drawable.AnimatedVectorDrawable;
-import android.os.Binder;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.Trace;
import android.util.Log;
@@ -164,6 +164,18 @@
public static final String OVERDRAW_PROPERTY_SHOW = "show";
/**
+ * Defines the rendering pipeline to be used by the ThreadedRenderer.
+ *
+ * Possible values:
+ * "opengl", will use the existing OpenGL renderer
+ * "skiagl", will use Skia's OpenGL renderer
+ * "skiavk", will use Skia's Vulkan renderer
+ *
+ * @hide
+ */
+ public static final String DEBUG_RENDERER_PROPERTY = "debug.hwui.renderer";
+
+ /**
* Turn on to debug non-rectangular clip operations.
*
* Possible values:
@@ -248,10 +260,10 @@
*
* @return A threaded renderer backed by OpenGL.
*/
- public static ThreadedRenderer create(Context context, boolean translucent) {
+ public static ThreadedRenderer create(Context context, boolean translucent, String name) {
ThreadedRenderer renderer = null;
if (isAvailable()) {
- renderer = new ThreadedRenderer(context, translucent);
+ renderer = new ThreadedRenderer(context, translucent, name);
}
return renderer;
}
@@ -275,10 +287,6 @@
nOverrideProperty(name, value);
}
- public static void dumpProfileData(byte[] data, FileDescriptor fd) {
- nDumpProfileData(data, fd);
- }
-
// Keep in sync with DrawFrameTask.h SYNC_* flags
// Nothing interesting to report
private static final int SYNC_OK = 0;
@@ -334,7 +342,7 @@
private boolean mEnabled;
private boolean mRequested = true;
- ThreadedRenderer(Context context, boolean translucent) {
+ ThreadedRenderer(Context context, boolean translucent, String name) {
final TypedArray a = context.obtainStyledAttributes(null, R.styleable.Lighting, 0, 0);
mLightY = a.getDimension(R.styleable.Lighting_lightY, 0);
mLightZ = a.getDimension(R.styleable.Lighting_lightZ, 0);
@@ -348,6 +356,7 @@
mRootNode = RenderNode.adopt(rootNodePtr);
mRootNode.setClipToBounds(false);
mNativeProxy = nCreateProxy(translucent, rootNodePtr);
+ nSetName(mNativeProxy, name);
ProcessInitializer.sInstance.init(context, mNativeProxy);
@@ -815,15 +824,6 @@
}
/**
- * Optional, sets the name of the renderer. Useful for debugging purposes.
- *
- * @param name The name of this renderer, can be null
- */
- void setName(String name) {
- nSetName(mNativeProxy, name);
- }
-
- /**
* Blocks until all previously queued work has completed.
*/
void fence() {
@@ -884,20 +884,29 @@
private static class ProcessInitializer {
static ProcessInitializer sInstance = new ProcessInitializer();
- private static IBinder sProcToken;
private boolean mInitialized = false;
+ private Context mAppContext;
+ private IGraphicsStats mGraphicsStatsService;
+ private IGraphicsStatsCallback mGraphicsStatsCallback = new IGraphicsStatsCallback.Stub() {
+ @Override
+ public void onRotateGraphicsStatsBuffer() throws RemoteException {
+ rotateBuffer();
+ }
+ };
+
private ProcessInitializer() {}
synchronized void init(Context context, long renderProxy) {
if (mInitialized) return;
mInitialized = true;
+ mAppContext = context.getApplicationContext();
initSched(context, renderProxy);
- initGraphicsStats(context, renderProxy);
+ initGraphicsStats();
}
- private static void initSched(Context context, long renderProxy) {
+ private void initSched(Context context, long renderProxy) {
try {
int tid = nGetRenderThreadTid(renderProxy);
ActivityManager.getService().setRenderThread(tid);
@@ -906,17 +915,28 @@
}
}
- private static void initGraphicsStats(Context context, long renderProxy) {
+ private void initGraphicsStats() {
try {
IBinder binder = ServiceManager.getService("graphicsstats");
if (binder == null) return;
- IGraphicsStats graphicsStatsService = IGraphicsStats.Stub
- .asInterface(binder);
- sProcToken = new Binder();
- final String pkg = context.getApplicationInfo().packageName;
- ParcelFileDescriptor pfd = graphicsStatsService.
- requestBufferForProcess(pkg, sProcToken);
- nSetProcessStatsBuffer(renderProxy, pfd.getFd());
+ mGraphicsStatsService = IGraphicsStats.Stub.asInterface(binder);
+ requestBuffer();
+ } catch (Throwable t) {
+ Log.w(LOG_TAG, "Could not acquire gfx stats buffer", t);
+ }
+ }
+
+ private void rotateBuffer() {
+ nRotateProcessStatsBuffer();
+ requestBuffer();
+ }
+
+ private void requestBuffer() {
+ try {
+ final String pkg = mAppContext.getApplicationInfo().packageName;
+ ParcelFileDescriptor pfd = mGraphicsStatsService
+ .requestBufferForProcess(pkg, mGraphicsStatsCallback);
+ nSetProcessStatsBuffer(pfd.getFd());
pfd.close();
} catch (Throwable t) {
Log.w(LOG_TAG, "Could not acquire gfx stats buffer", t);
@@ -936,7 +956,8 @@
static native void setupShadersDiskCache(String cacheFile);
- private static native void nSetProcessStatsBuffer(long nativeProxy, int fd);
+ private static native void nRotateProcessStatsBuffer();
+ private static native void nSetProcessStatsBuffer(int fd);
private static native int nGetRenderThreadTid(long nativeProxy);
private static native long nCreateRootRenderNode();
@@ -981,7 +1002,6 @@
private static native void nDumpProfileInfo(long nativeProxy, FileDescriptor fd,
@DumpFlags int dumpFlags);
- private static native void nDumpProfileData(byte[] data, FileDescriptor fd);
private static native void nAddRenderNode(long nativeProxy, long rootRenderNode,
boolean placeFront);
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 0c6d9e3..e349170 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -108,6 +108,7 @@
import android.widget.ScrollBarDrawable;
import com.android.internal.R;
+import com.android.internal.util.Preconditions;
import com.android.internal.view.TooltipPopup;
import com.android.internal.view.menu.MenuBuilder;
import com.android.internal.widget.ScrollBarUtils;
@@ -942,6 +943,37 @@
private static final int[] VISIBILITY_FLAGS = {VISIBLE, INVISIBLE, GONE};
+ /** @hide */
+ @IntDef({
+ AUTO_FILL_MODE_INHERIT,
+ AUTO_FILL_MODE_AUTO,
+ AUTO_FILL_MODE_MANUAL
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface AutoFillMode {}
+
+ /**
+ * This view inherits the autofill state from it's parent. If there is no parent it is
+ * {@link #AUTO_FILL_MODE_AUTO}.
+ * Use with {@link #setAutoFillMode(int)} and <a href="#attr_android:autoFillMode">
+ * {@code android:autoFillMode}.
+ */
+ public static final int AUTO_FILL_MODE_INHERIT = 0;
+
+ /**
+ * Allows this view to automatically trigger an auto-fill request when it get focus.
+ * Use with {@link #setAutoFillMode(int)} and <a href="#attr_android:autoFillMode">
+ * {@code android:autoFillMode}.
+ */
+ public static final int AUTO_FILL_MODE_AUTO = 1;
+
+ /**
+ * Require the user to manually force an auto-fill request.
+ * Use with {@link #setAutoFillMode(int)} and <a href="#attr_android:autoFillMode">{@code
+ * android:autoFillMode}.
+ */
+ public static final int AUTO_FILL_MODE_MANUAL = 2;
+
/**
* This view is enabled. Interpretation varies by subclass.
* Use with ENABLED_MASK when calling setFlags.
@@ -2512,7 +2544,8 @@
* x * NO LONGER NEEDED, SHOULD BE REUSED *
* 1 PFLAG3_FINGER_DOWN
* 1 PFLAG3_FOCUSED_BY_DEFAULT
- * xxxx * NO LONGER NEEDED, SHOULD BE REUSED *
+ * 11 PFLAG3_AUTO_FILL_MODE_MASK
+ * xx * NO LONGER NEEDED, SHOULD BE REUSED *
* 1 PFLAG3_OVERLAPPING_RENDERING_FORCED_VALUE
* 1 PFLAG3_HAS_OVERLAPPING_RENDERING_FORCED
* 1 PFLAG3_TEMPORARY_DETACH
@@ -2733,6 +2766,23 @@
private static final int PFLAG3_FOCUSED_BY_DEFAULT = 0x40000;
/**
+ * Shift for the place where the auto-fill mode is stored in the pflags
+ *
+ * @see #getAutoFillMode()
+ * @see #setAutoFillMode(int)
+ */
+ private static final int PFLAG3_AUTO_FILL_MODE_SHIFT = 19;
+
+ /**
+ * Mask for auto-fill modes
+ *
+ * @see #getAutoFillMode()
+ * @see #setAutoFillMode(int)
+ */
+ private static final int PFLAG3_AUTO_FILL_MODE_MASK = (AUTO_FILL_MODE_INHERIT
+ | AUTO_FILL_MODE_AUTO | AUTO_FILL_MODE_MANUAL) << PFLAG3_AUTO_FILL_MODE_SHIFT;
+
+ /**
* Whether this view has rendered elements that overlap (see {@link
* #hasOverlappingRendering()}, {@link #forceHasOverlappingRendering(boolean)}, and
* {@link #getHasOverlappingRendering()} ). The value in this bit is only valid when
@@ -4450,6 +4500,8 @@
break;
case com.android.internal.R.styleable.View_focusableInTouchMode:
if (a.getBoolean(attr, false)) {
+ // unset auto focus since focusableInTouchMode implies explicit focusable
+ viewFlagValues &= ~FOCUSABLE_AUTO;
viewFlagValues |= FOCUSABLE_IN_TOUCH_MODE | FOCUSABLE;
viewFlagMasks |= FOCUSABLE_IN_TOUCH_MODE | FOCUSABLE_MASK;
}
@@ -4747,6 +4799,11 @@
setFocusedByDefault(a.getBoolean(attr, true));
}
break;
+ case com.android.internal.R.styleable.View_autoFillMode:
+ if (a.peekValue(attr) != null) {
+ setAutoFillMode(a.getInt(attr, AUTO_FILL_MODE_INHERIT));
+ }
+ break;
}
}
@@ -6416,12 +6473,18 @@
}
}
}
+
+ // Invisible and gone views are never focusable.
if ((mViewFlags & VISIBILITY_MASK) != VISIBLE) {
return false;
}
- return (allowAutoFocus
- ? getFocusable() != NOT_FOCUSABLE
- : getFocusable() == FOCUSABLE) && isFocusable();
+
+ // Only use effective focusable value when allowed.
+ if ((allowAutoFocus || getFocusable() != FOCUSABLE_AUTO) && isFocusable()) {
+ return true;
+ }
+
+ return false;
}
/**
@@ -6928,19 +6991,19 @@
/**
* Called when assist structure is being retrieved from a view as part of an auto-fill request.
*
- * <p>When implementing this method, subclasses must also:
- *
+ * <p>This method already provides most of what's needed for auto-fill, but should be overridden
* <ol>
- * <li>Implement {@link #autoFill(AutoFillValue)}, {@link #getAutoFillType()}
- * and {@link #getAutoFillValue()}.
- * <li>Call {@link android.view.autofill.AutoFillManager#virtualValueChanged(View, int,
- * AutoFillValue)} when its value changed.
+ * <li>The view contents does not include PII (Personally Identifiable Information), so it
+ * can call {@link ViewStructure#setSanitized(boolean)} passing {@code true}.
+ * <li>It must set fields such {@link ViewStructure#setText(CharSequence)},
+ * {@link ViewStructure#setAutoFillOptions(String[])}, or {@link ViewStructure#setUrl(String)}.
* </ol>
*
* @param structure Fill in with structured view data. The default implementation
* fills in all data that can be inferred from the view itself.
* @param flags optional flags (currently {@code 0}).
*/
+ @CallSuper
public void onProvideAutoFillStructure(ViewStructure structure, int flags) {
onProvideStructureForAssistOrAutoFill(structure, true);
}
@@ -7405,16 +7468,19 @@
* This method only needs overloading if the node is marked as having extra data available.
* </p>
*
- * @param info The info to which to add the extra data
+ * @param info The info to which to add the extra data. Never {@code null}.
* @param extraDataKey A key specifying the type of extra data to add to the info. The
* extra data should be added to the {@link Bundle} returned by
- * the info's {@link AccessibilityNodeInfo#getExtras} method.
- * @param arguments A {@link Bundle} holding any arguments relevant for this request.
+ * the info's {@link AccessibilityNodeInfo#getExtras} method. Never
+ * {@code null}.
+ * @param arguments A {@link Bundle} holding any arguments relevant for this request. May be
+ * {@code null} if the service provided no arguments.
*
* @see AccessibilityNodeInfo#setExtraAvailableData
*/
public void addExtraDataToAccessibilityNodeInfo(
- AccessibilityNodeInfo info, String extraDataKey, Bundle arguments) {
+ @NonNull AccessibilityNodeInfo info, @NonNull String extraDataKey,
+ @Nullable Bundle arguments) {
}
/**
@@ -8608,12 +8674,30 @@
// which, in touch mode, will not successfully request focus on this view
// because the focusable in touch mode flag is not set
setFlags(focusableInTouchMode ? FOCUSABLE_IN_TOUCH_MODE : 0, FOCUSABLE_IN_TOUCH_MODE);
+
+ // Clear FOCUSABLE_AUTO if set.
if (focusableInTouchMode) {
+ // Clears FOCUSABLE_AUTO if set.
setFlags(FOCUSABLE, FOCUSABLE_MASK);
}
}
/**
+ * Set auto-fill mode for the view.
+ *
+ * @param autoFillMode One of {@link #AUTO_FILL_MODE_INHERIT}, {@link #AUTO_FILL_MODE_AUTO},
+ * or {@link #AUTO_FILL_MODE_MANUAL}.
+ * @attr ref android.R.styleable#View_autoFillMode
+ */
+ public void setAutoFillMode(@AutoFillMode int autoFillMode) {
+ Preconditions.checkArgumentInRange(autoFillMode, AUTO_FILL_MODE_INHERIT,
+ AUTO_FILL_MODE_MANUAL, "autoFillMode");
+
+ mPrivateFlags3 &= ~PFLAG3_AUTO_FILL_MODE_MASK;
+ mPrivateFlags3 |= autoFillMode << PFLAG3_AUTO_FILL_MODE_SHIFT;
+ }
+
+ /**
* Set whether this view should have sound effects enabled for events such as
* clicking and touching.
*
@@ -9217,6 +9301,23 @@
}
/**
+ * Returns the auto-fill mode for this view.
+ *
+ * @return One of {@link #AUTO_FILL_MODE_INHERIT}, {@link #AUTO_FILL_MODE_AUTO}, or
+ * {@link #AUTO_FILL_MODE_MANUAL}.
+ * @attr ref android.R.styleable#View_autoFillMode
+ */
+ @ViewDebug.ExportedProperty(mapping = {
+ @ViewDebug.IntToString(from = AUTO_FILL_MODE_INHERIT, to = "AUTO_FILL_MODE_INHERIT"),
+ @ViewDebug.IntToString(from = AUTO_FILL_MODE_AUTO, to = "AUTO_FILL_MODE_AUTO"),
+ @ViewDebug.IntToString(from = AUTO_FILL_MODE_MANUAL, to = "AUTO_FILL_MODE_MANUAL")
+ })
+ @AutoFillMode
+ public int getAutoFillMode() {
+ return (mPrivateFlags3 & PFLAG3_AUTO_FILL_MODE_MASK) >> PFLAG3_AUTO_FILL_MODE_SHIFT;
+ }
+
+ /**
* Find the nearest view in the specified direction that can take focus.
* This does not actually give focus to that view.
*
@@ -9343,7 +9444,8 @@
* @return The nearest keyboard navigation cluster in the specified direction, or null if none
* can be found
*/
- public View keyboardNavigationClusterSearch(View currentCluster, int direction) {
+ public View keyboardNavigationClusterSearch(View currentCluster,
+ @FocusDirection int direction) {
if (isKeyboardNavigationCluster()) {
currentCluster = this;
}
@@ -9491,7 +9593,10 @@
public void addKeyboardNavigationClusters(
@NonNull Collection<View> views,
int direction) {
- if (!(isKeyboardNavigationCluster())) {
+ if (!isKeyboardNavigationCluster()) {
+ return;
+ }
+ if (!hasFocusable()) {
return;
}
views.add(this);
@@ -9698,11 +9803,12 @@
}
/**
- * Public for testing. This will request focus for whichever View was last focused within this
+ * This will request focus for whichever View was last focused within this
* cluster before a focus-jump out of it.
*
* @hide
*/
+ @TestApi
public boolean restoreFocusInCluster(@FocusRealDirection int direction) {
// Prioritize focusableByDefault over algorithmic focus selection.
if (restoreDefaultFocus()) {
@@ -9712,6 +9818,18 @@
}
/**
+ * This will request focus for whichever View not in a cluster was last focused before a
+ * focus-jump to a cluster. If no non-cluster View has previously had focus, this will focus
+ * the "first" focusable view it finds.
+ *
+ * @hide
+ */
+ @TestApi
+ public boolean restoreFocusNotInCluster() {
+ return requestFocus(View.FOCUS_DOWN);
+ }
+
+ /**
* Gives focus to the default-focus view in the view hierarchy that has this view as a root.
* If the default-focus view cannot be found, falls back to calling {@link #requestFocus(int)}.
*
@@ -11623,7 +11741,10 @@
&& isOnScrollbar(event.getX(), event.getY())) {
awakenScrollBars();
}
- if (isHoverable()) {
+
+ // If we consider ourself hoverable, or if we we're already hovered,
+ // handle changing state in response to ENTER and EXIT events.
+ if (isHoverable() || isHovered()) {
switch (action) {
case MotionEvent.ACTION_HOVER_ENTER:
setHovered(true);
@@ -12154,12 +12275,13 @@
// If focusable is auto, update the FOCUSABLE bit.
int focusableChangedByAuto = 0;
if (((mViewFlags & FOCUSABLE_AUTO) != 0)
- && (changed & (FOCUSABLE_MASK | CLICKABLE | FOCUSABLE_IN_TOUCH_MODE)) != 0) {
- int newFocus = NOT_FOCUSABLE;
- if ((mViewFlags & (CLICKABLE | FOCUSABLE_IN_TOUCH_MODE)) != 0) {
+ && (changed & (FOCUSABLE_MASK | CLICKABLE)) != 0) {
+ // Heuristic only takes into account whether view is clickable.
+ final int newFocus;
+ if ((mViewFlags & CLICKABLE) != 0) {
newFocus = FOCUSABLE;
} else {
- mViewFlags = (mViewFlags & ~FOCUSABLE_IN_TOUCH_MODE);
+ newFocus = NOT_FOCUSABLE;
}
mViewFlags = (mViewFlags & ~FOCUSABLE) | newFocus;
focusableChangedByAuto = (old & FOCUSABLE) ^ (newFocus & FOCUSABLE);
@@ -15869,6 +15991,32 @@
}
/**
+ * @see #onMovedToDisplay(int)
+ */
+ void dispatchMovedToDisplay(Display display) {
+ mAttachInfo.mDisplay = display;
+ mAttachInfo.mDisplayState = display.getState();
+ onMovedToDisplay(display.getDisplayId());
+ }
+
+ /**
+ * Called by the system when the hosting activity is moved from one display to another without
+ * recreation. This means that the activity is declared to handle all changes to configuration
+ * that happened when it was switched to another display, so it wasn't destroyed and created
+ * again. This call will be followed by {@link #onConfigurationChanged(Configuration)} if the
+ * applied configuration actually changed.
+ *
+ * <p>Use this callback to track changes to the displays if some functionality relies on an
+ * association with some display properties.
+ *
+ * @param displayId The id of the display to which the view was moved.
+ *
+ * @see #onConfigurationChanged(Configuration)
+ */
+ public void onMovedToDisplay(int displayId) {
+ }
+
+ /**
* Return true if the application tag in the AndroidManifest has set "supportRtl" to true
*/
private boolean hasRtlSupport() {
@@ -20127,9 +20275,9 @@
* @return the view of the specified id, null if cannot be found
* @hide
*/
- protected View findViewTraversal(@IdRes int id) {
+ protected <T extends View> T findViewTraversal(@IdRes int id) {
if (id == mID) {
- return this;
+ return (T) this;
}
return null;
}
@@ -20139,9 +20287,9 @@
* @return the view of specified tag, null if cannot be found
* @hide
*/
- protected View findViewWithTagTraversal(Object tag) {
+ protected <T extends View> T findViewWithTagTraversal(Object tag) {
if (tag != null && tag.equals(mTag)) {
- return this;
+ return (T) this;
}
return null;
}
@@ -20152,9 +20300,10 @@
* @return The first view that matches the predicate or null.
* @hide
*/
- protected View findViewByPredicateTraversal(Predicate<View> predicate, View childToSkip) {
+ protected <T extends View> T findViewByPredicateTraversal(Predicate<View> predicate,
+ View childToSkip) {
if (predicate.test(this)) {
- return this;
+ return (T) this;
}
return null;
}
@@ -20167,7 +20316,7 @@
* @return The view that has the given id in the hierarchy or null
*/
@Nullable
- public final View findViewById(@IdRes int id) {
+ public final <T extends View> T findViewById(@IdRes int id) {
if (id < 0) {
return null;
}
@@ -20180,11 +20329,11 @@
* @param accessibilityId The searched accessibility id.
* @return The found view.
*/
- final View findViewByAccessibilityId(int accessibilityId) {
+ final <T extends View> T findViewByAccessibilityId(int accessibilityId) {
if (accessibilityId < 0) {
return null;
}
- View view = findViewByAccessibilityIdTraversal(accessibilityId);
+ T view = findViewByAccessibilityIdTraversal(accessibilityId);
if (view != null) {
return view.includeForAccessibility() ? view : null;
}
@@ -20203,12 +20352,11 @@
*
* @param accessibilityId The accessibility id.
* @return The found view.
- *
* @hide
*/
- public View findViewByAccessibilityIdTraversal(int accessibilityId) {
+ public <T extends View> T findViewByAccessibilityIdTraversal(int accessibilityId) {
if (getAccessibilityViewId() == accessibilityId) {
- return this;
+ return (T) this;
}
return null;
}
@@ -20220,7 +20368,7 @@
* @param tag The tag to search for, using "tag.equals(getTag())".
* @return The View that has the given tag in the hierarchy or null
*/
- public final View findViewWithTag(Object tag) {
+ public final <T extends View> T findViewWithTag(Object tag) {
if (tag == null) {
return null;
}
@@ -20235,7 +20383,7 @@
* @return The first view that matches the predicate or null.
* @hide
*/
- public final View findViewByPredicate(Predicate<View> predicate) {
+ public final <T extends View> T findViewByPredicate(Predicate<View> predicate) {
return findViewByPredicateTraversal(predicate, null);
}
@@ -20255,10 +20403,11 @@
* @return The first view that matches the predicate or null.
* @hide
*/
- public final View findViewByPredicateInsideOut(View start, Predicate<View> predicate) {
+ public final <T extends View> T findViewByPredicateInsideOut(
+ View start, Predicate<View> predicate) {
View childToSkip = null;
for (;;) {
- View view = start.findViewByPredicateTraversal(predicate, childToSkip);
+ T view = start.findViewByPredicateTraversal(predicate, childToSkip);
if (view != null || start == this) {
return view;
}
@@ -23756,7 +23905,7 @@
final IBinder mWindowToken;
- final Display mDisplay;
+ Display mDisplay;
final Callbacks mRootCallbacks;
@@ -24518,17 +24667,20 @@
* the case where no accessibility delegate is set.
* </p>
*
- * @param host The View hosting the delegate.
- * @param info The info to which to add the extra data
+ * @param host The View hosting the delegate. Never {@code null}.
+ * @param info The info to which to add the extra data. Never {@code null}.
* @param extraDataKey A key specifying the type of extra data to add to the info. The
* extra data should be added to the {@link Bundle} returned by
- * the info's {@link AccessibilityNodeInfo#getExtras} method.
+ * the info's {@link AccessibilityNodeInfo#getExtras} method. Never
+ * {@code null}.
* @param arguments A {@link Bundle} holding any arguments relevant for this request.
+ * May be {@code null} if the if the service provided no arguments.
*
* @see AccessibilityNodeInfo#setExtraAvailableData
*/
- public void addExtraDataToAccessibilityNodeInfo(
- View host, AccessibilityNodeInfo info, String extraDataKey, Bundle arguments) {
+ public void addExtraDataToAccessibilityNodeInfo(@NonNull View host,
+ @NonNull AccessibilityNodeInfo info, @NonNull String extraDataKey,
+ @Nullable Bundle arguments) {
host.addExtraDataToAccessibilityNodeInfo(info, extraDataKey, arguments);
}
@@ -24899,13 +25051,20 @@
* Sets the tooltip text which will be displayed in a small popup next to the view.
* <p>
* The tooltip will be displayed:
+ * <ul>
* <li>On long click, unless is not handled otherwise (by OnLongClickListener or a context
* menu). </li>
* <li>On hover, after a brief delay since the pointer has stopped moving </li>
+ * </ul>
+ * <p>
+ * <strong>Note:</strong> Do not override this method, as it will have no
+ * effect on the text displayed in the tooltip.
*
* @param tooltipText the tooltip text, or null if no tooltip is required
+ * @see #getTooltipText()
+ * @attr ref android.R.styleable#View_tooltipText
*/
- public final void setTooltipText(@Nullable CharSequence tooltipText) {
+ public void setTooltipText(@Nullable CharSequence tooltipText) {
if (TextUtils.isEmpty(tooltipText)) {
setFlags(0, TOOLTIP);
hideTooltip();
@@ -24934,10 +25093,16 @@
/**
* Returns the view's tooltip text.
*
+ * <strong>Note:</strong> Do not override this method, as it will have no
+ * effect on the text displayed in the tooltip. You must call
+ * {@link #setTooltipText(CharSequence)} to modify the tooltip text.
+ *
* @return the tooltip text
+ * @see #setTooltipText(CharSequence)
+ * @attr ref android.R.styleable#View_tooltipText
*/
@Nullable
- public final CharSequence getTooltipText() {
+ public CharSequence getTooltipText() {
return mTooltipInfo != null ? mTooltipInfo.mTooltipText : null;
}
@@ -24950,21 +25115,20 @@
}
private boolean showTooltip(int x, int y, boolean fromLongClick) {
- if (mAttachInfo == null) {
+ if (mAttachInfo == null || mTooltipInfo == null) {
return false;
}
if ((mViewFlags & ENABLED_MASK) != ENABLED) {
return false;
}
- final CharSequence tooltipText = getTooltipText();
- if (TextUtils.isEmpty(tooltipText)) {
+ if (TextUtils.isEmpty(mTooltipInfo.mTooltipText)) {
return false;
}
hideTooltip();
mTooltipInfo.mTooltipFromLongClick = fromLongClick;
mTooltipInfo.mTooltipPopup = new TooltipPopup(getContext());
final boolean fromTouch = (mPrivateFlags3 & PFLAG3_FINGER_DOWN) == PFLAG3_FINGER_DOWN;
- mTooltipInfo.mTooltipPopup.show(this, x, y, fromTouch, tooltipText);
+ mTooltipInfo.mTooltipPopup.show(this, x, y, fromTouch, mTooltipInfo.mTooltipText);
mAttachInfo.mTooltipHost = this;
return true;
}
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java
index 5d01b416..f16fcc9 100644
--- a/core/java/android/view/ViewConfiguration.java
+++ b/core/java/android/view/ViewConfiguration.java
@@ -35,7 +35,7 @@
* Defines the width of the horizontal scrollbar and the height of the vertical scrollbar in
* dips
*/
- private static final int SCROLL_BAR_SIZE = 10;
+ private static final int SCROLL_BAR_SIZE = 4;
/**
* Duration of the fade when scrollbars fade away in milliseconds
@@ -346,7 +346,8 @@
mEdgeSlop = (int) (sizeAndDensity * EDGE_SLOP + 0.5f);
mFadingEdgeLength = (int) (sizeAndDensity * FADING_EDGE_LENGTH + 0.5f);
- mScrollbarSize = (int) (density * SCROLL_BAR_SIZE + 0.5f);
+ mScrollbarSize = res.getDimensionPixelSize(
+ com.android.internal.R.dimen.config_scrollbarSize);
mDoubleTapSlop = (int) (sizeAndDensity * DOUBLE_TAP_SLOP + 0.5f);
mWindowTouchSlop = (int) (sizeAndDensity * WINDOW_TOUCH_SLOP + 0.5f);
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index fd3ff82..3dd3ba8 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -22,6 +22,7 @@
import android.annotation.CallSuper;
import android.annotation.IdRes;
import android.annotation.NonNull;
+import android.annotation.TestApi;
import android.annotation.UiThread;
import android.content.ClipData;
import android.content.Context;
@@ -1147,18 +1148,21 @@
@Override
boolean hasFocusable(boolean allowAutoFocus, boolean dispatchExplicit) {
+ // This should probably be super.hasFocusable, but that would change
+ // behavior. Historically, we have not checked the ancestor views for
+ // shouldBlockFocusForTouchscreen() in ViewGroup.hasFocusable.
+
+ // Invisible and gone views are never focusable.
if ((mViewFlags & VISIBILITY_MASK) != VISIBLE) {
return false;
}
- // TODO This should probably be super.hasFocusable, but that would change behavior.
- // The below is a much simpler check than we do in the superclass implementation,
- // but it's been this way for a long time and other code likely relies on it.
- if ((allowAutoFocus ? getFocusable() != NOT_FOCUSABLE : getFocusable() == FOCUSABLE)
- && isFocusable()) {
+ // Only use effective focusable value when allowed.
+ if ((allowAutoFocus || getFocusable() != FOCUSABLE_AUTO) && isFocusable()) {
return true;
}
+ // Determine whether we have a focused descendant.
final int descendantFocusability = getDescendantFocusability();
if (descendantFocusability != FOCUS_BLOCK_DESCENDANTS) {
final int count = mChildrenCount;
@@ -3166,6 +3170,7 @@
/**
* @hide
*/
+ @TestApi
@Override
public boolean restoreFocusInCluster(@FocusRealDirection int direction) {
if (mFocusedInCluster != null && !mFocusedInCluster.isKeyboardNavigationCluster()
@@ -3178,6 +3183,40 @@
}
/**
+ * @hide
+ */
+ @Override
+ public boolean restoreFocusNotInCluster() {
+ if (mFocusedInCluster != null) {
+ // since clusters don't nest; we can assume that a non-null mFocusedInCluster
+ // will refer to a view not-in a cluster.
+ return restoreFocusInCluster(View.FOCUS_DOWN);
+ }
+ if (isKeyboardNavigationCluster()) {
+ return false;
+ }
+ int descendentFocusability = getDescendantFocusability();
+ if (descendentFocusability == FOCUS_BLOCK_DESCENDANTS) {
+ return super.requestFocus(FOCUS_DOWN, null);
+ }
+ if (descendentFocusability == FOCUS_BEFORE_DESCENDANTS
+ && super.requestFocus(FOCUS_DOWN, null)) {
+ return true;
+ }
+ for (int i = 0; i < mChildrenCount; ++i) {
+ View child = mChildren[i];
+ if (!child.isKeyboardNavigationCluster()
+ && child.restoreFocusNotInCluster()) {
+ return true;
+ }
+ }
+ if (descendentFocusability == FOCUS_AFTER_DESCENDANTS) {
+ return super.requestFocus(FOCUS_DOWN, null);
+ }
+ return false;
+ }
+
+ /**
* {@inheritDoc}
*
* @hide
@@ -3239,6 +3278,17 @@
}
}
+ @Override
+ void dispatchMovedToDisplay(Display display) {
+ super.dispatchMovedToDisplay(display);
+
+ final int count = mChildrenCount;
+ final View[] children = mChildren;
+ for (int i = 0; i < count; i++) {
+ children[i].dispatchMovedToDisplay(display);
+ }
+ }
+
/** @hide */
@Override
public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
@@ -4277,9 +4327,9 @@
* {@hide}
*/
@Override
- protected View findViewTraversal(@IdRes int id) {
+ protected <T extends View> T findViewTraversal(@IdRes int id) {
if (id == mID) {
- return this;
+ return (T) this;
}
final View[] where = mChildren;
@@ -4292,7 +4342,7 @@
v = v.findViewById(id);
if (v != null) {
- return v;
+ return (T) v;
}
}
}
@@ -4304,9 +4354,9 @@
* {@hide}
*/
@Override
- protected View findViewWithTagTraversal(Object tag) {
+ protected <T extends View> T findViewWithTagTraversal(Object tag) {
if (tag != null && tag.equals(mTag)) {
- return this;
+ return (T) this;
}
final View[] where = mChildren;
@@ -4319,7 +4369,7 @@
v = v.findViewWithTag(tag);
if (v != null) {
- return v;
+ return (T) v;
}
}
}
@@ -4331,9 +4381,10 @@
* {@hide}
*/
@Override
- protected View findViewByPredicateTraversal(Predicate<View> predicate, View childToSkip) {
+ protected <T extends View> T findViewByPredicateTraversal(Predicate<View> predicate,
+ View childToSkip) {
if (predicate.test(this)) {
- return this;
+ return (T) this;
}
final View[] where = mChildren;
@@ -4346,7 +4397,7 @@
v = v.findViewByPredicate(predicate);
if (v != null) {
- return v;
+ return (T) v;
}
}
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 20d8a11..20d960f 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -72,6 +72,7 @@
import android.util.TypedValue;
import android.view.Surface.OutOfResourcesException;
import android.view.View.AttachInfo;
+import android.view.View.FocusDirection;
import android.view.View.MeasureSpec;
import android.view.WindowManager.LayoutParams.SoftInputModeFlags;
import android.view.accessibility.AccessibilityEvent;
@@ -887,9 +888,9 @@
final boolean hasSurfaceInsets = insets.left != 0 || insets.right != 0
|| insets.top != 0 || insets.bottom != 0;
final boolean translucent = attrs.format != PixelFormat.OPAQUE || hasSurfaceInsets;
- mAttachInfo.mThreadedRenderer = ThreadedRenderer.create(mContext, translucent);
+ mAttachInfo.mThreadedRenderer = ThreadedRenderer.create(mContext, translucent,
+ attrs.getTitle().toString());
if (mAttachInfo.mThreadedRenderer != null) {
- mAttachInfo.mThreadedRenderer.setName(attrs.getTitle().toString());
mAttachInfo.mHardwareAccelerated =
mAttachInfo.mHardwareAccelerationRequested = true;
}
@@ -1034,6 +1035,26 @@
}
};
+ /**
+ * Notify about move to a different display.
+ * @param displayId The id of the display where this view root is moved to.
+ *
+ * @hide
+ */
+ public void onMovedToDisplay(int displayId) {
+ if (mDisplay.getDisplayId() == displayId) {
+ return;
+ }
+
+ // Get new instance of display based on current display adjustments. It may be updated later
+ // if moving between the displays also involved a configuration change.
+ mDisplay = ResourcesManager.getInstance().getAdjustedDisplay(displayId,
+ mView.getResources());
+ mAttachInfo.mDisplayState = mDisplay.getState();
+ // Internal state updated, now notify the view hierarchy.
+ mView.dispatchMovedToDisplay(mDisplay);
+ }
+
void pokeDrawLockIfNeeded() {
final int displayState = mAttachInfo.mDisplayState;
if (mView != null && mAdded && mTraversalScheduled
@@ -3364,7 +3385,7 @@
if (force || mLastConfiguration.diff(config) != 0) {
// Update the display with new DisplayAdjustments.
mDisplay = ResourcesManager.getInstance().getAdjustedDisplay(
- mDisplay.getDisplayId(), localResources.getDisplayAdjustments());
+ mDisplay.getDisplayId(), localResources);
final int lastLayoutDirection = mLastConfiguration.getLayoutDirection();
final int currentLayoutDirection = config.getLayoutDirection();
@@ -3523,7 +3544,8 @@
&& mPendingOutsets.equals(args.arg7)
&& mPendingBackDropFrame.equals(args.arg8)
&& args.arg4 == null
- && args.argi1 == 0) {
+ && args.argi1 == 0
+ && mDisplay.getDisplayId() == args.argi3) {
break;
}
} // fall through...
@@ -3531,6 +3553,10 @@
if (mAdded) {
SomeArgs args = (SomeArgs) msg.obj;
+ if (mDisplay.getDisplayId() != args.argi3) {
+ onMovedToDisplay(args.argi3);
+ }
+
Configuration config = (Configuration) args.arg4;
if (config != null) {
updateConfiguration(config, false);
@@ -4279,11 +4305,11 @@
mTranslator.translateEventInScreenToAppWindow(event);
}
- // Enter touch mode on down or scroll.
+ // Enter touch mode on down or scroll, if it is coming from a touch screen device,
+ // exit otherwise.
final int action = event.getAction();
- if (event.isFromSource(InputDevice.SOURCE_TOUCHSCREEN)
- && (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_SCROLL)) {
- ensureTouchMode(true);
+ if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_SCROLL) {
+ ensureTouchMode(event.isFromSource(InputDevice.SOURCE_TOUCHSCREEN));
}
if (action == MotionEvent.ACTION_DOWN && mAttachInfo.mTooltipHost != null) {
@@ -4440,7 +4466,7 @@
private boolean performKeyboardGroupNavigation(int direction) {
final View focused = mView.findFocus();
- final View cluster = focused != null
+ View cluster = focused != null
? focused.keyboardNavigationClusterSearch(null, direction)
: keyboardNavigationClusterSearch(null, direction);
@@ -4451,6 +4477,15 @@
realDirection = View.FOCUS_DOWN;
}
+ if (cluster != null && cluster.isRootNamespace()) {
+ // the default cluster. Try to find a non-clustered view to focus.
+ if (cluster.restoreFocusNotInCluster()) {
+ return true;
+ }
+ // otherwise skip to next actual cluster
+ cluster = keyboardNavigationClusterSearch(null, direction);
+ }
+
if (cluster != null && cluster.restoreFocusInCluster(realDirection)) {
return true;
}
@@ -5941,7 +5976,8 @@
* {@inheritDoc}
*/
@Override
- public View keyboardNavigationClusterSearch(View currentCluster, int direction) {
+ public View keyboardNavigationClusterSearch(View currentCluster,
+ @FocusDirection int direction) {
checkThread();
return FocusFinder.getInstance().findNextKeyboardNavigationCluster(
mView, currentCluster, direction);
@@ -6138,7 +6174,7 @@
public void dispatchResized(Rect frame, Rect overscanInsets, Rect contentInsets,
Rect visibleInsets, Rect stableInsets, Rect outsets, boolean reportDraw,
Configuration newConfig, Rect backDropFrame, boolean forceLayout,
- boolean alwaysConsumeNavBar) {
+ boolean alwaysConsumeNavBar, int displayId) {
if (DEBUG_LAYOUT) Log.v(mTag, "Resizing " + this + ": frame=" + frame.toShortString()
+ " contentInsets=" + contentInsets.toShortString()
+ " visibleInsets=" + visibleInsets.toShortString()
@@ -6176,6 +6212,7 @@
args.arg8 = sameProcessCall ? new Rect(backDropFrame) : backDropFrame;
args.argi1 = forceLayout ? 1 : 0;
args.argi2 = alwaysConsumeNavBar ? 1 : 0;
+ args.argi3 = displayId;
msg.obj = args;
mHandler.sendMessage(msg);
}
@@ -7188,12 +7225,12 @@
public void resized(Rect frame, Rect overscanInsets, Rect contentInsets,
Rect visibleInsets, Rect stableInsets, Rect outsets, boolean reportDraw,
Configuration newConfig, Rect backDropFrame, boolean forceLayout,
- boolean alwaysConsumeNavBar) {
+ boolean alwaysConsumeNavBar, int displayId) {
final ViewRootImpl viewAncestor = mViewAncestor.get();
if (viewAncestor != null) {
viewAncestor.dispatchResized(frame, overscanInsets, contentInsets,
visibleInsets, stableInsets, outsets, reportDraw, newConfig, backDropFrame,
- forceLayout, alwaysConsumeNavBar);
+ forceLayout, alwaysConsumeNavBar, displayId);
}
}
diff --git a/core/java/android/view/ViewStructure.java b/core/java/android/view/ViewStructure.java
index cc19539..84c2c84 100644
--- a/core/java/android/view/ViewStructure.java
+++ b/core/java/android/view/ViewStructure.java
@@ -25,19 +25,12 @@
/**
* Container for storing additional per-view data generated by {@link View#onProvideStructure
- * View.onProvideStructure}.
+ * View.onProvideStructure} and {@link View#onProvideAutoFillStructure
+ * View.onProvideAutoFillStructure}.
*/
public abstract class ViewStructure {
/**
- * Flag used when adding virtual views for auto-fill, it indicates the contents of the view
- * (such as * {@link android.app.assist.AssistStructure.ViewNode#getText()} and
- * {@link android.app.assist.AssistStructure.ViewNode#getAutoFillValue()})
- * can be passed to the {@link android.service.autofill.AutoFillService}.
- */
- public static final int AUTO_FILL_FLAG_SANITIZED = 0x1;
-
- /**
* Set the identifier for this view.
*
* @param id The view's identifier, as per {@link View#getId View.getId()}.
@@ -314,12 +307,28 @@
public abstract void setAutoFillValue(AutoFillValue value);
/**
- * @hide
+ * Sets the options that can be used to auto-fill this node.
*
- * TODO(b/33197203, b/33269702): temporary set it as not sanitized until
- * AssistStructure automaticaly sets sanitization based on text coming from resources
+ * <p>Typically used by nodes whose {@link AutoFillType} is a list to indicate the meaning of
+ * each possible value in the list.
*/
- public abstract void setSanitized(boolean sensitive);
+ // TODO(b/33197203, b/33802548): add CTS/unit test
+ public abstract void setAutoFillOptions(String[] options);
+
+ /**
+ * Marks this node as sanitized so its content are sent on {@link
+ * android.service.autofill.AutoFillService#onFillRequest(android.app.assist.AssistStructure,
+ * Bundle, android.os.CancellationSignal, android.service.autofill.FillCallback)}.
+ *
+ * <p>Only nodes that does not have PII (Personally Identifiable Information - sensitive data
+ * such as email addresses, credit card numbers, passwords, etc...) should be marked
+ * as sanitized; a good rule of thumb is to mark as sanitized nodes whose value were statically
+ * set from resources.
+ *
+ * <p>Should only be set when the node is used for AutoFill purposes - it will be ignored
+ * when used for Assist.
+ */
+ public abstract void setSanitized(boolean sanitized);
/**
* Call when done populating a {@link ViewStructure} returned by
@@ -335,4 +344,17 @@
/** @hide */
public abstract AutoFillId getAutoFillId();
+
+ /**
+ * Sets the URL represented by this node.
+ *
+ * <p>Typically used in the following situations:
+ *
+ * <ol>
+ * <li>In a {@link android.app.assist.AssistStructure.WindowNode#getRootViewNode()}, to set up
+ * the main URL of an HTML page.
+ * <li>On child nodes represening hyperlinks.
+ * </ol>
+ */
+ public abstract void setUrl(String url);
}
diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java
index fc6448a..c7e8dee 100644
--- a/core/java/android/view/WindowManagerGlobal.java
+++ b/core/java/android/view/WindowManagerGlobal.java
@@ -167,8 +167,10 @@
sWindowManagerService = IWindowManager.Stub.asInterface(
ServiceManager.getService("window"));
try {
- sWindowManagerService = getWindowManagerService();
- ValueAnimator.setDurationScale(sWindowManagerService.getCurrentAnimatorScale());
+ if (sWindowManagerService != null) {
+ ValueAnimator.setDurationScale(
+ sWindowManagerService.getCurrentAnimatorScale());
+ }
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/view/WindowManagerInternal.java b/core/java/android/view/WindowManagerInternal.java
index 7a5e670..a541a4c 100644
--- a/core/java/android/view/WindowManagerInternal.java
+++ b/core/java/android/view/WindowManagerInternal.java
@@ -296,9 +296,12 @@
* to corresponding API calls. Note that this state is not guaranteed
* to be synchronized with state in WindowManagerService.
* @param targetWindowToken token to identify the target window that the IME is associated with.
+ * {@code null} when application, system, or the IME itself decided to
+ * change its window visibility before being associated with any target
+ * window.
*/
- public abstract void updateInputMethodWindowStatus(IBinder imeToken, boolean imeWindowVisible,
- IBinder targetWindowToken);
+ public abstract void updateInputMethodWindowStatus(@NonNull IBinder imeToken,
+ boolean imeWindowVisible, @Nullable IBinder targetWindowToken);
/**
* Returns true when the hardware keyboard is available.
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 67d7ff8..8094fa6 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -28,6 +28,7 @@
import android.os.Parcelable;
import android.text.InputType;
import android.text.Spannable;
+import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.AccessibilityClickableSpan;
@@ -2421,7 +2422,7 @@
ClickableSpan[] spans =
((Spanned) text).getSpans(0, text.length(), ClickableSpan.class);
if (spans.length > 0) {
- Spannable spannable = Spannable.Factory.getInstance().newSpannable(text);
+ Spannable spannable = new SpannableStringBuilder(text);
for (int i = 0; i < spans.length; i++) {
ClickableSpan span = spans[i];
if ((span instanceof AccessibilityClickableSpan)
@@ -3590,6 +3591,7 @@
* <li><strong>Standard actions</strong> - These are actions that are reported and
* handled by the standard UI widgets in the platform. For each standard action
* there is a static constant defined in this class, e.g. {@link #ACTION_FOCUS}.
+ * These actions will have {@code null} labels.
* </li>
* <li><strong>Custom actions action</strong> - These are actions that are reported
* and handled by custom widgets. i.e. ones that are not part of the UI toolkit. For
diff --git a/core/java/android/view/autofill/AutoFillManager.java b/core/java/android/view/autofill/AutoFillManager.java
index f7a1b61..b44bbbe 100644
--- a/core/java/android/view/autofill/AutoFillManager.java
+++ b/core/java/android/view/autofill/AutoFillManager.java
@@ -16,6 +16,9 @@
package android.view.autofill;
+import static android.view.autofill.Helper.DEBUG;
+import static android.view.autofill.Helper.VERBOSE;
+
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
@@ -24,7 +27,6 @@
import android.os.IBinder;
import android.os.Parcelable;
import android.os.RemoteException;
-import android.util.ArrayMap;
import android.util.Log;
import android.view.View;
@@ -37,7 +39,6 @@
// TODO(b/33197203): improve this javadoc
//TODO(b/33197203): restrict manager calls to activity
public final class AutoFillManager {
- private static final boolean DEBUG = false;
private static final String TAG = "AutoFillManager";
@@ -69,13 +70,6 @@
/** @hide */ public static final int FLAG_FOCUS_LOST = 0x4;
/** @hide */ public static final int FLAG_VALUE_CHANGED = 0x8;
- // These are activities that may have auto-fill UI which are keyed off their tokens.
- // This is done instead of the activity setting the client in the auto-fill manager
- // to avoid unnecessary instantiation of the manager and do this only if there is an
- // auto-fillable focused. This has only the cost of loading the class vs creating an
- // auto-fill manager for every activity even one that cannot be filled.
- private static final ArrayMap<IBinder, AutoFillClient> sPendingClients = new ArrayMap<>();
-
private final Rect mTempRect = new Rect();
private final IAutoFillManager mService;
@@ -83,8 +77,6 @@
private Context mContext;
- private AutoFillClient mClient;
-
private boolean mHasSession;
private boolean mEnabled;
@@ -105,6 +97,11 @@
* @param fillInIntent The authentication fill-in intent.
*/
void authenticate(IntentSender intent, Intent fillInIntent);
+
+ /**
+ * Tells the client this manager has state to be reset.
+ */
+ void resetableStateAvailable();
}
/**
@@ -136,7 +133,7 @@
if (!mHasSession) {
if (gainFocus) {
// Starts new session.
- startSession(id, bounds, value);
+ startSession(id, view.getWindowToken(), bounds, value);
}
} else {
// Update focus on existing session.
@@ -164,7 +161,7 @@
if (!mHasSession) {
if (gainFocus) {
// Starts new session.
- startSession(id, bounds, null);
+ startSession(id, parent.getWindowToken(), bounds, null);
}
} else {
// Update focus on existing session.
@@ -178,8 +175,6 @@
* @param view view whose focus changed.
*/
public void valueChanged(View view) {
- ensureServiceClientAddedIfNeeded();
-
if (!mEnabled || !mHasSession) {
return;
}
@@ -198,8 +193,6 @@
* @param value new value of the child.
*/
public void virtualValueChanged(View parent, int childId, AutoFillValue value) {
- ensureServiceClientAddedIfNeeded();
-
if (!mEnabled || !mHasSession) {
return;
}
@@ -215,8 +208,6 @@
* call this method after the form is submitted and another page is rendered.
*/
public void reset() {
- ensureServiceClientAddedIfNeeded();
-
if (!mEnabled && !mHasSession) {
return;
}
@@ -224,35 +215,27 @@
finishSession();
}
- /** @hide */
- public static void addClient(IBinder token, AutoFillClient client) {
- sPendingClients.put(token, client);
- }
-
- /** @hide */
- public static boolean isClientActive(IBinder token) {
- return !sPendingClients.containsKey(token);
- }
-
- private void activateClient() {
- mClient = sPendingClients.remove(mContext.getActivityToken());
- }
-
private AutoFillClient getClient() {
- if (mClient == null) {
- return sPendingClients.get(mContext.getActivityToken());
+ if (mContext instanceof AutoFillClient) {
+ return (AutoFillClient) mContext;
}
- return mClient;
+ return null;
}
/** @hide */
public void onAuthenticationResult(Intent data) {
+ // TODO(b/33197203): the result code is being ignored, so this method is not reliably
+ // handling the cases where it's not RESULT_OK: it works fine if the service does not
+ // set the EXTRA_AUTHENTICATION_RESULT extra, but it could cause weird results if the
+ // service set the extra and returned RESULT_CANCELED...
+
+ if (DEBUG) Log.d(TAG, "onAuthenticationResult(): d=" + data);
+
if (data == null) {
return;
}
- Parcelable result = data.getParcelableExtra(
- EXTRA_AUTHENTICATION_RESULT);
- Bundle responseData = new Bundle();
+ final Parcelable result = data.getParcelableExtra(EXTRA_AUTHENTICATION_RESULT);
+ final Bundle responseData = new Bundle();
responseData.putParcelable(EXTRA_AUTHENTICATION_RESULT, result);
try {
mService.setAuthenticationResult(responseData,
@@ -270,15 +253,19 @@
return new AutoFillId(parent.getAccessibilityViewId(), childId);
}
- private void startSession(AutoFillId id, Rect bounds, AutoFillValue value) {
+ private void startSession(AutoFillId id, IBinder windowToken,
+ Rect bounds, AutoFillValue value) {
if (DEBUG) {
- Log.v(TAG, "startSession(): id=" + id + ", bounds=" + bounds + ", value=" + value);
+ Log.d(TAG, "startSession(): id=" + id + ", bounds=" + bounds + ", value=" + value);
}
try {
- mService.startSession(mContext.getActivityToken(), mServiceClient.asBinder(),
- id, bounds, value, mContext.getUserId());
+ mService.startSession(mContext.getActivityToken(), windowToken,
+ mServiceClient.asBinder(), id, bounds, value, mContext.getUserId());
+ AutoFillClient client = getClient();
+ if (client != null) {
+ client.resetableStateAvailable();
+ }
mHasSession = true;
- activateClient();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -286,7 +273,7 @@
private void finishSession() {
if (DEBUG) {
- Log.v(TAG, "finishSession()");
+ Log.d(TAG, "finishSession()");
}
mHasSession = false;
try {
@@ -298,9 +285,12 @@
private void updateSession(AutoFillId id, Rect bounds, AutoFillValue value, int flags) {
if (DEBUG) {
- Log.v(TAG, "updateSession(): id=" + id + ", bounds=" + bounds + ", value=" + value
+ if (VERBOSE || (flags & FLAG_FOCUS_LOST) != 0) {
+ Log.d(TAG, "updateSession(): id=" + id + ", bounds=" + bounds + ", value=" + value
+ ", flags=" + flags);
+ }
}
+
try {
mService.updateSession(mContext.getActivityToken(), id, bounds, value, flags,
mContext.getUserId());
diff --git a/core/java/android/view/autofill/AutoFillType.java b/core/java/android/view/autofill/AutoFillType.java
index 017f7f8..5d85bfd 100644
--- a/core/java/android/view/autofill/AutoFillType.java
+++ b/core/java/android/view/autofill/AutoFillType.java
@@ -44,8 +44,6 @@
private static final int TYPE_TEXT = 1;
private static final int TYPE_TOGGLE = 2;
- // TODO(b/33197203): make sure it works with Spinners and/or add a new type for them
- // (since they're often used for credit card selection)
private static final int TYPE_LIST = 3;
// TODO(b/33197203): add others, like date picker? That would be trick, because they're set as:
diff --git a/core/java/android/view/autofill/AutoFillValue.java b/core/java/android/view/autofill/AutoFillValue.java
index af70361..d9afa3b 100644
--- a/core/java/android/view/autofill/AutoFillValue.java
+++ b/core/java/android/view/autofill/AutoFillValue.java
@@ -32,7 +32,6 @@
* {@code sub-type} define its semantics (like a postal address).
*/
public final class AutoFillValue implements Parcelable {
-
private final String mText;
private final int mListIndex;
private final boolean mToggle;
@@ -100,6 +99,12 @@
return true;
}
+ /** @hide */
+ public String coerceToString() {
+ // TODO(b/33197203): How can we filter on toggles or list values?
+ return mText;
+ }
+
@Override
public String toString() {
if (!DEBUG) return super.toString();
diff --git a/core/java/android/view/autofill/Helper.java b/core/java/android/view/autofill/Helper.java
index b1c9efa..aa94de0 100644
--- a/core/java/android/view/autofill/Helper.java
+++ b/core/java/android/view/autofill/Helper.java
@@ -25,9 +25,9 @@
/** @hide */
public final class Helper {
- static final boolean DEBUG = true; // TODO(b/33197203): set to false when stable
- static final boolean VERBOSE = false;
- static final String REDACTED = "[REDACTED]";
+ public static final boolean DEBUG = true; // TODO(b/33197203): set to false when stable
+ public static final boolean VERBOSE = false;
+ public static final String REDACTED = "[REDACTED]";
static StringBuilder append(StringBuilder builder, Bundle bundle) {
if (bundle == null) {
diff --git a/core/java/android/view/autofill/IAutoFillManager.aidl b/core/java/android/view/autofill/IAutoFillManager.aidl
index 0433a8f..d054e97 100644
--- a/core/java/android/view/autofill/IAutoFillManager.aidl
+++ b/core/java/android/view/autofill/IAutoFillManager.aidl
@@ -30,7 +30,7 @@
*/
interface IAutoFillManager {
boolean addClient(in IAutoFillManagerClient client, int userId);
- oneway void startSession(in IBinder activityToken, in IBinder appCallback,
+ oneway void startSession(in IBinder activityToken, IBinder windowToken, in IBinder appCallback,
in AutoFillId autoFillId, in Rect bounds, in AutoFillValue value, int userId);
oneway void updateSession(in IBinder activityToken, in AutoFillId id, in Rect bounds,
in AutoFillValue value, int flags, int userId);
diff --git a/core/java/android/webkit/WebViewZygote.java b/core/java/android/webkit/WebViewZygote.java
index 2d6f443..f9d7332 100644
--- a/core/java/android/webkit/WebViewZygote.java
+++ b/core/java/android/webkit/WebViewZygote.java
@@ -176,7 +176,7 @@
// paths and pass them to the zygote as strings.
final List<String> zipPaths = new ArrayList<>(10);
final List<String> libPaths = new ArrayList<>(10);
- LoadedApk.makePaths(null, sPackage.applicationInfo, zipPaths, libPaths);
+ LoadedApk.makePaths(null, false, sPackage.applicationInfo, zipPaths, libPaths);
final String librarySearchPath = TextUtils.join(File.pathSeparator, libPaths);
final String zip = (zipPaths.size() == 1) ? zipPaths.get(0) :
TextUtils.join(File.pathSeparator, zipPaths);
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 4c9a866..1937187 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -54,6 +54,7 @@
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
+import android.view.PointerIcon;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
@@ -4402,6 +4403,17 @@
}
@Override
+ public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) {
+ if (mFastScroll != null) {
+ PointerIcon pointerIcon = mFastScroll.onResolvePointerIcon(event, pointerIndex);
+ if (pointerIcon != null) {
+ return pointerIcon;
+ }
+ }
+ return super.onResolvePointerIcon(event, pointerIndex);
+ }
+
+ @Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
final int actionMasked = ev.getActionMasked();
View v;
diff --git a/core/java/android/widget/ActivityChooserView.java b/core/java/android/widget/ActivityChooserView.java
index 51587a7..9a39a17 100644
--- a/core/java/android/widget/ActivityChooserView.java
+++ b/core/java/android/widget/ActivityChooserView.java
@@ -250,7 +250,7 @@
mDefaultActivityButton = (FrameLayout) findViewById(R.id.default_activity_button);
mDefaultActivityButton.setOnClickListener(mCallbacks);
mDefaultActivityButton.setOnLongClickListener(mCallbacks);
- mDefaultActivityButtonImage = (ImageView) mDefaultActivityButton.findViewById(R.id.image);
+ mDefaultActivityButtonImage = mDefaultActivityButton.findViewById(R.id.image);
final FrameLayout expandButton = (FrameLayout) findViewById(R.id.expand_activities_button);
expandButton.setOnClickListener(mCallbacks);
@@ -282,7 +282,7 @@
mExpandActivityOverflowButton = expandButton;
mExpandActivityOverflowButtonImage =
- (ImageView) expandButton.findViewById(R.id.image);
+ expandButton.findViewById(R.id.image);
mExpandActivityOverflowButtonImage.setImageDrawable(expandActivityOverflowButtonDrawable);
mAdapter = new ActivityChooserViewAdapter();
@@ -760,7 +760,7 @@
convertView = LayoutInflater.from(getContext()).inflate(
R.layout.activity_chooser_view_list_item, parent, false);
convertView.setId(ITEM_VIEW_TYPE_FOOTER);
- TextView titleView = (TextView) convertView.findViewById(R.id.title);
+ TextView titleView = convertView.findViewById(R.id.title);
titleView.setText(mContext.getString(
R.string.activity_chooser_view_see_all));
}
@@ -772,11 +772,11 @@
}
PackageManager packageManager = mContext.getPackageManager();
// Set the icon
- ImageView iconView = (ImageView) convertView.findViewById(R.id.icon);
+ ImageView iconView = convertView.findViewById(R.id.icon);
ResolveInfo activity = (ResolveInfo) getItem(position);
iconView.setImageDrawable(activity.loadIcon(packageManager));
// Set the title.
- TextView titleView = (TextView) convertView.findViewById(R.id.title);
+ TextView titleView = convertView.findViewById(R.id.title);
titleView.setText(activity.loadLabel(packageManager));
// Highlight the default.
if (mShowDefaultActivity && position == 0 && mHighlightDefaultActivity) {
diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java
index 2cfefba..0b3cff1 100644
--- a/core/java/android/widget/AdapterView.java
+++ b/core/java/android/widget/AdapterView.java
@@ -34,6 +34,7 @@
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.autofill.AutoFillManager;
/**
* An AdapterView is a view whose children are determined by an {@link Adapter}.
@@ -914,6 +915,11 @@
dispatchOnItemSelected();
}
}
+ // Always notify AutoFillManager - it will return right away if auto-fill is disabled.
+ final AutoFillManager afm = mContext.getSystemService(AutoFillManager.class);
+ if (afm != null) {
+ afm.valueChanged(this);
+ }
}
private void dispatchOnItemSelected() {
diff --git a/core/java/android/widget/AppSecurityPermissions.java b/core/java/android/widget/AppSecurityPermissions.java
index 68e6809..06d4868 100644
--- a/core/java/android/widget/AppSecurityPermissions.java
+++ b/core/java/android/widget/AppSecurityPermissions.java
@@ -451,7 +451,7 @@
private View getPermissionsView(int which, boolean showRevokeUI) {
LinearLayout permsView = (LinearLayout) mInflater.inflate(R.layout.app_perms_summary, null);
- LinearLayout displayList = (LinearLayout) permsView.findViewById(R.id.perms_list);
+ LinearLayout displayList = permsView.findViewById(R.id.perms_list);
View noPermsView = permsView.findViewById(R.id.no_permissions);
displayPermissions(mPermGroupsList, displayList, which, showRevokeUI);
@@ -517,8 +517,8 @@
CharSequence grpName, CharSequence permList, boolean dangerous, Drawable icon) {
View permView = inflater.inflate(R.layout.app_permission_item_old, null);
- TextView permGrpView = (TextView) permView.findViewById(R.id.permission_group);
- TextView permDescView = (TextView) permView.findViewById(R.id.permission_list);
+ TextView permGrpView = permView.findViewById(R.id.permission_group);
+ TextView permDescView = permView.findViewById(R.id.permission_list);
ImageView imgView = (ImageView)permView.findViewById(R.id.perm_icon);
imgView.setImageDrawable(icon);
diff --git a/core/java/android/widget/ArrayAdapter.java b/core/java/android/widget/ArrayAdapter.java
index bbc50da..81f0d3d 100644
--- a/core/java/android/widget/ArrayAdapter.java
+++ b/core/java/android/widget/ArrayAdapter.java
@@ -388,7 +388,7 @@
text = (TextView) view;
} else {
// Otherwise, find the TextView field within the layout
- text = (TextView) view.findViewById(mFieldId);
+ text = view.findViewById(mFieldId);
if (text == null) {
throw new RuntimeException("Failed to find view with ID "
diff --git a/core/java/android/widget/CalendarViewLegacyDelegate.java b/core/java/android/widget/CalendarViewLegacyDelegate.java
index 557d411..1b899db 100644
--- a/core/java/android/widget/CalendarViewLegacyDelegate.java
+++ b/core/java/android/widget/CalendarViewLegacyDelegate.java
@@ -316,9 +316,9 @@
View content = layoutInflater.inflate(R.layout.calendar_view, null, false);
mDelegator.addView(content);
- mListView = (ListView) mDelegator.findViewById(R.id.list);
- mDayNamesHeader = (ViewGroup) content.findViewById(R.id.day_names);
- mMonthName = (TextView) content.findViewById(R.id.month_name);
+ mListView = mDelegator.findViewById(R.id.list);
+ mDayNamesHeader = content.findViewById(R.id.day_names);
+ mMonthName = content.findViewById(R.id.month_name);
setUpHeader();
setUpListView();
diff --git a/core/java/android/widget/CompoundButton.java b/core/java/android/widget/CompoundButton.java
index 6f687fe..887c59a 100644
--- a/core/java/android/widget/CompoundButton.java
+++ b/core/java/android/widget/CompoundButton.java
@@ -32,8 +32,10 @@
import android.view.SoundEffectConstants;
import android.view.ViewDebug;
import android.view.ViewHierarchyEncoder;
+import android.view.ViewStructure;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.autofill.AutoFillManager;
import android.view.autofill.AutoFillType;
import android.view.autofill.AutoFillValue;
@@ -67,6 +69,10 @@
private OnCheckedChangeListener mOnCheckedChangeListener;
private OnCheckedChangeListener mOnCheckedChangeWidgetListener;
+ // Indicates whether the toggle state was set from resources or dynamically, so it can be used
+ // to sanitize auto-fill requests.
+ private boolean mCheckedFromResource = false;
+
private static final int[] CHECKED_STATE_SET = {
R.attr.state_checked
};
@@ -108,6 +114,7 @@
final boolean checked = a.getBoolean(
com.android.internal.R.styleable.CompoundButton_checked, false);
setChecked(checked);
+ mCheckedFromResource = true;
a.recycle();
@@ -147,6 +154,7 @@
@Override
public void setChecked(boolean checked) {
if (mChecked != checked) {
+ mCheckedFromResource = false;
mChecked = checked;
refreshDrawableState();
notifyViewAccessibilityStateChangedIfNeeded(
@@ -164,6 +172,10 @@
if (mOnCheckedChangeWidgetListener != null) {
mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked);
}
+ final AutoFillManager afm = mContext.getSystemService(AutoFillManager.class);
+ if (afm != null) {
+ afm.valueChanged(this);
+ }
mBroadcasting = false;
}
@@ -563,7 +575,12 @@
// TODO(b/33197203): add unit/CTS tests for auto-fill methods (and make sure they handle enable)
- // TODO(b/33197203): override onProvideAutoFillStructure and add a change listener
+ @Override
+ public void onProvideAutoFillStructure(ViewStructure structure, int flags) {
+ super.onProvideAutoFillStructure(structure, flags);
+
+ structure.setSanitized(mCheckedFromResource);
+ }
@Override
public void autoFill(AutoFillValue value) {
@@ -579,6 +596,6 @@
@Override
public AutoFillValue getAutoFillValue() {
- return isEnabled() ? null : AutoFillValue.forToggle(isChecked());
+ return isEnabled() ? AutoFillValue.forToggle(isChecked()) : null;
}
}
diff --git a/core/java/android/widget/DatePickerCalendarDelegate.java b/core/java/android/widget/DatePickerCalendarDelegate.java
index f712685..907250a 100755
--- a/core/java/android/widget/DatePickerCalendarDelegate.java
+++ b/core/java/android/widget/DatePickerCalendarDelegate.java
@@ -115,10 +115,10 @@
mDelegator.addView(mContainer);
// Set up header views.
- final ViewGroup header = (ViewGroup) mContainer.findViewById(R.id.date_picker_header);
- mHeaderYear = (TextView) header.findViewById(R.id.date_picker_header_year);
+ final ViewGroup header = mContainer.findViewById(R.id.date_picker_header);
+ mHeaderYear = header.findViewById(R.id.date_picker_header_year);
mHeaderYear.setOnClickListener(mOnHeaderClickListener);
- mHeaderMonthDay = (TextView) header.findViewById(R.id.date_picker_header_date);
+ mHeaderMonthDay = header.findViewById(R.id.date_picker_header_date);
mHeaderMonthDay.setOnClickListener(mOnHeaderClickListener);
// For the sake of backwards compatibility, attempt to extract the text
@@ -154,10 +154,10 @@
a.recycle();
// Set up picker container.
- mAnimator = (ViewAnimator) mContainer.findViewById(R.id.animator);
+ mAnimator = mContainer.findViewById(R.id.animator);
// Set up day picker view.
- mDayPickerView = (DayPickerView) mAnimator.findViewById(R.id.date_picker_day_picker);
+ mDayPickerView = mAnimator.findViewById(R.id.date_picker_day_picker);
mDayPickerView.setFirstDayOfWeek(mFirstDayOfWeek);
mDayPickerView.setMinDate(mMinDate.getTimeInMillis());
mDayPickerView.setMaxDate(mMaxDate.getTimeInMillis());
@@ -165,7 +165,7 @@
mDayPickerView.setOnDaySelectedListener(mOnDaySelectedListener);
// Set up year picker view.
- mYearPickerView = (YearPickerView) mAnimator.findViewById(R.id.date_picker_year_picker);
+ mYearPickerView = mAnimator.findViewById(R.id.date_picker_year_picker);
mYearPickerView.setRange(mMinDate, mMaxDate);
mYearPickerView.setYear(mCurrentDate.get(Calendar.YEAR));
mYearPickerView.setOnYearSelectedListener(mOnYearSelectedListener);
diff --git a/core/java/android/widget/DayPickerPagerAdapter.java b/core/java/android/widget/DayPickerPagerAdapter.java
index 8d5bf8f..63621e1 100644
--- a/core/java/android/widget/DayPickerPagerAdapter.java
+++ b/core/java/android/widget/DayPickerPagerAdapter.java
@@ -225,7 +225,7 @@
public Object instantiateItem(ViewGroup container, int position) {
final View itemView = mInflater.inflate(mLayoutResId, container, false);
- final SimpleMonthView v = (SimpleMonthView) itemView.findViewById(mCalendarViewId);
+ final SimpleMonthView v = itemView.findViewById(mCalendarViewId);
v.setOnDayClickListener(mOnDayClickListener);
v.setMonthTextAppearance(mMonthTextAppearance);
v.setDayOfWeekTextAppearance(mDayOfWeekTextAppearance);
diff --git a/core/java/android/widget/DayPickerView.java b/core/java/android/widget/DayPickerView.java
index 919c1e2..0f0e6c3 100644
--- a/core/java/android/widget/DayPickerView.java
+++ b/core/java/android/widget/DayPickerView.java
@@ -294,14 +294,15 @@
* @param animate whether to smooth scroll to the new position
* @param setSelected whether to set the specified day as selected
*
- * @throws IllegalArgumentException as of {@link android.os.Build.VERSION_CODES#N_MR1} if the
- * provided timeInMillis is before the range start or after the range end.
+ * @throws IllegalArgumentException if the build version is greater than
+ * {@link android.os.Build.VERSION_CODES#N_MR1} and the provided timeInMillis is before
+ * the range start or after the range end.
*/
private void setDate(long timeInMillis, boolean animate, boolean setSelected) {
getTempCalendarForTime(timeInMillis);
final int targetSdkVersion = mContext.getApplicationInfo().targetSdkVersion;
- if (targetSdkVersion >= N_MR1) {
+ if (targetSdkVersion > N_MR1) {
if (mTempCalendar.before(mMinDate) || mTempCalendar.after(mMaxDate)) {
throw new IllegalArgumentException("timeInMillis must be between the values of "
+ "getMinDate() and getMaxDate()");
diff --git a/core/java/android/widget/DayPickerViewPager.java b/core/java/android/widget/DayPickerViewPager.java
index a27e022..1704ed7 100644
--- a/core/java/android/widget/DayPickerViewPager.java
+++ b/core/java/android/widget/DayPickerViewPager.java
@@ -137,9 +137,10 @@
}
@Override
- protected View findViewByPredicateTraversal(Predicate<View> predicate, View childToSkip) {
+ protected <T extends View> T findViewByPredicateTraversal(Predicate<View> predicate,
+ View childToSkip) {
if (predicate.test(this)) {
- return this;
+ return (T) this;
}
// Always try the selected view first.
@@ -148,7 +149,7 @@
if (current != childToSkip && current != null) {
final View v = current.findViewByPredicate(predicate);
if (v != null) {
- return v;
+ return (T) v;
}
}
@@ -160,7 +161,7 @@
final View v = child.findViewByPredicate(predicate);
if (v != null) {
- return v;
+ return (T) v;
}
}
}
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index dd3b054..ade03e1 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -2183,6 +2183,11 @@
}
void onTouchUpEvent(MotionEvent event) {
+ if (getSelectionActionModeHelper().resetOriginalSelection(
+ getTextView().getOffsetForPosition(event.getX(), event.getY()))) {
+ return;
+ }
+
boolean selectAllGotFocus = mSelectAllOnFocus && mTextView.didTouchFocusSelect();
hideCursorAndSpanControllers();
stopTextActionMode();
@@ -3916,7 +3921,7 @@
@Override
public void onDestroyActionMode(ActionMode mode) {
// Clear mTextActionMode not to recursively destroy action mode by clearing selection.
- getSelectionActionModeHelper().cancelAsyncTask();
+ getSelectionActionModeHelper().onDestroyActionMode();
mTextActionMode = null;
Callback customCallback = getCustomCallback();
if (customCallback != null) {
diff --git a/core/java/android/widget/FastScroller.java b/core/java/android/widget/FastScroller.java
index 559181b..198bf27 100644
--- a/core/java/android/widget/FastScroller.java
+++ b/core/java/android/widget/FastScroller.java
@@ -38,6 +38,7 @@
import android.util.TypedValue;
import android.view.Gravity;
import android.view.MotionEvent;
+import android.view.PointerIcon;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.ViewConfiguration;
@@ -1441,6 +1442,13 @@
return false;
}
+ public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) {
+ if (mState == STATE_DRAGGING || isPointInside(event.getX(), event.getY())) {
+ return PointerIcon.getSystemIcon(mList.getContext(), PointerIcon.TYPE_ARROW);
+ }
+ return null;
+ }
+
public boolean onTouchEvent(MotionEvent me) {
if (!isEnabled()) {
return false;
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index 46e998a..1c0c4ef 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -3740,20 +3740,21 @@
* @removed For internal use only. This should have been hidden.
*/
@Override
- protected View findViewTraversal(@IdRes int id) {
- View v;
- v = super.findViewTraversal(id);
+ protected <T extends View> T findViewTraversal(@IdRes int id) {
+ // First look in our children, then in any header and footer views that
+ // may be scrolled off.
+ View v = super.findViewTraversal(id);
if (v == null) {
v = findViewInHeadersOrFooters(mHeaderViewInfos, id);
if (v != null) {
- return v;
+ return (T) v;
}
v = findViewInHeadersOrFooters(mFooterViewInfos, id);
if (v != null) {
- return v;
+ return (T) v;
}
}
- return v;
+ return (T) v;
}
View findViewInHeadersOrFooters(ArrayList<FixedViewInfo> where, int id) {
@@ -3782,21 +3783,22 @@
* @removed For internal use only. This should have been hidden.
*/
@Override
- protected View findViewWithTagTraversal(Object tag) {
- View v;
- v = super.findViewWithTagTraversal(tag);
+ protected <T extends View> T findViewWithTagTraversal(Object tag) {
+ // First look in our children, then in any header and footer views that
+ // may be scrolled off.
+ View v = super.findViewWithTagTraversal(tag);
if (v == null) {
v = findViewWithTagInHeadersOrFooters(mHeaderViewInfos, tag);
if (v != null) {
- return v;
+ return (T) v;
}
v = findViewWithTagInHeadersOrFooters(mFooterViewInfos, tag);
if (v != null) {
- return v;
+ return (T) v;
}
}
- return v;
+ return (T) v;
}
View findViewWithTagInHeadersOrFooters(ArrayList<FixedViewInfo> where, Object tag) {
@@ -3829,21 +3831,21 @@
* @hide
*/
@Override
- protected View findViewByPredicateTraversal(Predicate<View> predicate, View childToSkip) {
- View v;
- v = super.findViewByPredicateTraversal(predicate, childToSkip);
+ protected <T extends View> T findViewByPredicateTraversal(
+ Predicate<View> predicate, View childToSkip) {
+ View v = super.findViewByPredicateTraversal(predicate, childToSkip);
if (v == null) {
v = findViewByPredicateInHeadersOrFooters(mHeaderViewInfos, predicate, childToSkip);
if (v != null) {
- return v;
+ return (T) v;
}
v = findViewByPredicateInHeadersOrFooters(mFooterViewInfos, predicate, childToSkip);
if (v != null) {
- return v;
+ return (T) v;
}
}
- return v;
+ return (T) v;
}
/**
diff --git a/core/java/android/widget/MediaController.java b/core/java/android/widget/MediaController.java
index 8008637..8e04f1c 100644
--- a/core/java/android/widget/MediaController.java
+++ b/core/java/android/widget/MediaController.java
@@ -257,13 +257,13 @@
.getText(com.android.internal.R.string.lockscreen_transport_play_description);
mPauseDescription = res
.getText(com.android.internal.R.string.lockscreen_transport_pause_description);
- mPauseButton = (ImageButton) v.findViewById(com.android.internal.R.id.pause);
+ mPauseButton = v.findViewById(com.android.internal.R.id.pause);
if (mPauseButton != null) {
mPauseButton.requestFocus();
mPauseButton.setOnClickListener(mPauseListener);
}
- mFfwdButton = (ImageButton) v.findViewById(com.android.internal.R.id.ffwd);
+ mFfwdButton = v.findViewById(com.android.internal.R.id.ffwd);
if (mFfwdButton != null) {
mFfwdButton.setOnClickListener(mFfwdListener);
if (!mFromXml) {
@@ -271,7 +271,7 @@
}
}
- mRewButton = (ImageButton) v.findViewById(com.android.internal.R.id.rew);
+ mRewButton = v.findViewById(com.android.internal.R.id.rew);
if (mRewButton != null) {
mRewButton.setOnClickListener(mRewListener);
if (!mFromXml) {
@@ -280,16 +280,16 @@
}
// By default these are hidden. They will be enabled when setPrevNextListeners() is called
- mNextButton = (ImageButton) v.findViewById(com.android.internal.R.id.next);
+ mNextButton = v.findViewById(com.android.internal.R.id.next);
if (mNextButton != null && !mFromXml && !mListenersSet) {
mNextButton.setVisibility(View.GONE);
}
- mPrevButton = (ImageButton) v.findViewById(com.android.internal.R.id.prev);
+ mPrevButton = v.findViewById(com.android.internal.R.id.prev);
if (mPrevButton != null && !mFromXml && !mListenersSet) {
mPrevButton.setVisibility(View.GONE);
}
- mProgress = (ProgressBar) v.findViewById(com.android.internal.R.id.mediacontroller_progress);
+ mProgress = v.findViewById(com.android.internal.R.id.mediacontroller_progress);
if (mProgress != null) {
if (mProgress instanceof SeekBar) {
SeekBar seeker = (SeekBar) mProgress;
@@ -298,8 +298,8 @@
mProgress.setMax(1000);
}
- mEndTime = (TextView) v.findViewById(com.android.internal.R.id.time);
- mCurrentTime = (TextView) v.findViewById(com.android.internal.R.id.time_current);
+ mEndTime = v.findViewById(com.android.internal.R.id.time);
+ mCurrentTime = v.findViewById(com.android.internal.R.id.time_current);
mFormatBuilder = new StringBuilder();
mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
diff --git a/core/java/android/widget/RadioGroup.java b/core/java/android/widget/RadioGroup.java
index 8ba4694..bba3a11 100644
--- a/core/java/android/widget/RadioGroup.java
+++ b/core/java/android/widget/RadioGroup.java
@@ -24,6 +24,8 @@
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewStructure;
+import android.view.autofill.AutoFillManager;
import android.view.autofill.AutoFillType;
import android.view.autofill.AutoFillValue;
@@ -65,6 +67,10 @@
private OnCheckedChangeListener mOnCheckedChangeListener;
private PassThroughHierarchyChangeListener mPassThroughListener;
+ // Indicates whether the child was set from resources or dynamically, so it can be used
+ // to sanitize auto-fill requests.
+ private int mInitialCheckedId = View.NO_ID;
+
/**
* {@inheritDoc}
*/
@@ -88,8 +94,8 @@
int value = attributes.getResourceId(R.styleable.RadioGroup_checkedButton, View.NO_ID);
if (value != View.NO_ID) {
mCheckedId = value;
+ mInitialCheckedId = value;
}
-
final int index = attributes.getInt(com.android.internal.R.styleable.RadioGroup_orientation, VERTICAL);
setOrientation(index);
@@ -177,6 +183,10 @@
if (mOnCheckedChangeListener != null) {
mOnCheckedChangeListener.onCheckedChanged(this, mCheckedId);
}
+ final AutoFillManager afm = mContext.getSystemService(AutoFillManager.class);
+ if (afm != null) {
+ afm.valueChanged(this);
+ }
}
private void setCheckedStateForView(int viewId, boolean checked) {
@@ -405,7 +415,11 @@
// TODO(b/33197203): add unit/CTS tests for auto-fill methods (and make sure they handle enable)
- // TODO(b/33197203): override onProvideAutoFillStructure and add a change listener
+ @Override
+ public void onProvideAutoFillStructure(ViewStructure structure, int flags) {
+ super.onProvideAutoFillStructure(structure, flags);
+ structure.setSanitized(mCheckedId == mInitialCheckedId);
+ }
@Override
public void autoFill(AutoFillValue value) {
@@ -427,6 +441,15 @@
@Override
public AutoFillValue getAutoFillValue() {
- return isEnabled() ? AutoFillValue.forList(getCheckedRadioButtonId()) : null;
+ if (!isEnabled()) return null;
+
+ final int count = getChildCount();
+ for (int i = 0; i < count; i++) {
+ final View child = getChildAt(i);
+ if (child.getId() == mCheckedId) {
+ return AutoFillValue.forList(i);
+ }
+ }
+ return null;
}
}
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 359d04e..5505f2f 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -1578,7 +1578,7 @@
@Override
public void apply(View root, ViewGroup rootParent, OnClickHandler handler) {
final Context context = root.getContext();
- final ViewGroup target = (ViewGroup) root.findViewById(viewId);
+ final ViewGroup target = root.findViewById(viewId);
if (target == null) return;
if (nestedViews != null) {
// Inflate nested views and add as children
@@ -1757,7 +1757,7 @@
@Override
public void apply(View root, ViewGroup rootParent, OnClickHandler handler) {
- final TextView target = (TextView) root.findViewById(viewId);
+ final TextView target = root.findViewById(viewId);
if (target == null) return;
if (drawablesLoaded) {
if (isRelative) {
@@ -1857,7 +1857,7 @@
@Override
public void apply(View root, ViewGroup rootParent, OnClickHandler handler) {
- final TextView target = (TextView) root.findViewById(viewId);
+ final TextView target = root.findViewById(viewId);
if (target == null) return;
target.setTextSize(units, size);
}
@@ -2045,7 +2045,7 @@
@Override
public void apply(View root, ViewGroup rootParent, OnClickHandler handler) {
- final TextView target = (TextView) root.findViewById(viewId);
+ final TextView target = root.findViewById(viewId);
if (target == null) return;
Drawable[] drawables = isRelative
? target.getCompoundDrawablesRelative()
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 770d9ee..6790532 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -54,6 +54,8 @@
private TextClassificationResult mTextClassificationResult;
private AsyncTask mTextClassificationAsyncTask;
+ private final SelectionInfo mSelectionInfo = new SelectionInfo();
+
SelectionActionModeHelper(@NonNull Editor editor) {
mEditor = Preconditions.checkNotNull(editor);
final TextView textView = mEditor.getTextView();
@@ -94,12 +96,12 @@
}
}
- public void cancelAsyncTask() {
- if (mTextClassificationAsyncTask != null) {
- mTextClassificationAsyncTask.cancel(true);
- mTextClassificationAsyncTask = null;
+ public boolean resetOriginalSelection(int textIndex) {
+ if (mSelectionInfo.resetOriginalSelection(textIndex, mEditor.getTextView().getText())) {
+ invalidateActionModeAsync();
+ return true;
}
- mTextClassificationResult = null;
+ return false;
}
@Nullable
@@ -107,12 +109,28 @@
return mTextClassificationResult;
}
+ public void onDestroyActionMode() {
+ mSelectionInfo.onSelectionDestroyed();
+ cancelAsyncTask();
+ }
+
+ private void cancelAsyncTask() {
+ if (mTextClassificationAsyncTask != null) {
+ mTextClassificationAsyncTask.cancel(true);
+ mTextClassificationAsyncTask = null;
+ }
+ mTextClassificationResult = null;
+ }
+
private boolean isNoOpTextClassifier() {
return mEditor.getTextView().getTextClassifier() == TextClassifier.NO_OP;
}
private void startActionMode(@Nullable SelectionResult result) {
- final CharSequence text = mEditor.getTextView().getText();
+ final TextView textView = mEditor.getTextView();
+ final CharSequence text = textView.getText();
+ mSelectionInfo.setOriginalSelection(
+ textView.getSelectionStart(), textView.getSelectionEnd());
if (result != null && text instanceof Spannable) {
Selection.setSelection((Spannable) text, result.mStart, result.mEnd);
mTextClassificationResult = result.mResult;
@@ -124,6 +142,9 @@
if (controller != null) {
controller.show();
}
+ if (result != null) {
+ mSelectionInfo.onSelectionStarted(result.mStart, result.mEnd);
+ }
}
mEditor.setRestartActionModeOnNextRefresh(false);
mTextClassificationAsyncTask = null;
@@ -135,6 +156,8 @@
if (actionMode != null) {
actionMode.invalidate();
}
+ final TextView textView = mEditor.getTextView();
+ mSelectionInfo.onSelectionUpdated(textView.getSelectionStart(), textView.getSelectionEnd());
mTextClassificationAsyncTask = null;
}
@@ -145,6 +168,56 @@
}
/**
+ * Holds information about the selection and uses it to decide on whether or not to update
+ * the selection when resetOriginalSelection is called.
+ * The expected UX here is to allow the user to re-snap the selection back to the original word
+ * that was selected with one tap on that word.
+ */
+ private static final class SelectionInfo {
+
+ private int mOriginalStart;
+ private int mOriginalEnd;
+ private int mSelectionStart;
+ private int mSelectionEnd;
+
+ private boolean mResetOriginal;
+
+ public void setOriginalSelection(int selectionStart, int selectionEnd) {
+ mOriginalStart = selectionStart;
+ mOriginalEnd = selectionEnd;
+ mResetOriginal = false;
+ }
+
+ public void onSelectionStarted(int selectionStart, int selectionEnd) {
+ // Set the reset flag to true if the selection changed.
+ mSelectionStart = selectionStart;
+ mSelectionEnd = selectionEnd;
+ mResetOriginal = mSelectionStart != mOriginalStart || mSelectionEnd != mOriginalEnd;
+ }
+
+ public void onSelectionUpdated(int selectionStart, int selectionEnd) {
+ // If the selection did not change, maintain the reset state. Otherwise, disable reset.
+ mResetOriginal &= selectionStart == mSelectionStart && selectionEnd == mSelectionEnd;
+ }
+
+ public void onSelectionDestroyed() {
+ mResetOriginal = false;
+ }
+
+ public boolean resetOriginalSelection(int textIndex, CharSequence text) {
+ if (mResetOriginal
+ && textIndex >= mOriginalStart && textIndex <= mOriginalEnd
+ && text instanceof Spannable) {
+ Selection.setSelection((Spannable) text, mOriginalStart, mOriginalEnd);
+ // Only allow a reset once.
+ mResetOriginal = false;
+ return true;
+ }
+ return false;
+ }
+ }
+
+ /**
* AsyncTask for running a query on a background thread and returning the result on the
* UiThread. The AsyncTask times out after a specified time, returning a null result if the
* query has not yet returned.
diff --git a/core/java/android/widget/Spinner.java b/core/java/android/widget/Spinner.java
index 28cc693..50c016b 100644
--- a/core/java/android/widget/Spinner.java
+++ b/core/java/android/widget/Spinner.java
@@ -41,9 +41,12 @@
import android.view.PointerIcon;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewStructure;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.autofill.AutoFillType;
+import android.view.autofill.AutoFillValue;
import android.widget.PopupWindow.OnDismissListener;
import com.android.internal.R;
@@ -784,6 +787,7 @@
return handled;
}
+ @Override
public void onClick(DialogInterface dialog, int which) {
setSelection(which);
dialog.dismiss();
@@ -912,6 +916,42 @@
return super.onResolvePointerIcon(event, pointerIndex);
}
+ // TODO(b/33197203): add unit/CTS tests for auto-fill methods (and make sure they handle enable)
+
+ @Override
+ public void onProvideAutoFillStructure(ViewStructure structure, int flags) {
+ super.onProvideAutoFillStructure(structure, flags);
+ // TODO(b/33197203): implement sanitization so initial value is only sanitized when coming
+ // from resources.
+
+ final int count = getAdapter().getCount();
+ if (count > 0) {
+ final String[] options = new String[count];
+ for (int i = 0; i < count; i++) {
+ options[i] = getAdapter().getItem(i).toString();
+ }
+ structure.setAutoFillOptions(options);
+ }
+ }
+
+ @Override
+ public void autoFill(AutoFillValue value) {
+ if (!isEnabled()) return;
+
+ final int position = value.getListValue();
+ setSelection(position);
+ }
+
+ @Override
+ public AutoFillType getAutoFillType() {
+ return AutoFillType.forList();
+ }
+
+ @Override
+ public AutoFillValue getAutoFillValue() {
+ return isEnabled() ? AutoFillValue.forList(getSelectedItemPosition()) : null;
+ }
+
static class SavedState extends AbsSpinner.SavedState {
boolean showDropdown;
diff --git a/core/java/android/widget/SuggestionsAdapter.java b/core/java/android/widget/SuggestionsAdapter.java
index f833d1b..fbb8993 100644
--- a/core/java/android/widget/SuggestionsAdapter.java
+++ b/core/java/android/widget/SuggestionsAdapter.java
@@ -286,7 +286,7 @@
v.setTag(new ChildViewCache(v));
// Set up icon.
- final ImageView iconRefine = (ImageView) v.findViewById(R.id.edit_query);
+ final ImageView iconRefine = v.findViewById(R.id.edit_query);
iconRefine.setImageResource(mCommitIconResId);
return v;
@@ -304,11 +304,11 @@
public final ImageView mIconRefine;
public ChildViewCache(View v) {
- mText1 = (TextView) v.findViewById(com.android.internal.R.id.text1);
- mText2 = (TextView) v.findViewById(com.android.internal.R.id.text2);
- mIcon1 = (ImageView) v.findViewById(com.android.internal.R.id.icon1);
- mIcon2 = (ImageView) v.findViewById(com.android.internal.R.id.icon2);
- mIconRefine = (ImageView) v.findViewById(com.android.internal.R.id.edit_query);
+ mText1 = v.findViewById(com.android.internal.R.id.text1);
+ mText2 = v.findViewById(com.android.internal.R.id.text2);
+ mIcon1 = v.findViewById(com.android.internal.R.id.icon1);
+ mIcon2 = v.findViewById(com.android.internal.R.id.icon2);
+ mIconRefine = v.findViewById(com.android.internal.R.id.edit_query);
}
}
diff --git a/core/java/android/widget/TabHost.java b/core/java/android/widget/TabHost.java
index 32418cd..7e2cadf 100644
--- a/core/java/android/widget/TabHost.java
+++ b/core/java/android/widget/TabHost.java
@@ -619,7 +619,7 @@
mTabWidget, // tab widget is the parent
false); // no inflate params
- final TextView tv = (TextView) tabIndicator.findViewById(R.id.title);
+ final TextView tv = tabIndicator.findViewById(R.id.title);
tv.setText(mLabel);
if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.DONUT) {
@@ -653,8 +653,8 @@
mTabWidget, // tab widget is the parent
false); // no inflate params
- final TextView tv = (TextView) tabIndicator.findViewById(R.id.title);
- final ImageView iconView = (ImageView) tabIndicator.findViewById(R.id.icon);
+ final TextView tv = tabIndicator.findViewById(R.id.title);
+ final ImageView iconView = tabIndicator.findViewById(R.id.icon);
// when icon is gone by default, we're in exclusive mode
final boolean exclusive = iconView.getVisibility() == View.GONE;
diff --git a/core/java/android/widget/TextInputTimePickerView.java b/core/java/android/widget/TextInputTimePickerView.java
index ef91576..0183343 100644
--- a/core/java/android/widget/TextInputTimePickerView.java
+++ b/core/java/android/widget/TextInputTimePickerView.java
@@ -177,15 +177,15 @@
mAmPmSpinner.setVisibility(is24Hour ? View.INVISIBLE : View.VISIBLE);
- mHourEditText.setText(String.format(format, localizedHour));
- mMinuteEditText.setText(String.format(format, minute));
-
if (amOrPm == AM) {
mAmPmSpinner.setSelection(0);
} else {
mAmPmSpinner.setSelection(1);
}
+ mHourEditText.setText(String.format(format, localizedHour));
+ mMinuteEditText.setText(String.format(format, minute));
+
if (mErrorShowing) {
validateInput();
}
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 5572cbb..adc6f72 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -63,7 +63,6 @@
import android.os.Parcelable;
import android.os.ParcelableParcel;
import android.os.SystemClock;
-import android.os.UserHandle;
import android.provider.Settings;
import android.text.BoringLayout;
import android.text.DynamicLayout;
@@ -113,6 +112,7 @@
import android.text.style.UpdateAppearance;
import android.text.util.Linkify;
import android.util.AttributeSet;
+import android.util.DisplayMetrics;
import android.util.IntArray;
import android.util.Log;
import android.util.TypedValue;
@@ -266,7 +266,7 @@
* @attr ref android.R.styleable#TextView_fontFeatureSettings
* @attr ref android.R.styleable#TextView_breakStrategy
* @attr ref android.R.styleable#TextView_hyphenationFrequency
- * @attr ref android.R.styleable#TextView_autoSizeText
+ * @attr ref android.R.styleable#TextView_autoSizeTextType
* @attr ref android.R.styleable#TextView_autoSizeMinTextSize
* @attr ref android.R.styleable#TextView_autoSizeMaxTextSize
* @attr ref android.R.styleable#TextView_autoSizeStepGranularity
@@ -691,31 +691,39 @@
*/
private int mDeviceProvisionedState = DEVICE_PROVISIONED_UNKNOWN;
- // The TextView does not auto-size text (default).
+ /**
+ * The TextView does not auto-size text (default).
+ */
public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0;
- // The TextView performs uniform horizontal and vertical text size scaling to fit within the
- // container.
+
+ /**
+ * The TextView scales text size both horizontally and vertically to fit within the
+ * container.
+ */
public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1;
+
/** @hide */
@IntDef({AUTO_SIZE_TEXT_TYPE_NONE, AUTO_SIZE_TEXT_TYPE_UNIFORM})
@Retention(RetentionPolicy.SOURCE)
public @interface AutoSizeTextType {}
- // Default minimum size for auto-sizing text in scaled pixels. {@see #setAutoSizeMinTextSize}.
+ // Default minimum size for auto-sizing text in scaled pixels.
private static final int DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP = 12;
- // Default maximum size for auto-sizing text in scaled pixels. {@see #setAutoSizeMaxTextSize}.
+ // Default maximum size for auto-sizing text in scaled pixels.
private static final int DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP = 112;
// Default value for the step size in pixels.
private static final int DEFAULT_AUTO_SIZE_GRANULARITY_IN_PX = 1;
+ // Use this to specify that any of the auto-size configuration int values have not been set.
+ private static final int UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE = -1;
// Auto-size text type.
private int mAutoSizeTextType = AUTO_SIZE_TEXT_TYPE_NONE;
// Specify if auto-size text is needed.
private boolean mNeedsAutoSizeText = false;
// Step size for auto-sizing in pixels.
- private int mAutoSizeStepGranularityInPx = 0;
+ private int mAutoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
// Minimum text size for auto-sizing in pixels.
- private int mAutoSizeMinTextSizeInPx = 0;
+ private int mAutoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
// Maximum text size for auto-sizing in pixels.
- private int mAutoSizeMaxTextSizeInPx = 0;
+ private int mAutoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
// Contains a (specified or computed) distinct sorted set of text sizes in pixels to pick from
// when auto-sizing text.
private int[] mAutoSizeTextSizesInPx = EmptyArray.INT;
@@ -724,8 +732,9 @@
// mAutoSizeStepGranularityInPx.
private boolean mHasPresetAutoSizeValues = false;
- // Watcher used to notify changes to auto-fill manager.
- private AutoFillChangeWatcher mAutoFillChangeWatcher;
+ // Indicates whether the text was set from resources or dynamically, so it can be used to
+ // sanitize auto-fill requests.
+ private boolean mTextFromResource = false;
/**
* Kick-start the font cache for the zygote process (to pay the cost of
@@ -937,11 +946,16 @@
CharSequence text = "";
CharSequence hint = null;
boolean password = false;
+ int autoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ int autoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ int autoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
int inputType = EditorInfo.TYPE_NULL;
a = theme.obtainStyledAttributes(
attrs, com.android.internal.R.styleable.TextView, defStyleAttr, defStyleRes);
int n = a.getIndexCount();
+
+ boolean fromResourceId = false;
for (int i = 0; i < n; i++) {
int attr = a.getIndex(i);
@@ -1083,6 +1097,7 @@
break;
case com.android.internal.R.styleable.TextView_text:
+ fromResourceId = true;
text = a.getText(attr);
break;
@@ -1299,20 +1314,23 @@
mHyphenationFrequency = a.getInt(attr, Layout.HYPHENATION_FREQUENCY_NONE);
break;
- case com.android.internal.R.styleable.TextView_autoSizeText:
+ case com.android.internal.R.styleable.TextView_autoSizeTextType:
mAutoSizeTextType = a.getInt(attr, AUTO_SIZE_TEXT_TYPE_NONE);
break;
case com.android.internal.R.styleable.TextView_autoSizeStepGranularity:
- mAutoSizeStepGranularityInPx = a.getDimensionPixelSize(attr, 0);
+ autoSizeStepGranularityInPx = a.getDimensionPixelSize(attr,
+ UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE);
break;
case com.android.internal.R.styleable.TextView_autoSizeMinTextSize:
- mAutoSizeMinTextSizeInPx = a.getDimensionPixelSize(attr, 0);
+ autoSizeMinTextSizeInPx = a.getDimensionPixelSize(attr,
+ UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE);
break;
case com.android.internal.R.styleable.TextView_autoSizeMaxTextSize:
- mAutoSizeMaxTextSizeInPx = a.getDimensionPixelSize(attr, 0);
+ autoSizeMaxTextSizeInPx = a.getDimensionPixelSize(attr,
+ UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE);
break;
case com.android.internal.R.styleable.TextView_autoSizePresetSizes:
@@ -1320,7 +1338,7 @@
if (autoSizeStepSizeArrayResId > 0) {
final TypedArray autoSizePreDefTextSizes = a.getResources()
.obtainTypedArray(autoSizeStepSizeArrayResId);
- setupAutoSizePresetSizes(autoSizePreDefTextSizes);
+ setupAutoSizeUniformPresetSizes(autoSizePreDefTextSizes);
autoSizePreDefTextSizes.recycle();
}
break;
@@ -1558,6 +1576,10 @@
}
setText(text, bufferType);
+ if (fromResourceId) {
+ mTextFromResource = true;
+ }
+
if (hint != null) setHint(hint);
/*
@@ -1598,40 +1620,78 @@
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
}
- setupAutoSizeText();
+ if (supportsAutoSizeText()) {
+ if (mAutoSizeTextType == AUTO_SIZE_TEXT_TYPE_UNIFORM) {
+ // If uniform auto-size has been specified but preset values have not been set then
+ // replace the auto-size configuration values that have not been specified with the
+ // defaults.
+ if (!mHasPresetAutoSizeValues) {
+ final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
+
+ if (autoSizeMinTextSizeInPx == UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE) {
+ autoSizeMinTextSizeInPx = (int) TypedValue.applyDimension(
+ TypedValue.COMPLEX_UNIT_SP,
+ DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP,
+ displayMetrics);
+ }
+
+ if (autoSizeMaxTextSizeInPx == UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE) {
+ autoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension(
+ TypedValue.COMPLEX_UNIT_SP,
+ DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP,
+ displayMetrics);
+ }
+
+ if (autoSizeMinTextSizeInPx == UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE) {
+ autoSizeStepGranularityInPx = DEFAULT_AUTO_SIZE_GRANULARITY_IN_PX;
+ }
+
+ validateAndSetAutoSizeTextTypeUniformConfiguration(autoSizeMinTextSizeInPx,
+ autoSizeMaxTextSizeInPx,
+ autoSizeStepGranularityInPx);
+ }
+
+ setupAutoSizeText();
+ }
+ } else {
+ mAutoSizeTextType = AUTO_SIZE_TEXT_TYPE_NONE;
+ }
}
/**
* Specify whether this widget should automatically scale the text to try to perfectly fit
- * within the layout bounds by taking into account the auto-size configuration.
+ * within the layout bounds by using the default auto-size configuration.
*
* @param autoSizeTextType the type of auto-size. Must be one of
* {@link TextView#AUTO_SIZE_TEXT_TYPE_NONE} or
* {@link TextView#AUTO_SIZE_TEXT_TYPE_UNIFORM}
*
- * @attr ref android.R.styleable#TextView_autoSizeText
+ * @attr ref android.R.styleable#TextView_autoSizeTextType
*
* @see #getAutoSizeTextType()
*/
- public void setAutoSizeTextType(@AutoSizeTextType int autoSizeTextType) {
+ public void setAutoSizeTextTypeWithDefaults(@AutoSizeTextType int autoSizeTextType) {
if (supportsAutoSizeText()) {
switch (autoSizeTextType) {
case AUTO_SIZE_TEXT_TYPE_NONE:
- if (mAutoSizeTextType != AUTO_SIZE_TEXT_TYPE_NONE) {
- // Clear all auto-size configuration
- mAutoSizeTextType = AUTO_SIZE_TEXT_TYPE_NONE;
- mAutoSizeMinTextSizeInPx = 0;
- mAutoSizeMaxTextSizeInPx = 0;
- mAutoSizeStepGranularityInPx = 0;
- mAutoSizeTextSizesInPx = EmptyArray.INT;
- mNeedsAutoSizeText = false;
- }
+ clearAutoSizeConfiguration();
break;
case AUTO_SIZE_TEXT_TYPE_UNIFORM:
- if (mAutoSizeTextType != AUTO_SIZE_TEXT_TYPE_UNIFORM) {
- mAutoSizeTextType = AUTO_SIZE_TEXT_TYPE_UNIFORM;
- setupAutoSizeText();
- }
+ final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
+ final int autoSizeMinTextSizeInPx = (int) TypedValue.applyDimension(
+ TypedValue.COMPLEX_UNIT_SP,
+ DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP,
+ displayMetrics);
+ final int autoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension(
+ TypedValue.COMPLEX_UNIT_SP,
+ DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP,
+ displayMetrics);
+
+ validateAndSetAutoSizeTextTypeUniformConfiguration(
+ autoSizeMinTextSizeInPx,
+ autoSizeMaxTextSizeInPx,
+ DEFAULT_AUTO_SIZE_GRANULARITY_IN_PX);
+ setupAutoSizeText();
break;
default:
throw new IllegalArgumentException(
@@ -1641,15 +1701,122 @@
}
/**
+ * Specify whether this widget should automatically scale the text to try to perfectly fit
+ * within the layout bounds. If all the configuration params are valid the type of auto-size is
+ * set to {@link #AUTO_SIZE_TEXT_TYPE_UNIFORM}.
+ *
+ * @param autoSizeMinTextSize the minimum text size available for auto-size
+ * @param autoSizeMaxTextSize the maximum text size available for auto-size
+ * @param autoSizeStepGranularity the auto-size step granularity. It is used in conjunction with
+ * the minimum and maximum text size in order to build the set of
+ * text sizes the system uses to choose from when auto-sizing
+ * @param unit the desired dimension unit for all sizes above. See {@link TypedValue} for the
+ * possible dimension units
+ *
+ * @throws IllegalArgumentException if any of the configuration params are invalid.
+ *
+ * @attr ref android.R.styleable#TextView_autoSizeTextType
+ * @attr ref android.R.styleable#TextView_autoSizeMinTextSize
+ * @attr ref android.R.styleable#TextView_autoSizeMaxTextSize
+ * @attr ref android.R.styleable#TextView_autoSizeStepGranularity
+ *
+ * @see #setAutoSizeTextTypeWithDefaults(int)
+ * @see #setAutoSizeTextTypeUniformWithPresetSizes(int[], int)
+ * @see #getAutoSizeMinTextSize()
+ * @see #getAutoSizeMaxTextSize()
+ * @see #getAutoSizeStepGranularity()
+ * @see #getAutoSizeTextAvailableSizes()
+ */
+ public void setAutoSizeTextTypeUniformWithConfiguration(
+ int autoSizeMinTextSize,
+ int autoSizeMaxTextSize,
+ int autoSizeStepGranularity,
+ int unit) throws IllegalArgumentException {
+ if (supportsAutoSizeText()) {
+ final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
+ final int autoSizeMinTextSizeInPx = (int) TypedValue.applyDimension(
+ unit, autoSizeMinTextSize, displayMetrics);
+ final int autoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension(
+ unit, autoSizeMaxTextSize, displayMetrics);
+ final int autoSizeStepGranularityInPx = (int) TypedValue.applyDimension(
+ unit, autoSizeStepGranularity, displayMetrics);
+
+ validateAndSetAutoSizeTextTypeUniformConfiguration(autoSizeMinTextSizeInPx,
+ autoSizeMaxTextSizeInPx,
+ autoSizeStepGranularityInPx);
+ setupAutoSizeText();
+ }
+ }
+
+ /**
+ * Specify whether this widget should automatically scale the text to try to perfectly fit
+ * within the layout bounds. If at least one value from the <code>presetSizes</code> is valid
+ * then the type of auto-size is set to {@link #AUTO_SIZE_TEXT_TYPE_UNIFORM}.
+ *
+ * @param presetSizes an {@code int} array of sizes in pixels
+ * @param unit the desired dimension unit for the preset sizes above. See {@link TypedValue} for
+ * the possible dimension units
+ *
+ * @throws IllegalArgumentException if all of the <code>presetSizes</code> are invalid.
+ *
+ * @attr ref android.R.styleable#TextView_autoSizeTextType
+ * @attr ref android.R.styleable#TextView_autoSizePresetSizes
+ *
+ * @see #setAutoSizeTextTypeWithDefaults(int)
+ * @see #setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int)
+ * @see #getAutoSizeMinTextSize()
+ * @see #getAutoSizeMaxTextSize()
+ * @see #getAutoSizeTextAvailableSizes()
+ */
+ public void setAutoSizeTextTypeUniformWithPresetSizes(@NonNull int[] presetSizes, int unit)
+ throws IllegalArgumentException {
+ if (supportsAutoSizeText()) {
+ final int presetSizesLength = presetSizes.length;
+ if (presetSizesLength > 0) {
+ int[] presetSizesInPx = new int[presetSizesLength];
+
+ if (unit == TypedValue.COMPLEX_UNIT_PX) {
+ presetSizesInPx = Arrays.copyOf(presetSizes, presetSizesLength);
+ } else {
+ final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
+ // Convert all to sizes to pixels.
+ for (int i = 0; i < presetSizesLength; i++) {
+ presetSizesInPx[i] = (int) TypedValue.applyDimension(unit, presetSizes[i],
+ displayMetrics);
+ }
+ }
+
+ mAutoSizeTextSizesInPx = cleanupAutoSizePresetSizes(presetSizesInPx);
+ final int sizesLength = mAutoSizeTextSizesInPx.length;
+ mHasPresetAutoSizeValues = sizesLength > 0;
+ if (mHasPresetAutoSizeValues) {
+ mAutoSizeTextType = AUTO_SIZE_TEXT_TYPE_UNIFORM;
+ mAutoSizeMinTextSizeInPx = mAutoSizeTextSizesInPx[0];
+ mAutoSizeMaxTextSizeInPx = mAutoSizeTextSizesInPx[sizesLength - 1];
+ mAutoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ } else {
+ throw new IllegalArgumentException("None of the preset sizes is valid: "
+ + Arrays.toString(presetSizes));
+ }
+ } else {
+ mHasPresetAutoSizeValues = false;
+ }
+ setupAutoSizeText();
+ }
+ }
+
+ /**
* Returns the type of auto-size set for this widget.
*
* @return an {@code int} corresponding to one of the auto-size types:
* {@link TextView#AUTO_SIZE_TEXT_TYPE_NONE} or
* {@link TextView#AUTO_SIZE_TEXT_TYPE_UNIFORM}
*
- * @attr ref android.R.styleable#TextView_autoSizeText
+ * @attr ref android.R.styleable#TextView_autoSizeTextType
*
- * @see #setAutoSizeTextType(int)
+ * @see #setAutoSizeTextTypeWithDefaults(int)
+ * @see #setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int)
+ * @see #setAutoSizeTextTypeUniformWithPresetSizes(int[], int)
*/
@AutoSizeTextType
public int getAutoSizeTextType() {
@@ -1657,155 +1824,53 @@
}
/**
- * Sets the auto-size step granularity. It is used in conjunction with auto-size minimum
- * and maximum text size in order to build the set of text sizes the system uses to choose
- * from when auto-sizing.
- *
- * @param unit the desired dimension unit. See {@link TypedValue} for the possible
- * dimension units
- * @param size the desired size in the given units
+ * @return the current auto-size step granularity in pixels.
*
* @attr ref android.R.styleable#TextView_autoSizeStepGranularity
*
- * @see #getAutoSizeStepGranularity()
- * @see #setAutoSizeMinTextSize(int, float)
- * @see #setAutoSizeMaxTextSize(int, float)
- */
- public void setAutoSizeStepGranularity(int unit, float size) {
- if (supportsAutoSizeText()) {
- mAutoSizeStepGranularityInPx = (int) TypedValue.applyDimension(
- unit, size, getResources().getDisplayMetrics());
- mHasPresetAutoSizeValues = false;
- setupAutoSizeText();
- }
- }
-
- /**
- * @return the current auto-size step granularity in pixels.
- *
- * @see #setAutoSizeStepGranularity(int, float)
+ * @see #setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int)
*/
public int getAutoSizeStepGranularity() {
return mAutoSizeStepGranularityInPx;
}
/**
- * Sets the minimum text size to be used in conjunction with auto-size maximum text size and
- * auto-size step granularity in order to build the set of text sizes the system uses to choose
- * from when auto-sizing.
- *
- * @param unit the desired dimension unit. See {@link TypedValue} for the possible
- * dimension units
- * @param size the desired size in the given units
+ * @return the current auto-size minimum text size in pixels (the default is 12sp). Note that
+ * if auto-size has not been configured this function returns {@code -1}.
*
* @attr ref android.R.styleable#TextView_autoSizeMinTextSize
*
- * @see #getAutoSizeMinTextSize()
- * @see #setAutoSizeMaxTextSize(int, float)
- * @see #setAutoSizeStepGranularity(int, float)
- */
- public void setAutoSizeMinTextSize(int unit, float size) {
- if (supportsAutoSizeText()) {
- mAutoSizeMinTextSizeInPx = (int) TypedValue.applyDimension(
- unit, size, getResources().getDisplayMetrics());
- mHasPresetAutoSizeValues = false;
- setupAutoSizeText();
- }
- }
-
- /**
- * @return the current auto-size minimum text size in pixels (the default is 12sp). Note that
- * if auto-size has not been configured this function returns {@code 0}.
- *
- * @see #setAutoSizeMinTextSize(int, float)
+ * @see #setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int)
+ * @see #setAutoSizeTextTypeUniformWithPresetSizes(int[], int)
*/
public int getAutoSizeMinTextSize() {
return mAutoSizeMinTextSizeInPx;
}
/**
- * Sets the maximum text size to be used in conjunction with auto-size minimum text size and
- * auto-size step granularity in order to build the set of text sizes the system uses to choose
- * from when auto-sizing.
- *
- * @param unit the desired dimension unit. See {@link TypedValue} for the possible
- * dimension units
- * @param size the desired size in the given units
+ * @return the current auto-size maximum text size in pixels (the default is 112sp). Note that
+ * if auto-size has not been configured this function returns {@code -1}.
*
* @attr ref android.R.styleable#TextView_autoSizeMaxTextSize
*
- * @see #getAutoSizeMaxTextSize()
- * @see #setAutoSizeMinTextSize(int, float)
- * @see #setAutoSizeStepGranularity(int, float)
- */
- public void setAutoSizeMaxTextSize(int unit, float size) {
- if (supportsAutoSizeText()) {
- mAutoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension(
- unit, size, getResources().getDisplayMetrics());
- mHasPresetAutoSizeValues = false;
- setupAutoSizeText();
- }
- }
-
- /**
- * @return the current auto-size maximum text size in pixels (the default is 112sp). Note that
- * if auto-size has not been configured this function returns {@code 0}.
- *
- * @see #setAutoSizeMaxTextSize(int, float)
+ * @see #setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int)
+ * @see #setAutoSizeTextTypeUniformWithPresetSizes(int[], int)
*/
public int getAutoSizeMaxTextSize() {
return mAutoSizeMaxTextSizeInPx;
}
/**
- * Sets a predefined array of sizes to be used when auto-sizing.
- *
- * <ul>Note:
- * <li>when <code>presetSizes</code> is not empty then the auto-size algorithm will use the
- * values provided here instead of calculating the values based on min, max and step size. Also
- * the values will be de-duplicated, sorted and negative or zero values will be removed.
- * <li>when <code>presetSizes</code> is empty then the auto-size algorithm will use the min, max
- * and step size to build the set of available sizes to choose from. Note that if no values have
- * been provided for any of min, max or step size then defaults will be used.
- * </ul>
- *
- * @param presetSizes an {@code int} array of sizes in pixels
- *
- * @attr ref android.R.styleable#TextView_autoSizePresetSizes
- *
- * @see #getAutoSizeTextAvailableSizes()
- */
- public void setAutoSizeTextPresetSizes(@NonNull int[] presetSizes) {
- if (supportsAutoSizeText()) {
- if (presetSizes.length > 0) {
- mAutoSizeTextSizesInPx = cleanupAutoSizePresetSizes(presetSizes);
- final int sizesLength = mAutoSizeTextSizesInPx.length;
- mHasPresetAutoSizeValues = sizesLength > 0;
- if (mHasPresetAutoSizeValues) {
- mAutoSizeMinTextSizeInPx = mAutoSizeTextSizesInPx[0];
- mAutoSizeMaxTextSizeInPx = mAutoSizeTextSizesInPx[sizesLength - 1];
- mAutoSizeStepGranularityInPx = 0;
- }
- } else {
- mHasPresetAutoSizeValues = false;
- }
- setupAutoSizeText();
- }
- }
-
- /**
* @return the current auto-size {@code int} sizes array (in pixels).
*
- * @see #setAutoSizeTextPresetSizes(int[])
- * @see #setAutoSizeMinTextSize(int, float)
- * @see #setAutoSizeMaxTextSize(int, float)
- * @see #setAutoSizeStepGranularity(int, float)
+ * @see #setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int)
+ * @see #setAutoSizeTextTypeUniformWithPresetSizes(int[], int)
*/
public int[] getAutoSizeTextAvailableSizes() {
return mAutoSizeTextSizesInPx;
}
- private void setupAutoSizePresetSizes(TypedArray textSizes) {
+ private void setupAutoSizeUniformPresetSizes(TypedArray textSizes) {
final int textSizesLength = textSizes.length();
final int[] parsedSizes = new int[textSizesLength];
@@ -1818,6 +1883,49 @@
}
}
+ /**
+ * If all params are valid then save the auto-size configuration.
+ *
+ * @throws IllegalArgumentException if any of the params are invalid
+ */
+ private void validateAndSetAutoSizeTextTypeUniformConfiguration(
+ int autoSizeMinTextSizeInPx,
+ int autoSizeMaxTextSizeInPx,
+ int autoSizeStepGranularityInPx) throws IllegalArgumentException {
+ // First validate.
+ if (autoSizeMinTextSizeInPx <= 0) {
+ throw new IllegalArgumentException("Minimum auto-size text size ("
+ + autoSizeMinTextSizeInPx + "px) is less or equal to 0px)");
+ }
+
+ if (autoSizeMaxTextSizeInPx <= autoSizeMinTextSizeInPx) {
+ throw new IllegalArgumentException("Maximum auto-size text size ("
+ + autoSizeMaxTextSizeInPx + "px) is less or equal to minimum auto-size "
+ + "text size (" + autoSizeMinTextSizeInPx + "px)");
+ }
+
+ if (autoSizeStepGranularityInPx <= 0) {
+ throw new IllegalArgumentException("Minimum auto-size text size ("
+ + autoSizeStepGranularityInPx + "px) is less or equal to 0px)");
+ }
+
+ // All good, persist the configuration.
+ mAutoSizeTextType = AUTO_SIZE_TEXT_TYPE_UNIFORM;
+ mAutoSizeMinTextSizeInPx = autoSizeMinTextSizeInPx;
+ mAutoSizeMaxTextSizeInPx = autoSizeMaxTextSizeInPx;
+ mAutoSizeStepGranularityInPx = autoSizeStepGranularityInPx;
+ mHasPresetAutoSizeValues = false;
+ }
+
+ private void clearAutoSizeConfiguration() {
+ mAutoSizeTextType = AUTO_SIZE_TEXT_TYPE_NONE;
+ mAutoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ mAutoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ mAutoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ mAutoSizeTextSizesInPx = EmptyArray.INT;
+ mNeedsAutoSizeText = false;
+ }
+
// Returns distinct sorted positive values.
private int[] cleanupAutoSizePresetSizes(int[] presetValues) {
final int presetValuesLength = presetValues.length;
@@ -1846,33 +1954,6 @@
// Calculate the sizes set based on minimum size, maximum size and step size if we do
// not have a predefined set of sizes or if the current sizes array is empty.
if (!mHasPresetAutoSizeValues || mAutoSizeTextSizesInPx.length == 0) {
- // Set valid defaults.
- if (mAutoSizeMinTextSizeInPx <= 0) {
- mAutoSizeMinTextSizeInPx = (int) TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_SP,
- DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP,
- getResources().getDisplayMetrics());
- }
-
- if (mAutoSizeMaxTextSizeInPx <= 0) {
- mAutoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_SP,
- DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP,
- getResources().getDisplayMetrics());
- }
-
- if (mAutoSizeStepGranularityInPx <= 0) {
- mAutoSizeStepGranularityInPx = DEFAULT_AUTO_SIZE_GRANULARITY_IN_PX;
- }
-
- // Validate.
- if (mAutoSizeMaxTextSizeInPx <= mAutoSizeMinTextSizeInPx) {
- throw new IllegalStateException("Maximum auto-size text size ("
- + mAutoSizeMaxTextSizeInPx
- + "px) is less or equal to minimum auto-size "
- + "text size (" + mAutoSizeMinTextSizeInPx + "px)");
- }
-
// Calculate sizes to choose from based on the current auto-size configuration.
int autoSizeValuesLength = (int) Math.ceil(
(mAutoSizeMaxTextSizeInPx - mAutoSizeMinTextSizeInPx)
@@ -4999,6 +5080,7 @@
private void setText(CharSequence text, BufferType type,
boolean notifyBefore, int oldlen) {
+ mTextFromResource = false;
if (text == null) {
text = "";
}
@@ -5143,6 +5225,9 @@
if (needEditableForNotification) {
sendAfterTextChanged((Editable) text);
+ } else {
+ // Always notify AutoFillManager - it will return right away if auto-fill is disabled.
+ notifyAutoFillManagerAfterTextChanged();
}
// SelectionModifierCursorController depends on textCanBeSelected, which depends on text
@@ -5233,6 +5318,7 @@
@android.view.RemotableViewMethod
public final void setText(@StringRes int resid) {
setText(getContext().getResources().getText(resid));
+ mTextFromResource = true;
}
/**
@@ -5259,6 +5345,7 @@
*/
public final void setText(@StringRes int resid, BufferType type) {
setText(getContext().getResources().getText(resid), type);
+ mTextFromResource = true;
}
/**
@@ -7953,9 +8040,9 @@
TEMP_RECTF.setEmpty();
TEMP_RECTF.right = maxWidth;
TEMP_RECTF.bottom = maxHeight;
- final float textSize = findLargestTextSizeWhichFits(TEMP_RECTF);
- if (textSize != getTextSize()) {
- setTextSizeInternal(TypedValue.COMPLEX_UNIT_PX, textSize);
+ final float optimalTextSize = findLargestTextSizeWhichFits(TEMP_RECTF);
+ if (optimalTextSize != getTextSize()) {
+ setTextSizeInternal(TypedValue.COMPLEX_UNIT_PX, optimalTextSize);
}
}
}
@@ -8127,7 +8214,7 @@
// If we have a fixed width, we can just swap in a new text layout
// if the text height stays the same or if the view height is fixed.
- if (((mLayoutParams.width != LayoutParams.WRAP_CONTENT && mLayoutParams.width != 0)
+ if ((mLayoutParams.width != LayoutParams.WRAP_CONTENT
|| (mMaxWidthMode == mMinWidthMode && mMaxWidth == mMinWidth))
&& (mHint == null || mHintLayout != null)
&& (mRight - mLeft - getCompoundPaddingLeft() - getCompoundPaddingRight() > 0)) {
@@ -9031,9 +9118,23 @@
list.get(i).afterTextChanged(text);
}
}
+
+ // Always notify AutoFillManager - it will return right away if auto-fill is disabled.
+ notifyAutoFillManagerAfterTextChanged();
+
hideErrorIfUnchanged();
}
+ private void notifyAutoFillManagerAfterTextChanged() {
+ final AutoFillManager afm = mContext.getSystemService(AutoFillManager.class);
+ if (afm != null) {
+ if (DEBUG_AUTOFILL) {
+ Log.v(LOG_TAG, "sendAfterTextChanged(): notify AFM for text=" + mText);
+ }
+ afm.valueChanged(TextView.this);
+ }
+ }
+
void updateAfterEdit() {
invalidate();
int curs = getSelectionStart();
@@ -9772,16 +9873,6 @@
}
}
- /**
- * @return true if the user has explicitly allowed accessibility services
- * to speak passwords.
- */
- private boolean shouldSpeakPasswordsForAccessibility() {
- return (Settings.Secure.getIntForUser(mContext.getContentResolver(),
- Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 0,
- UserHandle.USER_CURRENT_OR_SELF) == 1);
- }
-
@Override
public CharSequence getAccessibilityClassName() {
return TextView.class.getName();
@@ -9804,14 +9895,7 @@
final boolean isPassword = hasPasswordTransformationMethod()
|| isPasswordInputType(getInputType());
if (forAutoFill) {
- // TODO(b/33197203, b/33269702): temporary set it as not sanitized until
- // AssistStructure automaticaly sets sanitization based on text coming from resources
- structure.setSanitized(!isPassword);
- if (mAutoFillChangeWatcher == null && isTextEditable()) {
- mAutoFillChangeWatcher = new AutoFillChangeWatcher();
- addTextChangedListener(mAutoFillChangeWatcher);
- // TODO(b/33197203): remove mAutoFillValueListener auto-fill session is finished
- }
+ structure.setSanitized(mTextFromResource);
}
if (!isPassword || forAutoFill) {
@@ -10035,6 +10119,10 @@
@Override
public void addExtraDataToAccessibilityNodeInfo(
AccessibilityNodeInfo info, String extraDataKey, Bundle arguments) {
+ // The only extra data we support requires arguments.
+ if (arguments == null) {
+ return;
+ }
if (extraDataKey.equals(EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY)) {
int positionInfoStartIndex = arguments.getInt(
EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX, -1);
@@ -10352,13 +10440,7 @@
return mHint;
}
- // Check whether we need to bypass the transformation
- // method and expose unobscured text.
- if (hasPasswordTransformationMethod() && shouldSpeakPasswordsForAccessibility()) {
- return mText;
- }
-
- // Otherwise, speak whatever text is being displayed.
+ // Otherwise, return whatever text is being displayed.
return mTransformed;
}
@@ -11440,30 +11522,6 @@
}
}
- // TODO(b/33197203): implements SpanWatcher too?
- private final class AutoFillChangeWatcher implements TextWatcher {
-
- private final AutoFillManager mAfm = mContext.getSystemService(AutoFillManager.class);
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- }
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- }
-
- @Override
- public void afterTextChanged(Editable s) {
- if (mAfm != null) {
- if (DEBUG_AUTOFILL) {
- Log.v(LOG_TAG, "AutoFillChangeWatcher.afterTextChanged(): s=" + s);
- }
- mAfm.valueChanged(TextView.this);
- }
- }
- }
-
private class ChangeWatcher implements TextWatcher, SpanWatcher {
private CharSequence mBeforeText;
@@ -11475,9 +11533,7 @@
+ " before=" + before + " after=" + after + ": " + buffer);
}
- if (AccessibilityManager.getInstance(mContext).isEnabled()
- && ((!isPasswordInputType(getInputType()) && !hasPasswordTransformationMethod())
- || shouldSpeakPasswordsForAccessibility())) {
+ if (AccessibilityManager.getInstance(mContext).isEnabled()) {
mBeforeText = buffer.toString();
}
diff --git a/core/java/android/widget/TimePickerSpinnerDelegate.java b/core/java/android/widget/TimePickerSpinnerDelegate.java
index 7ef54a5..20a5512 100644
--- a/core/java/android/widget/TimePickerSpinnerDelegate.java
+++ b/core/java/android/widget/TimePickerSpinnerDelegate.java
@@ -86,7 +86,7 @@
inflater.inflate(layoutResourceId, mDelegator, true);
// hour
- mHourSpinner = (NumberPicker) delegator.findViewById(R.id.hour);
+ mHourSpinner = delegator.findViewById(R.id.hour);
mHourSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
updateInputState();
@@ -100,17 +100,17 @@
onTimeChanged();
}
});
- mHourSpinnerInput = (EditText) mHourSpinner.findViewById(R.id.numberpicker_input);
+ mHourSpinnerInput = mHourSpinner.findViewById(R.id.numberpicker_input);
mHourSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
// divider (only for the new widget style)
- mDivider = (TextView) mDelegator.findViewById(R.id.divider);
+ mDivider = mDelegator.findViewById(R.id.divider);
if (mDivider != null) {
setDividerText();
}
// minute
- mMinuteSpinner = (NumberPicker) mDelegator.findViewById(R.id.minute);
+ mMinuteSpinner = mDelegator.findViewById(R.id.minute);
mMinuteSpinner.setMinValue(0);
mMinuteSpinner.setMaxValue(59);
mMinuteSpinner.setOnLongPressUpdateInterval(100);
@@ -138,7 +138,7 @@
onTimeChanged();
}
});
- mMinuteSpinnerInput = (EditText) mMinuteSpinner.findViewById(R.id.numberpicker_input);
+ mMinuteSpinnerInput = mMinuteSpinner.findViewById(R.id.numberpicker_input);
mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
// Get the localized am/pm strings and use them in the spinner.
@@ -173,13 +173,13 @@
onTimeChanged();
}
});
- mAmPmSpinnerInput = (EditText) mAmPmSpinner.findViewById(R.id.numberpicker_input);
+ mAmPmSpinnerInput = mAmPmSpinner.findViewById(R.id.numberpicker_input);
mAmPmSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_DONE);
}
if (isAmPmAtStart()) {
// Move the am/pm view to the beginning
- ViewGroup amPmParent = (ViewGroup) delegator.findViewById(R.id.timePickerLayout);
+ ViewGroup amPmParent = delegator.findViewById(R.id.timePickerLayout);
amPmParent.removeView(amPmView);
amPmParent.addView(amPmView, 0);
// Swap layout margins if needed. They may be not symmetrical (Old Standard Theme
diff --git a/core/java/android/widget/Toast.java b/core/java/android/widget/Toast.java
index 789e60b..bf0601d 100644
--- a/core/java/android/widget/Toast.java
+++ b/core/java/android/widget/Toast.java
@@ -299,7 +299,7 @@
if (mNextView == null) {
throw new RuntimeException("This Toast was not created with Toast.makeText()");
}
- TextView tv = (TextView) mNextView.findViewById(com.android.internal.R.id.message);
+ TextView tv = mNextView.findViewById(com.android.internal.R.id.message);
if (tv == null) {
throw new RuntimeException("This Toast was not created with Toast.makeText()");
}
diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java
index b973324..7b2efea 100644
--- a/core/java/android/widget/VideoView.java
+++ b/core/java/android/widget/VideoView.java
@@ -16,11 +16,13 @@
package android.widget;
+import android.annotation.NonNull;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.graphics.Canvas;
+import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.Cea708CaptionRenderer;
import android.media.ClosedCaptionRenderer;
@@ -67,6 +69,14 @@
* {@link android.app.Activity#onRestoreInstanceState}.<p>
* Also note that the audio session id (from {@link #getAudioSessionId}) may
* change from its previously returned value when the VideoView is restored.
+ * <p>
+ * By default, VideoView requests audio focus with {@link AudioManager#AUDIOFOCUS_GAIN}. Use
+ * {@link #setAudioFocusRequest(int)} to change this behavior.
+ * <p>
+ * The default {@link AudioAttributes} used during playback have a usage of
+ * {@link AudioAttributes#USAGE_MEDIA} and a content type of
+ * {@link AudioAttributes#CONTENT_TYPE_MOVIE}, use {@link #setAudioAttributes(AudioAttributes)} to
+ * modify them.
*/
public class VideoView extends SurfaceView
implements MediaPlayerControl, SubtitleController.Anchor {
@@ -113,6 +123,9 @@
private boolean mCanPause;
private boolean mCanSeekBack;
private boolean mCanSeekForward;
+ private AudioManager mAudioManager;
+ private int mAudioFocusType = AudioManager.AUDIOFOCUS_GAIN; // legacy focus gain
+ private AudioAttributes mAudioAttributes;
/** Subtitle rendering widget overlaid on top of the video. */
private RenderingWidget mSubtitleWidget;
@@ -138,6 +151,10 @@
mVideoWidth = 0;
mVideoHeight = 0;
+ mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+ mAudioAttributes = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA)
+ .setContentType(AudioAttributes.CONTENT_TYPE_MOVIE).build();
+
getHolder().addCallback(mSHCallback);
getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
@@ -260,6 +277,41 @@
}
/**
+ * Sets which type of audio focus will be requested during the playback, or configures playback
+ * to not request audio focus. Valid values for focus requests are
+ * {@link AudioManager#AUDIOFOCUS_GAIN}, {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT},
+ * {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK}, and
+ * {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE}. Or use
+ * {@link AudioManager#AUDIOFOCUS_NONE} to express that audio focus should not be
+ * requested when playback starts. You can for instance use this when playing a silent animation
+ * through this class, and you don't want to affect other audio applications playing in the
+ * background.
+ * @param focusGain the type of audio focus gain that will be requested, or
+ * {@link AudioManager#AUDIOFOCUS_NONE} to disable the use audio focus during playback.
+ */
+ public void setAudioFocusRequest(int focusGain) {
+ if (focusGain != AudioManager.AUDIOFOCUS_NONE
+ && focusGain != AudioManager.AUDIOFOCUS_GAIN
+ && focusGain != AudioManager.AUDIOFOCUS_GAIN_TRANSIENT
+ && focusGain != AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
+ && focusGain != AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE) {
+ throw new IllegalArgumentException("Illegal audio focus type " + focusGain);
+ }
+ mAudioFocusType = focusGain;
+ }
+
+ /**
+ * Sets the {@link AudioAttributes} to be used during the playback of the video.
+ * @param attributes non-null <code>AudioAttributes</code>.
+ */
+ public void setAudioAttributes(@NonNull AudioAttributes attributes) {
+ if (attributes == null) {
+ throw new IllegalArgumentException("Illegal null AudioAttributes");
+ }
+ mAudioAttributes = attributes;
+ }
+
+ /**
* Adds an external subtitle source file (from the provided input stream.)
*
* Note that a single external subtitle source may contain multiple or no
@@ -301,8 +353,7 @@
mMediaPlayer = null;
mCurrentState = STATE_IDLE;
mTargetState = STATE_IDLE;
- AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
- am.abandonAudioFocus(null);
+ mAudioManager.abandonAudioFocus(null);
}
}
@@ -315,8 +366,10 @@
// called start() previously
release(false);
- AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
- am.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
+ if (mAudioFocusType != AudioManager.AUDIOFOCUS_NONE) {
+ // TODO this should have a focus listener
+ mAudioManager.requestAudioFocus(null, mAudioAttributes, mAudioFocusType, 0 /*flags*/);
+ }
try {
mMediaPlayer = new MediaPlayer();
@@ -345,7 +398,7 @@
mCurrentBufferPercentage = 0;
mMediaPlayer.setDataSource(mContext, mUri, mHeaders);
mMediaPlayer.setDisplay(mSurfaceHolder);
- mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
+ mMediaPlayer.setAudioAttributes(mAudioAttributes);
mMediaPlayer.setScreenOnWhilePlaying(true);
mMediaPlayer.prepareAsync();
@@ -482,6 +535,9 @@
if (mOnCompletionListener != null) {
mOnCompletionListener.onCompletion(mMediaPlayer);
}
+ if (mAudioFocusType != AudioManager.AUDIOFOCUS_NONE) {
+ mAudioManager.abandonAudioFocus(null);
+ }
}
};
@@ -644,8 +700,9 @@
if (cleartargetstate) {
mTargetState = STATE_IDLE;
}
- AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
- am.abandonAudioFocus(null);
+ if (mAudioFocusType != AudioManager.AUDIOFOCUS_NONE) {
+ mAudioManager.abandonAudioFocus(null);
+ }
}
}
diff --git a/core/java/android/widget/ZoomButtonsController.java b/core/java/android/widget/ZoomButtonsController.java
index 69b79971..1a3ca86 100644
--- a/core/java/android/widget/ZoomButtonsController.java
+++ b/core/java/android/widget/ZoomButtonsController.java
@@ -264,7 +264,7 @@
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(com.android.internal.R.layout.zoom_container, container);
- mControls = (ZoomControls) container.findViewById(com.android.internal.R.id.zoomControls);
+ mControls = container.findViewById(com.android.internal.R.id.zoomControls);
mControls.setOnZoomInClickListener(new OnClickListener() {
public void onClick(View v) {
dismissControlsDelayed(ZOOM_CONTROLS_TIMEOUT);
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 84c8f7a..79301aa 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -23,15 +23,21 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.IntentSender;
import android.content.IntentSender.SendIntentException;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
import android.content.pm.LabeledIntent;
+import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ParceledListSlice;
import android.content.pm.ResolveInfo;
+import android.content.pm.ShortcutInfo;
+import android.content.pm.ShortcutManager;
import android.database.DataSetObserver;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
@@ -84,6 +90,14 @@
public class ChooserActivity extends ResolverActivity {
private static final String TAG = "ChooserActivity";
+ /**
+ * Boolean extra to change the following behavior: Normally, ChooserActivity finishes itself
+ * in onStop when launched in a new task. If this extra is set to true, we do not finish
+ * ourselves when onStop gets called.
+ */
+ public static final String EXTRA_PRIVATE_RETAIN_IN_ON_STOP
+ = "com.android.internal.app.ChooserActivity.EXTRA_PRIVATE_RETAIN_IN_ON_STOP";
+
private static final boolean DEBUG = false;
private static final int QUERY_TARGET_SERVICE_LIMIT = 5;
@@ -260,6 +274,7 @@
}
mPinnedSharedPrefs = getPinnedSharedPrefs(this);
+ setRetainInOnStop(intent.getBooleanExtra(EXTRA_PRIVATE_RETAIN_IN_ON_STOP, false));
super.onCreate(savedInstanceState, target, title, defaultTitleRes, initialIntents,
null, false);
@@ -347,6 +362,7 @@
mChooserListAdapter.addServiceResults(null, Lists.newArrayList(mCallerChooserTargets));
}
mChooserRowAdapter = new ChooserRowAdapter(mChooserListAdapter);
+ mChooserRowAdapter.updateRowScales();
mChooserRowAdapter.registerDataSetObserver(new OffsetDataSetObserver(adapterView));
adapterView.setAdapter(mChooserRowAdapter);
if (listView != null) {
@@ -833,7 +849,9 @@
return false;
}
intent.setComponent(mChooserTarget.getComponentName());
- intent.putExtras(mChooserTarget.getIntentExtras());
+ if (mChooserTarget.getIntentExtras() != null) {
+ intent.putExtras(mChooserTarget.getIntentExtras());
+ }
// Important: we will ignore the target security checks in ActivityManager
// if and only if the ChooserTarget's target package is the same package
@@ -916,6 +934,8 @@
private static final int MAX_SERVICE_TARGETS = 8;
private static final int MAX_TARGETS_PER_SERVICE = 4;
+ private boolean mAreChooserShortcutsRetrieved;
+
private final List<ChooserTargetInfo> mServiceTargets = new ArrayList<>();
private final List<TargetInfo> mCallerTargets = new ArrayList<>();
private boolean mShowServiceTargets;
@@ -1007,6 +1027,20 @@
if (mServiceTargets != null) {
pruneServiceTargets();
}
+
+ if (DEBUG) Log.d(TAG, "Adding pushed chooser targets");
+
+ if (!mAreChooserShortcutsRetrieved) {
+ LauncherApps launcherApps = getLauncherApps();
+ LauncherApps.ShortcutQuery query = new LauncherApps.ShortcutQuery();
+ query.setIntent(getTargetIntent());
+ query.setQueryFlags(LauncherApps.ShortcutQuery.FLAG_MATCH_CHOOSER);
+ List<ShortcutInfo> shortcuts = launcherApps.getShortcuts(query, UserHandle.SYSTEM);
+ if (DEBUG) Log.d(TAG, "Adding " + shortcuts.size() + " chooser shortcuts");
+ addShortcuts(shortcuts);
+ mAreChooserShortcutsRetrieved = true;
+ }
+
if (DEBUG) Log.d(TAG, "List built querying services");
queryTargetServices(this);
}
@@ -1032,6 +1066,7 @@
public int getServiceTargetCount() {
if (!mShowServiceTargets) {
+ if (DEBUG) Log.d("TAG", "Hiding service targets");
return 0;
}
return Math.min(mServiceTargets.size(), MAX_SERVICE_TARGETS);
@@ -1123,6 +1158,71 @@
notifyDataSetChanged();
}
+ // TODO: Pushed targets need to be scored correctly
+ public void addShortcuts(List<ShortcutInfo> infos) {
+ for (ShortcutInfo info : infos) {
+ List<ChooserTarget> newTargets = new ArrayList<>();
+ final ComponentName cn = info.getActivity();
+ ActivityInfo ai;
+ ResolveInfo ri = new ResolveInfo();
+ if (cn != null) {
+ try {
+ ai = getPackageManager().getActivityInfo(cn, 0);
+ ri.activityInfo = ai;
+ UserManager userManager =
+ (UserManager) getSystemService(Context.USER_SERVICE);
+ ri.iconResourceId = ai.icon;
+ ri.labelRes = ai.labelRes;
+ ri.resolvePackageName = ai.packageName;
+ ri.activityInfo.applicationInfo = new ApplicationInfo(
+ ri.activityInfo.applicationInfo);
+ ri.activityInfo.applicationInfo = ai.applicationInfo;
+ ri.activityInfo.applicationInfo.uid = getUserId();
+ } catch (PackageManager.NameNotFoundException ignored) {
+ if (DEBUG) Log.d(TAG, "Package not found, skipping this shortcut");
+ continue;
+ }
+ }
+
+ DisplayResolveInfo resolveInfo = new DisplayResolveInfo(getTargetIntent(),
+ ri,
+ info.getShortLabel(),
+ info.getLongLabel(),
+ getTargetIntent());
+
+ int bestMatch = 0;
+ ComponentName bestComponent = null;
+ for (int i = 0; i < info.getChooserIntentFilters().length; i++) {
+ int newMatch = info.getChooserIntentFilters()[i]
+ .match(getContentResolver(), getTargetIntent(), false, TAG);
+ if (DEBUG) Log.d(TAG, "A match was found with value: " + newMatch);
+ if (newMatch > bestMatch) {
+ bestMatch = newMatch;
+ bestComponent = info.getChooserComponentNames()[i];
+ }
+ }
+ if (bestMatch == 0) {
+ Log.e(TAG, "Unexpectedly, no match was found for the provided chooser intent");
+ return;
+ }
+
+ Bundle extrasToAdd =
+ info.getChooserExtras() == null ? null: new Bundle(info.getChooserExtras());
+ if (DEBUG) Log.d(TAG, "Adding service target " + info.getShortLabel());
+ newTargets.add(new ChooserTarget(
+ info.getShortLabel(),
+ info.getIcon(),
+ 1,
+ bestComponent,
+ extrasToAdd));
+ addServiceResults(resolveInfo, newTargets);
+ }
+ if (mChooserRowAdapter != null) {
+ mChooserRowAdapter.updateRowScales();
+ }
+ setShowServiceTargets(true);
+ }
+
/**
* Set to true to reveal all service targets at once.
*/
@@ -1237,37 +1337,7 @@
@Override
public void onChanged() {
super.onChanged();
- final int rcount = getServiceTargetRowCount();
- if (mServiceTargetScale == null
- || mServiceTargetScale.length != rcount) {
- RowScale[] old = mServiceTargetScale;
- int oldRCount = old != null ? old.length : 0;
- mServiceTargetScale = new RowScale[rcount];
- if (old != null && rcount > 0) {
- System.arraycopy(old, 0, mServiceTargetScale, 0,
- Math.min(old.length, rcount));
- }
-
- for (int i = rcount; i < oldRCount; i++) {
- old[i].cancelAnimation();
- }
-
- for (int i = oldRCount; i < rcount; i++) {
- final RowScale rs = new RowScale(ChooserRowAdapter.this, 0.f, 1.f)
- .setInterpolator(mInterpolator);
- mServiceTargetScale[i] = rs;
- }
-
- // Start the animations in a separate loop.
- // The process of starting animations will result in
- // binding views to set up initial values, and we must
- // have ALL of the new RowScale objects created above before
- // we get started.
- for (int i = oldRCount; i < rcount; i++) {
- mServiceTargetScale[i].startAnimation();
- }
- }
-
+ updateRowScales();
notifyDataSetChanged();
}
@@ -1284,6 +1354,40 @@
});
}
+ void updateRowScales() {
+ final int rcount = getServiceTargetRowCount();
+ if (mServiceTargetScale == null
+ || mServiceTargetScale.length != rcount) {
+ if (DEBUG) Log.d(TAG, "Row scales need adjusting to " + rcount + " rows.");
+ RowScale[] old = mServiceTargetScale;
+ int oldRCount = old != null ? old.length : 0;
+ mServiceTargetScale = new RowScale[rcount];
+ if (old != null && rcount > 0) {
+ System.arraycopy(old, 0, mServiceTargetScale, 0,
+ Math.min(old.length, rcount));
+ }
+
+ for (int i = rcount; i < oldRCount; i++) {
+ old[i].cancelAnimation();
+ }
+
+ for (int i = oldRCount; i < rcount; i++) {
+ final RowScale rs = new RowScale(ChooserRowAdapter.this, 0.f, 1.f)
+ .setInterpolator(mInterpolator);
+ mServiceTargetScale[i] = rs;
+ }
+
+ // Start the animations in a separate loop.
+ // The process of starting animations will result in
+ // binding views to set up initial values, and we must
+ // have ALL of the new RowScale objects created above before
+ // we get started.
+ for (int i = oldRCount; i < rcount; i++) {
+ mServiceTargetScale[i].startAnimation();
+ }
+ }
+ }
+
private float getRowScale(int rowPosition) {
final int start = getCallerTargetRowCount();
final int end = start + getServiceTargetRowCount();
@@ -1554,6 +1658,10 @@
}
}
+ public LauncherApps getLauncherApps() {
+ return (LauncherApps) getSystemService(Context.LAUNCHER_APPS_SERVICE);
+ }
+
static class ServiceResultInfo {
public final DisplayResolveInfo originalTarget;
public final List<ChooserTarget> resultTargets;
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index 3c1a180..3f1c9ad 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -116,6 +116,10 @@
private Runnable mPostListReadyRunnable;
private boolean mRegistered;
+
+ /** See {@link #setRetainInOnStop}. */
+ private boolean mRetainInOnStop;
+
private final PackageMonitor mPackageMonitor = new PackageMonitor() {
@Override public void onSomePackagesChanged() {
mAdapter.handlePackagesChanged();
@@ -123,6 +127,13 @@
bindProfileView();
}
}
+
+ @Override
+ public boolean onPackageChanged(String packageName, int uid, String[] components) {
+ // We care about all package changes, not just the whole package itself which is
+ // default behavior.
+ return true;
+ }
};
/**
@@ -495,7 +506,7 @@
}
final Intent intent = getIntent();
if ((intent.getFlags() & FLAG_ACTIVITY_NEW_TASK) != 0 && !isVoiceInteraction()
- && !mResolvingHome) {
+ && !mResolvingHome && !mRetainInOnStop) {
// This resolver is in the unusual situation where it has been
// launched at the top of a new task. We don't let it be added
// to the recent tasks shown to the user, and we need to make sure
@@ -524,16 +535,7 @@
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
- if (mSupportsAlwaysUseOption) {
- final int checkedPos = mAdapterView.getCheckedItemPosition();
- final boolean hasValidSelection = checkedPos != ListView.INVALID_POSITION;
- mLastSelected = checkedPos;
- setAlwaysButtonEnabled(hasValidSelection, checkedPos, true);
- mOnceButton.setEnabled(hasValidSelection);
- if (hasValidSelection) {
- mAdapterView.setSelection(checkedPos);
- }
- }
+ resetAlwaysOrOnceButtonBar();
}
private boolean hasManagedProfile() {
@@ -570,7 +572,13 @@
boolean enabled = false;
if (hasValidSelection) {
ResolveInfo ri = mAdapter.resolveInfoForPosition(checkedPos, filtered);
- if (ri.targetUserId == UserHandle.USER_CURRENT) {
+ if (ri == null) {
+ Log.e(TAG, "Invalid position supplied to setAlwaysButtonEnabled");
+ return;
+ } else if (ri.targetUserId != UserHandle.USER_CURRENT) {
+ Log.e(TAG, "Attempted to set selection to resolve info for another user");
+ return;
+ } else {
enabled = true;
}
}
@@ -1022,6 +1030,14 @@
}
/**
+ * If {@code retainInOnStop} is set to true, we will not finish ourselves when onStop gets
+ * called and we are launched in a new task.
+ */
+ protected void setRetainInOnStop(boolean retainInOnStop) {
+ mRetainInOnStop = retainInOnStop;
+ }
+
+ /**
* Check a simple match for the component of two ResolveInfos.
*/
static boolean resolveInfoMatch(ResolveInfo lhs, ResolveInfo rhs) {
@@ -1427,7 +1443,7 @@
mUnfilteredResolveList = originalList;
}
- if (N > 1) {
+ if (currentResolveList.size() > 1) {
setPlaceholderCount(currentResolveList.size());
AsyncTask<List<ResolvedComponentInfo>,
Void,
@@ -1555,7 +1571,15 @@
}
public void onListRebuilt() {
- // This space for rent
+ int count = getUnfilteredCount();
+ if (count == 1 && getOtherProfile() == null) {
+ // Only one target, so we're a candidate to auto-launch!
+ final TargetInfo target = targetInfoForPosition(0, false);
+ if (shouldAutoLaunchSingleChoice(target)) {
+ safelyStartActivity(target);
+ finish();
+ }
+ }
}
public boolean shouldGetResolvedFilter() {
diff --git a/core/java/com/android/internal/content/FileSystemProvider.java b/core/java/com/android/internal/content/FileSystemProvider.java
new file mode 100644
index 0000000..3ac5a72
--- /dev/null
+++ b/core/java/com/android/internal/content/FileSystemProvider.java
@@ -0,0 +1,487 @@
+/*
+ * 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.internal.content;
+
+import android.annotation.CallSuper;
+import android.content.ContentResolver;
+import android.content.Intent;
+import android.content.res.AssetFileDescriptor;
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.database.MatrixCursor.RowBuilder;
+import android.graphics.Point;
+import android.net.Uri;
+import android.os.CancellationSignal;
+import android.os.FileObserver;
+import android.os.FileUtils;
+import android.os.Handler;
+import android.os.ParcelFileDescriptor;
+import android.provider.DocumentsContract;
+import android.provider.DocumentsContract.Document;
+import android.provider.DocumentsProvider;
+import android.provider.MediaStore;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.Log;
+import android.webkit.MimeTypeMap;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * A helper class for {@link android.provider.DocumentsProvider} to perform file operations on local
+ * files.
+ */
+public abstract class FileSystemProvider extends DocumentsProvider {
+
+ private static final String TAG = "FileSystemProvider";
+
+ private static final boolean LOG_INOTIFY = false;
+
+ private String[] mDefaultProjection;
+
+ @GuardedBy("mObservers")
+ private final ArrayMap<File, DirectoryObserver> mObservers = new ArrayMap<>();
+
+ private Handler mHandler;
+
+ protected abstract File getFileForDocId(String docId, boolean visible)
+ throws FileNotFoundException;
+
+ protected abstract String getDocIdForFile(File file) throws FileNotFoundException;
+
+ protected abstract Uri buildNotificationUri(String docId);
+
+ @Override
+ public boolean onCreate() {
+ throw new UnsupportedOperationException(
+ "Subclass should override this and call onCreate(defaultDocumentProjection)");
+ }
+
+ @CallSuper
+ protected void onCreate(String[] defaultProjection) {
+ mHandler = new Handler();
+ mDefaultProjection = defaultProjection;
+ }
+
+ @Override
+ public boolean isChildDocument(String parentDocId, String docId) {
+ try {
+ final File parent = getFileForDocId(parentDocId).getCanonicalFile();
+ final File doc = getFileForDocId(docId).getCanonicalFile();
+ return FileUtils.contains(parent, doc);
+ } catch (IOException e) {
+ throw new IllegalArgumentException(
+ "Failed to determine if " + docId + " is child of " + parentDocId + ": " + e);
+ }
+ }
+
+ protected final List<String> findDocumentPath(File parent, File doc)
+ throws FileNotFoundException {
+
+ if (!doc.exists()) {
+ throw new FileNotFoundException(doc + " is not found.");
+ }
+
+ if (!FileUtils.contains(parent, doc)) {
+ throw new FileNotFoundException(doc + " is not found under " + parent);
+ }
+
+ LinkedList<String> path = new LinkedList<>();
+ while (doc != null && FileUtils.contains(parent, doc)) {
+ path.addFirst(getDocIdForFile(doc));
+
+ doc = doc.getParentFile();
+ }
+
+ return path;
+ }
+
+ @Override
+ public String createDocument(String docId, String mimeType, String displayName)
+ throws FileNotFoundException {
+ displayName = FileUtils.buildValidFatFilename(displayName);
+
+ final File parent = getFileForDocId(docId);
+ if (!parent.isDirectory()) {
+ throw new IllegalArgumentException("Parent document isn't a directory");
+ }
+
+ final File file = FileUtils.buildUniqueFile(parent, mimeType, displayName);
+ if (Document.MIME_TYPE_DIR.equals(mimeType)) {
+ if (!file.mkdir()) {
+ throw new IllegalStateException("Failed to mkdir " + file);
+ }
+ } else {
+ try {
+ if (!file.createNewFile()) {
+ throw new IllegalStateException("Failed to touch " + file);
+ }
+ } catch (IOException e) {
+ throw new IllegalStateException("Failed to touch " + file + ": " + e);
+ }
+ }
+
+ return getDocIdForFile(file);
+ }
+
+ @Override
+ public String renameDocument(String docId, String displayName) throws FileNotFoundException {
+ // Since this provider treats renames as generating a completely new
+ // docId, we're okay with letting the MIME type change.
+ displayName = FileUtils.buildValidFatFilename(displayName);
+
+ final File before = getFileForDocId(docId);
+ final File after = FileUtils.buildUniqueFile(before.getParentFile(), displayName);
+ final File visibleFileBefore = getFileForDocId(docId, true);
+ if (!before.renameTo(after)) {
+ throw new IllegalStateException("Failed to rename to " + after);
+ }
+ removeFromMediaStore(visibleFileBefore);
+
+ final String afterDocId = getDocIdForFile(after);
+ scanFile(getFileForDocId(afterDocId, true));
+
+ if (!TextUtils.equals(docId, afterDocId)) {
+ return afterDocId;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public void deleteDocument(String docId) throws FileNotFoundException {
+ final File file = getFileForDocId(docId);
+ final File visibleFile = getFileForDocId(docId, true);
+
+ final boolean isDirectory = file.isDirectory();
+ if (isDirectory) {
+ FileUtils.deleteContents(file);
+ }
+ if (!file.delete()) {
+ throw new IllegalStateException("Failed to delete " + file);
+ }
+
+ removeFromMediaStore(visibleFile);
+ }
+
+ @Override
+ public String moveDocument(String sourceDocumentId, String sourceParentDocumentId,
+ String targetParentDocumentId)
+ throws FileNotFoundException {
+ final File before = getFileForDocId(sourceDocumentId);
+ final File after = new File(getFileForDocId(targetParentDocumentId), before.getName());
+ final File visibleFileBefore = getFileForDocId(sourceDocumentId, true);
+
+ if (after.exists()) {
+ throw new IllegalStateException("Already exists " + after);
+ }
+ if (!before.renameTo(after)) {
+ throw new IllegalStateException("Failed to move to " + after);
+ }
+
+ // Notify media store to update its content
+ removeFromMediaStore(visibleFileBefore);
+ final String docId = getDocIdForFile(after);
+ scanFile(getFileForDocId(docId, true));
+
+ return docId;
+ }
+
+ private void removeFromMediaStore(File visibleFile) throws FileNotFoundException {
+ if (visibleFile != null) {
+ final ContentResolver resolver = getContext().getContentResolver();
+ final Uri externalUri = MediaStore.Files.getContentUri("external");
+
+ // Remove media store entries for any files inside this directory, using
+ // path prefix match. Logic borrowed from MtpDatabase.
+ if (visibleFile.isDirectory()) {
+ final String path = visibleFile.getAbsolutePath() + "/";
+ resolver.delete(externalUri,
+ "_data LIKE ?1 AND lower(substr(_data,1,?2))=lower(?3)",
+ new String[] { path + "%", Integer.toString(path.length()), path });
+ }
+
+ // Remove media store entry for this exact file.
+ final String path = visibleFile.getAbsolutePath();
+ resolver.delete(externalUri,
+ "_data LIKE ?1 AND lower(_data)=lower(?2)",
+ new String[] { path, path });
+ }
+ }
+
+ @Override
+ public Cursor queryDocument(String documentId, String[] projection)
+ throws FileNotFoundException {
+ final MatrixCursor result = new MatrixCursor(resolveProjection(projection));
+ includeFile(result, documentId, null);
+ return result;
+ }
+
+ @Override
+ public Cursor queryChildDocuments(
+ String parentDocumentId, String[] projection, String sortOrder)
+ throws FileNotFoundException {
+
+ final File parent = getFileForDocId(parentDocumentId);
+ final MatrixCursor result = new DirectoryCursor(
+ resolveProjection(projection), parentDocumentId, parent);
+ for (File file : parent.listFiles()) {
+ includeFile(result, null, file);
+ }
+ return result;
+ }
+
+ /**
+ * Searches documents under the given folder.
+ *
+ * To avoid runtime explosion only returns the at most 23 items.
+ *
+ * @param folder the root folder where recursive search begins
+ * @param query the search condition used to match file names
+ * @param projection projection of the returned cursor
+ * @param exclusion absolute file paths to exclude from result
+ * @return cursor containing search result
+ * @throws FileNotFoundException when root folder doesn't exist or search fails
+ */
+ protected final Cursor querySearchDocuments(
+ File folder, String query, String[] projection, Set<String> exclusion)
+ throws FileNotFoundException {
+
+ query = query.toLowerCase();
+ final MatrixCursor result = new MatrixCursor(resolveProjection(projection));
+ final LinkedList<File> pending = new LinkedList<>();
+ pending.add(folder);
+ while (!pending.isEmpty() && result.getCount() < 24) {
+ final File file = pending.removeFirst();
+ if (file.isDirectory()) {
+ for (File child : file.listFiles()) {
+ pending.add(child);
+ }
+ }
+ if (file.getName().toLowerCase().contains(query)
+ && !exclusion.contains(file.getAbsolutePath())) {
+ includeFile(result, null, file);
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public String getDocumentType(String documentId) throws FileNotFoundException {
+ final File file = getFileForDocId(documentId);
+ return getTypeForFile(file);
+ }
+
+ @Override
+ public ParcelFileDescriptor openDocument(
+ String documentId, String mode, CancellationSignal signal)
+ throws FileNotFoundException {
+ final File file = getFileForDocId(documentId);
+ final File visibleFile = getFileForDocId(documentId, true);
+
+ final int pfdMode = ParcelFileDescriptor.parseMode(mode);
+ if (pfdMode == ParcelFileDescriptor.MODE_READ_ONLY || visibleFile == null) {
+ return ParcelFileDescriptor.open(file, pfdMode);
+ } else {
+ try {
+ // When finished writing, kick off media scanner
+ return ParcelFileDescriptor.open(
+ file, pfdMode, mHandler, (IOException e) -> scanFile(visibleFile));
+ } catch (IOException e) {
+ throw new FileNotFoundException("Failed to open for writing: " + e);
+ }
+ }
+ }
+
+ private void scanFile(File visibleFile) {
+ final Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
+ intent.setData(Uri.fromFile(visibleFile));
+ getContext().sendBroadcast(intent);
+ }
+
+ @Override
+ public AssetFileDescriptor openDocumentThumbnail(
+ String documentId, Point sizeHint, CancellationSignal signal)
+ throws FileNotFoundException {
+ final File file = getFileForDocId(documentId);
+ return DocumentsContract.openImageThumbnail(file);
+ }
+
+ protected RowBuilder includeFile(MatrixCursor result, String docId, File file)
+ throws FileNotFoundException {
+ if (docId == null) {
+ docId = getDocIdForFile(file);
+ } else {
+ file = getFileForDocId(docId);
+ }
+
+ int flags = 0;
+
+ if (file.canWrite()) {
+ if (file.isDirectory()) {
+ flags |= Document.FLAG_DIR_SUPPORTS_CREATE;
+ flags |= Document.FLAG_SUPPORTS_DELETE;
+ flags |= Document.FLAG_SUPPORTS_RENAME;
+ flags |= Document.FLAG_SUPPORTS_MOVE;
+ } else {
+ flags |= Document.FLAG_SUPPORTS_WRITE;
+ flags |= Document.FLAG_SUPPORTS_DELETE;
+ flags |= Document.FLAG_SUPPORTS_RENAME;
+ flags |= Document.FLAG_SUPPORTS_MOVE;
+ }
+ }
+
+ final String mimeType = getTypeForFile(file);
+ final String displayName = file.getName();
+ if (mimeType.startsWith("image/")) {
+ flags |= Document.FLAG_SUPPORTS_THUMBNAIL;
+ }
+
+ final RowBuilder row = result.newRow();
+ row.add(Document.COLUMN_DOCUMENT_ID, docId);
+ row.add(Document.COLUMN_DISPLAY_NAME, displayName);
+ row.add(Document.COLUMN_SIZE, file.length());
+ row.add(Document.COLUMN_MIME_TYPE, mimeType);
+ row.add(Document.COLUMN_FLAGS, flags);
+
+ // Only publish dates reasonably after epoch
+ long lastModified = file.lastModified();
+ if (lastModified > 31536000000L) {
+ row.add(Document.COLUMN_LAST_MODIFIED, lastModified);
+ }
+
+ // Return the row builder just in case any subclass want to add more stuff to it.
+ return row;
+ }
+
+ private static String getTypeForFile(File file) {
+ if (file.isDirectory()) {
+ return Document.MIME_TYPE_DIR;
+ } else {
+ return getTypeForName(file.getName());
+ }
+ }
+
+ private static String getTypeForName(String name) {
+ final int lastDot = name.lastIndexOf('.');
+ if (lastDot >= 0) {
+ final String extension = name.substring(lastDot + 1).toLowerCase();
+ final String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
+ if (mime != null) {
+ return mime;
+ }
+ }
+
+ return "application/octet-stream";
+ }
+
+ protected final File getFileForDocId(String docId) throws FileNotFoundException {
+ return getFileForDocId(docId, false);
+ }
+
+ private String[] resolveProjection(String[] projection) {
+ return projection == null ? mDefaultProjection : projection;
+ }
+
+ private void startObserving(File file, Uri notifyUri) {
+ synchronized (mObservers) {
+ DirectoryObserver observer = mObservers.get(file);
+ if (observer == null) {
+ observer = new DirectoryObserver(
+ file, getContext().getContentResolver(), notifyUri);
+ observer.startWatching();
+ mObservers.put(file, observer);
+ }
+ observer.mRefCount++;
+
+ if (LOG_INOTIFY) Log.d(TAG, "after start: " + observer);
+ }
+ }
+
+ private void stopObserving(File file) {
+ synchronized (mObservers) {
+ DirectoryObserver observer = mObservers.get(file);
+ if (observer == null) return;
+
+ observer.mRefCount--;
+ if (observer.mRefCount == 0) {
+ mObservers.remove(file);
+ observer.stopWatching();
+ }
+
+ if (LOG_INOTIFY) Log.d(TAG, "after stop: " + observer);
+ }
+ }
+
+ private static class DirectoryObserver extends FileObserver {
+ private static final int NOTIFY_EVENTS = ATTRIB | CLOSE_WRITE | MOVED_FROM | MOVED_TO
+ | CREATE | DELETE | DELETE_SELF | MOVE_SELF;
+
+ private final File mFile;
+ private final ContentResolver mResolver;
+ private final Uri mNotifyUri;
+
+ private int mRefCount = 0;
+
+ public DirectoryObserver(File file, ContentResolver resolver, Uri notifyUri) {
+ super(file.getAbsolutePath(), NOTIFY_EVENTS);
+ mFile = file;
+ mResolver = resolver;
+ mNotifyUri = notifyUri;
+ }
+
+ @Override
+ public void onEvent(int event, String path) {
+ if ((event & NOTIFY_EVENTS) != 0) {
+ if (LOG_INOTIFY) Log.d(TAG, "onEvent() " + event + " at " + path);
+ mResolver.notifyChange(mNotifyUri, null, false);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "DirectoryObserver{file=" + mFile.getAbsolutePath() + ", ref=" + mRefCount + "}";
+ }
+ }
+
+ private class DirectoryCursor extends MatrixCursor {
+ private final File mFile;
+
+ public DirectoryCursor(String[] columnNames, String docId, File file) {
+ super(columnNames);
+
+ final Uri notifyUri = buildNotificationUri(docId);
+ setNotificationUri(getContext().getContentResolver(), notifyUri);
+
+ mFile = file;
+ startObserving(mFile, notifyUri);
+ }
+
+ @Override
+ public void close() {
+ super.close();
+ stopObserving(mFile);
+ }
+ }
+}
diff --git a/core/java/com/android/internal/content/PackageHelper.java b/core/java/com/android/internal/content/PackageHelper.java
index eec3cb0..e088717 100644
--- a/core/java/com/android/internal/content/PackageHelper.java
+++ b/core/java/com/android/internal/content/PackageHelper.java
@@ -534,7 +534,7 @@
final int prefer;
final boolean checkBoth;
boolean ephemeral = false;
- if ((installFlags & PackageManager.INSTALL_EPHEMERAL) != 0) {
+ if ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) {
prefer = RECOMMEND_INSTALL_INTERNAL;
ephemeral = true;
checkBoth = false;
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 9dca5ea..12d96e2 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -7914,12 +7914,11 @@
}
public void noteStartSensor(int sensor, long elapsedRealtimeMs) {
- StopwatchTimer t = getSensorTimerLocked(sensor, true);
- if (t != null) {
- t.startRunningLocked(elapsedRealtimeMs);
- }
- Counter c = getSensorBgCounterLocked(sensor, true);
- if (c != null && mProcessState >= PROCESS_STATE_BACKGROUND) {
+ StopwatchTimer t = getSensorTimerLocked(sensor, /* create= */ true);
+ t.startRunningLocked(elapsedRealtimeMs);
+
+ Counter c = getSensorBgCounterLocked(sensor, /* create= */ true);
+ if (mProcessState >= PROCESS_STATE_BACKGROUND && t.mNesting == 1) {
c.stepAtomic();
}
}
@@ -7933,17 +7932,17 @@
}
public void noteStartGps(long elapsedRealtimeMs) {
- StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true);
- if (t != null) {
- t.startRunningLocked(elapsedRealtimeMs);
- }
- Counter c = getSensorBgCounterLocked(Sensor.GPS, true);
- if (c != null && mProcessState >= PROCESS_STATE_BACKGROUND) {
+ StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, /* create= */ true);
+ t.startRunningLocked(elapsedRealtimeMs);
+
+ Counter c = getSensorBgCounterLocked(Sensor.GPS, /* create= */ true);
+ if (mProcessState >= PROCESS_STATE_BACKGROUND && t.mNesting == 1) {
c.stepAtomic();
}
}
public void noteStopGps(long elapsedRealtimeMs) {
+ // Don't create a timer if one doesn't already exist
StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false);
if (t != null) {
t.stopRunningLocked(elapsedRealtimeMs);
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 0b5a1b7..310cbc7 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -584,6 +584,7 @@
OsConstants.CAP_NET_RAW,
OsConstants.CAP_SYS_MODULE,
OsConstants.CAP_SYS_NICE,
+ OsConstants.CAP_SYS_PTRACE,
OsConstants.CAP_SYS_RESOURCE,
OsConstants.CAP_SYS_TIME,
OsConstants.CAP_SYS_TTY_CONFIG,
diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java
index cb3a250..2b16254 100644
--- a/core/java/com/android/internal/util/ArrayUtils.java
+++ b/core/java/com/android/internal/util/ArrayUtils.java
@@ -260,10 +260,19 @@
*/
@SuppressWarnings("unchecked")
public static @NonNull <T> T[] appendElement(Class<T> kind, @Nullable T[] array, T element) {
+ return appendElement(kind, array, element, false);
+ }
+
+ /**
+ * Adds value to given array.
+ */
+ @SuppressWarnings("unchecked")
+ public static @NonNull <T> T[] appendElement(Class<T> kind, @Nullable T[] array, T element,
+ boolean allowDuplicates) {
final T[] result;
final int end;
if (array != null) {
- if (contains(array, element)) return array;
+ if (!allowDuplicates && contains(array, element)) return array;
end = array.length;
result = (T[])Array.newInstance(kind, end + 1);
System.arraycopy(array, 0, result, 0, end);
@@ -299,17 +308,19 @@
}
/**
- * Adds value to given array if not already present, providing set-like
- * behavior.
+ * Adds value to given array.
*/
- public static @NonNull int[] appendInt(@Nullable int[] cur, int val) {
+ public static @NonNull int[] appendInt(@Nullable int[] cur, int val,
+ boolean allowDuplicates) {
if (cur == null) {
return new int[] { val };
}
final int N = cur.length;
- for (int i = 0; i < N; i++) {
- if (cur[i] == val) {
- return cur;
+ if (!allowDuplicates) {
+ for (int i = 0; i < N; i++) {
+ if (cur[i] == val) {
+ return cur;
+ }
}
}
int[] ret = new int[N + 1];
@@ -319,6 +330,14 @@
}
/**
+ * Adds value to given array if not already present, providing set-like
+ * behavior.
+ */
+ public static @NonNull int[] appendInt(@Nullable int[] cur, int val) {
+ return appendInt(cur, val, false);
+ }
+
+ /**
* Removes value from given array if present, providing set-like behavior.
*/
public static @Nullable int[] removeInt(@Nullable int[] cur, int val) {
diff --git a/core/java/com/android/internal/util/NotificationColorUtil.java b/core/java/com/android/internal/util/NotificationColorUtil.java
index b4890b7..44b21b4 100644
--- a/core/java/com/android/internal/util/NotificationColorUtil.java
+++ b/core/java/com/android/internal/util/NotificationColorUtil.java
@@ -456,7 +456,10 @@
}
}
- public static int resolveActionBarColor(int backgroundColor) {
+ public static int resolveActionBarColor(Context context, int backgroundColor) {
+ if (backgroundColor == Notification.COLOR_DEFAULT) {
+ return context.getColor(com.android.internal.R.color.notification_action_list);
+ }
boolean useDark = shouldUseDark(backgroundColor);
final double[] result = ColorUtilsFromCompat.getTempDouble3Array();
ColorUtilsFromCompat.colorToLAB(backgroundColor, result);
diff --git a/core/java/com/android/internal/util/Predicate.java b/core/java/com/android/internal/util/Predicate.java
index bc6d6b3..1b5eaff 100644
--- a/core/java/com/android/internal/util/Predicate.java
+++ b/core/java/com/android/internal/util/Predicate.java
@@ -25,7 +25,10 @@
* <p/>
* Implementors of Predicate which may cause side effects upon evaluation are
* strongly encouraged to state this fact clearly in their API documentation.
+ *
+ * @deprecated Use {@code java.util.function.Predicate} instead.
*/
+@Deprecated
public interface Predicate<T> {
boolean apply(T t);
diff --git a/core/java/com/android/internal/util/StateMachine.java b/core/java/com/android/internal/util/StateMachine.java
index be10608df..d67cef3 100644
--- a/core/java/com/android/internal/util/StateMachine.java
+++ b/core/java/com/android/internal/util/StateMachine.java
@@ -23,6 +23,8 @@
import android.text.TextUtils;
import android.util.Log;
+import com.android.internal.annotations.VisibleForTesting;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -1495,7 +1497,7 @@
}
/**
- * @return number of log records
+ * @return the number of log records currently readable
*/
public final int getLogRecSize() {
// mSmHandler can be null if the state machine has quit.
@@ -1505,6 +1507,17 @@
}
/**
+ * @return the number of log records we can store
+ */
+ @VisibleForTesting
+ public final int getLogRecMaxSize() {
+ // mSmHandler can be null if the state machine has quit.
+ SmHandler smh = mSmHandler;
+ if (smh == null) return 0;
+ return smh.mLogRecords.mMaxSize;
+ }
+
+ /**
* @return the total number of records processed
*/
public final int getLogRecCount() {
diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java
index dd91d2f..ce51dc4 100644
--- a/core/java/com/android/internal/view/BaseIWindow.java
+++ b/core/java/com/android/internal/view/BaseIWindow.java
@@ -40,7 +40,7 @@
@Override
public void resized(Rect frame, Rect overscanInsets, Rect contentInsets, Rect visibleInsets,
Rect stableInsets, Rect outsets, boolean reportDraw, Configuration newConfig,
- Rect backDropFrame, boolean forceLayout, boolean alwaysConsumeNavBar) {
+ Rect backDropFrame, boolean forceLayout, boolean alwaysConsumeNavBar, int displayId) {
if (reportDraw) {
try {
mSession.finishDrawing(this);
diff --git a/core/java/com/android/internal/view/IInputConnectionWrapper.java b/core/java/com/android/internal/view/IInputConnectionWrapper.java
index 555263d..28291ae 100644
--- a/core/java/com/android/internal/view/IInputConnectionWrapper.java
+++ b/core/java/com/android/internal/view/IInputConnectionWrapper.java
@@ -496,6 +496,7 @@
} finally {
args.recycle();
}
+ return;
}
case DO_REQUEST_UPDATE_CURSOR_ANCHOR_INFO: {
SomeArgs args = (SomeArgs)msg.obj;
diff --git a/core/java/com/android/internal/view/menu/ListMenuItemView.java b/core/java/com/android/internal/view/menu/ListMenuItemView.java
index 43005e6..919cf99 100644
--- a/core/java/com/android/internal/view/menu/ListMenuItemView.java
+++ b/core/java/com/android/internal/view/menu/ListMenuItemView.java
@@ -115,7 +115,6 @@
setEnabled(itemData.isEnabled());
setSubMenuArrowVisible(itemData.hasSubMenu());
setContentDescription(itemData.getContentDescription());
- setTooltipText(itemData.getTooltipText());
}
public void setForceShowIcon(boolean forceShow) {
diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java
index 854d013..79b0cd1 100644
--- a/core/java/com/android/internal/widget/FloatingToolbar.java
+++ b/core/java/com/android/internal/widget/FloatingToolbar.java
@@ -54,7 +54,6 @@
import android.view.animation.Interpolator;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
-import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
@@ -278,10 +277,14 @@
private List<Object> getShowingMenuItemsReferences(List<MenuItem> menuItems) {
List<Object> references = new ArrayList<Object>();
for (MenuItem menuItem : menuItems) {
- if (isIconOnlyMenuItem(menuItem)) {
+ if (menuItem.getItemId() != Menu.NONE) {
+ references.add(menuItem.getItemId());
+ } else if (!TextUtils.isEmpty(menuItem.getTitle())) {
+ references.add(menuItem.getTitle());
+ } else if (menuItem.getIcon() != null){
references.add(menuItem.getIcon());
} else {
- references.add(menuItem.getTitle());
+ references.add(menuItem);
}
}
return references;
@@ -364,6 +367,9 @@
}
};
+ private final int mLineHeight;
+ private final int mIconTextSpacing;
+
/**
* @see OverflowPanelViewHelper#preparePopupContent().
*/
@@ -418,6 +424,10 @@
.getDimensionPixelSize(R.dimen.floating_toolbar_horizontal_margin);
mMarginVertical = parent.getResources()
.getDimensionPixelSize(R.dimen.floating_toolbar_vertical_margin);
+ mLineHeight = context.getResources()
+ .getDimensionPixelSize(R.dimen.floating_toolbar_height);
+ mIconTextSpacing = context.getResources()
+ .getDimensionPixelSize(R.dimen.floating_toolbar_menu_button_side_padding);
// Interpolators
mLogAccelerateInterpolator = new LogAccelerateInterpolator();
@@ -607,7 +617,7 @@
mViewPortOnScreen.bottom - contentRectOnScreen.bottom;
final int margin = 2 * mMarginVertical;
- final int toolbarHeightWithVerticalMargin = getLineHeight(mContext) + margin;
+ final int toolbarHeightWithVerticalMargin = mLineHeight + margin;
if (!hasOverflow()) {
if (availableHeightAboveContent >= toolbarHeightWithVerticalMargin) {
@@ -616,7 +626,7 @@
} else if (availableHeightBelowContent >= toolbarHeightWithVerticalMargin) {
// There is enough space at the bottom of the content.
y = contentRectOnScreen.bottom;
- } else if (availableHeightBelowContent >= getLineHeight(mContext)) {
+ } else if (availableHeightBelowContent >= mLineHeight) {
// Just enough space to fit the toolbar with no vertical margins.
y = contentRectOnScreen.bottom - mMarginVertical;
} else {
@@ -993,7 +1003,7 @@
private void updateOverflowHeight(int suggestedHeight) {
if (hasOverflow()) {
final int maxItemSize = (suggestedHeight - mOverflowButtonSize.getHeight()) /
- getLineHeight(mContext);
+ mLineHeight;
final int newHeight = calculateOverflowHeight(maxItemSize);
if (mOverflowPanelSize.getHeight() != newHeight) {
mOverflowPanelSize = new Size(mOverflowPanelSize.getWidth(), newHeight);
@@ -1118,7 +1128,7 @@
boolean isFirstItem = true;
while (!remainingMenuItems.isEmpty()) {
final MenuItem menuItem = remainingMenuItems.peek();
- View menuItemButton = createMenuItemButton(mContext, menuItem);
+ View menuItemButton = createMenuItemButton(mContext, menuItem, mIconTextSpacing);
// Adding additional start padding for the first button to even out button spacing.
if (isFirstItem) {
@@ -1185,6 +1195,8 @@
}
setButtonTagAndClickListener(menuItemButton, menuItem);
+ // Set tooltips for main panel items, but not overflow items (b/35726766).
+ menuItemButton.setTooltipText(menuItem.getTooltipText());
mMainPanel.addView(menuItemButton);
final ViewGroup.LayoutParams params = menuItemButton.getLayoutParams();
params.width = menuItemButtonWidth + extraPadding / 2;
@@ -1296,20 +1308,16 @@
if (actualSize < mOverflowPanel.getCount()) {
// The overflow will require scrolling to get to all the items.
// Extend the height so that part of the hidden items is displayed.
- extension = (int) (getLineHeight(mContext) * 0.5f);
+ extension = (int) (mLineHeight * 0.5f);
}
- return actualSize * getLineHeight(mContext)
+ return actualSize * mLineHeight
+ mOverflowButtonSize.getHeight()
+ extension;
}
private void setButtonTagAndClickListener(View menuItemButton, MenuItem menuItem) {
- View button = menuItemButton;
- if (isIconOnlyMenuItem(menuItem)) {
- button = menuItemButton.findViewById(R.id.floating_toolbar_menu_item_image_button);
- }
- button.setTag(menuItem);
- button.setOnClickListener(mMenuItemButtonOnClickListener);
+ menuItemButton.setTag(menuItem);
+ menuItemButton.setOnClickListener(mMenuItemButtonOnClickListener);
}
/**
@@ -1395,16 +1403,6 @@
final ArrayAdapter adapter =
new ArrayAdapter<MenuItem>(mContext, 0) {
@Override
- public int getViewTypeCount() {
- return mOverflowPanelViewHelper.getViewTypeCount();
- }
-
- @Override
- public int getItemViewType(int position) {
- return mOverflowPanelViewHelper.getItemViewType(getItem(position));
- }
-
- @Override
public View getView(int position, View convertView, ViewGroup parent) {
return mOverflowPanelViewHelper.getView(
getItem(position), mOverflowPanelSize.getWidth(), convertView);
@@ -1496,10 +1494,6 @@
setSize(view, params.width, height);
}
- private static int getLineHeight(Context context) {
- return context.getResources().getDimensionPixelSize(R.dimen.floating_toolbar_height);
- }
-
/**
* A custom ListView for the overflow panel.
*/
@@ -1562,138 +1556,86 @@
*/
private static final class OverflowPanelViewHelper {
- private static final int NUM_OF_VIEW_TYPES = 2;
- private static final int VIEW_TYPE_STRING_TITLE = 0;
- private static final int VIEW_TYPE_ICON_ONLY = 1;
-
- private final TextView mStringTitleViewCalculator;
- private final View mIconOnlyViewCalculator;
+ private final View mCalculator;
+ private final int mIconTextSpacing;
+ private final int mSidePadding;
private final Context mContext;
public OverflowPanelViewHelper(Context context) {
mContext = Preconditions.checkNotNull(context);
- mStringTitleViewCalculator = getStringTitleView(null, 0, null);
- mIconOnlyViewCalculator = getIconOnlyView(null, 0, null);
- }
-
- public int getViewTypeCount() {
- return NUM_OF_VIEW_TYPES;
+ mIconTextSpacing = context.getResources()
+ .getDimensionPixelSize(R.dimen.floating_toolbar_menu_button_side_padding);
+ mSidePadding = context.getResources()
+ .getDimensionPixelSize(R.dimen.floating_toolbar_overflow_side_padding);
+ mCalculator = createMenuButton(null);
}
public View getView(MenuItem menuItem, int minimumWidth, View convertView) {
Preconditions.checkNotNull(menuItem);
- if (getItemViewType(menuItem) == VIEW_TYPE_ICON_ONLY) {
- return getIconOnlyView(menuItem, minimumWidth, convertView);
+ if (convertView != null) {
+ updateMenuItemButton(convertView, menuItem, mIconTextSpacing);
+ } else {
+ convertView = createMenuButton(menuItem);
}
- return getStringTitleView(menuItem, minimumWidth, convertView);
- }
-
- public int getItemViewType(MenuItem menuItem) {
- Preconditions.checkNotNull(menuItem);
- if (isIconOnlyMenuItem(menuItem)) {
- return VIEW_TYPE_ICON_ONLY;
- }
- return VIEW_TYPE_STRING_TITLE;
+ convertView.setMinimumWidth(minimumWidth);
+ return convertView;
}
public int calculateWidth(MenuItem menuItem) {
- final View calculator;
- if (isIconOnlyMenuItem(menuItem)) {
- ((ImageView) mIconOnlyViewCalculator
- .findViewById(R.id.floating_toolbar_menu_item_image_button))
- .setImageDrawable(menuItem.getIcon());
- calculator = mIconOnlyViewCalculator;
- } else {
- mStringTitleViewCalculator.setText(menuItem.getTitle());
- calculator = mStringTitleViewCalculator;
- }
- calculator.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
- return calculator.getMeasuredWidth();
+ updateMenuItemButton(mCalculator, menuItem, mIconTextSpacing);
+ mCalculator.measure(
+ View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
+ return mCalculator.getMeasuredWidth();
}
- private TextView getStringTitleView(
- MenuItem menuItem, int minimumWidth, View convertView) {
- TextView menuButton;
- if (convertView != null) {
- menuButton = (TextView) convertView;
- } else {
- menuButton = (TextView) LayoutInflater.from(mContext)
- .inflate(R.layout.floating_popup_overflow_list_item, null);
- menuButton.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT));
- }
- if (menuItem != null) {
- menuButton.setText(menuItem.getTitle());
- final CharSequence contentDescription = menuItem.getContentDescription();
- if (TextUtils.isEmpty(contentDescription)) {
- menuButton.setContentDescription(menuItem.getTitle());
- } else {
- menuButton.setContentDescription(contentDescription);
- }
- menuButton.setTooltipText(menuItem.getTooltipText());
- menuButton.setMinimumWidth(minimumWidth);
- }
- return menuButton;
- }
-
- private View getIconOnlyView(
- MenuItem menuItem, int minimumWidth, View convertView) {
- View menuButton;
- if (convertView != null) {
- menuButton = convertView;
- } else {
- menuButton = LayoutInflater.from(mContext).inflate(
- R.layout.floating_popup_overflow_image_list_item, null);
- menuButton.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.WRAP_CONTENT,
- ViewGroup.LayoutParams.WRAP_CONTENT));
- }
- if (menuItem != null) {
- ((ImageView) menuButton
- .findViewById(R.id.floating_toolbar_menu_item_image_button))
- .setImageDrawable(menuItem.getIcon());
- menuButton.setMinimumWidth(minimumWidth);
- }
- return menuButton;
+ private View createMenuButton(MenuItem menuItem) {
+ View button = createMenuItemButton(mContext, menuItem, mIconTextSpacing);
+ button.setPadding(mSidePadding, 0, mSidePadding, 0);
+ return button;
}
}
}
/**
- * @return {@code true} if the menu item does not not have a string title but has an icon.
- * {@code false} otherwise.
- */
- private static boolean isIconOnlyMenuItem(MenuItem menuItem) {
- if (TextUtils.isEmpty(menuItem.getTitle()) && menuItem.getIcon() != null) {
- return true;
- }
- return false;
- }
-
- /**
* Creates and returns a menu button for the specified menu item.
*/
- private static View createMenuItemButton(Context context, MenuItem menuItem) {
- final View menuItemButton;
- if (isIconOnlyMenuItem(menuItem)) {
- menuItemButton = LayoutInflater.from(context)
- .inflate(R.layout.floating_popup_menu_image_button, null);
- ((ImageButton) menuItemButton
- .findViewById(R.id.floating_toolbar_menu_item_image_button))
- .setImageDrawable(menuItem.getIcon());
- final CharSequence tooltipText = menuItem.getTooltipText();
- if (TextUtils.isEmpty(tooltipText)) {
- menuItemButton.setTooltipText(menuItem.getTitle());
- } else {
- menuItemButton.setTooltipText(tooltipText);
+ private static View createMenuItemButton(
+ Context context, MenuItem menuItem, int iconTextSpacing) {
+ final View menuItemButton = LayoutInflater.from(context)
+ .inflate(R.layout.floating_popup_menu_button, null);
+ if (menuItem != null) {
+ updateMenuItemButton(menuItemButton, menuItem, iconTextSpacing);
+ }
+ return menuItemButton;
+ }
+
+ /**
+ * Updates the specified menu item button with the specified menu item data.
+ */
+ private static void updateMenuItemButton(
+ View menuItemButton, MenuItem menuItem, int iconTextSpacing) {
+ final TextView buttonText = (TextView) menuItemButton.findViewById(
+ R.id.floating_toolbar_menu_item_text);
+ if (TextUtils.isEmpty(menuItem.getTitle())) {
+ buttonText.setVisibility(View.GONE);
+ } else {
+ buttonText.setVisibility(View.VISIBLE);
+ buttonText.setText(menuItem.getTitle());
+ }
+ final ImageView buttonIcon = (ImageView) menuItemButton
+ .findViewById(R.id.floating_toolbar_menu_item_image);
+ if (menuItem.getIcon() == null) {
+ buttonIcon.setVisibility(View.GONE);
+ if (buttonText != null) {
+ buttonText.setPaddingRelative(0, 0, 0, 0);
}
} else {
- menuItemButton = LayoutInflater.from(context)
- .inflate(R.layout.floating_popup_menu_button, null);
- ((Button) menuItemButton).setText(menuItem.getTitle());
- menuItemButton.setTooltipText(menuItem.getTooltipText());
+ buttonIcon.setVisibility(View.VISIBLE);
+ buttonIcon.setImageDrawable(menuItem.getIcon());
+ if (buttonText != null) {
+ buttonText.setPaddingRelative(iconTextSpacing, 0, 0, 0);
+ }
}
final CharSequence contentDescription = menuItem.getContentDescription();
if (TextUtils.isEmpty(contentDescription)) {
@@ -1701,7 +1643,6 @@
} else {
menuItemButton.setContentDescription(contentDescription);
}
- return menuItemButton;
}
private static ViewGroup createContentContainer(Context context) {
diff --git a/core/java/com/android/internal/widget/ILockSettings.aidl b/core/java/com/android/internal/widget/ILockSettings.aidl
index b380b13..b8c062e 100644
--- a/core/java/com/android/internal/widget/ILockSettings.aidl
+++ b/core/java/com/android/internal/widget/ILockSettings.aidl
@@ -45,4 +45,10 @@
void systemReady();
void userPresent(int userId);
int getStrongAuthForUser(int userId);
+
+ long addEscrowToken(in byte[] token, int userId);
+ boolean removeEscrowToken(long handle, int userId);
+ boolean isEscrowTokenActive(long handle, int userId);
+ boolean setLockCredentialWithToken(String credential, int type, long tokenHandle, in byte[] token, int userId);
+ void unlockUserWithToken(long tokenHandle, in byte[] token, int userId);
}
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index ef6e6c2..0aba9c2 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -147,6 +147,10 @@
public static final String PROFILE_KEY_NAME_ENCRYPT = "profile_key_name_encrypt_";
public static final String PROFILE_KEY_NAME_DECRYPT = "profile_key_name_decrypt_";
+ public static final String SYNTHETIC_PASSWORD_KEY_PREFIX = "synthetic_password_";
+
+ public static final String SYNTHETIC_PASSWORD_HANDLE_KEY = "sp-handle";
+ public static final String SYNTHETIC_PASSWORD_ENABLED_KEY = "enable-sp";
private final Context mContext;
private final ContentResolver mContentResolver;
@@ -769,7 +773,7 @@
getLockSettings().setLockCredential(password, CREDENTIAL_TYPE_PASSWORD, savedPassword,
userHandle);
- addEncryptionPassword(password, computedQuality, userHandle);
+ updateEncryptionPasswordIfNeeded(password, computedQuality, userHandle);
updatePasswordHistory(password, userHandle);
} catch (RemoteException re) {
// Cant do much
@@ -777,7 +781,11 @@
}
}
- private void addEncryptionPassword(String password, int quality, int userHandle) {
+ /**
+ * Update device encryption password if calling user is USER_SYSTEM and device supports
+ * encryption.
+ */
+ private void updateEncryptionPasswordIfNeeded(String password, int quality, int userHandle) {
// Update the device encryption password.
if (userHandle == UserHandle.USER_SYSTEM
&& LockPatternUtils.isDeviceEncryptionEnabled()) {
@@ -1398,6 +1406,104 @@
}
/**
+ * Create an escrow token for the current user, which can later be used to unlock FBE
+ * or change user password.
+ *
+ * After adding, if the user currently has lockscreen password, he will need to perform a
+ * confirm credential operation in order to activate the token for future use. If the user
+ * has no secure lockscreen, then the token is activated immediately.
+ *
+ * @return a unique 64-bit token handle which is needed to refer to this token later.
+ */
+ public long addEscrowToken(byte[] token, int userId) {
+ try {
+ return getLockSettings().addEscrowToken(token, userId);
+ } catch (RemoteException re) {
+ return 0L;
+ }
+ }
+
+ /**
+ * Remove an escrow token.
+ * @return true if the given handle refers to a valid token previously returned from
+ * {@link #addEscrowToken}, whether it's active or not. return false otherwise.
+ */
+ public boolean removeEscrowToken(long handle, int userId) {
+ try {
+ return getLockSettings().removeEscrowToken(handle, userId);
+ } catch (RemoteException re) {
+ return false;
+ }
+ }
+
+ /**
+ * Check if the given escrow token is active or not. Only active token can be used to call
+ * {@link #setLockCredentialWithToken} and {@link #unlockUserWithToken}
+ */
+ public boolean isEscrowTokenActive(long handle, int userId) {
+ try {
+ return getLockSettings().isEscrowTokenActive(handle, userId);
+ } catch (RemoteException re) {
+ return false;
+ }
+ }
+
+ public boolean setLockCredentialWithToken(String credential, int type, long tokenHandle,
+ byte[] token, int userId) {
+ try {
+ if (type != CREDENTIAL_TYPE_NONE) {
+ if (TextUtils.isEmpty(credential) || credential.length() < MIN_LOCK_PASSWORD_SIZE) {
+ throw new IllegalArgumentException("password must not be null and at least "
+ + "of length " + MIN_LOCK_PASSWORD_SIZE);
+ }
+
+ final int computedQuality = PasswordMetrics.computeForPassword(credential).quality;
+ if (!getLockSettings().setLockCredentialWithToken(credential, type, tokenHandle,
+ token, userId)) {
+ return false;
+ }
+ setLong(PASSWORD_TYPE_KEY, Math.max(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC,
+ computedQuality), userId);
+
+ updateEncryptionPasswordIfNeeded(credential, computedQuality, userId);
+ updatePasswordHistory(credential, userId);
+ } else {
+ if (!TextUtils.isEmpty(credential)) {
+ throw new IllegalArgumentException("password must be emtpy for NONE type");
+ }
+ if (!getLockSettings().setLockCredentialWithToken(null, CREDENTIAL_TYPE_NONE,
+ tokenHandle, token, userId)) {
+ return false;
+ }
+ setLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED,
+ userId);
+
+ if (userId == UserHandle.USER_SYSTEM) {
+ // Set the encryption password to default.
+ updateEncryptionPassword(StorageManager.CRYPT_TYPE_DEFAULT, null);
+ setCredentialRequiredToDecrypt(false);
+ }
+ }
+ onAfterChangingPassword(userId);
+ return true;
+ } catch (RemoteException re) {
+ Log.e(TAG, "Unable to save lock password ", re);
+ re.rethrowFromSystemServer();
+ }
+ return false;
+ }
+
+ public void unlockUserWithToken(long tokenHandle, byte[] token, int userId) {
+ try {
+ getLockSettings().unlockUserWithToken(tokenHandle, token, userId);
+ } catch (RemoteException re) {
+ Log.e(TAG, "Unable to unlock user with token", re);
+ re.rethrowFromSystemServer();
+ }
+ }
+
+
+ /**
* Callback to be notified about progress when checking credentials.
*/
public interface CheckCredentialProgressCallback {
@@ -1559,6 +1665,14 @@
break;
}
}
- };
+ }
+ }
+
+ public void enableSyntheticPassword() {
+ setLong(SYNTHETIC_PASSWORD_ENABLED_KEY, 1L, UserHandle.USER_SYSTEM);
+ }
+
+ public boolean isSyntheticPasswordEnabled() {
+ return getLong(SYNTHETIC_PASSWORD_ENABLED_KEY, 0, UserHandle.USER_SYSTEM) != 0;
}
}
diff --git a/core/java/com/android/internal/widget/LockPatternView.java b/core/java/com/android/internal/widget/LockPatternView.java
index 4ba19f4..cc1c65e 100644
--- a/core/java/com/android/internal/widget/LockPatternView.java
+++ b/core/java/com/android/internal/widget/LockPatternView.java
@@ -278,7 +278,8 @@
public LockPatternView(Context context, AttributeSet attrs) {
super(context, attrs);
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LockPatternView);
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LockPatternView,
+ R.attr.lockPatternStyle, R.style.Widget_LockPatternView);
final String aspect = a.getString(R.styleable.LockPatternView_aspect);
@@ -298,12 +299,9 @@
mPathPaint.setAntiAlias(true);
mPathPaint.setDither(true);
- mRegularColor = context.getColor(R.color.lock_pattern_view_regular_color);
- mErrorColor = context.getColor(R.color.lock_pattern_view_error_color);
- mSuccessColor = context.getColor(R.color.lock_pattern_view_success_color);
- mRegularColor = a.getColor(R.styleable.LockPatternView_regularColor, mRegularColor);
- mErrorColor = a.getColor(R.styleable.LockPatternView_errorColor, mErrorColor);
- mSuccessColor = a.getColor(R.styleable.LockPatternView_successColor, mSuccessColor);
+ mRegularColor = a.getColor(R.styleable.LockPatternView_regularColor, 0);
+ mErrorColor = a.getColor(R.styleable.LockPatternView_errorColor, 0);
+ mSuccessColor = a.getColor(R.styleable.LockPatternView_successColor, 0);
int pathColor = a.getColor(R.styleable.LockPatternView_pathColor, mRegularColor);
mPathPaint.setColor(pathColor);
@@ -1489,21 +1487,10 @@
return bounds;
}
- private boolean shouldSpeakPassword() {
- final boolean speakPassword = Settings.Secure.getIntForUser(
- mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 0,
- UserHandle.USER_CURRENT_OR_SELF) != 0;
- final boolean hasHeadphones = mAudioManager != null ?
- (mAudioManager.isWiredHeadsetOn() || mAudioManager.isBluetoothA2dpOn())
- : false;
- return speakPassword || hasHeadphones;
- }
-
private CharSequence getTextForVirtualView(int virtualViewId) {
final Resources res = getResources();
- return shouldSpeakPassword() ? res.getString(
- R.string.lockscreen_access_pattern_cell_added_verbose, virtualViewId)
- : res.getString(R.string.lockscreen_access_pattern_cell_added);
+ return res.getString(R.string.lockscreen_access_pattern_cell_added_verbose,
+ virtualViewId);
}
/**
diff --git a/core/java/com/android/internal/widget/ResolverDrawerLayout.java b/core/java/com/android/internal/widget/ResolverDrawerLayout.java
index e84cc27..e224b17 100644
--- a/core/java/com/android/internal/widget/ResolverDrawerLayout.java
+++ b/core/java/com/android/internal/widget/ResolverDrawerLayout.java
@@ -748,6 +748,10 @@
final int widthSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY);
final int heightSpec = MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.EXACTLY);
final int widthPadding = getPaddingLeft() + getPaddingRight();
+
+ // Currently we allot more height than is really needed so that the entirety of the
+ // sheet may be pulled up.
+ // TODO: Restrict the height here to be the right value.
int heightUsed = getPaddingTop() + getPaddingBottom();
// Measure always-show children first.
@@ -757,7 +761,7 @@
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
if (lp.alwaysShow && child.getVisibility() != GONE) {
measureChildWithMargins(child, widthSpec, widthPadding, heightSpec, heightUsed);
- heightUsed += getHeightUsed(child);
+ heightUsed += child.getMeasuredHeight();
}
}
@@ -769,7 +773,7 @@
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
if (!lp.alwaysShow && child.getVisibility() != GONE) {
measureChildWithMargins(child, widthSpec, widthPadding, heightSpec, heightUsed);
- heightUsed += getHeightUsed(child);
+ heightUsed += child.getMeasuredHeight();
}
}
@@ -785,36 +789,6 @@
setMeasuredDimension(sourceWidth, heightSize);
}
- private int getHeightUsed(View child) {
- // This method exists because we're taking a fast path at measuring ListViews that
- // lets us get away with not doing the more expensive wrap_content measurement which
- // imposes double child view measurement costs. If we're looking at a ListView, we can
- // check against the lowest child view plus padding and margin instead of the actual
- // measured height of the ListView. This lets the ListView hang off the edge when
- // all of the content would fit on-screen.
-
- int heightUsed = child.getMeasuredHeight();
- if (child instanceof AbsListView) {
- final AbsListView lv = (AbsListView) child;
- final int lvPaddingBottom = lv.getPaddingBottom();
-
- int lowest = 0;
- for (int i = 0, N = lv.getChildCount(); i < N; i++) {
- final int bottom = lv.getChildAt(i).getBottom() + lvPaddingBottom;
- if (bottom > lowest) {
- lowest = bottom;
- }
- }
-
- if (lowest < heightUsed) {
- heightUsed = lowest;
- }
- }
-
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
- return lp.topMargin + heightUsed + lp.bottomMargin;
- }
-
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
final int width = getWidth();
diff --git a/core/java/com/android/internal/widget/WatchHeaderListView.java b/core/java/com/android/internal/widget/WatchHeaderListView.java
index 7e91537..0654454 100644
--- a/core/java/com/android/internal/widget/WatchHeaderListView.java
+++ b/core/java/com/android/internal/widget/WatchHeaderListView.java
@@ -91,13 +91,14 @@
}
@Override
- protected View findViewByPredicateTraversal(Predicate<View> predicate, View childToSkip) {
+ protected <T extends View> T findViewByPredicateTraversal(
+ Predicate<View> predicate, View childToSkip) {
View v = super.findViewByPredicateTraversal(predicate, childToSkip);
if (v == null && mTopPanel != null && mTopPanel != childToSkip
&& !mTopPanel.isRootNamespace()) {
- return mTopPanel.findViewByPredicate(predicate);
+ return (T) mTopPanel.findViewByPredicate(predicate);
}
- return v;
+ return (T) v;
}
@Override
diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java
index fcb4c7b..67f9f8f 100644
--- a/core/java/com/android/server/SystemConfig.java
+++ b/core/java/com/android/server/SystemConfig.java
@@ -59,6 +59,7 @@
private static final int ALLOW_LIBS = 0x02;
private static final int ALLOW_PERMISSIONS = 0x04;
private static final int ALLOW_APP_CONFIGS = 0x08;
+ private static final int ALLOW_PRIVAPP_PERMISSIONS = 0x10;
private static final int ALLOW_ALL = ~0;
// Group-ids that are given to all packages as read from etc/permissions/*.xml.
@@ -109,6 +110,10 @@
// background while in data-usage save mode, as read from the configuration files.
final ArraySet<String> mAllowInDataUsageSave = new ArraySet<>();
+ // These are the packages that are white-listed to be able to run background location
+ // without throttling, as read from the configuration files.
+ final ArraySet<String> mAllowUnthrottledLocation = new ArraySet<>();
+
// These are the action strings of broadcasts which are whitelisted to
// be delivered anonymously even to apps which target O+.
final ArraySet<String> mAllowImplicitBroadcasts = new ArraySet<>();
@@ -182,6 +187,10 @@
return mAllowInDataUsageSave;
}
+ public ArraySet<String> getAllowUnthrottledLocation() {
+ return mAllowUnthrottledLocation;
+ }
+
public ArraySet<String> getLinkedApps() {
return mLinkedApps;
}
@@ -217,6 +226,13 @@
// Read configuration from the old permissions dir
readPermissions(Environment.buildPath(
Environment.getRootDirectory(), "etc", "permissions"), ALLOW_ALL);
+ // Allow Vendor to customize system configs around libs, features, permissions and apps
+ int vendorPermissionFlag = ALLOW_LIBS | ALLOW_FEATURES | ALLOW_PERMISSIONS |
+ ALLOW_APP_CONFIGS;
+ readPermissions(Environment.buildPath(
+ Environment.getVendorDirectory(), "etc", "sysconfig"), vendorPermissionFlag);
+ readPermissions(Environment.buildPath(
+ Environment.getVendorDirectory(), "etc", "permissions"), vendorPermissionFlag);
// Allow ODM to customize system configs around libs, features and apps
int odmPermissionFlag = ALLOW_LIBS | ALLOW_FEATURES | ALLOW_APP_CONFIGS;
readPermissions(Environment.buildPath(
@@ -305,6 +321,7 @@
boolean allowFeatures = (permissionFlag & ALLOW_FEATURES) != 0;
boolean allowPermissions = (permissionFlag & ALLOW_PERMISSIONS) != 0;
boolean allowAppConfigs = (permissionFlag & ALLOW_APP_CONFIGS) != 0;
+ boolean allowPrivappPermissions = (permissionFlag & ALLOW_PRIVAPP_PERMISSIONS) != 0;
while (true) {
XmlUtils.nextElement(parser);
if (parser.getEventType() == XmlPullParser.END_DOCUMENT) {
@@ -446,6 +463,17 @@
XmlUtils.skipCurrentTag(parser);
continue;
+ } else if ("allow-unthrottled-location".equals(name) && allowAll) {
+ String pkgname = parser.getAttributeValue(null, "package");
+ if (pkgname == null) {
+ Slog.w(TAG, "<allow-unthrottled-location> without package in "
+ + permFile + " at " + parser.getPositionDescription());
+ } else {
+ mAllowUnthrottledLocation.add(pkgname);
+ }
+ XmlUtils.skipCurrentTag(parser);
+ continue;
+
} else if ("allow-implicit-broadcast".equals(name) && allowAll) {
String action = parser.getAttributeValue(null, "action");
if (action == null) {
@@ -534,7 +562,7 @@
associatedPkgs.add(pkgname);
}
XmlUtils.skipCurrentTag(parser);
- } else if ("privapp-permissions".equals(name) && allowAppConfigs) {
+ } else if ("privapp-permissions".equals(name) && allowPrivappPermissions) {
readPrivAppPermissions(parser);
} else {
XmlUtils.skipCurrentTag(parser);
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index 0c07192..cb60c62 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -220,7 +220,6 @@
external/skia/src/effects \
external/skia/src/image \
external/skia/src/images \
- external/skia/src/utils \
external/sqlite/dist \
external/sqlite/android \
external/tremor/Tremor \
@@ -284,11 +283,16 @@
libhidltransport \
libhwbinder \
libvintf \
+ libnativewindow \
LOCAL_SHARED_LIBRARIES += \
libhwui \
libdl \
+# our headers include libnativewindow's public headers
+LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := \
+ libnativewindow \
+
# we need to access the private Bionic header
# <bionic_tls.h> in com_google_android_gles_jni_GLImpl.cpp
LOCAL_C_INCLUDES += bionic/libc/private
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 2aa16b2..417ef8a0 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -8,7 +8,6 @@
#include "SkBRDAllocator.h"
#include "SkFrontBufferedStream.h"
#include "SkMath.h"
-#include "SkOpts.h"
#include "SkPixelRef.h"
#include "SkStream.h"
#include "SkUtils.h"
@@ -229,45 +228,6 @@
needsFineScale(fullSize.height(), decodedSize.height(), sampleSize);
}
-static inline SkAlphaType computeDecodeAlphaType(SkColorType colorType, SkAlphaType alphaType) {
-#ifndef ANDROID_ENABLE_LINEAR_BLENDING
- // Skia premultiplies linearly. Until the framework enables linear blending,
- // it expects a legacy premultiply.
- if (kPremul_SkAlphaType == alphaType && kRGBA_F16_SkColorType != colorType) {
- return kUnpremul_SkAlphaType;
- }
-#endif
-
- return alphaType;
-}
-
-static inline void premultiplyIfNecessary(SkBitmap* bitmap, SkPMColor* colorPtr, int* colorCount,
- SkAlphaType alphaType, bool requireUnpremultiplied) {
-#ifndef ANDROID_ENABLE_LINEAR_BLENDING
- if (kUnpremul_SkAlphaType != alphaType || requireUnpremultiplied) {
- return;
- }
-
- switch (bitmap->colorType()) {
- case kN32_SkColorType:
- for (int y = 0; y < bitmap->height(); y++) {
- SkOpts::RGBA_to_rgbA(bitmap->getAddr32(0, y), bitmap->getAddr32(0, y),
- bitmap->width());
- }
-
- return;
- case kIndex_8_SkColorType:
- SkOpts::RGBA_to_rgbA(colorPtr, colorPtr, *colorCount);
- return;
- default:
- // kRGBA_F16 will be premultiplied by the codec if necessary.
- // kGray_8 (alias kAlpha_8) and k565 are opaque.
- LOG_ALWAYS_FATAL("Should be unreachable - no need for legacy premultiply.");
- return;
- }
-#endif
-}
-
static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding, jobject options) {
// This function takes ownership of the input stream. Since the SkAndroidCodec
// will take ownership of the stream, we don't necessarily need to take ownership
@@ -450,15 +410,20 @@
}
SkAlphaType alphaType = codec->computeOutputAlphaType(requireUnpremultiplied);
- SkAlphaType decodeAlphaType = computeDecodeAlphaType(decodeColorType, alphaType);
const SkImageInfo decodeInfo = SkImageInfo::Make(size.width(), size.height(),
- decodeColorType, decodeAlphaType, codec->computeOutputColorSpace(decodeColorType));
+ decodeColorType, alphaType, codec->computeOutputColorSpace(decodeColorType));
- // When supported by the colorType, we will decode to sRGB (or linear sRGB). However,
- // we only want to mark the bitmap as sRGB when linear blending is enabled.
- SkImageInfo bitmapInfo = decodeInfo.makeAlphaType(alphaType)
- .makeColorSpace(GraphicsJNI::colorSpaceForType(decodeColorType));
+ // For wide gamut images, we will leave the color space on the SkBitmap. Otherwise,
+ // use the default.
+ SkImageInfo bitmapInfo = decodeInfo;
+ sk_sp<SkColorSpace> srgb =
+ SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
+ SkColorSpace::kSRGB_Gamut,
+ SkColorSpace::kNonLinearBlending_ColorSpaceFlag);
+ if (decodeInfo.colorSpace() == srgb.get()) {
+ bitmapInfo = bitmapInfo.makeColorSpace(GraphicsJNI::colorSpaceForType(decodeColorType));
+ }
if (decodeColorType == kGray_8_SkColorType) {
// The legacy implementation of BitmapFactory used kAlpha8 for
@@ -495,8 +460,6 @@
default:
return nullObjectReturn("codec->getAndroidPixels() failed.");
}
- premultiplyIfNecessary(&decodingBitmap, colorPtr, colorCount, decodeAlphaType,
- requireUnpremultiplied);
jbyteArray ninePatchChunk = NULL;
if (peeker.mPatch != NULL) {
diff --git a/core/jni/android/graphics/FontFamily.cpp b/core/jni/android/graphics/FontFamily.cpp
index 6ec658b..49024b6 100644
--- a/core/jni/android/graphics/FontFamily.cpp
+++ b/core/jni/android/graphics/FontFamily.cpp
@@ -63,37 +63,41 @@
return 0;
}
NativeFamilyBuilder* builder = reinterpret_cast<NativeFamilyBuilder*>(builderPtr);
- minikin::FontFamily* family = new minikin::FontFamily(
- builder->langId, builder->variant, std::move(builder->fonts));
+ FontFamilyWrapper* family = new FontFamilyWrapper(
+ std::make_shared<minikin::FontFamily>(
+ builder->langId, builder->variant, std::move(builder->fonts)));
delete builder;
return reinterpret_cast<jlong>(family);
}
static void FontFamily_abort(jlong builderPtr) {
NativeFamilyBuilder* builder = reinterpret_cast<NativeFamilyBuilder*>(builderPtr);
- minikin::Font::clearElementsWithLock(&builder->fonts);
delete builder;
}
static void FontFamily_unref(jlong familyPtr) {
- minikin::FontFamily* fontFamily = reinterpret_cast<minikin::FontFamily*>(familyPtr);
- fontFamily->Unref();
+ FontFamilyWrapper* family = reinterpret_cast<FontFamilyWrapper*>(familyPtr);
+ delete family;
}
static void addSkTypeface(jlong builderPtr, sk_sp<SkTypeface> face, const void* fontData,
- size_t fontSize, int ttcIndex) {
- minikin::MinikinFont* minikinFont =
- new MinikinFontSkia(std::move(face), fontData, fontSize, ttcIndex);
+ size_t fontSize, int ttcIndex, jint givenWeight, jboolean givenItalic) {
+ std::shared_ptr<minikin::MinikinFont> minikinFont =
+ std::make_shared<MinikinFontSkia>(std::move(face), fontData, fontSize, ttcIndex,
+ std::vector<minikin::FontVariation>());
NativeFamilyBuilder* builder = reinterpret_cast<NativeFamilyBuilder*>(builderPtr);
- int weight;
- bool italic;
- if (!minikin::FontFamily::analyzeStyle(minikinFont, &weight, &italic)) {
- ALOGE("analyzeStyle failed. Using default style");
- weight = 400;
- italic = false;
+ int weight = givenWeight / 100;
+ bool italic = givenItalic;
+ if (weight == 0) {
+ if (!minikin::FontFamily::analyzeStyle(minikinFont, &weight, &italic)) {
+ ALOGE("analyzeStyle failed. Using default style");
+ weight = 4;
+ italic = false;
+ }
}
- builder->fonts.push_back(minikin::Font(minikinFont, minikin::FontStyle(weight / 100, italic)));
- minikinFont->Unref();
+
+ builder->fonts.push_back(minikin::Font(
+ std::move(minikinFont), minikin::FontStyle(weight, italic)));
}
static void release_global_ref(const void* /*data*/, void* context) {
@@ -146,7 +150,7 @@
ALOGE("addFont failed to create font");
return false;
}
- addSkTypeface(builderPtr, std::move(face), fontPtr, (size_t)fontSize, ttcIndex);
+ addSkTypeface(builderPtr, std::move(face), fontPtr, (size_t)fontSize, ttcIndex, 0, false);
return true;
}
@@ -204,12 +208,12 @@
ALOGE("addFont failed to create font, invalid request");
return false;
}
- minikin::MinikinFont* minikinFont =
- new MinikinFontSkia(std::move(face), fontPtr, fontSize, ttcIndex);
+ std::shared_ptr<minikin::MinikinFont> minikinFont =
+ std::make_shared<MinikinFontSkia>(std::move(face), fontPtr, fontSize, ttcIndex,
+ std::vector<minikin::FontVariation>());
NativeFamilyBuilder* builder = reinterpret_cast<NativeFamilyBuilder*>(builderPtr);
- builder->fonts.push_back(minikin::Font(minikinFont,
+ builder->fonts.push_back(minikin::Font(std::move(minikinFont),
minikin::FontStyle(weight / 100, isItalic)));
- minikinFont->Unref();
return true;
}
@@ -218,7 +222,8 @@
}
static jboolean FontFamily_addFontFromAssetManager(JNIEnv* env, jobject, jlong builderPtr,
- jobject jassetMgr, jstring jpath, jint cookie, jboolean isAsset) {
+ jobject jassetMgr, jstring jpath, jint cookie, jboolean isAsset, jint weight,
+ jboolean isItalic) {
NPE_CHECK_RETURN_ZERO(env, jassetMgr);
NPE_CHECK_RETURN_ZERO(env, jpath);
@@ -261,7 +266,7 @@
return false;
}
- addSkTypeface(builderPtr, std::move(face), buf, bufSize, 0 /* ttc index */);
+ addSkTypeface(builderPtr, std::move(face), buf, bufSize, 0 /* ttc index */, weight, isItalic);
return true;
}
@@ -275,7 +280,7 @@
{ "nAddFont", "(JLjava/nio/ByteBuffer;I)Z", (void*)FontFamily_addFont },
{ "nAddFontWeightStyle", "(JLjava/nio/ByteBuffer;ILjava/util/List;IZ)Z",
(void*)FontFamily_addFontWeightStyle },
- { "nAddFontFromAssetManager", "(JLandroid/content/res/AssetManager;Ljava/lang/String;IZ)Z",
+ { "nAddFontFromAssetManager", "(JLandroid/content/res/AssetManager;Ljava/lang/String;IZIZ)Z",
(void*)FontFamily_addFontFromAssetManager },
};
diff --git a/core/jni/android/graphics/FontUtils.h b/core/jni/android/graphics/FontUtils.h
index 8f44b1e..9eaaa49 100644
--- a/core/jni/android/graphics/FontUtils.h
+++ b/core/jni/android/graphics/FontUtils.h
@@ -18,9 +18,19 @@
#define _ANDROID_GRAPHICS_FONT_UTILS_H_
#include <jni.h>
+#include <memory>
+
+namespace minikin {
+class FontFamily;
+} // namespace minikin
namespace android {
+struct FontFamilyWrapper {
+ FontFamilyWrapper(std::shared_ptr<minikin::FontFamily>&& family) : family(family) {}
+ std::shared_ptr<minikin::FontFamily> family;
+};
+
// Utility wrapper for java.util.List
class ListHelper {
public:
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index dfe809d..1846237 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -84,15 +84,15 @@
}
static jlong init(JNIEnv* env, jobject) {
- static_assert(1 << 0 == SkPaint::kAntiAlias_Flag, "paint_flags_mismatch");
- static_assert(1 << 2 == SkPaint::kDither_Flag, "paint_flags_mismatch");
- static_assert(1 << 3 == SkPaint::kUnderlineText_Flag, "paint_flags_mismatch");
- static_assert(1 << 4 == SkPaint::kStrikeThruText_Flag, "paint_flags_mismatch");
- static_assert(1 << 5 == SkPaint::kFakeBoldText_Flag, "paint_flags_mismatch");
- static_assert(1 << 6 == SkPaint::kLinearText_Flag, "paint_flags_mismatch");
- static_assert(1 << 7 == SkPaint::kSubpixelText_Flag, "paint_flags_mismatch");
- static_assert(1 << 8 == SkPaint::kDevKernText_Flag, "paint_flags_mismatch");
- static_assert(1 << 10 == SkPaint::kEmbeddedBitmapText_Flag, "paint_flags_mismatch");
+ static_assert(1 << 0 == SkPaint::kAntiAlias_Flag, "paint_flags_mismatch");
+ static_assert(1 << 2 == SkPaint::kDither_Flag, "paint_flags_mismatch");
+ static_assert(1 << 3 == SkPaint::kUnderlineText_ReserveFlag, "paint_flags_mismatch");
+ static_assert(1 << 4 == SkPaint::kStrikeThruText_ReserveFlag, "paint_flags_mismatch");
+ static_assert(1 << 5 == SkPaint::kFakeBoldText_Flag, "paint_flags_mismatch");
+ static_assert(1 << 6 == SkPaint::kLinearText_Flag, "paint_flags_mismatch");
+ static_assert(1 << 7 == SkPaint::kSubpixelText_Flag, "paint_flags_mismatch");
+ static_assert(1 << 8 == SkPaint::kDevKernText_Flag, "paint_flags_mismatch");
+ static_assert(1 << 10 == SkPaint::kEmbeddedBitmapText_Flag, "paint_flags_mismatch");
Paint* obj = new Paint();
defaultSettingsForAndroid(obj);
@@ -300,8 +300,8 @@
static void getTextPath(JNIEnv* env, Paint* paint, Typeface* typeface, const jchar* text,
jint count, jint bidiFlags, jfloat x, jfloat y, SkPath* path) {
- minikin::Layout layout;
- MinikinUtils::doLayout(&layout, paint, bidiFlags, typeface, text, 0, count, count);
+ minikin::Layout layout = MinikinUtils::doLayout(
+ paint, bidiFlags, typeface, text, 0, count, count);
size_t nGlyphs = layout.nGlyphs();
uint16_t* glyphs = new uint16_t[nGlyphs];
SkPoint* pos = new SkPoint[nGlyphs];
@@ -344,8 +344,8 @@
SkRect r;
SkIRect ir;
- minikin::Layout layout;
- MinikinUtils::doLayout(&layout, &paint, bidiFlags, typeface, text, 0, count, count);
+ minikin::Layout layout = MinikinUtils::doLayout(
+ &paint, bidiFlags, typeface, text, 0, count, count);
minikin::MinikinRect rect;
layout.getBounds(&rect);
r.fLeft = rect.mLeft;
@@ -459,9 +459,8 @@
nChars++;
prevCp = cp;
}
- minikin::Layout layout;
- MinikinUtils::doLayout(&layout, paint, bidiFlags, typeface, str.get(), 0, str.size(),
- str.size());
+ minikin::Layout layout = MinikinUtils::doLayout(
+ paint, bidiFlags, typeface, str.get(), 0, str.size(), str.size());
size_t nGlyphs = countNonSpaceGlyphs(layout);
if (nGlyphs != 1 && nChars > 1) {
// multiple-character input, and was not a ligature
@@ -480,8 +479,8 @@
// since ZZ is reserved for unknown or invalid territory.
// U+1F1FF (REGIONAL INDICATOR SYMBOL LETTER Z) is \uD83C\uDDFF in UTF16.
static const jchar ZZ_FLAG_STR[] = { 0xD83C, 0xDDFF, 0xD83C, 0xDDFF };
- minikin::Layout zzLayout;
- MinikinUtils::doLayout(&zzLayout, paint, bidiFlags, typeface, ZZ_FLAG_STR, 0, 4, 4);
+ minikin::Layout zzLayout = MinikinUtils::doLayout(
+ paint, bidiFlags, typeface, ZZ_FLAG_STR, 0, 4, 4);
if (zzLayout.nGlyphs() != 1 || layoutContainsNotdef(zzLayout)) {
// The font collection doesn't have a glyph for unknown flag. Just return true.
return true;
@@ -692,11 +691,25 @@
}
static void setUnderlineText(jlong paintHandle, jboolean underlineText) {
- reinterpret_cast<Paint*>(paintHandle)->setUnderlineText(underlineText);
+ Paint* paint = reinterpret_cast<Paint*>(paintHandle);
+ uint32_t flags = paint->getFlags();
+ if (underlineText) {
+ flags |= Paint::kUnderlineText_ReserveFlag;
+ } else {
+ flags &= ~Paint::kUnderlineText_ReserveFlag;
+ }
+ paint->setFlags(flags);
}
static void setStrikeThruText(jlong paintHandle, jboolean strikeThruText) {
- reinterpret_cast<Paint*>(paintHandle)->setStrikeThruText(strikeThruText);
+ Paint* paint = reinterpret_cast<Paint*>(paintHandle);
+ uint32_t flags = paint->getFlags();
+ if (strikeThruText) {
+ flags |= Paint::kStrikeThruText_ReserveFlag;
+ } else {
+ flags &= ~Paint::kStrikeThruText_ReserveFlag;
+ }
+ paint->setFlags(flags);
}
static void setFakeBoldText(jlong paintHandle, jboolean fakeBoldText) {
diff --git a/core/jni/android/graphics/SurfaceTexture.cpp b/core/jni/android/graphics/SurfaceTexture.cpp
index dc9b656..2b1da25 100644
--- a/core/jni/android/graphics/SurfaceTexture.cpp
+++ b/core/jni/android/graphics/SurfaceTexture.cpp
@@ -25,6 +25,7 @@
#include <gui/GLConsumer.h>
#include <gui/Surface.h>
+#include <gui/BufferQueue.h>
#include "core_jni_helpers.h"
@@ -33,6 +34,7 @@
#include "jni.h"
#include "JNIHelp.h"
+#include "ScopedLocalRef.h"
// ----------------------------------------------------------------------------
@@ -384,7 +386,6 @@
// ----------------------------------------------------------------------------
static const JNINativeMethod gSurfaceTextureMethods[] = {
- {"nativeClassInit", "()V", (void*)SurfaceTexture_classInit },
{"nativeInit", "(ZIZLjava/lang/ref/WeakReference;)V", (void*)SurfaceTexture_init },
{"nativeFinalize", "()V", (void*)SurfaceTexture_finalize },
{"nativeSetDefaultBufferSize", "(II)V", (void*)SurfaceTexture_setDefaultBufferSize },
@@ -400,6 +401,10 @@
int register_android_graphics_SurfaceTexture(JNIEnv* env)
{
+ // Cache some fields.
+ ScopedLocalRef<jclass> klass(env, FindClassOrDie(env, kSurfaceTextureClassPathName));
+ SurfaceTexture_classInit(env, klass.get());
+
return RegisterMethodsOrDie(env, kSurfaceTextureClassPathName, gSurfaceTextureMethods,
NELEM(gSurfaceTextureMethods));
}
diff --git a/core/jni/android/graphics/Typeface.cpp b/core/jni/android/graphics/Typeface.cpp
index 0a0fce3e..0cdc74f 100644
--- a/core/jni/android/graphics/Typeface.cpp
+++ b/core/jni/android/graphics/Typeface.cpp
@@ -67,9 +67,7 @@
static void Typeface_unref(JNIEnv* env, jobject obj, jlong faceHandle) {
Typeface* face = reinterpret_cast<Typeface*>(faceHandle);
- if (face != NULL) {
- face->unref();
- }
+ delete face;
}
static jint Typeface_getStyle(JNIEnv* env, jobject obj, jlong faceHandle) {
@@ -79,12 +77,13 @@
static jlong Typeface_createFromArray(JNIEnv *env, jobject, jlongArray familyArray) {
ScopedLongArrayRO families(env, familyArray);
- std::vector<minikin::FontFamily*> familyVec;
+ std::vector<std::shared_ptr<minikin::FontFamily>> familyVec;
+ familyVec.reserve(families.size());
for (size_t i = 0; i < families.size(); i++) {
- minikin::FontFamily* family = reinterpret_cast<minikin::FontFamily*>(families[i]);
- familyVec.push_back(family);
+ FontFamilyWrapper* family = reinterpret_cast<FontFamilyWrapper*>(families[i]);
+ familyVec.emplace_back(family->family);
}
- return reinterpret_cast<jlong>(Typeface::createFromFamilies(familyVec));
+ return reinterpret_cast<jlong>(Typeface::createFromFamilies(std::move(familyVec)));
}
static void Typeface_setDefault(JNIEnv *env, jobject, jlong faceHandle) {
diff --git a/core/jni/android_hardware_HardwareBuffer.cpp b/core/jni/android_hardware_HardwareBuffer.cpp
index 6cf5ccf..b91bd5c 100644
--- a/core/jni/android_hardware_HardwareBuffer.cpp
+++ b/core/jni/android_hardware_HardwareBuffer.cpp
@@ -26,15 +26,17 @@
#include <android_runtime/android_hardware_HardwareBuffer.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/Log.h>
+#include <private/android/AHardwareBufferHelpers.h>
#include <binder/Parcel.h>
+
+#include <ui/GraphicBuffer.h>
#include <gui/IGraphicBufferAlloc.h>
#include <gui/ISurfaceComposer.h>
-#include <hardware/gralloc1.h>
-#include <ui/GraphicBuffer.h>
-
#include <private/gui/ComposerService.h>
+#include <hardware/gralloc1.h>
+
#include "core_jni_helpers.h"
using namespace android;
@@ -44,7 +46,7 @@
// ----------------------------------------------------------------------------
// Debug
-static const bool kDebugGraphicBuffer = false;
+static constexpr bool kDebugGraphicBuffer = false;
// ----------------------------------------------------------------------------
// Types
@@ -64,15 +66,6 @@
sp<GraphicBuffer> buffer;
};
-
-// ----------------------------------------------------------------------------
-// Helper functions
-// ----------------------------------------------------------------------------
-
-static inline bool containsBits(uint64_t mask, uint64_t bitsToCheck) {
- return (mask & bitsToCheck) == bitsToCheck;
-}
-
// ----------------------------------------------------------------------------
// HardwareBuffer lifecycle
// ----------------------------------------------------------------------------
@@ -99,8 +92,8 @@
}
uint64_t producerUsage = 0;
uint64_t consumerUsage = 0;
- android_hardware_HardwareBuffer_convertToGrallocUsageBits(usage, 0, &producerUsage,
- &consumerUsage);
+ android_hardware_HardwareBuffer_convertToGrallocUsageBits(&producerUsage, &consumerUsage, usage,
+ 0);
status_t error;
sp<GraphicBuffer> buffer(alloc->createGraphicBuffer(width, height, pixelFormat,
layers, producerUsage, consumerUsage,
@@ -121,8 +114,7 @@
delete wrapper;
}
-static jlong android_hardware_HardwareBuffer_getNativeFinalizer(JNIEnv* env,
- jobject clazz) {
+static jlong android_hardware_HardwareBuffer_getNativeFinalizer(JNIEnv* env, jobject clazz) {
return static_cast<jlong>(reinterpret_cast<uintptr_t>(&destroyWrapper));
}
@@ -163,8 +155,11 @@
static jlong android_hardware_HardwareBuffer_getUsage(JNIEnv* env,
jobject clazz, jlong nativeObject) {
GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject);
- return android_hardware_HardwareBuffer_convertFromGrallocUsageBits(
+ uint64_t usage0 = 0;
+ uint64_t usage1 = 0;
+ android_hardware_HardwareBuffer_convertFromGrallocUsageBits(&usage0, &usage1,
buffer->getUsage(), buffer->getUsage());
+ return usage0;
}
// ----------------------------------------------------------------------------
@@ -203,7 +198,8 @@
if (env->IsInstanceOf(hardwareBufferObj, gHardwareBufferClassInfo.clazz)) {
GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(
env->GetLongField(hardwareBufferObj, gHardwareBufferClassInfo.mNativeObject));
- return reinterpret_cast<AHardwareBuffer*>(buffer);
+ return AHardwareBuffer_from_GraphicBuffer(buffer);
+
} else {
return nullptr;
}
@@ -211,7 +207,7 @@
jobject android_hardware_HardwareBuffer_createFromAHardwareBuffer(
JNIEnv* env, AHardwareBuffer* hardwareBuffer) {
- GraphicBuffer* buffer = reinterpret_cast<GraphicBuffer*>(hardwareBuffer);
+ GraphicBuffer* buffer = AHardwareBuffer_to_GraphicBuffer(hardwareBuffer);
GraphicBufferWrapper* wrapper = new GraphicBufferWrapper(buffer);
jobject hardwareBufferObj = env->NewObject(gHardwareBufferClassInfo.clazz,
gHardwareBufferClassInfo.ctor, reinterpret_cast<jlong>(wrapper));
@@ -228,99 +224,21 @@
}
uint32_t android_hardware_HardwareBuffer_convertFromPixelFormat(uint32_t format) {
- switch (format) {
- case HAL_PIXEL_FORMAT_RGBA_8888:
- return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
- case HAL_PIXEL_FORMAT_RGBX_8888:
- return AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM;
- case HAL_PIXEL_FORMAT_RGB_565:
- return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM;
- case HAL_PIXEL_FORMAT_RGB_888:
- return AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM;
- case HAL_PIXEL_FORMAT_RGBA_FP16:
- return AHARDWAREBUFFER_FORMAT_R16G16B16A16_SFLOAT;
- case HAL_PIXEL_FORMAT_BLOB:
- return AHARDWAREBUFFER_FORMAT_BLOB;
- default:
- ALOGE("Unknown pixel format %u", format);
- return 0;
- }
+ return AHardwareBuffer_convertFromPixelFormat(format);
}
uint32_t android_hardware_HardwareBuffer_convertToPixelFormat(uint32_t format) {
- switch (format) {
- case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
- return HAL_PIXEL_FORMAT_RGBA_8888;
- case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM:
- return HAL_PIXEL_FORMAT_RGBX_8888;
- case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
- return HAL_PIXEL_FORMAT_RGB_565;
- case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
- return HAL_PIXEL_FORMAT_RGB_888;
- case AHARDWAREBUFFER_FORMAT_R16G16B16A16_SFLOAT:
- return HAL_PIXEL_FORMAT_RGBA_FP16;
- case AHARDWAREBUFFER_FORMAT_BLOB:
- return HAL_PIXEL_FORMAT_BLOB;
- default:
- ALOGE("Unknown AHardwareBuffer format %u", format);
- return 0;
- }
+ return AHardwareBuffer_convertToPixelFormat(format);
}
-void android_hardware_HardwareBuffer_convertToGrallocUsageBits(uint64_t usage0,
- uint64_t usage1, uint64_t* outProducerUsage,
- uint64_t* outConsumerUsage) {
- *outProducerUsage = 0;
- *outConsumerUsage = 0;
- if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_CPU_READ))
- *outConsumerUsage |= GRALLOC1_CONSUMER_USAGE_CPU_READ;
- if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_CPU_READ_OFTEN))
- *outConsumerUsage |= GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN;
- if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_CPU_WRITE))
- *outProducerUsage |= GRALLOC1_PRODUCER_USAGE_CPU_WRITE;
- if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_CPU_WRITE_OFTEN))
- *outProducerUsage |= GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN;
- if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_GPU_SAMPLED_IMAGE))
- *outConsumerUsage |= GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE;
- if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_GPU_COLOR_OUTPUT))
- *outProducerUsage |= GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET;
- // Not sure what this should be.
- //if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_GPU_CUBEMAP)) bits |= 0;
- if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_GPU_DATA_BUFFER))
- *outConsumerUsage |= GRALLOC1_CONSUMER_USAGE_GPU_DATA_BUFFER;
- if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_VIDEO_ENCODE))
- *outConsumerUsage |= GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER;
- if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_PROTECTED_CONTENT))
- *outProducerUsage |= GRALLOC1_PRODUCER_USAGE_PROTECTED;
- if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_SENSOR_DIRECT_DATA))
- *outProducerUsage |= GRALLOC1_PRODUCER_USAGE_SENSOR_DIRECT_DATA;
+void android_hardware_HardwareBuffer_convertToGrallocUsageBits(uint64_t* outProducerUsage,
+ uint64_t* outConsumerUsage, uint64_t usage0, uint64_t usage1) {
+ AHardwareBuffer_convertToGrallocUsageBits(outProducerUsage, outConsumerUsage, usage0, usage1);
}
-uint64_t android_hardware_HardwareBuffer_convertFromGrallocUsageBits(
- uint64_t producerUsage, uint64_t consumerUsage) {
- uint64_t bits = 0;
- if (containsBits(consumerUsage, GRALLOC1_CONSUMER_USAGE_CPU_READ))
- bits |= AHARDWAREBUFFER_USAGE0_CPU_READ;
- if (containsBits(consumerUsage, GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN))
- bits |= AHARDWAREBUFFER_USAGE0_CPU_READ_OFTEN;
- if (containsBits(producerUsage, GRALLOC1_PRODUCER_USAGE_CPU_WRITE))
- bits |= AHARDWAREBUFFER_USAGE0_CPU_WRITE;
- if (containsBits(producerUsage, GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN))
- bits |= AHARDWAREBUFFER_USAGE0_CPU_WRITE_OFTEN;
- if (containsBits(consumerUsage, GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE))
- bits |= AHARDWAREBUFFER_USAGE0_GPU_SAMPLED_IMAGE;
- if (containsBits(producerUsage, GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET))
- bits |= AHARDWAREBUFFER_USAGE0_GPU_COLOR_OUTPUT;
- if (containsBits(consumerUsage, GRALLOC1_CONSUMER_USAGE_GPU_DATA_BUFFER))
- bits |= AHARDWAREBUFFER_USAGE0_GPU_DATA_BUFFER;
- if (containsBits(consumerUsage, GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER))
- bits |= AHARDWAREBUFFER_USAGE0_VIDEO_ENCODE;
- if (containsBits(producerUsage, GRALLOC1_PRODUCER_USAGE_PROTECTED))
- bits |= AHARDWAREBUFFER_USAGE0_PROTECTED_CONTENT;
- if (containsBits(producerUsage, GRALLOC1_PRODUCER_USAGE_SENSOR_DIRECT_DATA))
- bits |= AHARDWAREBUFFER_USAGE0_SENSOR_DIRECT_DATA;
-
- return bits;
+void android_hardware_HardwareBuffer_convertFromGrallocUsageBits(uint64_t* outUsage0,
+ uint64_t* outUsage1, uint64_t producerUsage, uint64_t consumerUsage) {
+ AHardwareBuffer_convertFromGrallocUsageBits(outUsage0, outUsage1, producerUsage, consumerUsage);
}
} // namespace android
@@ -332,19 +250,21 @@
const char* const kClassPathName = "android/hardware/HardwareBuffer";
static const JNINativeMethod gMethods[] = {
- { "nCreateHardwareBuffer", "(IIIIJ)J", (void*) android_hardware_HardwareBuffer_create },
- { "nGetNativeFinalizer", "()J", (void*) android_hardware_HardwareBuffer_getNativeFinalizer },
+ { "nCreateHardwareBuffer", "(IIIIJ)J",
+ (void*) android_hardware_HardwareBuffer_create },
+ { "nGetNativeFinalizer", "()J",
+ (void*) android_hardware_HardwareBuffer_getNativeFinalizer },
{ "nWriteHardwareBufferToParcel", "(JLandroid/os/Parcel;)V",
(void*) android_hardware_HardwareBuffer_write },
{ "nReadHardwareBufferFromParcel", "(Landroid/os/Parcel;)J",
(void*) android_hardware_HardwareBuffer_read },
// --------------- @FastNative ----------------------
- { "nGetWidth", "(J)I", (void*) android_hardware_HardwareBuffer_getWidth },
- { "nGetHeight", "(J)I", (void*) android_hardware_HardwareBuffer_getHeight },
- { "nGetFormat", "(J)I", (void*) android_hardware_HardwareBuffer_getFormat },
- { "nGetLayers", "(J)I", (void*) android_hardware_HardwareBuffer_getLayers },
- { "nGetUsage", "(J)J", (void*) android_hardware_HardwareBuffer_getUsage },
+ { "nGetWidth", "(J)I", (void*) android_hardware_HardwareBuffer_getWidth },
+ { "nGetHeight", "(J)I", (void*) android_hardware_HardwareBuffer_getHeight },
+ { "nGetFormat", "(J)I", (void*) android_hardware_HardwareBuffer_getFormat },
+ { "nGetLayers", "(J)I", (void*) android_hardware_HardwareBuffer_getLayers },
+ { "nGetUsage", "(J)J", (void*) android_hardware_HardwareBuffer_getUsage },
};
int register_android_hardware_HardwareBuffer(JNIEnv* env) {
diff --git a/core/jni/android_hardware_camera2_CameraMetadata.cpp b/core/jni/android_hardware_camera2_CameraMetadata.cpp
index 518f99e..78a5735 100644
--- a/core/jni/android_hardware_camera2_CameraMetadata.cpp
+++ b/core/jni/android_hardware_camera2_CameraMetadata.cpp
@@ -161,7 +161,6 @@
extern "C" {
-static void CameraMetadata_classInit(JNIEnv *env, jobject thiz);
static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass keyType);
static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyName);
static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jobject thiz, jint tag);
@@ -529,9 +528,6 @@
static const JNINativeMethod gCameraMetadataMethods[] = {
// static methods
- { "nativeClassInit",
- "()V",
- (void *)CameraMetadata_classInit },
{ "nativeGetAllVendorKeys",
"(Ljava/lang/Class;)Ljava/util/ArrayList;",
(void *)CameraMetadata_getAllVendorKeys},
@@ -581,35 +577,6 @@
(void *)CameraMetadata_writeToParcel },
};
-struct field {
- const char *class_name;
- const char *field_name;
- const char *field_type;
- jfieldID *jfield;
-};
-
-static int find_fields(JNIEnv *env, field *fields, int count)
-{
- for (int i = 0; i < count; i++) {
- field *f = &fields[i];
- jclass clazz = env->FindClass(f->class_name);
- if (clazz == NULL) {
- ALOGE("Can't find %s", f->class_name);
- return -1;
- }
-
- jfieldID field = env->GetFieldID(clazz, f->field_name, f->field_type);
- if (field == NULL) {
- ALOGE("Can't find %s.%s", f->class_name, f->field_name);
- return -1;
- }
-
- *(f->jfield) = field;
- }
-
- return 0;
-}
-
// Get all the required offsets in java class and register native functions
int register_android_hardware_camera2_CameraMetadata(JNIEnv *env)
{
@@ -651,6 +618,9 @@
gMetadataOffsets.mArrayListAdd = GetMethodIDOrDie(env, gMetadataOffsets.mArrayList,
"add", "(Ljava/lang/Object;)Z");
+ jclass cameraMetadataClazz = FindClassOrDie(env, CAMERA_METADATA_CLASS_NAME);
+ fields.metadata_ptr = GetFieldIDOrDie(env, cameraMetadataClazz, "mMetadataPtr", "J");
+
// Register native functions
return RegisterMethodsOrDie(env,
CAMERA_METADATA_CLASS_NAME,
@@ -660,22 +630,6 @@
extern "C" {
-static void CameraMetadata_classInit(JNIEnv *env, jobject thiz) {
- // XX: Why do this separately instead of doing it in the register function?
- ALOGV("%s", __FUNCTION__);
-
- field fields_to_find[] = {
- { CAMERA_METADATA_CLASS_NAME, "mMetadataPtr", "J", &fields.metadata_ptr },
- };
-
- // Do this here instead of in register_native_methods,
- // since otherwise it will fail to find the fields.
- if (find_fields(env, fields_to_find, NELEM(fields_to_find)) < 0)
- return;
-
- env->FindClass(CAMERA_METADATA_CLASS_NAME);
-}
-
static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass keyType) {
// Get all vendor tags
diff --git a/core/jni/android_opengl_GLES10.cpp b/core/jni/android_opengl_GLES10.cpp
index 64c9fe8..5bcb800 100644
--- a/core/jni/android_opengl_GLES10.cpp
+++ b/core/jni/android_opengl_GLES10.cpp
@@ -272,6 +272,19 @@
*/
static int getNeededCount(GLint pname) {
int needed = 1;
+#ifdef GL_ES_VERSION_3_0
+ // GLES 3.x pnames
+ switch (pname) {
+ case GL_MAX_VIEWPORT_DIMS:
+ needed = 2;
+ break;
+
+ case GL_PROGRAM_BINARY_FORMATS:
+ glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &needed);
+ break;
+ }
+#endif
+
#ifdef GL_ES_VERSION_2_0
// GLES 2.x pnames
switch (pname) {
diff --git a/core/jni/android_opengl_GLES10Ext.cpp b/core/jni/android_opengl_GLES10Ext.cpp
index 533bda4..38f7ba6 100644
--- a/core/jni/android_opengl_GLES10Ext.cpp
+++ b/core/jni/android_opengl_GLES10Ext.cpp
@@ -272,6 +272,19 @@
*/
static int getNeededCount(GLint pname) {
int needed = 1;
+#ifdef GL_ES_VERSION_3_0
+ // GLES 3.x pnames
+ switch (pname) {
+ case GL_MAX_VIEWPORT_DIMS:
+ needed = 2;
+ break;
+
+ case GL_PROGRAM_BINARY_FORMATS:
+ glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &needed);
+ break;
+ }
+#endif
+
#ifdef GL_ES_VERSION_2_0
// GLES 2.x pnames
switch (pname) {
diff --git a/core/jni/android_opengl_GLES11.cpp b/core/jni/android_opengl_GLES11.cpp
index 923f7a8..014672d 100644
--- a/core/jni/android_opengl_GLES11.cpp
+++ b/core/jni/android_opengl_GLES11.cpp
@@ -272,6 +272,19 @@
*/
static int getNeededCount(GLint pname) {
int needed = 1;
+#ifdef GL_ES_VERSION_3_0
+ // GLES 3.x pnames
+ switch (pname) {
+ case GL_MAX_VIEWPORT_DIMS:
+ needed = 2;
+ break;
+
+ case GL_PROGRAM_BINARY_FORMATS:
+ glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &needed);
+ break;
+ }
+#endif
+
#ifdef GL_ES_VERSION_2_0
// GLES 2.x pnames
switch (pname) {
diff --git a/core/jni/android_opengl_GLES11Ext.cpp b/core/jni/android_opengl_GLES11Ext.cpp
index f7498d5..b4a1ab6 100644
--- a/core/jni/android_opengl_GLES11Ext.cpp
+++ b/core/jni/android_opengl_GLES11Ext.cpp
@@ -272,6 +272,19 @@
*/
static int getNeededCount(GLint pname) {
int needed = 1;
+#ifdef GL_ES_VERSION_3_0
+ // GLES 3.x pnames
+ switch (pname) {
+ case GL_MAX_VIEWPORT_DIMS:
+ needed = 2;
+ break;
+
+ case GL_PROGRAM_BINARY_FORMATS:
+ glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &needed);
+ break;
+ }
+#endif
+
#ifdef GL_ES_VERSION_2_0
// GLES 2.x pnames
switch (pname) {
diff --git a/core/jni/android_opengl_GLES20.cpp b/core/jni/android_opengl_GLES20.cpp
index 791233b..c1ffa81 100644
--- a/core/jni/android_opengl_GLES20.cpp
+++ b/core/jni/android_opengl_GLES20.cpp
@@ -272,6 +272,19 @@
*/
static int getNeededCount(GLint pname) {
int needed = 1;
+#ifdef GL_ES_VERSION_3_0
+ // GLES 3.x pnames
+ switch (pname) {
+ case GL_MAX_VIEWPORT_DIMS:
+ needed = 2;
+ break;
+
+ case GL_PROGRAM_BINARY_FORMATS:
+ glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &needed);
+ break;
+ }
+#endif
+
#ifdef GL_ES_VERSION_2_0
// GLES 2.x pnames
switch (pname) {
diff --git a/core/jni/android_opengl_GLES30.cpp b/core/jni/android_opengl_GLES30.cpp
index 736fd99..1d12b0a 100644
--- a/core/jni/android_opengl_GLES30.cpp
+++ b/core/jni/android_opengl_GLES30.cpp
@@ -272,6 +272,19 @@
*/
static int getNeededCount(GLint pname) {
int needed = 1;
+#ifdef GL_ES_VERSION_3_0
+ // GLES 3.x pnames
+ switch (pname) {
+ case GL_MAX_VIEWPORT_DIMS:
+ needed = 2;
+ break;
+
+ case GL_PROGRAM_BINARY_FORMATS:
+ glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &needed);
+ break;
+ }
+#endif
+
#ifdef GL_ES_VERSION_2_0
// GLES 2.x pnames
switch (pname) {
diff --git a/core/jni/android_opengl_GLES31.cpp b/core/jni/android_opengl_GLES31.cpp
index 0e596dc..e0750e4 100644
--- a/core/jni/android_opengl_GLES31.cpp
+++ b/core/jni/android_opengl_GLES31.cpp
@@ -270,6 +270,19 @@
*/
static int getNeededCount(GLint pname) {
int needed = 1;
+#ifdef GL_ES_VERSION_3_0
+ // GLES 3.x pnames
+ switch (pname) {
+ case GL_MAX_VIEWPORT_DIMS:
+ needed = 2;
+ break;
+
+ case GL_PROGRAM_BINARY_FORMATS:
+ glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &needed);
+ break;
+ }
+#endif
+
#ifdef GL_ES_VERSION_2_0
// GLES 2.x pnames
switch (pname) {
diff --git a/core/jni/android_opengl_GLES31Ext.cpp b/core/jni/android_opengl_GLES31Ext.cpp
index 9f2b0c5..8212eb1 100644
--- a/core/jni/android_opengl_GLES31Ext.cpp
+++ b/core/jni/android_opengl_GLES31Ext.cpp
@@ -271,6 +271,19 @@
*/
static int getNeededCount(GLint pname) {
int needed = 1;
+#ifdef GL_ES_VERSION_3_0
+ // GLES 3.x pnames
+ switch (pname) {
+ case GL_MAX_VIEWPORT_DIMS:
+ needed = 2;
+ break;
+
+ case GL_PROGRAM_BINARY_FORMATS:
+ glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &needed);
+ break;
+ }
+#endif
+
#ifdef GL_ES_VERSION_2_0
// GLES 2.x pnames
switch (pname) {
diff --git a/core/jni/android_opengl_GLES32.cpp b/core/jni/android_opengl_GLES32.cpp
index aa917a0..91b573b 100644
--- a/core/jni/android_opengl_GLES32.cpp
+++ b/core/jni/android_opengl_GLES32.cpp
@@ -270,6 +270,19 @@
*/
static int getNeededCount(GLint pname) {
int needed = 1;
+#ifdef GL_ES_VERSION_3_0
+ // GLES 3.x pnames
+ switch (pname) {
+ case GL_MAX_VIEWPORT_DIMS:
+ needed = 2;
+ break;
+
+ case GL_PROGRAM_BINARY_FORMATS:
+ glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &needed);
+ break;
+ }
+#endif
+
#ifdef GL_ES_VERSION_2_0
// GLES 2.x pnames
switch (pname) {
diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp
index eaf9e91..4322105 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -1021,17 +1021,13 @@
env->ReleaseStringCritical(fileName, str);
}
- int fd = open(fileName8.string(), O_CREAT | O_WRONLY | O_NOFOLLOW, 0666); /* -rw-rw-rw- */
+ int fd = open(fileName8.string(), O_CREAT | O_WRONLY | O_NOFOLLOW | O_CLOEXEC | O_APPEND, 0666);
if (fd < 0) {
fprintf(stderr, "Can't open %s: %s\n", fileName8.string(), strerror(errno));
return;
}
- if (lseek(fd, 0, SEEK_END) < 0) {
- fprintf(stderr, "lseek: %s\n", strerror(errno));
- } else {
- dump_backtrace_to_file_timeout(pid, fd, timeoutSecs);
- }
+ dump_backtrace_to_file_timeout(pid, fd, timeoutSecs);
close(fd);
}
diff --git a/core/jni/android_os_seccomp.cpp b/core/jni/android_os_seccomp.cpp
index 45d5061..dd5622d 100644
--- a/core/jni/android_os_seccomp.cpp
+++ b/core/jni/android_os_seccomp.cpp
@@ -14,219 +14,11 @@
* limitations under the License.
*/
-#include "JNIHelp.h"
#include "core_jni_helpers.h"
#include "JniConstants.h"
#include "utils/Log.h"
-#include "utils/misc.h"
-
-#if defined __arm__ || defined __aarch64__
-
-#include <vector>
-
-#include <sys/prctl.h>
-
-#include <linux/unistd.h>
-#include <linux/audit.h>
-#include <linux/filter.h>
-#include <linux/seccomp.h>
-
#include "seccomp_policy.h"
-#define syscall_nr (offsetof(struct seccomp_data, nr))
-#define arch_nr (offsetof(struct seccomp_data, arch))
-
-typedef std::vector<sock_filter> filter;
-
-// We want to keep the below inline functions for debugging and future
-// development even though they are not all sed currently.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunused-function"
-
-static inline void Kill(filter& f) {
- f.push_back(BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL));
-}
-
-static inline void Trap(filter& f) {
- f.push_back(BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRAP));
-}
-
-static inline void Error(filter& f, __u16 retcode) {
- f.push_back(BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO + retcode));
-}
-
-inline static void Trace(filter& f) {
- f.push_back(BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE));
-}
-
-inline static void Allow(filter& f) {
- f.push_back(BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW));
-}
-
-#pragma clang diagnostic pop
-
-inline static void AllowSyscall(filter& f, __u32 num) {
- f.push_back(BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, num, 0, 1));
- Allow(f);
-}
-
-inline static void ExamineSyscall(filter& f) {
- f.push_back(BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_nr));
-}
-
-inline static int SetValidateArchitectureJumpTarget(size_t offset, filter& f) {
- size_t jump_length = f.size() - offset - 1;
- auto u8_jump_length = (__u8) jump_length;
- if (u8_jump_length != jump_length) {
- ALOGE("Can't set jump greater than 255 - actual jump is %zu",
- jump_length);
- return -1;
- }
- f[offset] = BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, AUDIT_ARCH_ARM, u8_jump_length, 0);
- return 0;
-}
-
-inline static size_t ValidateArchitectureAndJumpIfNeeded(filter& f) {
- f.push_back(BPF_STMT(BPF_LD|BPF_W|BPF_ABS, arch_nr));
-
- f.push_back(BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, AUDIT_ARCH_AARCH64, 2, 0));
- f.push_back(BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, AUDIT_ARCH_ARM, 1, 0));
- Trap(f);
- return f.size() - 2;
-}
-
-static bool install_filter(filter const& f) {
- struct sock_fprog prog = {
- (unsigned short) f.size(),
- (struct sock_filter*) &f[0],
- };
-
- if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog) < 0) {
- ALOGE("SECCOMP: Could not set seccomp filter of size %zu: %s", f.size(), strerror(errno));
- return false;
- }
-
- ALOGI("SECCOMP: Global filter of size %zu installed", f.size());
- return true;
-}
-
-bool set_seccomp_filter() {
- filter f;
-
- // Note that for mixed 64/32 bit architectures, ValidateArchitecture inserts a
- // jump that must be changed to point to the start of the 32-bit policy
- // 32 bit syscalls will not hit the policy between here and the call to SetJump
- auto offset_to_32bit_filter =
- ValidateArchitectureAndJumpIfNeeded(f);
-
- // 64-bit filter
- ExamineSyscall(f);
-
- // arm64-only filter - autogenerated from bionic syscall usage
- for (size_t i = 0; i < arm64_filter_size; ++i)
- f.push_back(arm64_filter[i]);
-
- // Syscalls needed to boot Android
- AllowSyscall(f, 41); // __NR_pivot_root
- AllowSyscall(f, 31); // __NR_ioprio_get
- AllowSyscall(f, 30); // __NR_ioprio_set
- AllowSyscall(f, 178); // __NR_gettid
- AllowSyscall(f, 98); // __NR_futex
- AllowSyscall(f, 220); // __NR_clone
- AllowSyscall(f, 139); // __NR_rt_sigreturn
- AllowSyscall(f, 240); // __NR_rt_tgsigqueueinfo
- AllowSyscall(f, 128); // __NR_restart_syscall
- AllowSyscall(f, 278); // __NR_getrandom
-
- // Needed for performance tools
- AllowSyscall(f, 241); // __NR_perf_event_open
-
- // Needed for strace
- AllowSyscall(f, 130); // __NR_tkill
-
- // Needed for kernel to restart syscalls
- AllowSyscall(f, 128); // __NR_restart_syscall
-
- // b/35034743
- AllowSyscall(f, 267); // __NR_syncfs
-
- // b/34763393
- AllowSyscall(f, 277); // __NR_seccomp
-
- Trap(f);
-
- if (SetValidateArchitectureJumpTarget(offset_to_32bit_filter, f) != 0)
- return -1;
-
- // 32-bit filter
- ExamineSyscall(f);
-
- // arm32 filter - autogenerated from bionic syscall usage
- for (size_t i = 0; i < arm_filter_size; ++i)
- f.push_back(arm_filter[i]);
-
- // Syscalls needed to boot android
- AllowSyscall(f, 120); // __NR_clone
- AllowSyscall(f, 240); // __NR_futex
- AllowSyscall(f, 119); // __NR_sigreturn
- AllowSyscall(f, 173); // __NR_rt_sigreturn
- AllowSyscall(f, 363); // __NR_rt_tgsigqueueinfo
- AllowSyscall(f, 224); // __NR_gettid
-
- // Syscalls needed to run Chrome
- AllowSyscall(f, 383); // __NR_seccomp - needed to start Chrome
- AllowSyscall(f, 384); // __NR_getrandom - needed to start Chrome
-
- // Syscalls needed to run GFXBenchmark
- AllowSyscall(f, 190); // __NR_vfork
-
- // Needed for strace
- AllowSyscall(f, 238); // __NR_tkill
-
- // Needed for kernel to restart syscalls
- AllowSyscall(f, 0); // __NR_restart_syscall
-
- // Needed for debugging 32-bit Chrome
- AllowSyscall(f, 42); // __NR_pipe
-
- // b/34732712
- AllowSyscall(f, 364); // __NR_perf_event_open
-
- // b/34651972
- AllowSyscall(f, 33); // __NR_access
- AllowSyscall(f, 195); // __NR_stat64
-
- // b/34813887
- AllowSyscall(f, 5); // __NR_open
- AllowSyscall(f, 141); // __NR_getdents
- AllowSyscall(f, 217); // __NR_getdents64
-
- // b/34719286
- AllowSyscall(f, 351); // __NR_eventfd
-
- // b/34817266
- AllowSyscall(f, 252); // __NR_epoll_wait
-
- // Needed by sanitizers (b/34606909)
- // 5 (__NR_open) and 195 (__NR_stat64) are also required, but they are
- // already allowed.
- AllowSyscall(f, 85); // __NR_readlink
-
- // b/34908783
- AllowSyscall(f, 250); // __NR_epoll_create
-
- // b/34979910
- AllowSyscall(f, 8); // __NR_creat
- AllowSyscall(f, 10); // __NR_unlink
-
- // b/35059702
- AllowSyscall(f, 196); // __NR_lstat64
-
- Trap(f);
-
- return install_filter(f);
-}
-
static void Seccomp_setPolicy(JNIEnv* /*env*/) {
if (!set_seccomp_filter()) {
ALOGE("Failed to set seccomp policy - killing");
@@ -234,13 +26,6 @@
}
}
-#else // #if defined __arm__ || defined __aarch64__
-
-static void Seccomp_setPolicy(JNIEnv* /*env*/) {
-}
-
-#endif
-
static const JNINativeMethod method_table[] = {
NATIVE_METHOD(Seccomp, setPolicy, "()V"),
};
diff --git a/core/jni/android_text_StaticLayout.cpp b/core/jni/android_text_StaticLayout.cpp
index c05ef26..90ed6eb 100644
--- a/core/jni/android_text_StaticLayout.cpp
+++ b/core/jni/android_text_StaticLayout.cpp
@@ -159,11 +159,12 @@
minikin::LineBreaker* b = reinterpret_cast<minikin::LineBreaker*>(nativePtr);
Paint* paint = reinterpret_cast<Paint*>(nativePaint);
Typeface* typeface = reinterpret_cast<Typeface*>(nativeTypeface);
- minikin::FontCollection *font;
minikin::MinikinPaint minikinPaint;
- minikin::FontStyle style = MinikinUtils::prepareMinikinPaint(&minikinPaint, &font, paint,
+ Typeface* resolvedTypeface = Typeface::resolveDefault(typeface);
+ minikin::FontStyle style = MinikinUtils::prepareMinikinPaint(&minikinPaint, paint,
typeface);
- return b->addStyleRun(&minikinPaint, font, style, start, end, isRtl);
+ return b->addStyleRun(&minikinPaint, resolvedTypeface->fFontCollection, style, start, end,
+ isRtl);
}
// Accept width measurements for the run, passed in from Java
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index 723dce6..314595f 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -119,96 +119,6 @@
return block;
}
-// This is called by zygote (running as user root) as part of preloadResources.
-static void verifySystemIdmaps()
-{
- pid_t pid;
- char system_id[10];
-
- snprintf(system_id, sizeof(system_id), "%d", AID_SYSTEM);
-
- switch (pid = fork()) {
- case -1:
- ALOGE("failed to fork for idmap: %s", strerror(errno));
- break;
- case 0: // child
- {
- struct __user_cap_header_struct capheader;
- struct __user_cap_data_struct capdata;
-
- memset(&capheader, 0, sizeof(capheader));
- memset(&capdata, 0, sizeof(capdata));
-
- capheader.version = _LINUX_CAPABILITY_VERSION;
- capheader.pid = 0;
-
- if (capget(&capheader, &capdata) != 0) {
- ALOGE("capget: %s\n", strerror(errno));
- exit(1);
- }
-
- capdata.effective = capdata.permitted;
- if (capset(&capheader, &capdata) != 0) {
- ALOGE("capset: %s\n", strerror(errno));
- exit(1);
- }
-
- if (setgid(AID_SYSTEM) != 0) {
- ALOGE("setgid: %s\n", strerror(errno));
- exit(1);
- }
-
- if (setuid(AID_SYSTEM) != 0) {
- ALOGE("setuid: %s\n", strerror(errno));
- exit(1);
- }
-
- // Generic idmap parameters
- const char* argv[8];
- int argc = 0;
- struct stat st;
-
- memset(argv, NULL, sizeof(argv));
- argv[argc++] = AssetManager::IDMAP_BIN;
- argv[argc++] = "--scan";
- argv[argc++] = AssetManager::TARGET_PACKAGE_NAME;
- argv[argc++] = AssetManager::TARGET_APK_PATH;
- argv[argc++] = AssetManager::IDMAP_DIR;
-
- // Directories to scan for overlays: if OVERLAY_THEME_DIR_PROPERTY is defined,
- // use OVERLAY_DIR/<value of OVERLAY_THEME_DIR_PROPERTY> in addition to OVERLAY_DIR.
- char subdir[PROP_VALUE_MAX];
- int len = __system_property_get(AssetManager::OVERLAY_THEME_DIR_PERSIST_PROPERTY,
- subdir);
- if (len == 0) {
- len = __system_property_get(AssetManager::OVERLAY_THEME_DIR_PROPERTY, subdir);
- }
- if (len > 0) {
- String8 overlayPath = String8(AssetManager::OVERLAY_DIR) + "/" + subdir;
- if (stat(overlayPath.string(), &st) == 0) {
- argv[argc++] = overlayPath.string();
- }
- }
- if (stat(AssetManager::OVERLAY_DIR, &st) == 0) {
- argv[argc++] = AssetManager::OVERLAY_DIR;
- }
-
- // Finally, invoke idmap (if any overlay directory exists)
- if (argc > 5) {
- execv(AssetManager::IDMAP_BIN, (char* const*)argv);
- ALOGE("failed to execv for idmap: %s", strerror(errno));
- exit(1); // should never get here
- } else {
- exit(0);
- }
- }
- break;
- default: // parent
- waitpid(pid, NULL, 0);
- break;
- }
-}
-
// ----------------------------------------------------------------------------
// this guy is exported to other jni routines
@@ -1597,9 +1507,6 @@
static void android_content_AssetManager_init(JNIEnv* env, jobject clazz, jboolean isSystem)
{
- if (isSystem) {
- verifySystemIdmaps();
- }
AssetManager* am = new AssetManager();
if (am == NULL) {
jniThrowException(env, "java/lang/OutOfMemoryError", "");
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index b57f2362..a03d3c5 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -252,25 +252,26 @@
if (t_pri >= ANDROID_PRIORITY_BACKGROUND) {
// This task wants to stay at background
// update its cpuset so it doesn't only run on bg core(s)
-#ifdef ENABLE_CPUSETS
- int err = set_cpuset_policy(t_pid, sp);
- if (err != NO_ERROR) {
- signalExceptionForGroupError(env, -err, t_pid);
- break;
+ if (cpusets_enabled()) {
+ int err = set_cpuset_policy(t_pid, sp);
+ if (err != NO_ERROR) {
+ signalExceptionForGroupError(env, -err, t_pid);
+ break;
+ }
}
-#endif
continue;
}
}
int err;
-#ifdef ENABLE_CPUSETS
- // set both cpuset and cgroup for general threads
- err = set_cpuset_policy(t_pid, sp);
- if (err != NO_ERROR) {
- signalExceptionForGroupError(env, -err, t_pid);
- break;
+
+ if (cpusets_enabled()) {
+ // set both cpuset and cgroup for general threads
+ err = set_cpuset_policy(t_pid, sp);
+ if (err != NO_ERROR) {
+ signalExceptionForGroupError(env, -err, t_pid);
+ break;
+ }
}
-#endif
err = set_sched_policy(t_pid, sp);
if (err != NO_ERROR) {
@@ -291,7 +292,6 @@
return (int) sp;
}
-#ifdef ENABLE_CPUSETS
/** Sample CPUset list format:
* 0-3,4,6-8
*/
@@ -367,7 +367,6 @@
}
return;
}
-#endif
/**
@@ -376,22 +375,21 @@
* them in the passed in cpu_set_t
*/
void get_exclusive_cpuset_cores(SchedPolicy policy, cpu_set_t *cpu_set) {
-#ifdef ENABLE_CPUSETS
- int i;
- cpu_set_t tmp_set;
- get_cpuset_cores_for_policy(policy, cpu_set);
- for (i = 0; i < SP_CNT; i++) {
- if ((SchedPolicy) i == policy) continue;
- get_cpuset_cores_for_policy((SchedPolicy)i, &tmp_set);
- // First get cores exclusive to one set or the other
- CPU_XOR(&tmp_set, cpu_set, &tmp_set);
- // Then get the ones only in cpu_set
- CPU_AND(cpu_set, cpu_set, &tmp_set);
+ if (cpusets_enabled()) {
+ int i;
+ cpu_set_t tmp_set;
+ get_cpuset_cores_for_policy(policy, cpu_set);
+ for (i = 0; i < SP_CNT; i++) {
+ if ((SchedPolicy) i == policy) continue;
+ get_cpuset_cores_for_policy((SchedPolicy)i, &tmp_set);
+ // First get cores exclusive to one set or the other
+ CPU_XOR(&tmp_set, cpu_set, &tmp_set);
+ // Then get the ones only in cpu_set
+ CPU_AND(cpu_set, cpu_set, &tmp_set);
+ }
+ } else {
+ CPU_ZERO(cpu_set);
}
-#else
- (void) policy;
- CPU_ZERO(cpu_set);
-#endif
return;
}
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index 4a9cd24..6192271 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -170,6 +170,7 @@
case HAL_PIXEL_FORMAT_RGBA_8888:
case HAL_PIXEL_FORMAT_RGBX_8888:
case HAL_PIXEL_FORMAT_RGBA_FP16:
+ case HAL_PIXEL_FORMAT_RGBA_1010102:
case HAL_PIXEL_FORMAT_RGB_888:
case HAL_PIXEL_FORMAT_RGB_565:
case HAL_PIXEL_FORMAT_Y8:
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 0171562..a81901d 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -356,9 +356,9 @@
}
static void nativeSetMatrix(JNIEnv* env, jclass clazz, jlong nativeObject,
- jfloat dsdx, jfloat dtdx, jfloat dsdy, jfloat dtdy) {
+ jfloat dsdx, jfloat dtdx, jfloat dtdy, jfloat dsdy) {
SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
- status_t err = ctrl->setMatrix(dsdx, dtdx, dsdy, dtdy);
+ status_t err = ctrl->setMatrix(dsdx, dtdx, dtdy, dsdy);
if (err < 0 && err != NO_INIT) {
doThrowIAE(env);
}
diff --git a/core/jni/android_view_TextureView.cpp b/core/jni/android_view_TextureView.cpp
index 613e040..18a1360 100644
--- a/core/jni/android_view_TextureView.cpp
+++ b/core/jni/android_view_TextureView.cpp
@@ -83,7 +83,7 @@
colorType = kN32_SkColorType;
alphaType = kOpaque_SkAlphaType;
break;
- case WINDOW_FORMAT_RGBA_FP16:
+ case AHARDWAREBUFFER_FORMAT_R16G16B16A16_SFLOAT:
colorType = kRGBA_F16_SkColorType;
alphaType = kPremul_SkAlphaType;
break;
diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp
index d37f96a..37eae48a 100644
--- a/core/jni/android_view_ThreadedRenderer.cpp
+++ b/core/jni/android_view_ThreadedRenderer.cpp
@@ -43,7 +43,6 @@
#include <FrameInfo.h>
#include <FrameMetricsObserver.h>
#include <IContextFactory.h>
-#include <JankTracker.h>
#include <PropertyValuesAnimatorSet.h>
#include <RenderNode.h>
#include <renderthread/CanvasContext.h>
@@ -587,10 +586,13 @@
return atoi(prop) > 0 ? JNI_TRUE : JNI_FALSE;
}
+static void android_view_ThreadedRenderer_rotateProcessStatsBuffer(JNIEnv* env, jobject clazz) {
+ RenderProxy::rotateProcessStatsBuffer();
+}
+
static void android_view_ThreadedRenderer_setProcessStatsBuffer(JNIEnv* env, jobject clazz,
- jlong proxyPtr, jint fd) {
- RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
- proxy->setProcessStatsBuffer(fd);
+ jint fd) {
+ RenderProxy::setProcessStatsBuffer(fd);
}
static jint android_view_ThreadedRenderer_getRenderThreadTid(JNIEnv* env, jobject clazz,
@@ -817,15 +819,6 @@
proxy->dumpProfileInfo(fd, dumpFlags);
}
-static void android_view_ThreadedRenderer_dumpProfileData(JNIEnv* env, jobject clazz,
- jbyteArray jdata, jobject javaFileDescriptor) {
- int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
- ScopedByteArrayRO buffer(env, jdata);
- if (buffer.get()) {
- JankTracker::dumpBuffer(buffer.get(), buffer.size(), fd);
- }
-}
-
static void android_view_ThreadedRenderer_addRenderNode(JNIEnv* env, jobject clazz,
jlong proxyPtr, jlong renderNodePtr, jboolean placeFront) {
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
@@ -910,7 +903,8 @@
static const JNINativeMethod gMethods[] = {
{ "nSupportsOpenGL", "()Z", (void*) android_view_ThreadedRenderer_supportsOpenGL },
- { "nSetProcessStatsBuffer", "(JI)V", (void*) android_view_ThreadedRenderer_setProcessStatsBuffer },
+ { "nRotateProcessStatsBuffer", "()V", (void*) android_view_ThreadedRenderer_rotateProcessStatsBuffer },
+ { "nSetProcessStatsBuffer", "(I)V", (void*) android_view_ThreadedRenderer_setProcessStatsBuffer },
{ "nGetRenderThreadTid", "(J)I", (void*) android_view_ThreadedRenderer_getRenderThreadTid },
{ "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode },
{ "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy },
@@ -943,7 +937,6 @@
{ "nNotifyFramePending", "(J)V", (void*) android_view_ThreadedRenderer_notifyFramePending },
{ "nSerializeDisplayListTree", "(J)V", (void*) android_view_ThreadedRenderer_serializeDisplayListTree },
{ "nDumpProfileInfo", "(JLjava/io/FileDescriptor;I)V", (void*) android_view_ThreadedRenderer_dumpProfileInfo },
- { "nDumpProfileData", "([BLjava/io/FileDescriptor;)V", (void*) android_view_ThreadedRenderer_dumpProfileData },
{ "setupShadersDiskCache", "(Ljava/lang/String;)V",
(void*) android_view_ThreadedRenderer_setupShadersDiskCache },
{ "nAddRenderNode", "(JJZ)V", (void*) android_view_ThreadedRenderer_addRenderNode},
diff --git a/core/jni/include/android_runtime/android_hardware_HardwareBuffer.h b/core/jni/include/android_runtime/android_hardware_HardwareBuffer.h
index a5d0596..3545c56 100644
--- a/core/jni/include/android_runtime/android_hardware_HardwareBuffer.h
+++ b/core/jni/include/android_runtime/android_hardware_HardwareBuffer.h
@@ -41,12 +41,13 @@
/* Convert from AHARDWAREBUFFER_USAGE* flags to to gralloc usage flags. */
extern void android_hardware_HardwareBuffer_convertToGrallocUsageBits(
- uint64_t usage0, uint64_t usage1, uint64_t* outProducerUsage,
- uint64_t* outConsumerUsage);
+ uint64_t* outProducerUsage, uint64_t* outConsumerUsage, uint64_t usage0,
+ uint64_t usage1);
/* Convert from gralloc usage flags to to AHARDWAREBUFFER_USAGE0* flags. */
-extern uint64_t android_hardware_HardwareBuffer_convertFromGrallocUsageBits(
- uint64_t producerUsage, uint64_t consumerUsage);
+extern void android_hardware_HardwareBuffer_convertFromGrallocUsageBits(
+ uint64_t* outUsage0, uint64_t* outUsage1, uint64_t producerUsage,
+ uint64_t consumerUsage);
} // namespace android
diff --git a/core/jni/include/android_runtime/android_view_Surface.h b/core/jni/include/android_runtime/android_view_Surface.h
index 07e29cb..3f1bdff 100644
--- a/core/jni/include/android_runtime/android_view_Surface.h
+++ b/core/jni/include/android_runtime/android_view_Surface.h
@@ -50,6 +50,7 @@
RAW_PRIVATE = 0x24,
RAW10 = 0x25,
RAW12 = 0x26,
+ RGBA_1010102 = 0x2b,
JPEG = 0x100,
DEPTH_POINT_CLOUD = 0x101,
YV12 = 0x32315659,
diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto
index ba1d664..a2f07d9 100644
--- a/core/proto/android/os/incident.proto
+++ b/core/proto/android/os/incident.proto
@@ -21,6 +21,7 @@
import "frameworks/base/libs/incident/proto/android/privacy.proto";
import "frameworks/base/core/proto/android/service/appwidget.proto";
+import "frameworks/base/core/proto/android/service/graphicsstats.proto";
import "frameworks/base/core/proto/android/service/fingerprint.proto";
import "frameworks/base/core/proto/android/service/netstats.proto";
import "frameworks/base/core/proto/android/service/notification.proto";
@@ -57,4 +58,5 @@
android.providers.settings.SettingsServiceDumpProto settings = 3002;
android.service.appwidget.AppWidgetServiceDumpProto appwidget = 3003;
android.service.notification.NotificationServiceDumpProto notification = 3004;
+ android.service.GraphicsStatsServiceDumpProto graphicsstats = 3005;
}
diff --git a/core/java/android/companion/ICompanionDeviceManagerService.aidl b/core/proto/android/os/looper.proto
similarity index 65%
copy from core/java/android/companion/ICompanionDeviceManagerService.aidl
copy to core/proto/android/os/looper.proto
index ff2a7eb..9fcc781 100644
--- a/core/java/android/companion/ICompanionDeviceManagerService.aidl
+++ b/core/proto/android/os/looper.proto
@@ -14,16 +14,17 @@
* limitations under the License.
*/
-package android.companion;
+syntax = "proto3";
-import android.companion.AssociationRequest;
-import android.companion.IOnAssociateCallback;
+package android.os;
+option java_multiple_files = true;
-/** @hide */
-interface ICompanionDeviceManagerService {
- void startDiscovery(
- in AssociationRequest request,
- in IOnAssociateCallback callback,
- in String callingPackage);
+import "frameworks/base/core/proto/android/os/messagequeue.proto";
+
+message LooperProto {
+ string thread_name = 1;
+ int64 thread_id = 2;
+ int32 identity_hash_code = 3;
+ android.os.MessageQueueProto queue = 4;
}
diff --git a/core/proto/android/os/message.proto b/core/proto/android/os/message.proto
new file mode 100644
index 0000000..604935d
--- /dev/null
+++ b/core/proto/android/os/message.proto
@@ -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.
+ */
+
+syntax = "proto3";
+
+package android.os;
+
+option java_multiple_files = true;
+
+message MessageProto {
+ int64 when = 1;
+ // Name of callback class.
+ string callback = 2;
+ // User-defined message code so that the recipient can identify what this
+ // message is about.
+ int32 what = 3;
+ int32 arg1 = 4;
+ int32 arg2 = 5;
+ // String representation of an arbitrary object to send to the recipient.
+ string obj = 6;
+ // Name of target class.
+ string target = 7;
+ int32 barrier = 8;
+}
diff --git a/core/java/android/companion/ICompanionDeviceManagerService.aidl b/core/proto/android/os/messagequeue.proto
similarity index 65%
copy from core/java/android/companion/ICompanionDeviceManagerService.aidl
copy to core/proto/android/os/messagequeue.proto
index ff2a7eb..9bff13e 100644
--- a/core/java/android/companion/ICompanionDeviceManagerService.aidl
+++ b/core/proto/android/os/messagequeue.proto
@@ -14,16 +14,16 @@
* limitations under the License.
*/
-package android.companion;
+syntax = "proto3";
-import android.companion.AssociationRequest;
-import android.companion.IOnAssociateCallback;
+package android.os;
+option java_multiple_files = true;
-/** @hide */
-interface ICompanionDeviceManagerService {
- void startDiscovery(
- in AssociationRequest request,
- in IOnAssociateCallback callback,
- in String callingPackage);
+import "frameworks/base/core/proto/android/os/message.proto";
+
+message MessageQueueProto {
+ repeated android.os.MessageProto messages = 1;
+ bool is_polling_locked = 2;
+ bool is_quitting = 3;
}
diff --git a/core/java/android/companion/ICompanionDeviceManagerService.aidl b/core/proto/android/os/worksource.proto
similarity index 65%
copy from core/java/android/companion/ICompanionDeviceManagerService.aidl
copy to core/proto/android/os/worksource.proto
index ff2a7eb..c2aa5cb 100644
--- a/core/java/android/companion/ICompanionDeviceManagerService.aidl
+++ b/core/proto/android/os/worksource.proto
@@ -14,16 +14,17 @@
* limitations under the License.
*/
-package android.companion;
+syntax = "proto3";
-import android.companion.AssociationRequest;
-import android.companion.IOnAssociateCallback;
+package android.os;
+option java_multiple_files = true;
-/** @hide */
-interface ICompanionDeviceManagerService {
- void startDiscovery(
- in AssociationRequest request,
- in IOnAssociateCallback callback,
- in String callingPackage);
-}
+message WorkSourceProto {
+ message WorkSourceContentProto {
+ int32 uid = 1;
+ string name = 2;
+ }
+
+ repeated WorkSourceContentProto work_source_contents = 1;
+}
\ No newline at end of file
diff --git a/core/proto/android/service/graphicsstats.proto b/core/proto/android/service/graphicsstats.proto
new file mode 100644
index 0000000..6dbfe48
--- /dev/null
+++ b/core/proto/android/service/graphicsstats.proto
@@ -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.
+ */
+
+syntax = "proto3";
+
+package android.service;
+
+option java_multiple_files = true;
+option java_outer_classname = "GraphicsStatsServiceProto";
+
+message GraphicsStatsServiceDumpProto {
+ repeated GraphicsStatsProto stats = 1;
+}
+
+message GraphicsStatsProto {
+
+ // The package name of the app
+ string package_name = 1;
+
+ // The version code of the app
+ int32 version_code = 2;
+
+ // The start & end timestamps in UTC as
+ // milliseconds since January 1, 1970
+ // Compatible with java.util.Date#setTime()
+ int64 stats_start = 3;
+ int64 stats_end = 4;
+
+ // The aggregated statistics for the package
+ GraphicsStatsJankSummaryProto summary = 5;
+
+ // The frame time histogram for the package
+ repeated GraphicsStatsHistogramBucketProto histogram = 6;
+}
+
+message GraphicsStatsJankSummaryProto {
+ // Distinct frame count.
+ int32 total_frames = 1;
+
+ // Number of frames with slow render time. Frames are considered janky if
+ // they took more than a vsync interval (typically 16.667ms) to be rendered.
+ int32 janky_frames = 2;
+
+ // Number of "missed vsync" events.
+ int32 missed_vsync_count = 3;
+
+ // Number of "high input latency" events.
+ int32 high_input_latency_count = 4;
+
+ // Number of "slow UI thread" events.
+ int32 slow_ui_thread_count = 5;
+
+ // Number of "slow bitmap upload" events.
+ int32 slow_bitmap_upload_count = 6;
+
+ // Number of "slow draw" events.
+ int32 slow_draw_count = 7;
+}
+
+message GraphicsStatsHistogramBucketProto {
+ // Lower bound of render time in milliseconds.
+ int32 render_millis = 1;
+ // Number of frames in the bucket.
+ int32 frame_count = 2;
+}
diff --git a/core/proto/android/service/notification.proto b/core/proto/android/service/notification.proto
index bc257e0..819460e 100644
--- a/core/proto/android/service/notification.proto
+++ b/core/proto/android/service/notification.proto
@@ -23,6 +23,8 @@
message NotificationServiceDumpProto {
repeated NotificationRecordProto records = 1;
+
+ ZenModeProto zen = 2;
}
message NotificationRecordProto {
@@ -42,4 +44,21 @@
ENQUEUED = 0;
POSTED = 1;
+
+ SNOOZED = 2;
+}
+
+message ZenModeProto {
+ ZenMode zen_mode = 1;
+ repeated string enabled_active_conditions = 2;
+ int32 suppressed_effects = 3;
+ repeated string suppressors = 4;
+ string policy = 5;
+}
+
+enum ZenMode {
+ ZEN_MODE_OFF = 0;
+ ZEN_MODE_IMPORTANT_INTERRUPTIONS = 1;
+ ZEN_MODE_NO_INTERRUPTIONS = 2;
+ ZEN_MODE_ALARMS = 3;
}
\ No newline at end of file
diff --git a/core/proto/android/service/package.proto b/core/proto/android/service/package.proto
new file mode 100644
index 0000000..326b0eb
--- /dev/null
+++ b/core/proto/android/service/package.proto
@@ -0,0 +1,120 @@
+/*
+ * 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 = "proto3";
+
+package android.service.pm;
+
+option java_multiple_files = true;
+option java_outer_classname = "PackageServiceProto";
+
+message PackageServiceDumpProto {
+ message PackageShortProto {
+ // Name of package. e.g. "com.android.providers.telephony".
+ string name = 1;
+ // UID for this package as assigned by Android OS.
+ int32 uid = 2;
+ }
+ message SharedLibraryProto {
+ string name = 1;
+ // True if library path is not null (jar), false otherwise (apk)
+ bool is_jar = 2;
+ // Should be filled if is_jar is true
+ string path = 3;
+ // Should be filled if is_jar is false
+ string apk = 4;
+ }
+ message FeatureProto {
+ string name = 1;
+ int32 version = 2;
+ }
+ message SharedUserProto {
+ int32 user_id = 1;
+ string name = 2;
+ }
+
+ // Installed packages.
+ PackageShortProto required_verifier_package = 1;
+ PackageShortProto verifier_package = 2;
+ repeated SharedLibraryProto shared_libraries = 3;
+ repeated FeatureProto features = 4;
+ repeated PackageProto packages = 5;
+ repeated SharedUserProto shared_users = 6;
+ // Messages from the settings problem file
+ repeated string messages = 7;
+}
+
+message PackageProto {
+ message SplitProto {
+ string name = 1;
+ int32 revision_code = 2;
+ }
+ message UserInfoProto {
+ enum InstallType {
+ NOT_INSTALLED_FOR_USER = 0;
+ FULL_APP_INSTALL = 1;
+ INSTANT_APP_INSTALL = 2;
+ }
+ // Enum values gotten from PackageManger.java
+ enum EnabledState {
+ // This component or application is in its default enabled state
+ // (as specified in its manifest).
+ COMPONENT_ENABLED_STATE_DEFAULT = 0;
+ // This component or application has been explictily enabled, regardless
+ // of what it has specified in its manifest.
+ COMPONENT_ENABLED_STATE_ENABLED = 1;
+ // This component or application has been explicitly disabled, regardless of
+ // what it has specified in its manifest.
+ COMPONENT_ENABLED_STATE_DISABLED = 2;
+ // The user has explicitly disabled the application, regardless of what it has
+ // specified in its manifest.
+ COMPONENT_ENABLED_STATE_DISABLED_USER = 3;
+ // This application should be considered, until the point where the user actually
+ // wants to use it.
+ COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED = 4;
+ }
+
+ int32 id = 1;
+ InstallType install_type = 2;
+ // Is the app restricted by owner / admin
+ bool is_hidden = 3;
+ bool is_suspended = 4;
+ bool is_stopped = 5;
+ bool is_launched = 6;
+ EnabledState enabled_state = 7;
+ string last_disabled_app_caller = 8;
+ }
+
+ // Name of package. e.g. "com.android.providers.telephony".
+ string name = 1;
+ // UID for this package as assigned by Android OS.
+ int32 uid = 2;
+ // Package's reported version.
+ int32 version_code = 3;
+ // Package's reported version string (what's displayed to the user).
+ string version_string = 4;
+ // UTC timestamp of install
+ int64 install_time_ms = 5;
+ // Millisecond UTC timestamp of latest update adjusted to Google's server clock.
+ int64 update_time_ms = 6;
+ // From "dumpsys package" - name of package which installed this one.
+ // Typically "" if system app or "com.android.vending" if Play Store.
+ string installer_name = 7;
+ // Split APKs.
+ repeated SplitProto splits = 8;
+ // Per-user package info.
+ repeated UserInfoProto users = 9;
+}
diff --git a/core/proto/android/service/power.proto b/core/proto/android/service/power.proto
new file mode 100644
index 0000000..1830dbf
--- /dev/null
+++ b/core/proto/android/service/power.proto
@@ -0,0 +1,408 @@
+/*
+ * 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 = "proto3";
+
+package android.service.power;
+
+option java_multiple_files = true;
+option java_outer_classname = "PowerServiceProto";
+
+import "frameworks/base/core/proto/android/os/looper.proto";
+import "frameworks/base/core/proto/android/os/worksource.proto";
+import "frameworks/base/core/proto/android/service/wirelesschargerdetector.proto";
+
+message PowerServiceDumpProto {
+ message ConstantsProto {
+ bool is_no_cached_wake_locks = 1;
+ }
+ message ActiveWakeLocksProto {
+ bool is_cpu = 1;
+ bool is_screen_bright = 2;
+ bool is_screen_dim = 3;
+ bool is_button_bright = 4;
+ bool is_proximity_screen_off = 5;
+ // only set if already awake
+ bool is_stay_awake = 6;
+ bool is_doze = 7;
+ bool is_draw = 8;
+ }
+ message UserActivityProto {
+ bool is_screen_bright = 1;
+ bool is_screen_dim = 2;
+ bool is_screen_dream = 3;
+ }
+ message UidProto {
+ // Enum values gotten from ActivityManager.java
+ enum ProcessState {
+ // Process is a persistent system process.
+ PROCESS_STATE_PERSISTENT = 0;
+ // Process is a persistent system process and is doing UI.
+ PROCESS_STATE_PERSISTENT_UI = 1;
+ // Process is hosting the current top activities. Note that this
+ // covers all activities that are visible to the user.
+ PROCESS_STATE_TOP = 2;
+ // Process is hosting a foreground service due to a system binding.
+ PROCESS_STATE_BOUND_FOREGROUND_SERVICE = 3;
+ // Process is hosting a foreground service.
+ PROCESS_STATE_FOREGROUND_SERVICE = 4;
+ // Same as {@link #PROCESS_STATE_TOP} but while device is sleeping.
+ PROCESS_STATE_TOP_SLEEPING = 5;
+ // Process is important to the user, and something they are aware of.
+ PROCESS_STATE_IMPORTANT_FOREGROUND = 6;
+ // Process is important to the user, but not something they are aware of.
+ PROCESS_STATE_IMPORTANT_BACKGROUND = 7;
+ // Process is in the background running a backup/restore operation.
+ PROCESS_STATE_BACKUP = 8;
+ // Process is in the background, but it can't restore its state so
+ // we want to try to avoid killing it.
+ PROCESS_STATE_HEAVY_WEIGHT = 9;
+ // Process is in the background running a service.
+ PROCESS_STATE_SERVICE = 10;
+ // Process is in the background running a receiver.
+ PROCESS_STATE_RECEIVER = 11;
+ // Process is in the background but hosts the home activity.
+ PROCESS_STATE_HOME = 12;
+ // Process is in the background but hosts the last shown activity.
+ PROCESS_STATE_LAST_ACTIVITY = 13;
+ // Process is being cached for later use and contains activities.
+ PROCESS_STATE_CACHED_ACTIVITY = 14;
+ // Process is being cached for later use and is a client of another
+ // cached process that contains activities.
+ PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 15;
+ // Process is being cached for later use and is empty.
+ PROCESS_STATE_CACHED_EMPTY = 16;
+ // Process does not exist.
+ PROCESS_STATE_NONEXISTENT = 17;
+ }
+ int32 uid = 1;
+ string uid_string = 2;
+ bool is_active = 3;
+ int32 num_wake_locks = 4;
+ bool is_process_state_unknown = 5;
+ ProcessState process_state = 6;
+ }
+
+ // Enum values gotten from PowerManagerInternal.java
+ enum Wakefulness {
+ WAKEFULNESS_ASLEEP = 0;
+ WAKEFULNESS_AWAKE = 1;
+ WAKEFULNESS_DREAMING = 2;
+ WAKEFULNESS_DOZING = 3;
+ WAKEFULNESS_UNKNOWN = 4;
+ }
+ // Enum values gotten from BatteryManager.java
+ enum PlugType {
+ PLUG_TYPE_NONE = 0;
+ PLUG_TYPE_PLUGGED_AC = 1;
+ PLUG_TYPE_PLUGGED_USB = 2;
+ PLUG_TYPE_PLUGGED_WIRELESS = 4;
+ }
+ // Enum values gotten from Intent.java
+ enum DockState {
+ DOCK_STATE_UNDOCKED = 0;
+ DOCK_STATE_DESK = 1;
+ DOCK_STATE_CAR = 2;
+ DOCK_STATE_LE_DESK = 3;
+ DOCK_STATE_HE_DESK = 4;
+ }
+
+ ConstantsProto constants = 1;
+ // A bitfield that indicates what parts of the power state have
+ // changed and need to be recalculated.
+ int32 dirty = 2;
+ // Indicates whether the device is awake or asleep or somewhere in between.
+ Wakefulness wakefulness = 3;
+ bool is_wakefulness_changing = 4;
+ // True if the device is plugged into a power source.
+ bool is_powered = 5;
+ // The current plug type
+ PlugType plug_type = 6;
+ // The current battery level percentage.
+ int32 battery_level = 7;
+ // The battery level percentage at the time the dream started.
+ int32 battery_level_when_dream_started = 8;
+ // The current dock state.
+ DockState dock_state = 9;
+ // True if the device should stay on.
+ bool is_stay_on = 10;
+ // True if the proximity sensor reads a positive result.
+ bool is_proximity_positive = 11;
+ // True if boot completed occurred. We keep the screen on until this happens.
+ bool is_boot_completed = 12;
+ // True if systemReady() has been called.
+ bool is_system_ready = 13;
+ // True if auto-suspend mode is enabled.
+ bool is_hal_auto_suspend_mode_enabled = 14;
+ // True if interactive mode is enabled.
+ bool is_hal_auto_interactive_mode_enabled = 15;
+ // Summarizes the state of all active wakelocks.
+ ActiveWakeLocksProto active_wake_locks = 16;
+ // Have we scheduled a message to check for long wake locks? This is when
+ // we will check. (In milliseconds timestamp)
+ int64 notify_long_scheduled_ms = 17;
+ // Last time we checked for long wake locks. (In milliseconds timestamp)
+ int64 notify_long_dispatched_ms = 18;
+ // The time we decided to do next long check. (In milliseconds timestamp)
+ int64 notify_long_next_check_ms = 19;
+ // Summarizes the effect of the user activity timer.
+ UserActivityProto user_activity = 20;
+ // If true, instructs the display controller to wait for the proximity
+ // sensor to go negative before turning the screen on.
+ bool is_request_wait_for_negative_proximity = 21;
+ // True if MSG_SANDMAN has been scheduled.
+ bool is_sandman_scheduled = 22;
+ // True if the sandman has just been summoned for the first time since entering
+ // the dreaming or dozing state. Indicates whether a new dream should begin.
+ bool is_sandman_summoned = 23;
+ // If true, the device is in low power mode.
+ bool is_low_power_mode_enabled = 24;
+ // True if the battery level is currently considered low.
+ bool is_battery_level_low = 25;
+ // True if we are currently in light device idle mode.
+ bool is_light_device_idle_mode = 26;
+ // True if we are currently in device idle mode.
+ bool is_device_idle_mode = 27;
+ // Set of app ids that we will always respect the wake locks for.
+ repeated int32 device_idle_whitelist = 28;
+ // Set of app ids that are temporarily allowed to acquire wakelocks due to
+ // high-pri message
+ repeated int32 device_idle_temp_whitelist = 29;
+ // Timestamp of the last time the device was awoken.
+ int64 last_wake_time_ms = 30;
+ // Timestamp of the last time the device was put to sleep.
+ int64 last_sleep_time_ms = 31;
+ // Timestamp of the last call to user activity.
+ int64 last_user_activity_time_ms = 32;
+ int64 last_user_activity_time_no_change_lights_ms = 33;
+ // Timestamp of last interactive power hint.
+ int64 last_interactive_power_hint_time_ms = 34;
+ // Timestamp of the last screen brightness boost.
+ int64 last_screen_brightness_boost_time_ms = 35;
+ // True if screen brightness boost is in progress.
+ bool is_screen_brightness_boost_in_progress = 36;
+ // True if the display power state has been fully applied, which means the
+ // display is actually on or actually off or whatever was requested.
+ bool is_display_ready = 37;
+ // True if the wake lock suspend blocker has been acquired.
+ bool is_holding_wake_lock_suspend_blocker = 38;
+ // The suspend blocker used to keep the CPU alive when the display is on, the
+ // display is getting ready or there is user activity (in which case the
+ // display must be on).
+ bool is_holding_display_suspend_blocker = 39;
+ // Settings and configuration
+ PowerServiceSettingsAndConfigurationDumpProto settings_and_configuration = 40;
+ // Sleep timeout in ms
+ sint32 sleep_timeout_ms = 41;
+ // Screen off timeout in ms
+ int32 screen_off_timeout_ms = 42;
+ // Screen dim duration in ms
+ int32 screen_dim_duration_ms = 43;
+ // We are currently in the middle of a batch change of uids.
+ bool are_uids_changing = 44;
+ // Some uids have actually changed while mUidsChanging was true.
+ bool are_uids_changed = 45;
+ // List of UIDs and their states
+ repeated UidProto uids = 46;
+ android.os.LooperProto looper = 47;
+ // List of all wake locks acquired by applications.
+ repeated WakeLockProto wake_locks = 48;
+ // List of all suspend blockers.
+ repeated SuspendBlockerProto suspend_blockers = 49;
+ WirelessChargerDetectorProto wireless_charger_detector = 50;
+}
+
+message SuspendBlockerProto {
+ string name = 1;
+ int32 reference_count = 2;
+}
+
+message WakeLockProto {
+ message WakeLockFlagsProto {
+ // Turn the screen on when the wake lock is acquired.
+ bool is_acquire_causes_wakeup = 1;
+ // When this wake lock is released, poke the user activity timer
+ // so the screen stays on for a little longer.
+ bool is_on_after_release = 2;
+ }
+
+ // Enum values gotten from PowerManager.java
+ enum LockLevel {
+ WAKE_LOCK_INVALID = 0;
+ // Ensures that the CPU is running.
+ PARTIAL_WAKE_LOCK = 1;
+ // Ensures that the screen is on (but may be dimmed).
+ SCREEN_DIM_WAKE_LOCK = 6;
+ // Ensures that the screen is on at full brightness.
+ SCREEN_BRIGHT_WAKE_LOCK = 10;
+ // Ensures that the screen and keyboard backlight are on at full brightness.
+ FULL_WAKE_LOCK = 26;
+ // Turns the screen off when the proximity sensor activates.
+ PROXIMITY_SCREEN_OFF_WAKE_LOCK = 32;
+ // Put the screen in a low power state and allow the CPU to suspend
+ // if no other wake locks are held.
+ DOZE_WAKE_LOCK = 64;
+ // Keep the device awake enough to allow drawing to occur.
+ DRAW_WAKE_LOCK = 128;
+ }
+
+ LockLevel lock_level = 1;
+ string tag = 2;
+ WakeLockFlagsProto flags = 3;
+ bool is_disabled = 4;
+ // Acquire time in ms
+ int64 acq_ms = 5;
+ bool is_notified_long = 6;
+ // Owner UID
+ int32 uid = 7;
+ // Owner PID
+ int32 pid = 8;
+ android.os.WorkSourceProto work_source = 9;
+}
+
+message PowerServiceSettingsAndConfigurationDumpProto {
+ message StayOnWhilePluggedInProto {
+ bool is_stay_on_while_plugged_in_ac = 1;
+ bool is_stay_on_while_plugged_in_usb = 2;
+ bool is_stay_on_while_plugged_in_wireless = 3;
+ }
+ message ScreenBrightnessSettingLimitsProto {
+ int32 setting_minimum = 1;
+ int32 setting_maximum = 2;
+ int32 setting_default = 3;
+ int32 setting_for_vr_default = 4;
+ }
+
+ // Enum values gotten from Settings.java
+ enum ScreenBrightnessMode {
+ SCREEN_BRIGHTNESS_MODE_MANUAL = 0;
+ SCREEN_BRIGHTNESS_MODE_AUTOMATIC = 1;
+ }
+ // Enum values gotten from Display.java
+ enum DisplayState {
+ DISPLAY_STATE_UNKNOWN = 0;
+ DISPLAY_STATE_OFF = 1;
+ DISPLAY_STATE_ON = 2;
+ DISPLAY_STATE_DOZE = 3;
+ DISPLAY_STATE_DOZE_SUSPEND = 4;
+ DISPLAY_STATE_VR = 5;
+ }
+
+
+ // True to decouple auto-suspend mode from the display state.
+ bool is_decouple_hal_auto_suspend_mode_from_display_config = 1;
+ // True to decouple interactive mode from the display state.
+ bool is_decouple_hal_interactive_mode_from_display_config = 2;
+ // True if the device should wake up when plugged or unplugged.
+ bool is_wake_up_when_plugged_or_unplugged_config = 3;
+ // True if the device should wake up when plugged or unplugged in theater mode.
+ bool is_wake_up_when_plugged_or_unplugged_in_theater_mode_config = 4;
+ // True if theater mode is enabled
+ bool is_theater_mode_enabled = 5;
+ // True if the device should suspend when the screen is off due to proximity.
+ bool is_suspend_when_screen_off_due_to_proximity_config = 6;
+ // True if dreams are supported on this device.
+ bool are_dreams_supported_config = 7;
+ // Default value for dreams enabled
+ bool are_dreams_enabled_by_default_config = 8;
+ // Default value for dreams activate-on-sleep
+ bool are_dreams_activated_on_sleep_by_default_config = 9;
+ // Default value for dreams activate-on-dock
+ bool are_dreams_activated_on_dock_by_default_config = 10;
+ // True if dreams can run while not plugged in.
+ bool are_dreams_enabled_on_battery_config = 11;
+ // Minimum battery level to allow dreaming when powered.
+ // Use -1 to disable this safety feature.
+ sint32 dreams_battery_level_minimum_when_powered_config = 12;
+ // Minimum battery level to allow dreaming when not powered.
+ // Use -1 to disable this safety feature.
+ sint32 dreams_battery_level_minimum_when_not_powered_config = 13;
+ // If the battery level drops by this percentage and the user activity
+ // timeout has expired, then assume the device is receiving insufficient
+ // current to charge effectively and terminate the dream. Use -1 to disable
+ // this safety feature.
+ sint32 dreams_battery_level_drain_cutoff_config = 14;
+ // True if dreams are enabled by the user.
+ bool are_dreams_enabled_setting = 15;
+ // True if dreams should be activated on sleep.
+ bool are_dreams_activate_on_sleep_setting = 16;
+ // True if dreams should be activated on dock.
+ bool are_dreams_activate_on_dock_setting = 17;
+ // True if doze should not be started until after the screen off transition.
+ bool is_doze_after_screen_off_config = 18;
+ // If true, the device is in low power mode.
+ bool is_low_power_mode_setting = 19;
+ // Current state of whether the settings are allowing auto low power mode.
+ bool is_auto_low_power_mode_configured = 20;
+ // The user turned off low power mode below the trigger level
+ bool is_auto_low_power_mode_snoozing = 21;
+ // The minimum screen off timeout, in milliseconds.
+ int32 minimum_screen_off_timeout_config_ms = 22;
+ // The screen dim duration, in milliseconds.
+ int32 maximum_screen_dim_duration_config_ms = 23;
+ // The maximum screen dim time expressed as a ratio relative to the screen off timeout.
+ float maximum_screen_dim_ratio_config = 24;
+ // The screen off timeout setting value in milliseconds.
+ int32 screen_off_timeout_setting_ms = 25;
+ // The sleep timeout setting value in milliseconds.
+ sint32 sleep_timeout_setting_ms = 26;
+ // The maximum allowable screen off timeout according to the device administration policy.
+ int32 maximum_screen_off_timeout_from_device_admin_ms = 27;
+ bool is_maximum_screen_off_timeout_from_device_admin_enforced_locked = 28;
+ // The stay on while plugged in setting.
+ // A set of battery conditions under which to make the screen stay on.
+ StayOnWhilePluggedInProto stay_on_while_plugged_in = 29;
+ // The screen brightness setting, from 0 to 255.
+ // Use -1 if no value has been set.
+ sint32 screen_brightness_setting = 30;
+ // The screen auto-brightness adjustment setting, from -1 to 1.
+ // Use 0 if there is no adjustment.
+ float screen_auto_brightness_adjustment_setting = 31;
+ // The screen brightness mode.
+ ScreenBrightnessMode screen_brightness_mode_setting = 32;
+ // The screen brightness setting override from the window manager
+ // to allow the current foreground activity to override the brightness.
+ // Use -1 to disable.
+ sint32 screen_brightness_override_from_window_manager = 33;
+ // The user activity timeout override from the window manager
+ // to allow the current foreground activity to override the user activity
+ // timeout. Use -1 to disable.
+ sint64 user_activity_timeout_override_from_window_manager_ms = 34;
+ // The window manager has determined the user to be inactive via other means.
+ // Set this to false to disable.
+ bool is_user_inactive_override_from_window_manager = 35;
+ // The screen brightness setting override from the settings application
+ // to temporarily adjust the brightness until next updated,
+ // Use -1 to disable.
+ sint32 temporary_screen_brightness_setting_override = 36;
+ // The screen brightness adjustment setting override from the settings
+ // application to temporarily adjust the auto-brightness adjustment factor
+ // until next updated, in the range -1..1.
+ // Use NaN to disable.
+ float temporary_screen_auto_brightness_adjustment_setting_override = 37;
+ // The screen state to use while dozing.
+ DisplayState doze_screen_state_override_from_dream_manager = 38;
+ // The screen brightness to use while dozing.
+ float dozed_screen_brightness_override_from_dream_manager = 39;
+ // Screen brightness settings limits.
+ ScreenBrightnessSettingLimitsProto screen_brightness_setting_limits = 40;
+ // The screen brightness setting, from 0 to 255, to be used while in VR Mode.
+ int32 screen_brightness_for_vr_setting = 41;
+ // True if double tap to wake is enabled
+ bool is_double_tap_wake_enabled = 42;
+ // True if we are currently in VR Mode.
+ bool is_vr_mode_enabled = 43;
+}
diff --git a/core/proto/android/service/wirelesschargerdetector.proto b/core/proto/android/service/wirelesschargerdetector.proto
new file mode 100644
index 0000000..7ba7c17
--- /dev/null
+++ b/core/proto/android/service/wirelesschargerdetector.proto
@@ -0,0 +1,50 @@
+/*
+ * 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 = "proto3";
+
+package android.service.power;
+
+option java_multiple_files = true;
+
+message WirelessChargerDetectorProto {
+ message VectorProto {
+ float x = 1;
+ float y = 2;
+ float z = 3;
+ }
+
+ // Previously observed wireless power state.
+ bool is_powered_wirelessly = 1;
+ // True if the device is thought to be at rest on a wireless charger.
+ bool is_at_rest = 2;
+ // The gravity vector most recently observed while at rest.
+ VectorProto rest = 3;
+ // True if detection is in progress.
+ bool is_detection_in_progress = 4;
+ // The time when detection was last performed.
+ int64 detection_start_time_ms = 5;
+ // True if the rest position should be updated if at rest.
+ bool is_must_update_rest_position = 6;
+ // The total number of samples collected.
+ int32 total_samples = 7;
+ // The number of samples collected that showed evidence of not being at rest.
+ int32 moving_samples = 8;
+ // The value of the first sample that was collected.
+ VectorProto first_sample = 9;
+ // The value of the last sample that was collected.
+ VectorProto last_sample = 10;
+}
\ No newline at end of file
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index cd02fbb..054fad2 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -520,6 +520,7 @@
<!-- TODO: temporary broadcast used by AutoFillManagerServiceImpl; will be removed -->
<protected-broadcast android:name="com.android.internal.autofill.action.REQUEST_AUTOFILL" />
<protected-broadcast android:name="android.app.action.APPLICATION_DELEGATION_SCOPES_CHANGED" />
+ <protected-broadcast android:name="com.android.server.wm.ACTION_REVOKE_SYSTEM_ALERT_WINDOW_PERMISSION" />
<!-- ====================================================================== -->
<!-- RUNTIME PERMISSIONS -->
@@ -1794,7 +1795,7 @@
<eat-comment />
<!-- Allows an app to create windows using the type
- {@link android.view.WindowManager.LayoutParams#TYPE_SYSTEM_ALERT},
+ {@link android.view.WindowManager.LayoutParams#TYPE_APPLICATION_OVERLAY},
shown on top of all other apps. Very few apps
should use this permission; these windows are intended for
system-level interaction with the user.
@@ -1813,6 +1814,22 @@
android:description="@string/permdesc_systemAlertWindow"
android:protectionLevel="signature|preinstalled|appop|pre23|development" />
+ <!-- Allows an app to run in the background.
+ <p>Protection level: signature
+ -->
+ <permission android:name="android.permission.RUN_IN_BACKGROUND"
+ android:label="@string/permlab_runInBackground"
+ android:description="@string/permdesc_runInBackground"
+ android:protectionLevel="signature" />
+
+ <!-- Allows an app to use data in the background.
+ <p>Protection level: signature
+ -->
+ <permission android:name="android.permission.USE_DATA_IN_BACKGROUND"
+ android:label="@string/permlab_useDataInBackground"
+ android:description="@string/permdesc_useDataInBackground"
+ android:protectionLevel="signature" />
+
<!-- ================================== -->
<!-- Permissions affecting the system wallpaper -->
<!-- ================================== -->
@@ -2121,7 +2138,7 @@
runtime resource overlays.
@hide -->
<permission android:name="android.permission.CHANGE_OVERLAY_PACKAGES"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged" />
<!-- ========================================= -->
<!-- Permissions for special development tools -->
@@ -2996,7 +3013,7 @@
any metadata and intents attached.
@hide -->
<permission android:name="android.permission.ACCESS_NOTIFICATIONS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged|appop" />
<!-- Marker permission for applications that wish to access notification policy.
<p>Protection level: normal
@@ -3060,10 +3077,11 @@
<permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
android:protectionLevel="signature" />
- <!-- Must be required by an {@link
+ <!-- @SystemApi Must be required by an {@link
android.service.notification.NotificationAssistantService} to ensure that only the system
can bind to it.
<p>Protection level: signature
+ @hide
-->
<permission android:name="android.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE"
android:protectionLevel="signature" />
@@ -3091,6 +3109,13 @@
<permission android:name="android.permission.BIND_DREAM_SERVICE"
android:protectionLevel="signature" />
+ <!-- Must be required by an {@link android.app.usage.CacheQuotaService} to ensure that only the
+ system can bind to it.
+ @hide This is not a third-party API (intended for OEMs and system apps).
+ -->
+ <permission android:name="android.permission.BIND_CACHE_QUOTA_SERVICE"
+ android:protectionLevel="signature" />
+
<!-- @SystemApi Allows an application to call into a carrier setup flow. It is up to the
carrier setup application to enforce that this permission is required
@hide This is not a third-party API (intended for OEMs and system apps). -->
@@ -3464,7 +3489,7 @@
<receiver android:name="com.android.server.updates.ApnDbInstallReceiver"
android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
- <action android:name="android.intent.action.UPDATE_APN_DB" />
+ <action android:name="com.android.internal.intent.action.UPDATE_APN_DB" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
</intent-filter>
</receiver>
diff --git a/core/res/res/drawable-hdpi/sym_def_app_icon.png b/core/res/res/drawable-hdpi/sym_def_app_icon.png
deleted file mode 100644
index cde69bc..0000000
--- a/core/res/res/drawable-hdpi/sym_def_app_icon.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-ldpi/sym_def_app_icon.png b/core/res/res/drawable-ldpi/sym_def_app_icon.png
deleted file mode 100644
index 2c205c8..0000000
--- a/core/res/res/drawable-ldpi/sym_def_app_icon.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/sym_def_app_icon.png b/core/res/res/drawable-mdpi/sym_def_app_icon.png
deleted file mode 100644
index c133a0c..0000000
--- a/core/res/res/drawable-mdpi/sym_def_app_icon.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-nodpi/alert_window_layer.xml b/core/res/res/drawable-nodpi/alert_window_layer.xml
new file mode 100644
index 0000000..f9b38c8
--- /dev/null
+++ b/core/res/res/drawable-nodpi/alert_window_layer.xml
@@ -0,0 +1,24 @@
+<!--
+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="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+<path
+ android:fillColor="#FF000000"
+ android:pathData="M11.99,18.54l-7.37,-5.73L3,14.07l9,7 9,-7 -1.63,-1.27 -7.38,5.74zM12,16l7.36,-5.73L21,9l-9,-7 -9,7 1.63,1.27L12,16z"/>
+</vector>
diff --git a/core/res/res/drawable-xhdpi/sym_def_app_icon.png b/core/res/res/drawable-xhdpi/sym_def_app_icon.png
deleted file mode 100644
index bfa42f0..0000000
--- a/core/res/res/drawable-xhdpi/sym_def_app_icon.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/sym_def_app_icon.png b/core/res/res/drawable-xxhdpi/sym_def_app_icon.png
deleted file mode 100644
index 324e72c..0000000
--- a/core/res/res/drawable-xxhdpi/sym_def_app_icon.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/sym_def_app_icon.png b/core/res/res/drawable-xxxhdpi/sym_def_app_icon.png
deleted file mode 100644
index aee44e1..0000000
--- a/core/res/res/drawable-xxxhdpi/sym_def_app_icon.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/scrollbar_handle_material.xml b/core/res/res/drawable/scrollbar_handle_material.xml
index 33efbba..f020112 100644
--- a/core/res/res/drawable/scrollbar_handle_material.xml
+++ b/core/res/res/drawable/scrollbar_handle_material.xml
@@ -19,7 +19,4 @@
android:shape="rectangle">
<solid
android:color="#84ffffff" />
- <size
- android:width="4dp"
- android:height="4dp" />
</shape>
diff --git a/core/res/res/drawable/sym_def_app_icon.xml b/core/res/res/drawable/sym_def_app_icon.xml
new file mode 100644
index 0000000..8a2b13b
--- /dev/null
+++ b/core/res/res/drawable/sym_def_app_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@android:color/white" />
+ <foreground android:drawable="@mipmap/sym_def_app_icon_maskable" />
+</adaptive-icon>
diff --git a/core/res/res/layout/app_permission_item_money.xml b/core/res/res/layout/app_permission_item_money.xml
index 2056285..764c883 100644
--- a/core/res/res/layout/app_permission_item_money.xml
+++ b/core/res/res/layout/app_permission_item_money.xml
@@ -57,14 +57,14 @@
android:layout_alignParentStart="true"
android:layout_alignBottom="@+id/perm_money_label"
android:scaleType="fitCenter"
- android:tint="@color/perms_costs_money"
+ android:tint="?android:attr/colorError"
android:tintMode="src_in"
android:src="@android:drawable/ic_coins_s" />
<TextView
android:id="@+id/perm_money_label"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textSize="16sp"
- android:textColor="@color/perms_costs_money"
+ android:textColor="?android:attr/colorError"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/perm_money_icon"
diff --git a/core/res/res/layout/autofill_dataset_picker.xml b/core/res/res/layout/autofill_dataset_picker.xml
new file mode 100644
index 0000000..9b90de6
--- /dev/null
+++ b/core/res/res/layout/autofill_dataset_picker.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.
+-->
+
+<ListView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/autofill_dataset_picker"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:divider="?android:attr/listDivider"
+ android:background="#ffffffff">
+</ListView>
diff --git a/core/res/res/layout/autofill_save.xml b/core/res/res/layout/autofill_save.xml
index d55a012..dad9aad 100644
--- a/core/res/res/layout/autofill_save.xml
+++ b/core/res/res/layout/autofill_save.xml
@@ -14,44 +14,87 @@
limitations under the License.
-->
-<!-- TODO(b/33197203) remove hardcoded color once color is final -->
-<RelativeLayout
+<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
+ android:id="@+id/autofill_save"
+ android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingStart="16dip"
android:paddingEnd="16dip"
android:paddingTop="16dip"
android:paddingBottom="16dip"
- android:background="#FDF8C8">
+ android:elevation="16dp"
+ android:background="?android:attr/colorBackground"
+ android:orientation="vertical">
- <!-- TODO(b/33197203) use.R.string once final wording is done -->
- <TextView
- android:id="@+id/autofill_save_title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Save for autofill?"
- android:singleLine="true"/>
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
- <TextView
- android:id="@+id/autofill_save_no"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@+id/autofill_save_title"
- android:layout_toLeftOf="@+id/autofill_save_yes"
- android:layout_marginRight="16dip"
- android:text="No thanks"
- android:textAllCaps="true"
- android:singleLine="true"/>
+ <TextView
+ android:id="@+id/autofill_save_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/autofill_save_title"
+ android:singleLine="true">
+ </TextView>
- <TextView
- android:id="@+id/autofill_save_yes"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@+id/autofill_save_title"
- android:layout_alignParentRight="true"
- android:text="Save"
- android:textAllCaps="true"
- android:singleLine="true"/>
+ <TextView
+ android:id="@+id/autofill_save_subtitle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="invisible">
+ </TextView>
-</RelativeLayout>
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:visibility="invisible" >
+ </Space>
+
+ <ImageView
+ android:id="@+id/autofill_save_close"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@android:drawable/ic_close"
+ android:background="?android:attr/selectableItemBackgroundBorderless">
+ </ImageView>
+
+ </LinearLayout>
+
+ <com.android.internal.widget.ButtonBarLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="end"
+ android:layout_marginTop="16dp"
+ android:layout_weight="1"
+ android:orientation="horizontal">
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:visibility="invisible" >
+ </Space>
+
+ <Button
+ android:id="@+id/autofill_save_no"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ style="?android:attr/buttonBarButtonStyle"
+ android:text="@string/autofill_save_no" >
+ </Button>
+
+ <Button
+ android:id="@+id/autofill_save_yes"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ style="?android:attr/buttonBarButtonStyle"
+ android:text="@string/autofill_save_yes" >
+ </Button>
+
+ </com.android.internal.widget.ButtonBarLayout>
+
+</LinearLayout>
diff --git a/core/res/res/layout/floating_popup_menu_button.xml b/core/res/res/layout/floating_popup_menu_button.xml
index 482f91f..6cbe8c8 100644
--- a/core/res/res/layout/floating_popup_menu_button.xml
+++ b/core/res/res/layout/floating_popup_menu_button.xml
@@ -15,21 +15,48 @@
** limitations under the License.
*/
-->
-<Button xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
- android:layout_height="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
android:minWidth="@dimen/floating_toolbar_menu_button_minimum_width"
android:minHeight="@dimen/floating_toolbar_height"
android:paddingStart="@dimen/floating_toolbar_menu_button_side_padding"
android:paddingEnd="@dimen/floating_toolbar_menu_button_side_padding"
android:paddingTop="0dp"
android:paddingBottom="0dp"
- android:layout_margin="0dp"
- android:gravity="center"
- android:singleLine="true"
- android:ellipsize="end"
- android:fontFamily="sans-serif-medium"
- android:textSize="@dimen/floating_toolbar_text_size"
- android:textAllCaps="true"
- android:textColor="?attr/floatingToolbarForegroundColor"
- android:background="?attr/floatingToolbarItemBackgroundDrawable" />
+ android:background="?attr/floatingToolbarItemBackgroundDrawable">
+ <ImageView
+ android:id="@+id/floating_toolbar_menu_item_image"
+ android:layout_width="@dimen/floating_toolbar_menu_image_width"
+ android:layout_height="@dimen/floating_toolbar_height"
+ android:paddingTop="@dimen/floating_toolbar_menu_image_button_vertical_padding"
+ android:paddingStart="0dp"
+ android:paddingBottom="@dimen/floating_toolbar_menu_image_button_vertical_padding"
+ android:paddingEnd="0dp"
+ android:layout_margin="0dp"
+ android:scaleType="centerInside"
+ android:background="@null"
+ android:focusable="false"
+ android:focusableInTouchMode="false"
+ android:importantForAccessibility="no" />
+ <TextView
+ android:id="@+id/floating_toolbar_menu_item_text"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/floating_toolbar_height"
+ android:textAppearance="?android:attr/textAppearanceListItemSmall"
+ android:padding="0dp"
+ android:paddingStart="@dimen/floating_toolbar_menu_button_side_padding"
+ android:layout_margin="0dp"
+ android:gravity="center"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:fontFamily="sans-serif-medium"
+ android:textSize="@dimen/floating_toolbar_text_size"
+ android:textAllCaps="true"
+ android:textColor="?attr/floatingToolbarForegroundColor"
+ android:background="@null"
+ android:focusable="false"
+ android:focusableInTouchMode="false"
+ android:importantForAccessibility="no" />
+</LinearLayout>
diff --git a/core/res/res/layout/floating_popup_menu_image_button.xml b/core/res/res/layout/floating_popup_menu_image_button.xml
deleted file mode 100644
index 1ba7848..0000000
--- a/core/res/res/layout/floating_popup_menu_image_button.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* Copyright 2015, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:minWidth="@dimen/floating_toolbar_menu_image_button_width"
- android:minHeight="@dimen/floating_toolbar_height"
- android:focusable="false"
- android:focusableInTouchMode="false"
- android:importantForAccessibility="no">
- <ImageButton
- android:id="@+id/floating_toolbar_menu_item_image_button"
- android:layout_width="@dimen/floating_toolbar_menu_image_button_width"
- android:layout_height="@dimen/floating_toolbar_height"
- android:paddingStart="@dimen/floating_toolbar_menu_button_side_padding"
- android:paddingTop="@dimen/floating_toolbar_menu_image_button_vertical_padding"
- android:paddingEnd="@dimen/floating_toolbar_menu_button_side_padding"
- android:paddingBottom="@dimen/floating_toolbar_menu_image_button_vertical_padding"
- android:scaleType="centerInside"
- android:background="?attr/floatingToolbarItemBackgroundDrawable" />
-</LinearLayout>
diff --git a/core/res/res/layout/floating_popup_overflow_image_list_item.xml b/core/res/res/layout/floating_popup_overflow_image_list_item.xml
deleted file mode 100644
index fc04b31..0000000
--- a/core/res/res/layout/floating_popup_overflow_image_list_item.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* Copyright 2015, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:minWidth="@dimen/floating_toolbar_overflow_image_button_width"
- android:minHeight="@dimen/floating_toolbar_height"
- android:focusable="false"
- android:focusableInTouchMode="false"
- android:importantForAccessibility="no">
- <ImageView
- android:id="@+id/floating_toolbar_menu_item_image_button"
- android:layout_width="@dimen/floating_toolbar_overflow_image_button_width"
- android:layout_height="@dimen/floating_toolbar_height"
- android:paddingTop="@dimen/floating_toolbar_menu_image_button_vertical_padding"
- android:paddingStart="@dimen/floating_toolbar_overflow_side_padding"
- android:paddingBottom="@dimen/floating_toolbar_menu_image_button_vertical_padding"
- android:paddingEnd="@dimen/floating_toolbar_overflow_side_padding"
- android:layout_margin="0dp"
- android:scaleType="centerInside"/>
-</LinearLayout>
diff --git a/core/res/res/layout/floating_popup_overflow_list_item.xml b/core/res/res/layout/floating_popup_overflow_list_item.xml
deleted file mode 100644
index 22f4e68..0000000
--- a/core/res/res/layout/floating_popup_overflow_list_item.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* Copyright 2015, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceListItemSmall"
- android:gravity="start|center_vertical"
- android:minWidth="@dimen/floating_toolbar_menu_button_side_padding"
- android:minHeight="@dimen/floating_toolbar_height"
- android:paddingStart="@dimen/floating_toolbar_overflow_side_padding"
- android:paddingEnd="@dimen/floating_toolbar_overflow_side_padding"
- android:paddingTop="0dp"
- android:paddingBottom="0dp"
- android:layout_margin="0dp"
- android:singleLine="true"
- android:ellipsize="end"
- android:fontFamily="sans-serif-medium"
- android:textSize="@dimen/floating_toolbar_text_size"
- android:textColor="?attr/floatingToolbarForegroundColor"
- android:textAllCaps="true" />
-
diff --git a/core/res/res/layout/resolver_list.xml b/core/res/res/layout/resolver_list.xml
index c4e8e9c..40c9941 100644
--- a/core/res/res/layout/resolver_list.xml
+++ b/core/res/res/layout/resolver_list.xml
@@ -45,7 +45,7 @@
android:textColor="?attr/colorAccent"
android:gravity="center_vertical"
android:layout_alignParentTop="true"
- android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:singleLine="true" />
<TextView
@@ -59,7 +59,7 @@
android:paddingEnd="?attr/dialogPreferredPadding"
android:paddingTop="8dp"
android:layout_below="@id/profile_button"
- android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:paddingBottom="8dp" />
</RelativeLayout>
diff --git a/core/res/res/layout/time_picker_text_input_material.xml b/core/res/res/layout/time_picker_text_input_material.xml
index f17b80e..632a4c1 100644
--- a/core/res/res/layout/time_picker_text_input_material.xml
+++ b/core/res/res/layout/time_picker_text_input_material.xml
@@ -77,7 +77,7 @@
android:layout_height="wrap_content"
android:layout_below="@id/input_hour"
android:layout_alignStart="@id/input_hour"
- android:textColor="?attr/textColorError"
+ android:textColor="?attr/colorError"
android:text="@string/time_picker_input_error" />
</RelativeLayout>
<Spinner
@@ -87,4 +87,4 @@
android:layout_alignBaseline="@id/input_block"
android:layout_alignParentEnd="true"/>
-</merge>
\ No newline at end of file
+</merge>
diff --git a/core/res/res/mipmap-hdpi/sym_def_app_icon_maskable.png b/core/res/res/mipmap-hdpi/sym_def_app_icon_maskable.png
new file mode 100644
index 0000000..bf58413
--- /dev/null
+++ b/core/res/res/mipmap-hdpi/sym_def_app_icon_maskable.png
Binary files differ
diff --git a/core/res/res/mipmap-ldpi/sym_def_app_icon_maskable.png b/core/res/res/mipmap-ldpi/sym_def_app_icon_maskable.png
new file mode 100644
index 0000000..3bf4285
--- /dev/null
+++ b/core/res/res/mipmap-ldpi/sym_def_app_icon_maskable.png
Binary files differ
diff --git a/core/res/res/mipmap-mdpi/sym_def_app_icon_maskable.png b/core/res/res/mipmap-mdpi/sym_def_app_icon_maskable.png
new file mode 100644
index 0000000..47f6f81
--- /dev/null
+++ b/core/res/res/mipmap-mdpi/sym_def_app_icon_maskable.png
Binary files differ
diff --git a/core/res/res/mipmap-xhdpi/sym_def_app_icon_maskable.png b/core/res/res/mipmap-xhdpi/sym_def_app_icon_maskable.png
new file mode 100644
index 0000000..f60b896
--- /dev/null
+++ b/core/res/res/mipmap-xhdpi/sym_def_app_icon_maskable.png
Binary files differ
diff --git a/core/res/res/mipmap-xxhdpi/sym_def_app_icon_maskable.png b/core/res/res/mipmap-xxhdpi/sym_def_app_icon_maskable.png
new file mode 100644
index 0000000..6d4f315
--- /dev/null
+++ b/core/res/res/mipmap-xxhdpi/sym_def_app_icon_maskable.png
Binary files differ
diff --git a/core/res/res/mipmap-xxxhdpi/sym_def_app_icon_maskable.png b/core/res/res/mipmap-xxxhdpi/sym_def_app_icon_maskable.png
new file mode 100644
index 0000000..08e54d0
--- /dev/null
+++ b/core/res/res/mipmap-xxxhdpi/sym_def_app_icon_maskable.png
Binary files differ
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 1022b13..c7696b0 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Laat die program toe om agtergrondprosesse van ander programme te beëindig. Dit kan moontlik veroorsaak dat ander programme ophou werk."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Hierdie program kan bo-op ander programme verskyn"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Hierdie program kan bokant ander programme of ander dele van die skerm verskyn. Dit kan met normale programgebruik inmeng en die voorkoms van ander programme verander."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"loop op die agtergrond"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Hierdie program kan op die agtergrond loop. Dit kan die battery vinniger laat pap word."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"gebruik data op die agtergrond"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Hierdie program kan data op die agtergrond gebruik. Dit kan die datagebruik vergroot."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"laat program altyd loop"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Laat die program toe om dele van ditself deurdringend in die geheue te hou. Dit kan geheue wat aan ander programme beskikbaar is, beperk, en die tablet stadiger maak."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Laat die program toe om dele van homself blywend in die berging te maak. Dit kan die berging wat beskikbaar is vir ander programme beperk, wat die TV stadiger sal maak."</string>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Invoermetode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksaksies"</string>
<string name="email" msgid="4560673117055050403">"E-pos"</string>
- <string name="dial" msgid="2275093056198652749">"Bel"</string>
+ <string name="dial" msgid="4204975095406423102">"Foon"</string>
<string name="map" msgid="5441053548030107189">"Kaart"</string>
+ <string name="browse" msgid="6079864138582486027">"Blaai"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tik om taal en uitleg te kies"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> teken oor ander programme"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g>-program verskyn bo-op."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Dele van hierdie program sal dalk altyd sigbaar wees. Skakel hierdie kenmerk af as dit nie reg werk nie."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Deel met <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Skyfievatsel. Raak en hou."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Sleep om te ontsluit."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Prop \'n kopfoon in om te hoor hoe wagwoordsleutels hardop gesê word."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punt."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navigeer tuis"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navigeer op"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Meer opsies"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Tik tyd in"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Skakel oor na teksmodus vir die tydinvoer."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Skakel oor na horlosiemodus vir die tydinvoer."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index fd75b35..a031ff8 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"መተግበሪያው የሌሎች መተግበሪያዎችን የጀርባ ሂደት እንዲያቆም ይፈቅድለታል። ይህ ሌሎች መተግበሪያዎች መሄድ እንዲያቆሙ ሊያደርግ ይችላል።"</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"ግቤት ስልት"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"የፅሁፍ እርምጃዎች"</string>
<string name="email" msgid="4560673117055050403">"ኢሜይል"</string>
- <string name="dial" msgid="2275093056198652749">"ደውል"</string>
+ <string name="dial" msgid="4204975095406423102">"ስልክ"</string>
<string name="map" msgid="5441053548030107189">"ካርታ"</string>
+ <string name="browse" msgid="6079864138582486027">"አስስ"</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>
@@ -1162,6 +1167,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> በሌሎች መተግበሪያዎች ላይ ሣል"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> መተግበሪያ ከላይ እየታየ ያለ።"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"የዚህ መተግበሪያ ክፍሎች በሁሉም ጊዜያት የሚታዩ እንደሆኑ ሊቆዩ ይችላሉ። ይህ ባህሪ በትክክል የማይሠራ ከሆነ ያጥፉት።"</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"ከ <xliff:g id="APPLICATION_NAME">%s</xliff:g> ጋር ተጋራ"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"ባለስላይድ መያዣ፡፡ ዳስ&ያዝ፡፡"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"ላለመቆለፍ አንሸራት፡፡"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"የይለፍ ቃል ቁልፎች ሲነገሩ ለመስማት የጆሮ ማዳመጫ ሰካ።"</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"ነጥብ."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"መነሻ ዳስስ"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"አስስ"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"ተጨማሪ አማራጮች"</string>
@@ -1701,4 +1708,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 1f81714..6d55ada 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -332,6 +332,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"للسماح للتطبيق بإنهاء عمليات التطبيقات الأخرى في الخلفية. وقد يؤدي هذا إلى توقف تطبيقات أخرى عن العمل."</string>
<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>
@@ -1032,8 +1036,9 @@
<string name="inputMethod" msgid="1653630062304567879">"طريقة الإرسال"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"إجراءات النص"</string>
<string name="email" msgid="4560673117055050403">"بريد إلكتروني"</string>
- <string name="dial" msgid="2275093056198652749">"طلب"</string>
+ <string name="dial" msgid="4204975095406423102">"الهاتف"</string>
<string name="map" msgid="5441053548030107189">"خريطة"</string>
+ <string name="browse" msgid="6079864138582486027">"تصفح"</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>
@@ -1242,6 +1247,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"انقر لاختيار لغة وتنسيق"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789 أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"يتم عرض <xliff:g id="NAME">%s</xliff:g> فوق التطبيقات الأخرى"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"يتم عرض تطبيق <xliff:g id="NAME">%s</xliff:g> فوق التطبيقات."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"قد تظل أجزاء من هذا التطبيق مرئية في جميع الأوقات. فإذا كانت هذه الميزة لا تعمل بشكل صحيح، يمكنك إيقافها."</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>
@@ -1400,8 +1409,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"مشاركة مع <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"مقبض التمرير. المس مع الاستمرار."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"مرر بسرعة لإلغاء التأمين."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"يمكنك توصيل سماعة رأس لسماع مفاتيح كلمة المرور عندما يتم نطقها."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"نقطة"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"التنقل إلى الشاشة الرئيسية"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"التنقل إلى أعلى"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"المزيد من الخيارات"</string>
@@ -1825,4 +1832,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 60c1ce5..07ea197 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Tətbiqə başqa tətbiqlərin arxafon proseslərini dayandırmaq icazəsi verir. Bu digər tətbiqlərin dayanmasına səbəb ola bilər."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Bu tətbiq digər tətbiqlərin üzərində görünə bilər"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Bu tətbiq digər tətbiqlərin və ya ekran hissələrinin üzərində görünə bilər. Bu, normal tətbiq istifadəsinə müdaxilə edə və digər tətbiqlərin görünüşünün dəyişməsinə səbəb ola bilər."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"arxa fonda işləmə"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Bu tətbiq arxa fonda işləsə, batareya daha tez qurtara bilər."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"datanın arxa fonda istifadəsi"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Bu tətbiq datanı arxa fonda istifadə etsə, data istifadəsi arta bilər."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"təbiqi həmişə çalışdır"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Tətbiqə öz komponentlərini yaddaşda saxlama icazəsi verir. Bu planşetin sürətini zəiflətməklə, digər tətbiqlər üçün mövcud olan yaddaşı limitləyə bilər."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Proqrama öz hissələrini yaddaşda davamlı etmək imkanı verir. Bu TV-ni zəiflədərək başqa proqramlar üçün mövcud olan yaddaşı məhdudlaşdıra bilər."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Yığım"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefon"</string>
<string name="map" msgid="5441053548030107189">"Xəritə"</string>
+ <string name="browse" msgid="6079864138582486027">"Axtarış"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dil və tərtibatı seçmək üçün tıklayın"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCÇDEƏFGĞHXIİJKQLMNOÖPRSŞTUÜVYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCÇDEƏFGĞHİIJKLMNOÖPQRSŞTUÜVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> digər tətbiqlərin üzərinə çəkilir"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> tətbiqi üstdə göstərilir."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Bu tətbiqin hissələri həmişə görünən qala bilər. Bu funksiya düzgün işləmirsə, onu deaktiv edin."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DEAKTİV EDİN"</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ilə paylaşın"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Sürüşən qulp. Toxunaraq basılı tutun."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Kilidi açmaq üçün vurun."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Parolların səsləndirilməsi üçün qulaqlıqları taxın."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Nöqtə."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Evə naviqasiya et"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Yuxarı gedin"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Digər variantlar"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Zamanı daxil edin"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Zamanı daxil etmək üçün mətnlə daxiletmə rejiminə keçin"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Zamanı daxil etmək üçün saat rejiminə keçin"</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 4d88979..894bd28 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -323,6 +323,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Dozvoljava aplikaciji da zaustavi pozadinske procese drugih aplikacija. Ovo može da zaustavi druge aplikacije."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Ova aplikacija može da se prikazuje preko drugih aplikacija"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Ova aplikacija može da se prikazuje preko drugih aplikacija ili drugih delova delova ekrana. To može da ometa standardno korišćenje aplikacija i način na koji se druge aplikacije prikazuju."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"pokretanje u pozadini"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Ova aplikacija može da se pokreće u pozadini. To može brže da istroši bateriju."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"korišćenje podataka u pozadini"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Ova aplikacija može da koristi podatke u pozadini. To može da poveća potrošnju podataka."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"omogućavanje neprekidne aktivnosti aplikacije"</string>
<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>
@@ -972,8 +976,9 @@
<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="dial" msgid="2275093056198652749">"Pozovi"</string>
+ <string name="dial" msgid="4204975095406423102">"Pozovi"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
+ <string name="browse" msgid="6079864138582486027">"Pregledaj"</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>
@@ -1182,6 +1187,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite da biste izabrali jezik i raspored"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Aplikacija <xliff:g id="NAME">%s</xliff:g> se prikazuje preko drugih aplikacija"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Aplikacija <xliff:g id="NAME">%s</xliff:g> se prikazuje preko."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Delovi ove aplikacije mogu da ostanu vidljivi u svakom trenutku. Ako ova funkcija ne radi ispravno, isključite 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>
@@ -1337,8 +1346,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Deli sa aplikacijom <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Klizna ručica. Dodirnite i zadržite."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Prevucite da biste otključali."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Priključite slušalice da biste čuli izgovorene tastere za lozinku."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Tačka."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Kretanje do Početne"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Kretanje nagore"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Još opcija"</string>
@@ -1732,4 +1739,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Unesite vreme"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Pređite u režim unosa teksta radi unosa vremena."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Pređite u režim sata radi unosa vremena."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index e6c18ae..d567c93 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -326,6 +326,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Дазваляе прыкладанню завяршаць фонавыя працэсы іншых прыкладанняў. Гэта можа спынiць працу iншых прыкладанняў."</string>
<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">"Дазваляе прыкладанню захоўваць некаторыя пастаянныя часткi ў памяцi. Гэта можа абмежаваць аб\'ём памяці, даступнай для іншых прыкладанняў, i запаволiць працу планшэта."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Дазваляе праграме пастаянна захоўваць некаторыя свае часткi ў памяцi. Гэта можа абмежаваць аб\'ём памяці, даступнай для іншых праграм, i запаволiць працу тэлевізара."</string>
@@ -992,8 +996,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Метад уводу"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Дзеянні з тэкстам"</string>
<string name="email" msgid="4560673117055050403">"Электронная пошта"</string>
- <string name="dial" msgid="2275093056198652749">"Набор нумара"</string>
+ <string name="dial" msgid="4204975095406423102">"Патэлефанаваць"</string>
<string name="map" msgid="5441053548030107189">"Карта"</string>
+ <string name="browse" msgid="6079864138582486027">"Праглядзець"</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>
@@ -1202,6 +1207,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Дакраніцеся, каб выбраць мову і раскладку"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" АБВГДЕЁЖЗІЙКЛМНОПРСТУЎФХЦЧШ\'ЫЬЭЮЯ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> паверх іншых праграм"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Праграма <xliff:g id="NAME">%s</xliff:g> паказваецца зверху."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Часткі гэтай праграмы могуць заставацца бачнымі ў любы час. Калі гэта функцыя не працуе належным чынам, адключыце яе."</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>
@@ -1358,8 +1367,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Адправiць з дапамогай прыкладання <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Ручка для перасоўвання. Націсніце і ўтрымлівайце."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Прагартайце, каб разблакаваць."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Каб праслухаць паролi, падключыце гарнiтуру."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Кропка."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Перайсці да пачатковай старонкі"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Перайсці ўверх"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Больш налад"</string>
@@ -1763,4 +1770,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index dd91b18..90d3bff 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Разрешава на приложението да прекратява намиращи се на заден план процеси на други приложения. Това може да доведе до спиране на тяхното изпълняване."</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Метод на въвеждане"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Действия с текста"</string>
<string name="email" msgid="4560673117055050403">"Имейл"</string>
- <string name="dial" msgid="2275093056198652749">"Набиране"</string>
+ <string name="dial" msgid="4204975095406423102">"Телефон"</string>
<string name="map" msgid="5441053548030107189">"Карта"</string>
+ <string name="browse" msgid="6079864138582486027">"Сърфиране"</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>
@@ -1162,6 +1167,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> се изобразява върху други приложения"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> се показва в/у други прилож."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Части от това приложение може да останат видими за постоянно. Ако функцията не работи правилно, изключете я."</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Споделяне със: <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Плъзгаща се дръжка. Докоснете и задръжте."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Прокарайте пръст, за да отключите."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Включете слушалки, за да чуете изговарянето на клавишите за паролата."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Точка."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Придвижване към „Начало“"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Придвижване нагоре"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Още опции"</string>
@@ -1701,4 +1708,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index c137334..1f5b0a1 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -163,7 +163,7 @@
<string name="httpErrorFile" msgid="2170788515052558676">"ফাইল অ্যাক্সেস করা যায়নি৷"</string>
<string name="httpErrorFileNotFound" msgid="6203856612042655084">"অনুরোধ করা ফাইলটি খুঁজে পাওয়া যায়নি৷"</string>
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"অনেকগুলি অনুরোধের প্রক্রিয়া করা হচ্ছে৷ পরে আবার চেষ্টা করুন৷"</string>
- <string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> এ প্রবেশ করুন ত্রুটি"</string>
+ <string name="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>
@@ -202,7 +202,7 @@
<string name="reboot_to_update_prepare" msgid="6305853831955310890">"আপডেট করতে প্রস্তুত হচ্ছে..."</string>
<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>
+ <string name="reboot_to_reset_title" msgid="4142355915340627490">"ফ্যাক্টরি ডেটা আবার সেট করুন"</string>
<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>
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"অন্যান্য অ্যাপ্লিকেশানগুলির নেপথ্যে চলা প্রক্রিয়াগুলির সমাপ্তি ঘটাতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷ এর ফলে অন্যান্য অ্যাপ্লিকেশানগুলি বন্ধ হয়ে যেতে পারে৷"</string>
<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>
@@ -443,7 +447,7 @@
<string name="permlab_nfc" msgid="4423351274757876953">"নিয়ার ফিল্ড কমিউনিকেশন নিয়ন্ত্রণ করে"</string>
<string name="permdesc_nfc" msgid="7120611819401789907">"অ্যাপ্লিকেশানকে নিয়ার ফিল্ড কমিউনিকেশন (NFC) ট্যাগ, কার্ড এবং রিডারগুলির সাথে যোগাযোগ করতে দেয়৷"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"আপনার স্ক্রীন লক অক্ষম করুন"</string>
- <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"কী-লক এবং যেকোনো সংশ্লিষ্ট পাসওয়ার্ড সুরক্ষা অক্ষম করতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷ উদাহরণস্বরূপ, একটি ইনকামিং ফোন কল গ্রহণ করার সময়ে ফোনটি কী-লক অক্ষম করে, তারপরে কল শেষ হয়ে গেলে কী-লকটিকে পুনরায় সক্ষম করে৷"</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"কী-লক এবং যেকোনো সংশ্লিষ্ট পাসওয়ার্ড সুরক্ষা অক্ষম করতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷ উদাহরণস্বরূপ, একটি ইনকামিং ফোন কল গ্রহণ করার সময়ে ফোনটি কী-লক অক্ষম করে, তারপরে কল শেষ হয়ে গেলে কী-লকটিকে আবার সক্ষম করে৷"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"আঙ্গুলের ছাপ নেওয়ার হার্ডওয়্যার পরিচালনা করুন"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"ব্যবহার করার জন্য আঙ্গুলের ছাপের টেম্প্লেটগুলি যোগ করা এবং মোছার পদ্ধতিগুলি গ্রহন করতে অ্যাপ্লিকেশানটিতে অমুমতি দেয়৷"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"আঙ্গুলের ছাপ নেওয়ার হার্ডওয়্যার ব্যবহার করুন"</string>
@@ -539,9 +543,9 @@
<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>
+ <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>
<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>
@@ -716,9 +720,9 @@
<string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"আপনি আপনার আনলকের প্যাটার্ন আঁকার ক্ষেত্রে <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল করেছেন৷ \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন৷"</string>
<string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"আপনি আপনার পাসওয়ার্ড <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল টাইপ করেছেন৷ \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন৷"</string>
<string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"আপনি আপনার পাসওয়ার্ড <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল টাইপ করেছেন৷ \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন৷"</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"আপনি <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল করে আপনার আনলক প্যাটার্ন অঙ্কিত করেছেন৷ আপনি <xliff:g id="NUMBER_1">%2$d</xliff:g>টি অসফল প্রচেষ্টার পরে, আপনাকে Google প্রবেশ করুন দিয়ে আপনার ট্যাবলেট আনলক করার কথা বলা হবে৷\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> সেকেন্ড পরে আবার চেষ্টা করুন৷"</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="5316664559603394684">"আপনি <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল করে আপনার আনলক প্যাটার্ন অঙ্কিত করেছেন৷ আপনি <xliff:g id="NUMBER_1">%2$d</xliff:g>টি অসফল প্রচেষ্টার পরে, আপনাকে Google প্রবেশ করুন দিয়ে আপনার টিভি আনলক করার কথা বলা হবে৷\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> সেকেন্ড পরে আবার চেষ্টা করুন৷"</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"আপনি <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল করে আপনার আনলক প্যাটার্ন অঙ্কিত করেছেন৷ আপনি <xliff:g id="NUMBER_1">%2$d</xliff:g>টি অসফল প্রচেষ্টার পরে, আপনাকে Google প্রবেশ করুন দিয়ে আপনার ফোন আনলক করার কথা বলা হবে৷\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> সেকেন্ড পরে আবার চেষ্টা করুন৷"</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"আপনি <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল করে আপনার আনলক প্যাটার্ন অঙ্কিত করেছেন৷ আপনি <xliff:g id="NUMBER_1">%2$d</xliff:g>টি অসফল প্রচেষ্টার পরে, আপনাকে Google এ প্রবেশ করে আপনার ট্যাবলেট আনলক করার কথা বলা হবে৷\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> সেকেন্ড পরে আবার চেষ্টা করুন৷"</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="5316664559603394684">"আপনি <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল করে আপনার আনলক প্যাটার্ন অঙ্কিত করেছেন৷ আপনি <xliff:g id="NUMBER_1">%2$d</xliff:g>টি অসফল প্রচেষ্টার পরে, আপনাকে Google এ প্রবেশ করে আপনার টিভি আনলক করার কথা বলা হবে৷\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> সেকেন্ড পরে আবার চেষ্টা করুন৷"</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"আপনি <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল করে আপনার আনলক প্যাটার্ন অঙ্কিত করেছেন৷ আপনি <xliff:g id="NUMBER_1">%2$d</xliff:g>টি অসফল প্রচেষ্টার পরে, আপনাকে Google এ প্রবেশ করে আপনার ফোন আনলক করার কথা বলা হবে৷\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> সেকেন্ড পরে আবার চেষ্টা করুন৷"</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"আপনি <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল করে ট্যাবলেটটি আনলক করার চেষ্টা করেছেন৷ আরো <xliff:g id="NUMBER_1">%2$d</xliff:g>টি অসফল চেষ্টার পরে, ট্যাবলেটটি ফ্যাক্টরী ডিফল্টে রিসেট হবে এবং ব্যবহারকারীর সমস্ত ডেটা মুছে যাবে৷"</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="950408382418270260">"আপনি <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল করে টিভি আনলক করার চেষ্টা করেছেন৷ <xliff:g id="NUMBER_1">%2$d</xliff:g>টি অসফল প্রচেষ্টার পরে, আপনার টিভি ফ্যাক্টরি ডিফল্টে পুনঃসেট হবে এবং সমস্ত ব্যবহারকারীর ডেটা মুছে যাবে৷"</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"আপনি <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল করে ফোনটি আনলক করার চেষ্টা করেছেন৷ আরো <xliff:g id="NUMBER_1">%2$d</xliff:g>টি অসফল চেষ্টার পরে, ফোনটি ফ্যাক্টরী ডিফল্টে রিসেট হবে এবং ব্যবহারকারীর সমস্ত ডেটা মুছে যাবে৷"</string>
@@ -729,7 +733,7 @@
<string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"প্যাটার্ন ভুলে গেছেন?"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"অ্যাকাউন্ট আনলক করুন"</string>
<string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"বিভিন্ন প্যাটার্নের সাহায্যে খুব বেশি বার প্রচেষ্টা করা হয়ে গেছে"</string>
- <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"আনলক করতে আপনার Google অ্যাকাউন্টের মাধ্যমে প্রবেশ করুন করুন৷"</string>
+ <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"আনলক করতে আপনার Google অ্যাকাউন্টের মাধ্যমে প্রবেশ করুন৷"</string>
<string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"ব্যবহারকারীনাম (ইমেল)"</string>
<string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"পাসওয়ার্ড"</string>
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"প্রবেশ করুন"</string>
@@ -945,18 +949,19 @@
<string name="copyUrl" msgid="2538211579596067402">"URL কপি করুন"</string>
<string name="selectTextMode" msgid="1018691815143165326">"পাঠ্য নির্বাচন করুন"</string>
<string name="undo" msgid="7905788502491742328">"পূর্বাবস্থায় ফিরুন"</string>
- <string name="redo" msgid="7759464876566803888">"পুনরায় করুন"</string>
+ <string name="redo" msgid="7759464876566803888">"আবার করুন"</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>
<string name="email" msgid="4560673117055050403">"ইমেল"</string>
- <string name="dial" msgid="2275093056198652749">"ডায়াল করুন"</string>
+ <string name="dial" msgid="4204975095406423102">"ফোন করুন"</string>
<string name="map" msgid="5441053548030107189">"মানচিত্র"</string>
+ <string name="browse" msgid="6079864138582486027">"ব্রাউজ করুন"</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>
+ <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"সিস্টেমের জন্য যথেষ্ট সঞ্চয়স্থান নেই৷ আপনার কাছে ২৫০MB ফাঁকা স্থান রয়েছে কিনা সে বিষয়ে নিশ্চিত হওয়ার পর আবার চালু করুন৷"</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>
<string name="ok" msgid="5970060430562524910">"ঠিক আছে"</string>
@@ -1163,6 +1168,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> অন্যান্য অ্যাপের উপরেও দেখা যায়"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> অ্যাপ সবার উপরে দেখা যাচ্ছে।"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"এই অ্যাপের কিছু কিছু অংশ সব সময় স্ক্রিনে দেখা যেতে পারে। যদি এই বৈশিষ্ট্যটি ঠিক ভাবে কাজ না করে, তাহলে অ্যাপটি বন্ধ করে দিন।"</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>
@@ -1181,7 +1190,7 @@
<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="5761133583368750174">"এই ডিভাইসটিকে আবার সন্নিবেশ করান"</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>
@@ -1250,7 +1259,7 @@
<string name="vpn_lockdown_config" msgid="5099330695245008680">"সেট আপ করতে আলতো চাপুন"</string>
<string name="upload_file" msgid="2897957172366730416">"ফাইল বেছে নিন"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"কোনো ফাইল নির্বাচন করা হয়নি"</string>
- <string name="reset" msgid="2448168080964209908">"পুনরায় সেট করুন"</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> এর সাথে শেয়ার করুন"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"স্লাইড নিয়ন্ত্রণ৷ স্পর্শ করুন ও ধরে রাখুন৷"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"আনলক করতে সোয়াইপ করুন৷"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"উচ্চারিত পাসওয়ার্ডের কীগুলি শোনার জন্য একটি হেডসেট সংযুক্ত করুন৷"</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"বিন্দু৷"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"হোম এ নেভিগেট করুন"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"উপরের দিকে নেভিগেট করুন"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"আরো বিকল্প"</string>
@@ -1412,7 +1419,7 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"সঠিক PUK কোড পুনরায় লিখুন৷ বার বার প্রচেষ্টা করা হলে তা স্থায়ীভাবে সিমটিকে অক্ষম করে দেবে৷"</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"পিন কোডগুলি মিলছে না"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"বিভিন্ন প্যাটার্নের সাহায্যে খুব বেশি বার প্রচেষ্টা করা হয়ে গেছে"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"আনলক করতে আপনার Google অ্যাকাউন্টের মাধ্যমে প্রবেশ করুন করুন৷"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"আনলক করতে আপনার Google অ্যাকাউন্টের মাধ্যমে প্রবেশ করুন৷"</string>
<string name="kg_login_username_hint" msgid="5718534272070920364">"ব্যবহারকারী নাম (ইমেল)"</string>
<string name="kg_login_password_hint" msgid="9057289103827298549">"পাসওয়ার্ড"</string>
<string name="kg_login_submit_button" msgid="5355904582674054702">"প্রবেশ করুন"</string>
@@ -1425,9 +1432,9 @@
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"আপনি আপনার ট্যাবলেট আনলকের প্রচেষ্টায় <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="tv" msgid="5621231220154419413">"আপনি <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="4051015943038199910">"আপনি আপনার ফোন আনলকের প্রচেষ্টায় <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="2072996269148483637">"আপনি আপনার ট্যাবলেট আনলকের প্রচেষ্টায় <xliff:g id="NUMBER">%d</xliff:g> বার ভুল করেছেন৷ ট্যাবলেটটি এখন ফ্যাক্টরি ডিফল্ট অনুযায়ী পুনরায় সেট করা হবে৷"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"আপনি আপনার ট্যাবলেট আনলকের প্রচেষ্টায় <xliff:g id="NUMBER">%d</xliff:g> বার ভুল করেছেন৷ ট্যাবলেটটি এখন ফ্যাক্টরি ডিফল্ট অনুযায়ী আবার সেট করা হবে৷"</string>
<string name="kg_failed_attempts_now_wiping" product="tv" msgid="4987878286750741463">"আপনি <xliff:g id="NUMBER">%d</xliff:g> বার ভুল করে টিভি আনলক করার চেষ্টা করেছেন৷ টিভি এখন ফ্যাক্টরি ডিফল্টে পুনঃসেট হবে৷"</string>
- <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"আপনি আপনার ফোন আনলকের প্রচেষ্টায় <xliff:g id="NUMBER">%d</xliff:g> বার ভুল করেছেন৷ ফোনটি এখন ফ্যাক্টরি ডিফল্ট অনুযায়ী পুনরায় সেট করা হবে৷"</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"আপনি আপনার ফোন আনলকের প্রচেষ্টায় <xliff:g id="NUMBER">%d</xliff:g> বার ভুল করেছেন৷ ফোনটি এখন ফ্যাক্টরি ডিফল্ট অনুযায়ী আবার সেট করা হবে৷"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"আপনি আপনার আনলকের প্যাটার্ন আঁকার ক্ষেত্রে <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="tv" msgid="4224651132862313471">"আপনি <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="1437638152015574839">"আপনি আপনার আনলকের প্যাটার্ন আঁকার ক্ষেত্রে <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>
@@ -1674,14 +1681,14 @@
<string name="unpin_target" msgid="3556545602439143442">"আনপিন করুন"</string>
<string name="app_info" msgid="6856026610594615344">"অ্যাপ্লিকেশানের তথ্য"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="reset_retail_demo_mode_title" msgid="2370249087943803584">"ডিভাইস পুনরায় সেট করবেন?"</string>
- <string name="reset_retail_demo_mode_text" msgid="5481925817590883246">"ডিভাইসটিকে পুনরায় সেট করতে আলতো চাপুন"</string>
+ <string name="reset_retail_demo_mode_title" msgid="2370249087943803584">"ডিভাইস আবার সেট করবেন?"</string>
+ <string name="reset_retail_demo_mode_text" msgid="5481925817590883246">"ডিভাইসটিকে আবার সেট করতে আলতো চাপুন"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"ডেমো শুরু করা হচ্ছে…"</string>
- <string name="demo_restarting_message" msgid="952118052531642451">"ডিভাইস পুনরায় সেট করা হচ্ছে…"</string>
- <string name="demo_user_inactivity_timeout_title" msgid="6596109959002331334">"ডিভাইস পুনরায় সেট করবেন?"</string>
+ <string name="demo_restarting_message" msgid="952118052531642451">"ডিভাইস আবার সেট করা হচ্ছে…"</string>
+ <string name="demo_user_inactivity_timeout_title" msgid="6596109959002331334">"ডিভাইস আবার সেট করবেন?"</string>
<string name="demo_user_inactivity_timeout_countdown" msgid="5675588824402569506">"আপনার করা যে কোনো পরিবর্তন মুছে যাবে এবং <xliff:g id="TIMEOUT">%1$s</xliff:g> সেকেন্ডের মধ্যে ডেমো আবার শুরু হবে…"</string>
<string name="demo_user_inactivity_timeout_left_button" msgid="5314271347014802475">"বাতিল করুন"</string>
- <string name="demo_user_inactivity_timeout_right_button" msgid="5019306703066964808">"এখনই পুনরায় সেট করুন"</string>
+ <string name="demo_user_inactivity_timeout_right_button" msgid="5019306703066964808">"এখনই আবার সেট করুন"</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>
@@ -1702,4 +1709,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 3f2e45e..d0017ad 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -323,6 +323,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Omogućava aplikaciji prekid pozadinskih procesa drugih aplikacija. Ovo može dovesti do prestanka rada drugih aplikacija."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Ova aplikacija se može pojaviti iznad drugih aplikacija"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Aplikacija se može pojaviti iznad ostalih aplikacija ili drugih dijelova ekrana. To može uticati na normalno korištenje aplikacije i promijeniti izgled drugih aplikacija."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"rad u pozadini"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Ova aplikacija može raditi u pozadini. To može brže istrošiti bateriju."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"prijenos podataka u pozadini"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Ova aplikacija može prenositi podatke u pozadini. To može povećati prijenos podataka."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"podešavanje aplikacije tako da je uvijek pokrenuta"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Omogućava aplikaciji da neke svoje dijelove pohrani trajno u memoriji. Ovo može ograničiti veličinu raspoložive memorije za druge aplikacije i tako usporiti tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Dozvoljava aplikaciji da jednim dijelom trajno ostaje u memoriji. Time se ostalim aplikacijama dostupna memorija može ograničiti te usporiti rad TV-a."</string>
@@ -972,8 +976,9 @@
<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="dial" msgid="2275093056198652749">"Biraj"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefon"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
+ <string name="browse" msgid="6079864138582486027">"Pretraži"</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>
@@ -1185,6 +1190,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite za odabir jezika i rasporeda"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prekriva ostale aplikacije"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Apl. <xliff:g id="NAME">%s</xliff:g> prikazana je na vrhu."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Dijelovi aplikacije mogu ostati vidljivi sve vrijeme. Ako ta funkcija ne radi ispravno, isključite je."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1340,8 +1349,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Podijeli koristeći aplikaciju <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Klizni regulator. Dodirnite & držite."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Prevucite za otključavanje ekrana."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Priključite slušalice kako biste čuli dugmad prilikom kucanja lozinke."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Tačka."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Vratite se na početnu stranicu"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navigirajte prema gore"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Više opcija"</string>
@@ -1735,4 +1742,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Upišite vrijeme"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Prebacite u način unosa teksta za unos vremena."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Prebacite u način rada kao sat za unos vremena."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 56a6252..2402232 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Permet que l\'aplicació finalitzi processos d\'altres aplicacions en segon pla. Aquesta acció pot fer que altres aplicacions deixin d\'executar-se."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Aquesta aplicació pot mostrar-se a sobre d\'altres aplicacions"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Aquesta aplicació pot mostrar-se a sobre d\'altres aplicacions o d\'altres parts de la pantalla. Això pot interferir en l\'ús normal de les aplicacions i alterar la manera en què es mostren."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"Executar en segon pla"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Aquesta aplicació es pot executar en segon pla. Això consumeix la bateria més ràpidament."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"Utilitzar dades en segon pla"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Aquesta aplicació utilitza dades en segon pla. Això incrementa l\'ús de dades."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"fes que l\'aplicació s\'executi sempre"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permet que l\'aplicació faci que parts de la seva memòria siguin persistents. Aquesta acció pot limitar la memòria disponible per a altres aplicacions i alentir la tauleta."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permet que l\'aplicació faci que parts de la seva memòria siguin persistents. Aquesta acció pot limitar la memòria disponible per a altres aplicacions i alentir el televisor."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Telèfon"</string>
+ <string name="dial" msgid="4204975095406423102">"Truca"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
+ <string name="browse" msgid="6079864138582486027">"Navega"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca per seleccionar l\'idioma i el disseny"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> se superposa a altres aplicacions"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"L\'aplicació <xliff:g id="NAME">%s</xliff:g> s\'està superposant."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Algunes parts d\'aquesta aplicació seran visibles en tot moment. Si aquesta funció presenta problemes, desactiva-la."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Comparteix amb <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Llisca el dit. Mantén premut."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Llisca el dit per desbloquejar."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Connecta un auricular per escoltar les claus de la contrasenya en veu alta."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punt."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Torna a la pàgina d\'inici"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Mou cap a dalt"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Més opcions"</string>
@@ -1693,7 +1700,7 @@
<string name="app_category_maps" msgid="5878491404538024367">"Mapes i navegació"</string>
<string name="app_category_productivity" msgid="3742083261781538852">"Productivitat"</string>
<string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"Emmagatzematge del dispositiu"</string>
- <string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"Depuració USB"</string>
+ <string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"Depuració per USB"</string>
<string name="time_picker_hour_label" msgid="2979075098868106450">"hora"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"minut"</string>
<string name="time_picker_header_text" msgid="143536825321922567">"Defineix l\'hora"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Escriu l\'hora"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Canvia al mode d\'introducció de text per introduir l\'hora."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Canvia al mode de rellotge per introduir l\'hora."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 5cb7122..7d59c43 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -326,6 +326,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Umožňuje aplikaci ukončit procesy na pozadí ostatních aplikací. Mohlo by dojít k zastavení ostatních aplikací."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Zobrazení přes ostatní aplikace"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Tato aplikace se může zobrazit přes ostatní aplikace a další části obrazovky. Může tak omezit použitelnost aplikací a změnit způsob jejich zobrazení."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"spuštění na pozadí"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Tato aplikace může být spuštěna na pozadí. Baterie se bude vybíjet rychleji."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"využití dat na pozadí"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Tato aplikace může využívat data na pozadí. Zvýší se využití dat."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"trvalé spuštění aplikace"</string>
<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>
@@ -992,8 +996,9 @@
<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="dial" msgid="2275093056198652749">"Vytočit"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefon"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
+ <string name="browse" msgid="6079864138582486027">"Procházet"</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>
@@ -1202,6 +1207,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Klepnutím vyberte jazyk a rozvržení"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Aplikace <xliff:g id="NAME">%s</xliff:g> se může vykreslovat přes ostatní aplikace"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Aplikace <xliff:g id="NAME">%s</xliff:g> se zobrazuje nahoře."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Části této aplikace mohou zůstat vždy viditelné. Pokud tato funkce nepracuje správně, vypněte ji."</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>
@@ -1358,8 +1367,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Sdílet s aplikací <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Posuvník. Dotkněte se a podržte."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Odemknete posunutím prstu."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Chcete-li slyšet, které klávesy jste při zadávání hesla stiskli, připojte sluchátka."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Tečka."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Přejít na plochu"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Přejít nahoru"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Další možnosti"</string>
@@ -1763,4 +1770,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Zadejte čas"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Chcete-li zadat čas, přepněte na režim textu."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Chcete-li zadat čas, přepněte na režim hodin."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 9bff925..c62cece 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Tillader, at appen kan afslutte baggrundsprocesser for andre apps. Dette kan forårsage, at andre apps holder op med at virke."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Denne app kan vises oven på andre apps"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Denne app kan vises oven på andre apps eller andre dele af skærmen. Dette kan forstyrre den normale brug af appen og ændre visningen af andre apps."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"kør i baggrunden"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Denne app kan køre i baggrunden. Dette kan aflade batteriet hurtigere."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"brug data i baggrunden"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Denne app kan bruge data i baggrunden. Dette kan øge dataforbruget."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"sørge for, at appen altid kører"</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Inputmetode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksthandlinger"</string>
<string name="email" msgid="4560673117055050403">"E-mail"</string>
- <string name="dial" msgid="2275093056198652749">"Ring op"</string>
+ <string name="dial" msgid="4204975095406423102">"Opkald"</string>
<string name="map" msgid="5441053548030107189">"Kort"</string>
+ <string name="browse" msgid="6079864138582486027">"Gennemse"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tryk for at vælge sprog og layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> vises over andre apps"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Appen <xliff:g id="NAME">%s</xliff:g> vises øverst."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Dele af denne app kan være synlig hele tiden. Deaktiver denne funktion, hvis den ikke fungerer korrekt."</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Del med <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Glidende håndtag. Tryk og hold nede."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Glid hurtigt henover for at låse op."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Tilslut et headset for at høre tasterne blive læst højt ved angivelse af adgangskode."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punktum."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Naviger hjem"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Naviger op"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Flere valgmuligheder"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Angiv klokkeslæt"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Skift til teksttilstand for at angive klokkeslæt."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Skift til urtilstand for at angive klokkeslæt."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 67d2d40f..4564231 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Ermöglicht der App, Hintergrundprozesse anderer Apps zu beenden. Das kann dazu führen, dass andere Apps nicht mehr ausgeführt werden."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"App kann über anderen Apps erscheinen"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Diese App kann über anderen Apps oder anderen Teilen des Bildschirms erscheinen. Dies kann sich auf die normale App-Nutzung und die Darstellung anderer Apps auswirken."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"Im Hintergrund ausführen"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Diese App kann im Hintergrund ausgeführt werden. Dadurch kann sich der Akku schneller entladen."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"Im Hintergrund Daten verwenden"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Diese App kann im Hintergrund Daten verwenden. Dadurch kann sich die Datennutzung erhöhen."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"App permanent ausführen"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Ermöglicht der App, Teile der eigenen App dauerhaft im Speicher abzulegen. Dies kann dazu führen, dass anderen Apps weniger Arbeitsspeicher zur Verfügung steht und das Tablet langsamer wird."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Ermöglicht der App, Teile der eigenen App dauerhaft im Speicher abzulegen. Dies kann dazu führen, dass anderen Apps weniger Arbeitsspeicher zur Verfügung steht und der Fernseher langsamer wird."</string>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Eingabemethode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Textaktionen"</string>
<string name="email" msgid="4560673117055050403">"E-Mail"</string>
- <string name="dial" msgid="2275093056198652749">"Wählen"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefon"</string>
<string name="map" msgid="5441053548030107189">"Karte"</string>
+ <string name="browse" msgid="6079864138582486027">"Stöbern"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Zum Auswählen von Sprache und Layout tippen"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> wird über anderen Apps eingeblendet"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Die App \"<xliff:g id="NAME">%s</xliff:g>\" wird über anderen Apps angezeigt."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Teile dieser App werden die ganze Zeit eingeblendet. Wenn diese Funktion nicht richtig funktioniert, deaktiviere sie."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Mit <xliff:g id="APPLICATION_NAME">%s</xliff:g> teilen"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Schieberegler: Berühren und halten"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Zum Entsperren den Finger über den Bildschirm ziehen"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Schließe ein Headset an, um das Passwort gesprochen zu hören."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punkt."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Zur Startseite navigieren"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Nach oben navigieren"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Weitere Optionen"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Uhrzeit eingeben"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"In den Texteingabemodus wechseln, um die Uhrzeit einzugeben."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"In den Uhrzeitmodus wechseln, um die Uhrzeit einzugeben."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index c8032e5..cd6c67b 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Επιτρέπει στην εφαρμογή τον τερματισμό των διεργασιών παρασκηνίου άλλων εφαρμογών. Αυτό μπορεί να προκαλεί τη διακοπή λειτουργίας άλλων εφαρμογών."</string>
<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">"Επιτρέπει στην εφαρμογή να δημιουργεί μόνιμα τμήματα του εαυτού της στη μνήμη. Αυτό μπορεί να περιορίζει τη μνήμη που διατίθεται σε άλλες εφαρμογές, καθυστερώντας τη λειτουργία του tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Επιτρέπει στην εφαρμογή να καθιστά τμήματά της μόνιμα στη μνήμη. Αυτό μπορεί να περιορίσει τη μνήμη που διατίθεται σε άλλες εφαρμογές, επιβραδύνοντας τη λειτουργία της τηλεόρασης."</string>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Μέθοδος εισόδου"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Ενέργειες κειμένου"</string>
<string name="email" msgid="4560673117055050403">"Ηλεκτρονικό ταχυδρομείο"</string>
- <string name="dial" msgid="2275093056198652749">"Κλήση"</string>
+ <string name="dial" msgid="4204975095406423102">"Τηλέφωνο"</string>
<string name="map" msgid="5441053548030107189">"Χάρτης"</string>
+ <string name="browse" msgid="6079864138582486027">"Αναζήτηση"</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>
@@ -1162,6 +1167,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Η εφαρμογή <xliff:g id="NAME">%s</xliff:g> επικάλυψε άλλες εφαρμογές"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Η εφαρμογή <xliff:g id="NAME">%s</xliff:g> επικαλύπτει άλλες."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Ορισμένα τμήματα αυτής της εφαρμογής μπορεί να παραμένουν συνεχώς ορατά. Εάν αυτή η λειτουργία δεν εκτελείται σωστά, απενεργοποιήστε την."</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Κοινή χρήση με <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Στοιχείο χειρισμού με δυνατότητα ολίσθησης. Αγγίξτε και πατήστε παρατεταμένα."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Σύρετε για ξεκλείδωμα."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Συνδέστε ακουστικά για να ακούσετε τα πλήκτρα του κωδικού πρόσβασης να εκφωνούνται."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Τελεία."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Πλοήγηση στην αρχική σελίδα"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Πλοήγηση προς τα επάνω"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Περισσότερες επιλογές"</string>
@@ -1701,4 +1708,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 0ae92b5..04f9537 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Allows the app to end background processes of other apps. This may cause other apps to stop running."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"This app can appear on top of other apps"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"This app can appear on top of other apps or other parts of the screen. This may interfere with normal app usage and change the way that other apps appear."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"run in the background"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"This app can run in the background. This may drain battery faster."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"use data in the background"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"This app can use data in the background. This may increase data usage."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"make app always run"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Allows the app to make parts of itself persistent in memory. This can limit the memory available to other apps, slowing down the tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Allows the app to make parts of itself persistent in memory. This can limit memory available to other apps slowing down the TV."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Dial"</string>
+ <string name="dial" msgid="4204975095406423102">"Phone"</string>
<string name="map" msgid="5441053548030107189">"Map"</string>
+ <string name="browse" msgid="6079864138582486027">"Browse"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap to select language and layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> draw over other apps"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> app displaying on top."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Parts of this app may remain visible at all times. If this feature isn\'t working correctly, turn it off."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Share with <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Sliding handle. Touch & hold."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Swipe to unlock."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Plug in a headset to hear password keys spoken."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Dot"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navigate home"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navigate up"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"More options"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Type in time"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Switch to text input mode for the time input."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Switch to clock mode for the time input."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 0ae92b5..04f9537 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Allows the app to end background processes of other apps. This may cause other apps to stop running."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"This app can appear on top of other apps"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"This app can appear on top of other apps or other parts of the screen. This may interfere with normal app usage and change the way that other apps appear."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"run in the background"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"This app can run in the background. This may drain battery faster."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"use data in the background"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"This app can use data in the background. This may increase data usage."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"make app always run"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Allows the app to make parts of itself persistent in memory. This can limit the memory available to other apps, slowing down the tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Allows the app to make parts of itself persistent in memory. This can limit memory available to other apps slowing down the TV."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Dial"</string>
+ <string name="dial" msgid="4204975095406423102">"Phone"</string>
<string name="map" msgid="5441053548030107189">"Map"</string>
+ <string name="browse" msgid="6079864138582486027">"Browse"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap to select language and layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> draw over other apps"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> app displaying on top."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Parts of this app may remain visible at all times. If this feature isn\'t working correctly, turn it off."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Share with <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Sliding handle. Touch & hold."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Swipe to unlock."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Plug in a headset to hear password keys spoken."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Dot"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navigate home"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navigate up"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"More options"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Type in time"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Switch to text input mode for the time input."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Switch to clock mode for the time input."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 0ae92b5..04f9537 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Allows the app to end background processes of other apps. This may cause other apps to stop running."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"This app can appear on top of other apps"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"This app can appear on top of other apps or other parts of the screen. This may interfere with normal app usage and change the way that other apps appear."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"run in the background"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"This app can run in the background. This may drain battery faster."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"use data in the background"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"This app can use data in the background. This may increase data usage."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"make app always run"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Allows the app to make parts of itself persistent in memory. This can limit the memory available to other apps, slowing down the tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Allows the app to make parts of itself persistent in memory. This can limit memory available to other apps slowing down the TV."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Dial"</string>
+ <string name="dial" msgid="4204975095406423102">"Phone"</string>
<string name="map" msgid="5441053548030107189">"Map"</string>
+ <string name="browse" msgid="6079864138582486027">"Browse"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap to select language and layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> draw over other apps"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> app displaying on top."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Parts of this app may remain visible at all times. If this feature isn\'t working correctly, turn it off."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Share with <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Sliding handle. Touch & hold."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Swipe to unlock."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Plug in a headset to hear password keys spoken."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Dot"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navigate home"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navigate up"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"More options"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Type in time"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Switch to text input mode for the time input."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Switch to clock mode for the time input."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index b9b6fc9..8aaa2ea 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Este permiso autoriza a la aplicación a interrumpir procesos en segundo plano de otras aplicaciones y puede hacer, por lo tanto, que esas aplicaciones dejen de ejecutarse."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Esta app puede superponerse a otras apps"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Esta app puede aparecer sobre otras apps o partes de la pantalla, lo que puede interferir con el uso normal de la app y cambiar la forma en que aparecen otras apps."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"ejecutarse en segundo plano"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Esta app puede ejecutarse en segundo plano, lo que podría agotar la batería más rápido."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"usar datos en segundo plano"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Esta app puede ejecutarse en segundo plano, lo que podría aumentar el uso de datos."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"hacer que la aplicación se ejecute siempre"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permite que la aplicación haga que algunas de sus partes se mantengan persistentes en la memoria. Esto puede limitar la memoria disponible para otras aplicaciones y ralentizar la tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permite que la aplicación cree partes de sí misma que queden en la memoria. Esta opción puede limitar la memoria disponible para otras aplicaciones y reducir la velocidad de la TV."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Marcar"</string>
+ <string name="dial" msgid="4204975095406423102">"Teléfono"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
+ <string name="browse" msgid="6079864138582486027">"Explorar"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Presiona para seleccionar el idioma y el diseño"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Es posible que ciertas partes de esta app permanezcan visibles todo el tiempo. Si esta función tiene problemas, desactívala."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Compartir con <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Mantén presionado el controlador deslizante."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Desliza el dedo para desbloquear."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Conecta un auricular para escuchar las contraseñas."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punto"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Desplazarse hasta la página principal"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Desplazarse hacia arriba"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Más opciones"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Ingresa la hora"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Cambia al modo de entrada de texto para ingresar la hora."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Cambia al modo de reloj para ingresar la hora."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 9cb770c..0ce96e7 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Este permiso autoriza a la aplicación a interrumpir procesos en segundo plano de otras aplicaciones y puede hacer, por tanto, que esas aplicaciones dejen de ejecutarse."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Esta aplicación puede aparecer sobre otras aplicaciones"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Esta aplicación puede aparecer sobre otras aplicaciones u otras partes de la pantalla. Esto puede interferir con el uso normal de las aplicaciones y cambiar la forma en la que estas aparecen."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"ejecutarse en segundo plano"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Esta aplicación puede ejecutarse en segundo plano, pero es posible que la batería se agote más rápido."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"utilizar datos en segundo plano"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Esta aplicación puede utilizar datos en segundo plano, pero es posible que aumente el uso de datos."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"hacer que la aplicación se ejecute siempre"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permite que la aplicación haga que algunas de sus partes se mantengan en la memoria. Esto puede limitar la cantidad de memoria disponible para otras aplicaciones y ralentizar el tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permite que la aplicación haga que algunas partes de sí misma queden persistentes en la memoria. Esto puede limitar la memoria disponible para otras aplicaciones, lo que podría ralentizar la TV."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Marcar"</string>
+ <string name="dial" msgid="4204975095406423102">"Teléfono"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
+ <string name="browse" msgid="6079864138582486027">"Explorar"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca para seleccionar el idioma y el diseño"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras aplicaciones"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> se muestra en primer plano."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Es posible que algunas partes de esta aplicación permanezcan visibles en todo momento. Desactiva esta función si no funciona correctamente."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Compartir con <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Mantén pulsado el icono de desbloqueo y deslízalo."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Desliza el dedo para desbloquear."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Conecta un auricular para escuchar las contraseñas."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punto"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Ir al escritorio"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Desplazarse hacia arriba"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Más opciones"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Escribe la hora"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Cambia al modo de introducción de texto para escribir la hora."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Cambia al modo de reloj para escribir la hora."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index f77fdcf..27cd957 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Võimaldab rakendusel lõpetada teiste rakenduste taustaprotsesse. See võib peatada teiste rakenduste töö."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"See rakendus võidakse kuvada teiste rakenduste peal"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"See rakendus võidakse kuvada teiste rakenduste või muude ekraani osade peal. See võib häirida tavapärast rakenduste kasutust ja muuta seda, kuidas teisi rakendusi kuvatakse."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"taustal käitamine"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Seda rakendust saab taustal käitada. See võib kiiremini akut kulutada."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"andmete taustal kasutamine"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"See rakendus saab andmeid taustal kasutada. See võib suurendada andmekasutust."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"Rakenduste pidev töös hoidmine"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Võimaldab rakendusel muuta oma osi mälus püsivaks. See võib piirata teistele (tahvelarvutit aeglasemaks muutvatele) rakendustele saadaolevat mälu."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Lubab rakendusel muuta enda osasid mälus püsiüksusteks. See võib piirata teistele rakendustele saadaolevat mälumahtu ja muuta teleri aeglasemaks."</string>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Sisestusmeetod"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tekstitoimingud"</string>
<string name="email" msgid="4560673117055050403">"E-post"</string>
- <string name="dial" msgid="2275093056198652749">"Helistamine"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefon"</string>
<string name="map" msgid="5441053548030107189">"Kaart"</string>
+ <string name="browse" msgid="6079864138582486027">"Sirvimine"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Puudutage keele ja paigutuse valimiseks"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Rakendus <xliff:g id="NAME">%s</xliff:g> joonistab teiste rakenduste peale"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Rakend. <xliff:g id="NAME">%s</xliff:g> kuvatakse kõige peal."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Selle rakenduse osad võivad alati nähtaval olla. Kui see funktsioon ei tööta korralikult, lülitage see välja."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Jaga rakendusega <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Libistamispide. Puudutage ja hoidke all."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Avamiseks tõmmake sõrmega."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Paroolide kuulamiseks ühendage peakomplekt."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punkt."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Liigu avalehele"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Liigu üles"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Rohkem valikuid"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Sisestage kellaaeg"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Aktiveerige kellaaja sisestamiseks tekstisisestusrežiim."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Aktiveerige kellaaja sisestamiseks kellarežiim."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 99fafec..5fb9998 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Beste aplikazioen atzeko planoko prozesuak amaitzeko baimena ematen die aplikazioei. Horrela, agian aplikazio batzuk exekutatzeari utziko zaio."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Agertu beste aplikazio batzuen gainean"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Beste aplikazio batzuen edo pantailako beste zati batzuen gainean ager daiteke aplikazioa. Aplikazioaren funtzionamendu normala oztopa dezake eta beste aplikazio batzuen itxura alda dezake."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"atzeko planoan exekutatu"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Atzeko planoan exekuta liteke aplikazioa eta horrek bizkorrago agor lezake bateria."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"atzeko planoan datuak erabili"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Aplikazioak datuak erabil litzake atzeko planoan eta horrek datuen erabilera areago lezake."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"Izan aplikazioa beti abian"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta tableta motel daiteke."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Beren zati batzuk memorian modu iraunkorrean aktibo uztea baimentzen die aplikazioei. Horrela, beste aplikazioek memoria gutxiago izan lezakete erabilgarri eta telebistak motelago funtziona lezake."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Telefonoa"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefonoa"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
+ <string name="browse" msgid="6079864138582486027">"Arakatu"</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>
@@ -1163,6 +1168,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Hizkuntza eta diseinua hautatzeko, sakatu hau"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> zerbitzuak beste aplikazio batzuk gainjarri ditu pantailan"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> gainjarri da pantailan."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Aplikazioaren atal batzuk ikusgai gera litezke uneoro. Eginbideak behar bezala funtzionatzen ez badu, desaktiba ezazu."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Partekatu <xliff:g id="APPLICATION_NAME">%s</xliff:g> aplikazioarekin"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Lerratze-euskarria. Ukitu eta eutsi."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Pasatu hatza desblokeatzeko."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Konektatu entzungailua pasahitzaren teklak ozen entzuteko."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Puntu."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Nabigatu orri nagusira"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Nabigatu gora"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Aukera gehiago"</string>
@@ -1702,4 +1709,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Idatzi ordua"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Aldatu testu modura ordua zehazteko."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Aldatu erloju modura ordua zehazteko."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 3ca8051..51eb178 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"به برنامه امکان میدهد به فرآیندهای پسزمینه سایر برنامهها پایان دهد. این ممکن است باعث شود سایر برنامهها متوقف شوند."</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"روش ورودی"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"عملکردهای متنی"</string>
<string name="email" msgid="4560673117055050403">"رایانامه"</string>
- <string name="dial" msgid="2275093056198652749">"شمارهگیری"</string>
+ <string name="dial" msgid="4204975095406423102">"تلفن"</string>
<string name="map" msgid="5441053548030107189">"نقشه"</string>
+ <string name="browse" msgid="6079864138582486027">"مرور"</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>
@@ -1162,6 +1167,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"نمایش <xliff:g id="NAME">%s</xliff:g> روی برنامههای دیگر"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"نمایش برنامه <xliff:g id="NAME">%s</xliff:g> در بالا."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"ممکن است قسمتهایی از این برنامه همیشه قابل مشاهده بمانند. اگر این قابلیت بهدرستی کار نمیکند، آن را خاموش کنید."</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"اشتراکگذاری با <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"اهرم کنترل حرکت. لمس کرده و نگهدارید."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"برای بازگشایی قفل، بلغزانید."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"برای شنیدن کلیدهای گذرواژه که با صدای بلند خوانده میشوند، هدست را وصل کنید."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"نقطه."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"رفتن به صفحهٔ اصلی"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"حرکت به بالا"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"سایر گزینهها"</string>
@@ -1701,4 +1708,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index dafb9c9..87f3214 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Antaa sovelluksen sulkea muiden sovelluksien taustaprosesseja. Tämä voi sulkea muita sovelluksia."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Tämä sovellus voi näkyä muiden sovellusten päällä"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Tämä sovellus voi näkyä muiden sovellusten tai näytön muiden osien päällä. Tämä voi häiritä sovellusten tavallista käyttöä ja muuttaa tapaa, jolla muut sovellukset näkyvät."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"toimia taustalla"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Tämä sovellus voi toimia taustalla. Tämä saattaa kuluttaa enemmän akkua."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"käyttää dataa taustalla"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Tämä sovellus voi käyttää dataa taustalla. Tämä saattaa lisätä datankulutusta."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"sovelluksen asettaminen aina käynnissä olevaksi"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Antaa sovelluksen lisätä omia osiaan muistiin pysyvästi. Tämä voi rajoittaa muiden sovellusten käytettävissä olevaa muistia ja hidastaa tablet-laitteen toimintaa."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Antaa sovelluksen lisätä omia osiaan pysyvästi muistiin. Tämä voi rajoittaa muiden sovellusten käytettävissä olevaa muistia ja hidastaa television toimintaa."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Puhelu"</string>
+ <string name="dial" msgid="4204975095406423102">"Puhelin"</string>
<string name="map" msgid="5441053548030107189">"Kartta"</string>
+ <string name="browse" msgid="6079864138582486027">"Selaa"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Valitse kieli ja asettelu koskettamalla."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> piirtää muiden sovellusten päälle"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Sovellus <xliff:g id="NAME">%s</xliff:g> näkyy päällä"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Osia sovelluksesta voi olla aina näkyvissä. Jos ominaisuus ei toimi oikein, poista se käytöstä."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Jaa sovelluksessa <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Liukuva valitsin. Kosketa pitkään."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Poista lukitus liu\'uttamalla."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Liitä kuulokkeet kuullaksesi, mitä näppäimiä painat kirjoittaessasi salasanaa."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Piste."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Siirry etusivulle"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Siirry ylös"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Lisää asetuksia"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Kirjoita aika"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Vaihda ajan syöttämiseen tekstitilassa."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Vaihda ajan syöttämiseen kellotilassa."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 473fc85..7b05c74 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Permet à l\'application de mettre fin aux processus d\'autres applications exécutés en arrière-plan. Cette autorisation peut interrompre l\'exécution d\'autres applications."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Cette application peut s\'afficher par-dessus d\'autres applications"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Cette application peut s\'afficher par-dessus d\'autres applications ou parties de l\'écran. Cela pourrait interférer avec l\'utilisation normale des applications et modifier la manière dont les autres applications s\'affichent à l\'écran."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"fonctionner en arrière-plan"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Cette application peut fonctionner en arrière-plan. Cela risque d\'épuiser la pile plus rapidement."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"utiliser des données en arrière-plan"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Cette application peut utiliser des données en arrière-plan. Cela risque d\'augmenter l\'utilisation des données."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"exécuter l\'application en continu"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permet à l\'application de rendre certains de ces composants persistants dans la mémoire. Cette autorisation peut limiter la mémoire disponible pour d\'autres applications et ralentir la tablette."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permet à l\'application de placer certaines de ses parties en permanence dans la mémoire. Cela peut limiter la mémoire disponible pour les autres applications et ralentir le téléviseur."</string>
@@ -952,8 +956,9 @@
<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>
- <string name="dial" msgid="2275093056198652749">"Composer"</string>
+ <string name="dial" msgid="4204975095406423102">"Téléphone"</string>
<string name="map" msgid="5441053548030107189">"Carte"</string>
+ <string name="browse" msgid="6079864138582486027">"Parcourir"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Touchez pour sélectionner la langue et la configuration du clavier"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> se superpose aux autres applications"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> s\'affiche par-dessus les autres"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Certaines parties de cette application restent visibles en tout temps. Si cette option ne fonctionne pas correctement, désactivez-la."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Partager avec <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Poignée coulissante. Appuyez de manière prolongée."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Faites glisser votre doigt pour déverrouiller l\'appareil."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Branchez des écouteurs pour entendre l\'énoncé des touches lors de la saisie du mot de passe."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Point."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Revenir à l\'accueil"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Revenir en haut de la page"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Plus d\'options"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Entrez l\'heure"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Passer au mode Entrée de texte pour entrer l\'heure."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Passer au mode Horloge pour entrer l\'heure."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 2ad6096..40172d0 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Permet à l\'application de mettre fin aux processus d\'autres applications exécutés en arrière-plan. Cette autorisation peut interrompre l\'exécution d\'autres applications."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Cette application peut se superposer à d\'autres applications"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Cette application peut se superposer à d\'autres applications ou à d\'autres parties de l\'écran. Cela peut altérer l\'utilisation normale des applications et modifier l\'apparence des autres applications."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"s\'exécuter en arrière-plan"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Cette application peut s\'exécuter en arrière-plan, ce qui risque d\'épuiser la batterie plus rapidement."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"consommer des données en arrière-plan"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Cette application peut utiliser des données en arrière-plan, ce qui risque d\'augmenter la consommation des données."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"exécuter l\'application en continu"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permet à l\'application de rendre certains de ces composants persistants dans la mémoire. Cette autorisation peut limiter la mémoire disponible pour d\'autres applications et ralentir la tablette."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permet à l\'application d\'activer la persistance de certains de ces composants dans la mémoire. Cette fonctionnalité peut limiter l\'espace mémoire disponible pour les autres applications et ralentir ainsi le téléviseur."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Composer"</string>
+ <string name="dial" msgid="4204975095406423102">"Téléphone"</string>
<string name="map" msgid="5441053548030107189">"Carte"</string>
+ <string name="browse" msgid="6079864138582486027">"Parcourir"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Appuyer pour sélectionner la langue et la disposition"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> se superpose aux autres applications"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Superposition de l\'application <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Certaines sections de cette application peuvent rester visibles en permanence. Si cette fonctionnalité ne s\'exécute pas correctement, désactivez-la."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Partager avec <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Poignée coulissante. Appuyez de manière prolongée."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Faites glisser votre doigt pour déverrouiller l\'appareil."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Branchez des écouteurs pour entendre l\'énoncé des touches lors de la saisie du mot de passe."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Point."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Retour à l\'accueil"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Parcourir vers le haut"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Plus d\'options"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Indiquez l\'heure"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Passer en mode saisie de texte pour la saisie de l\'heure."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Passer en mode horloge pour la saisie de l\'heure."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 1f95bc5..0e024b4 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Permite á aplicación finalizar procesos en segundo plano doutras aplicacións. É posible que esta acción provoque que outras aplicacións deixen de funcionar."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Esta aplicación pode aparecer sobre outras"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Esta aplicación pode aparecer sobre outras aplicacións ou outras partes da pantalla, polo que é posible que interfira no uso normal das aplicacións e modifique a forma en que se mostran."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"executar en segundo plano"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Esta aplicación pode executarse en segundo plano. Por este motivo, quizais se esgote antes a batería."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"usar datos en segundo plano"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Esta aplicación pode usar datos en segundo plano. Por este motivo, quizais aumente o uso de datos."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"facer que a aplicación se execute sempre"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permite á aplicación converter partes súas como persistentes na memoria. Esta acción pode limitar a cantidade memoria dispoñible para outras aplicacións e reducir a velocidade de funcionamento da tableta."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permite que a aplicación faga que algunhas das súas partes se manteñan na memoria. Esta acción pode limitar a cantidade de memoria dispoñible para outras aplicacións e reducir a velocidade da televisión."</string>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Accións de texto"</string>
<string name="email" msgid="4560673117055050403">"Correo electrónico"</string>
- <string name="dial" msgid="2275093056198652749">"Marcador"</string>
+ <string name="dial" msgid="4204975095406423102">"Teléfono"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
+ <string name="browse" msgid="6079864138582486027">"Examinar"</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>
@@ -1163,6 +1168,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca para seleccionar o idioma e o deseño"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> superponse a outras aplicacións"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"A aplicación <xliff:g id="NAME">%s</xliff:g> móstrase enriba."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Partes desta aplicación poden permanecer visibles en todo momento. Se esta función non traballa correctamente, desactívaa."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Compartir con <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Mantén premida a icona de desbloqueo e pasa o dedo por ela."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Pasa o dedo para desbloquear."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Conecta uns auriculares para escoitar as teclas do contrasinal pronunciadas."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punto"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Ir ao inicio"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Ir para arriba"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Máis opcións"</string>
@@ -1702,4 +1709,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Escribe a hora"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Cambia ao modo de entrada de texto para introducir a hora."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Cambiar ao modo de reloxo para introducir a hora."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 9c394cf..511a843 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"એપ્લિકેશનને અન્ય ઍપ્લિકેશનોની પૃષ્ઠભૂમિ પ્રક્રિયા સમાપ્ત કરવાની મંજૂરી આપે છે. આનાથી અન્ય ઍપ્લિકેશનો ચાલવાથી બંધ થઈ શકે છે."</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"ઇનપુટ પદ્ધતિ"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"ટેક્સ્ટ ક્રિયાઓ"</string>
<string name="email" msgid="4560673117055050403">"ઇમેઇલ"</string>
- <string name="dial" msgid="2275093056198652749">"ડાયલ કરો"</string>
+ <string name="dial" msgid="4204975095406423102">"ફોન"</string>
<string name="map" msgid="5441053548030107189">"નકશો"</string>
+ <string name="browse" msgid="6079864138582486027">"બ્રાઉઝ કરો"</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>
@@ -1163,6 +1168,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> અન્ય ઍપ્લિકેશનો પર ડ્રો કરે છે"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> ઍપ્લિકેશન સૌથી ઉપર દેખાઈ રહી છે."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"આ ઍપ્લિકેશનના ભાગ હંમેશાં દૃશ્યક્ષમ રહી શકે છે. જો આ સુવિધા યોગ્ય રીતે કાર્ય કરી રહી ન હોય, તો તેને બંધ કરો."</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> સાથે શેર કરો"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"સ્લાઇડિંગ હેન્ડલ. ટચ કરો અને પકડો."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"અનલૉક કરવા માટે સ્વાઇપ કરો."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"પાસવર્ડ કીઝ બોલાતી સાંભળવા માટે હેડસેટ પ્લગ ઇન કરો."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"ડોટ."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"હોમ પર નેવિગેટ કરો"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"ઉપર નેવિગેટ કરો"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"વધુ વિકલ્પો"</string>
@@ -1702,4 +1709,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 4ac25e2..0a5d130 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -148,7 +148,7 @@
<string name="fcComplete" msgid="3118848230966886575">"सुविधा कोड पूर्ण."</string>
<string name="fcError" msgid="3327560126588500777">"कनेक्शन समस्या या अमान्य सुविधा कोड."</string>
<string name="httpErrorOk" msgid="1191919378083472204">"ठीक है"</string>
- <string name="httpError" msgid="7956392511146698522">"कोई नेटवर्क त्रुटि हुई थी."</string>
+ <string name="httpError" msgid="7956392511146698522">"कोई नेटवर्क गड़बड़ी हुई थी."</string>
<string name="httpErrorLookup" msgid="4711687456111963163">"URL नहीं मिल सका."</string>
<string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"साइट प्रमाणीकरण योजना समर्थित नहीं है."</string>
<string name="httpErrorAuth" msgid="1435065629438044534">"प्रमाणीकृत नहीं किया जा सका."</string>
@@ -163,7 +163,7 @@
<string name="httpErrorFile" msgid="2170788515052558676">"फ़ाइल पर नहीं पहुंचा जा सका."</string>
<string name="httpErrorFileNotFound" msgid="6203856612042655084">"अनुरोधित फ़ाइल नहीं मिल सकी."</string>
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"बहुत सारे अनुरोधों का संसाधन हो रहा है. बाद में पुन: प्रयास करें."</string>
- <string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> के लिए प्रवेश त्रुटि"</string>
+ <string name="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>
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"ऐप्स को अन्य ऐप्स की पृष्ठभूमि प्रक्रियाओं को समाप्त करने देता है. यह अन्य ऐप्स का चलना रोक सकता है."</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"इनपुट विधि"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"लेख क्रियाएं"</string>
<string name="email" msgid="4560673117055050403">"ईमेल करें"</string>
- <string name="dial" msgid="2275093056198652749">"डायल करें"</string>
+ <string name="dial" msgid="4204975095406423102">"फ़ोन"</string>
<string name="map" msgid="5441053548030107189">"मानचित्र"</string>
+ <string name="browse" msgid="6079864138582486027">"ब्राउज़ करें"</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>
@@ -1162,6 +1167,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> दूसरे ऐप पर आरेखण करते हैं"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> ऐप ऊपर दिखा रहा है."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"हो सकता है कि इस ऐप के कुछ हिस्से हर समय दृश्यमान रहें. अगर यह सुविधा ठीक तरह से काम नहीं कर रही है, तो इसे बंद कर दें."</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>
@@ -1245,7 +1254,7 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"हमेशा-चालू VPN कनेक्ट हो रहा है…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"हमेशा-चालू VPN कनेक्ट है"</string>
<string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"हमेशा-चालू VPN डिस्कनेक्ट है"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"हमेशा-चालू VPN त्रुटि"</string>
+ <string name="vpn_lockdown_error" msgid="6009249814034708175">"हमेशा-चालू VPN गड़बड़ी"</string>
<string name="vpn_lockdown_config" msgid="5099330695245008680">"सेट करने के लिए टैप करें"</string>
<string name="upload_file" msgid="2897957172366730416">"फ़ाइल चुनें"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"कोई फ़ाइल चुनी नहीं गई"</string>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> के साथ साझा करें"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"स्लाइडिंग हैंडल. स्पर्श करके रखें."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"अनलॉक करने के लिए स्वाइप करें."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"बोली गईं पासवर्ड कुंजियां सुनने के लिए हेडसेट प्लग इन करें."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"बिंदु."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"होम पर नेविगेट करें"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"ऊपर नेविगेट करें"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"अधिक विकल्प"</string>
@@ -1443,7 +1450,7 @@
<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>
+ <string name="error_message_title" msgid="4510373083082500195">"गड़बड़ी"</string>
<string name="error_message_change_not_allowed" msgid="1347282344200417578">"यह बदलाव आपके व्यवस्थापक द्वारा अनुमत नहीं है"</string>
<string name="app_not_found" msgid="3429141853498927379">"इस कार्यवाही को प्रबंधित करने के लिए कोई ऐप्स नहीं मिला"</string>
<string name="revoke" msgid="5404479185228271586">"निरस्त करें"</string>
@@ -1531,7 +1538,7 @@
<string name="mediasize_unknown_portrait" msgid="3088043641616409762">"अज्ञात पोर्ट्रेट"</string>
<string name="mediasize_unknown_landscape" msgid="4876995327029361552">"अज्ञात लैंडस्केप"</string>
<string name="write_fail_reason_cancelled" msgid="7091258378121627624">"रद्द कर दी गई"</string>
- <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"सामग्री लिखने में त्रुटि"</string>
+ <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"सामग्री लिखने में गड़बड़ी"</string>
<string name="reason_unknown" msgid="6048913880184628119">"अज्ञात"</string>
<string name="reason_service_unavailable" msgid="7824008732243903268">"प्रिंट सेवा सक्षम नहीं है"</string>
<string name="print_service_installed_title" msgid="2246317169444081628">"<xliff:g id="NAME">%s</xliff:g> सेवा इंस्टॉल की गई"</string>
@@ -1622,8 +1629,8 @@
<string name="zen_mode_default_weekends_name" msgid="2786495801019345244">"सप्ताहांत"</string>
<string name="zen_mode_default_events_name" msgid="8158334939013085363">"इवेंट"</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="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>
@@ -1701,4 +1708,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index d4bc343..89058a5 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -323,6 +323,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Aplikaciji omogućuje završavanje pozadinskih procesa drugih aplikacija. To može dovesti do prekida rada drugih aplikacija."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Aplikacija se može prikazivati povrh drugih aplikacija"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Aplikacija se može prikazivati povrh drugih aplikacija ili drugih dijelova zaslona. To može omesti uobičajenu upotrebu aplikacija i promijeniti način prikaza drugih aplikacija."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"izvoditi se u pozadini"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Aplikacija se može izvoditi u pozadini. To može brže trošiti bateriju."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"upotrebljavati podatke u pozadini"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Aplikacija može upotrebljavati podatke u pozadini. To može povećati potrošnju podataka."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"trajni rad aplikacije"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Aplikaciji omogućuje trajnu prisutnost nekih njenih dijelova u memoriji. To može ograničiti dostupnost memorije drugim aplikacijama i usporiti tabletno računalo."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Aplikaciji omogućuje trajnu ugradnju nekih svojih dijelova u memoriju. To može ograničiti memoriju raspoloživu drugim aplikacijama i usporiti televizor."</string>
@@ -972,8 +976,9 @@
<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="dial" msgid="2275093056198652749">"Biraj"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefon"</string>
<string name="map" msgid="5441053548030107189">"Karta"</string>
+ <string name="browse" msgid="6079864138582486027">"Pregledaj"</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>
@@ -1182,6 +1187,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite da biste odabrali jezik i raspored"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prikazuje se preko drugih aplikacija"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prikazuje se gore."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Dijelovi ove aplikacije mogu ostati vidljivi cijelo vrijeme. Ako ta značajka ne funkcionira pravilno, isključite je."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1337,8 +1346,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Dijeli s aplikacijom <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Klizna ručka. Dodirnite i držite."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Prijeđite prstima da biste otključali."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Priključite slušalice kako biste čuli izgovaranje tipki zaporke."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Točka."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Kreni na početnu"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Kreni gore"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Više opcija"</string>
@@ -1732,4 +1739,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Unesite vrijeme"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Prijeđite na način unosa teksta da biste unijeli vrijeme."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Prijeđite na način rada sata da biste unijeli vrijeme."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 9fd17e5..a4028ee 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Lehetővé teszi az alkalmazás számára, hogy megszüntesse más alkalmazások háttérben zajló folyamatait. Így előfordulhat, hogy egyes alkalmazások bezárulnak."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Az alkalmazás megjelenhet más alkalmazások fölött"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Az alkalmazás megjelenhet más alkalmazások fölött vagy a képernyő más részein. Ez befolyásolhatja a megszokott alkalmazáshasználatot, és módosíthatja más alkalmazások megjelenésének módját."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"futás a háttérben"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Ez az alkalmazás futhat a háttérben. Ez gyorsabban merítheti az akkumulátort."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"adathasználat a háttérben"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Ez az alkalmazás használhat adatkapcsolatot a háttérben. Ez növelheti az adathasználatot."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"az alkalmazás állandó futtatása"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Lehetővé teszi az alkalmazás számára, hogy egyes részeit állandó jelleggel eltárolja a memóriában. Ez korlátozhatja a többi alkalmazás számára rendelkezésre álló memóriát, és lelassíthatja a táblagépet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Lehetővé teszi az alkalmazás számára azt, hogy egyes részeit állandóan a memóriában tartsa. Ez korlátozhatja a többi alkalmazás számára elérhető memóriát, ezáltal lelassulhat a tévé."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Tárcsázás"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefon"</string>
<string name="map" msgid="5441053548030107189">"Térkép"</string>
+ <string name="browse" msgid="6079864138582486027">"Böngészés"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Koppintson a nyelv és a billentyűzetkiosztás kiválasztásához"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"A(z) <xliff:g id="NAME">%s</xliff:g> a többi alkalmazás felett jelenik meg"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"A(z) <xliff:g id="NAME">%s</xliff:g> legfelül jelenik meg."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Előfordulhat, hogy ezen alkalmazás egyes részei mindig láthatók maradnak. Ha ez a funkció nem működik megfelelően, kapcsolja ki."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Ossza meg a következő alkalmazással: <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Csúsztatható fogantyú. Érintse meg és tartsa."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"A feloldásához húzza végig az ujját."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Csatlakoztasson egy fülhallgatót, ha hallani szeretné a jelszó betűit felolvasva."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Pont."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Ugrás a főoldalra"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Felfele mozgás"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"További lehetőségek"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Adja meg az időt"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Időbevitelhez váltson szövegbeviteli módba."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Időbevitelhez váltson óramódba."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 51f6fe2..ad375eb 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Թույլ է տալիս հավելվածին վերջ տալ այլ հավելվածների հետնաշերտի գործընթացները: Սա կարող է պատճառ դառնալ, որ այլ հավելվածները դադարեն աշխատել:"</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Մուտքագրման եղանակը"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Տեքստի գործողությունները"</string>
<string name="email" msgid="4560673117055050403">"Էլփոստ"</string>
- <string name="dial" msgid="2275093056198652749">"Համարհավաքել"</string>
+ <string name="dial" msgid="4204975095406423102">"Հեռախոս"</string>
<string name="map" msgid="5441053548030107189">"Քարտեզ"</string>
+ <string name="browse" msgid="6079864138582486027">"Բացել"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Հպեք՝ լեզուն և դասավորությունն ընտրելու համար"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՈՒՓՔԵւՕՖ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> ցուցադրել այլ հավելվածների վերևում"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> հավելվածը ցուցադրվում է վերևում։"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Այս հավելվածի որոշ հատվածներ կարող են միշտ տեսանելի լինել։ Եթե այս գործառույթն ինչպես հարկն է չի աշխատում, անջատեք այն։"</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Կիսվել <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ի հետ"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Սահող բռնակ: Հպել & պահել:"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Սահեցրեք` ապակողպելու համար:"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Միացրեք ականջակալները` արտասանվող գաղտնաբառը լսելու համար:"</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Կետ:"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Ուղղվել տուն"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Ուղղվել վերև"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Ավելի շատ ընտրանքներ"</string>
@@ -1701,4 +1708,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 6363c6b..ab32838 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Memungkinkan aplikasi mengakhiri proses latar belakang aplikasi lain. Izin ini dapat menyebabkan aplikasi lain berhenti berjalan."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Aplikasi ini dapat muncul di atas aplikasi lain"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Aplikasi ini dapat muncul di atas aplikasi lain atau bagian lain pada layar. Ini dapat mengganggu penggunaan aplikasi biasa dan mengubah kemunculan aplikasi lainnya."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"jalankan di latar belakang"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Aplikasi ini dapat berjalan di latar belakang. Dapat menghabiskan baterai lebih cepat."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"gunakan data di latar belakang"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Aplikasi ini dapat menggunakan data di latar belakang. Dapat meningkatkan penggunaan data."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"membuat apl selalu berjalan"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Memungkinkan aplikasi membuat bagian dari dirinya sendiri terus-menerus berada dalam memori. Izin ini dapat membatasi memori yang tersedia untuk aplikasi lain sehingga menjadikan tablet lambat."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Mengizinkan aplikasi untuk membuat bagian dirinya tetap berada dalam memori. Izin ini dapat membatasi memori yang tersedia untuk aplikasi lain yang membuat TV menjadi lambat."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Telepon"</string>
+ <string name="dial" msgid="4204975095406423102">"Telepon"</string>
<string name="map" msgid="5441053548030107189">"Peta"</string>
+ <string name="browse" msgid="6079864138582486027">"Buka browser"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ketuk untuk memilih bahasa dan tata letak"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> muncul di atas aplikasi lain"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Aplikasi <xliff:g id="NAME">%s</xliff:g> muncul di atas."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Sebagian aplikasi ini mungkin selalu terlihat. Jika fitur ini tidak berfungsi dengan baik, nonaktifkan."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Berbagi dengan <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Gagang geser. Sentuh & tahan."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Gesek untuk membuka kunci."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Pasang headset untuk mendengar tombol sandi yang diucapkan."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Titik."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navigasi ke beranda"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navigasi naik"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Opsi lainnya"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Ketik waktu"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Beralih ke mode masukan teks untuk masukan waktu."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Beralih ke mode jam untuk masukan waktu."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 2085854..3cbc17e 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Leyfir forriti að loka bakgrunnsferlum annarra forrita. Þetta getur valdið því að önnur forrit lokist."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Þetta forrit getur birst yfir öðrum forritum"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Þetta forrit getur birst yfir öðrum forritum eða öðrum hlutum skjásins. Þetta getur truflað venjulega notkun forrita og breytt því hvernig önnur forrit birtast."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"keyra í bakgrunni"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Þetta forrit getur verið í gangi í bakgrunni. Þetta gæti aukið á rafhlöðunotkunina."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"nota gögn í bakgrunni"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Þetta forrit getur notað gagnamagn í bakgrunni. Þetta gæti aukið notkun gagnamagns."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"láta forrit keyra stöðugt"</string>
<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>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Hringja"</string>
+ <string name="dial" msgid="4204975095406423102">"Sími"</string>
<string name="map" msgid="5441053548030107189">"Kort"</string>
+ <string name="browse" msgid="6079864138582486027">"Vafri"</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>
@@ -1163,6 +1168,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ýttu til að velja tungumál og útlit"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁBCDÐEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AÁBCDÐEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> teiknar yfir önnur forrit"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> forritið birtist efst."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Hluti af þessu forriti gæti verið ávallt sýnilegur. Ef þessi eiginleiki virkar ekki sem skyldi skaltu slökkva á honum."</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Deila með <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Sleði. Snertu og haltu."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Strjúktu til að opna."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Tengdu heyrnartól til að heyra stafi aðgangsorðsins lesna upphátt."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punktur."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Fara heim"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Fara upp"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Fleiri valkostir"</string>
@@ -1702,4 +1709,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Færðu inn tíma"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Skipta yfir í textastillingu til að færa inn tíma."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Skipta yfir í klukkustillingu til að færa inn tíma."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 8d0ee79b..89b0113 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Consente all\'applicazione di terminare i processi in background di altre applicazioni. Ciò potrebbe causare l\'interruzione di altre applicazioni."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Questa app può essere visualizzata sopra ad altre app"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Questa app può essere visualizzata sopra ad altre app o altre parti dello schermo. Ciò potrebbe interferire con il normale utilizzo dell\'app e modificare la modalità di visualizzazione delle altre app."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"esecuzione in background"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Questa app può essere eseguita in background, velocizzando il consumo della batteria."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"utilizzo dei dati in background"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Questa app può usare dati in background, aumentando l\'utilizzo dei dati."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"esecuzione permanente delle applicazioni"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Consente all\'applicazione di rendere persistenti in memoria alcune sue parti. Ciò può limitare la memoria disponibile per altre applicazioni, rallentando il tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Consente all\'app di rendere alcune sue parti persistenti nella memoria. Potrebbe così essere limitata la memoria a disposizione di altre app ed essere rallentata la TV."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Componi"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefono"</string>
<string name="map" msgid="5441053548030107189">"Mappa"</string>
+ <string name="browse" msgid="6079864138582486027">"Sfoglia"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tocca per selezionare la lingua e il layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> visualizzata sopra altre app"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"App <xliff:g id="NAME">%s</xliff:g> visualizzata sulle altre."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Alcune parti di questa app possono rimanere sempre visibili. Disattiva la funzione qualora non funzionasse correttamente."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Condividi con <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Maniglia scorrevole. Tocca e tieni premuto."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Fai scorrere per sbloccare."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Collega gli auricolari per ascoltare la pronuncia dei tasti premuti per la password."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punto."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Vai alla home page"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Vai in alto"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Altre opzioni"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Digita l\'ora"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Passa alla modalità di immissione testo per inserire l\'ora."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Passa alla modalità orologio per inserire l\'ora."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 64f76d04..c6e02d2 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -326,6 +326,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"מאפשר לאפליקציה להפסיק תהליכים ברקע המבוצעים על ידי אפליקציות אחרות. הדבר עשוי לגרום להפסקת פעולתם של אפליקציות אחרות."</string>
<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>
@@ -992,8 +996,9 @@
<string name="inputMethod" msgid="1653630062304567879">"שיטת קלט"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"פעולות טקסט"</string>
<string name="email" msgid="4560673117055050403">"אימייל"</string>
- <string name="dial" msgid="2275093056198652749">"חייג"</string>
+ <string name="dial" msgid="4204975095406423102">"טלפון"</string>
<string name="map" msgid="5441053548030107189">"מפה"</string>
+ <string name="browse" msgid="6079864138582486027">"דפדף"</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>
@@ -1202,6 +1207,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> יכולה להופיע מעל אפליקציות אחרות"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> מופיעה מעל אפליקציות אחרות."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"חלקים באפליקציה הזו עשויים להופיע במסך כל הזמן. כבה את התכונה הזו אם היא לא עובדת כראוי."</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>
@@ -1358,8 +1367,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"שתף עם <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"ידית להחלקה. גע והחזק."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"החלק לביטול נעילה."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"חבר אוזניות כדי לשמוע הקראה של מפתחות סיסמה."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"נקודה."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"נווט לדף הבית"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"נווט למעלה"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"אפשרויות נוספות"</string>
@@ -1763,4 +1770,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index dbb4048..857999f 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -296,8 +296,8 @@
<string name="permdesc_receiveSms" msgid="6424387754228766939">"SMSメッセージの受信と処理をアプリに許可します。これにより、アプリが端末に届いたメッセージを表示することなく監視または削除できるようになります。"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"テキストメッセージ(MMS)の受信"</string>
<string name="permdesc_receiveMms" msgid="533019437263212260">"MMSメッセージの受信と処理をアプリに許可します。これにより、アプリが端末に届いたメッセージを表示することなく監視または削除できるようになります。"</string>
- <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"緊急警報SMSの読み取り"</string>
- <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"端末で受信した緊急警報SMSの読み取りをアプリに許可します。緊急警報は、緊急事態を警告する目的で一部の地域に配信されます。緊急警報の受信時に、悪意のあるアプリによって端末の動作や処理が妨害される恐れがあります。"</string>
+ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"緊急速報メール SMS の読み取り"</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"端末で受信した緊急速報メール SMS の読み取りをアプリに許可します。緊急速報メールは、緊急事態を警告する目的で一部の地域に配信されます。緊急速報メールの受信時に、悪意のあるアプリによって端末の動作や処理が妨害される恐れがあります。"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"登録したフィードの読み取り"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"現在同期されているフィードの詳細を取得することをアプリに許可します。"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMSメッセージの送信と表示"</string>
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"他のアプリのバックグラウンドプロセスを終了することをアプリに許可します。これを許可すると、他のアプリの実行が停止する原因になることがあります。"</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"入力方法"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"テキスト操作"</string>
<string name="email" msgid="4560673117055050403">"メール"</string>
- <string name="dial" msgid="2275093056198652749">"発信"</string>
+ <string name="dial" msgid="4204975095406423102">"電話"</string>
<string name="map" msgid="5441053548030107189">"地図"</string>
+ <string name="browse" msgid="6079864138582486027">"ブラウジング"</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>
@@ -1162,6 +1167,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g>を他のアプリの上に重ねて表示"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g>を重ねて表示中"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"このアプリの一部は常に表示され続けます。この機能が正常に動作しない場合は OFF にしてください。"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>と共有"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"スライダーハンドルです。押し続けます。"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"ロック解除するにはスワイプします。"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"パスワードのキーが音声出力されるのでヘッドセットを接続してください。"</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"ドット。"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"ホームへ移動"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"上へ移動"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"その他のオプション"</string>
@@ -1701,4 +1708,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 5bb36b1..5d970b6 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"აპს შეეძლება, დაასრულოს სხვა აპების ფონური პროცესები. ამან შეიძლება სხვა აპების შეჩერება გამოიწვიოს."</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"შეყვანის მეთოდი"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"ქმედებები ტექსტზე"</string>
<string name="email" msgid="4560673117055050403">"ელფოსტა"</string>
- <string name="dial" msgid="2275093056198652749">"დარეკვა"</string>
+ <string name="dial" msgid="4204975095406423102">"ტელეფონი"</string>
<string name="map" msgid="5441053548030107189">"რუკა"</string>
+ <string name="browse" msgid="6079864138582486027">"მოძიება"</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>
@@ -1162,6 +1167,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g>-ის სხვა აპების ინტერფეისზე გადაწერა"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> აპის მიერ ზემოდან ჩვენება."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"აპის გარკვეული ნაწილები შესაძლოა ყოველთვის ხილული იყოს. თუ ეს ფუნქცია გამართულად არ მუშაობს, გამორთეთ."</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"გაუზიარეთ <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ს"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"გასრიალებით მართვა. შეეხეთ & არ აუშვათ."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"განბლოკვისათვის გადაფურცლეთ"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"შეაერთედ ყურსასმენები, პაროლის ღილაკები რომ გაიგოთ."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"წერტილი."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"მთავარზე ნავიგაცია"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"ზემოთ ნავიგაცია"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"მეტი ვარიანტები"</string>
@@ -1701,4 +1708,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index b2fbaef..3e77e9c 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Қолданбаға басқа қолданбалардың артқы шеп үрдістерін тоқтату мүмкіндігін береді. Бұл басқа қолданбалардың жұмысын тоқтатуы мүмкін."</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Енгізу әдісі"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Мәтін әрекеттері"</string>
<string name="email" msgid="4560673117055050403">"Электрондық пошта"</string>
- <string name="dial" msgid="2275093056198652749">"Теру"</string>
+ <string name="dial" msgid="4204975095406423102">"Телефон"</string>
<string name="map" msgid="5441053548030107189">"Map"</string>
+ <string name="browse" msgid="6079864138582486027">"Шолу"</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>
@@ -1163,6 +1168,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> басқа қолданбалардың үстінен көрсетіледі"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> қолданбасы жоғарғы жағында көрсетіледі."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Бұл қолданбаның бір бөлігі үнемі көрініп тұруы мүмкін. Егер бұл функция дұрыс жұмыс істемесе, оны өшіріңіз."</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> қолданбасымен бөлісу"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Сырғитын тұтқа. Түртіп, ұстап тұрыңыз."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Бекітпесін ашу үшін сипап өтіңіз."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Құпия сөз пернелерін есту үшін құлақаспапты қосыңыз."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Нүкте."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Негізгі бетте жылжу"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Жоғары қарай жылжу"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Басқа опциялар"</string>
@@ -1702,4 +1709,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index ffa6867..e07bc41 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"ឲ្យកម្មវិធីបញ្ឈប់ដំណើរការផ្ទៃខាងក្រោយនៃកម្មវិធីផ្សេងៗ។ វាអាចធ្វើឲ្យកម្មវិធីផ្សេងឈប់ដំណើរការ។"</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"វិធីសាស្ត្របញ្ចូល"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"សកម្មភាពអត្ថបទ"</string>
<string name="email" msgid="4560673117055050403">"អ៊ីមែល"</string>
- <string name="dial" msgid="2275093056198652749">"ហៅទូរសព្ទ"</string>
+ <string name="dial" msgid="4204975095406423102">"ទូរសព្ទ"</string>
<string name="map" msgid="5441053548030107189">"ផែនទី"</string>
+ <string name="browse" msgid="6079864138582486027">"រុករក"</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>
@@ -1164,6 +1169,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> គូរពីលើកម្មវិធីផ្សេងទៀត"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"កម្មវិធី <xliff:g id="NAME">%s</xliff:g> បង្ហាញនៅលើគេ។"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"ផ្នែកខ្លះនៃកម្មវិធីនេះនឹងនៅតែអាចមើលឃើញបានគ្រប់ពេល។ ប្រសិនបើមុខងារនេះដំណើរការមិនប្រក្រតីទេ សូមបិទវា។"</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>
@@ -1318,8 +1327,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"ចែករំលែកជាមួយ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"គ្រប់គ្រងការរុញ។ ប៉ះ & សង្កត់។"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"អូស ដើម្បីដោះសោ។"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"ដោតកាសដើម្បីស្ដាប់ពាក្យសម្ងាត់បាននិយាយ។"</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Dot."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"រកមើលទៅដើម"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"រកមើលឡើងលើ"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"ជម្រើសច្រើនទៀត"</string>
@@ -1703,4 +1710,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 1dc8a32..2fedb79 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಹಿನ್ನೆಲೆ ಪ್ರಕ್ರಿಯೆಗಳನ್ನು ಅಂತ್ಯಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಚಾಲನೆಯನ್ನು ನಿಲ್ಲಿಸುವುದಕ್ಕೆ ಕಾರಣವಾಗಬಹುದು."</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"ಇನ್ಪುಟ್ ವಿಧಾನ"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"ಪಠ್ಯದ ಕ್ರಮಗಳು"</string>
<string name="email" msgid="4560673117055050403">"ಇಮೇಲ್"</string>
- <string name="dial" msgid="2275093056198652749">"ಡಯಲ್"</string>
+ <string name="dial" msgid="4204975095406423102">"ಫೋನ್"</string>
<string name="map" msgid="5441053548030107189">"ನಕ್ಷೆ"</string>
+ <string name="browse" msgid="6079864138582486027">"ಬ್ರೌಸ್ ಮಾಡಿ"</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>
@@ -1163,6 +1168,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಮೇಲೆ <xliff:g id="NAME">%s</xliff:g> ಎಳೆಯಿರಿ"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> ಅಪ್ಲಿಕೇಶನ್ ಮೇಲೆ ಕಾಣಿಸುತ್ತಿದೆ."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"ಈ ಅಪ್ಲಿಕೇಶನ್ನ ಭಾಗಗಳು ಎಲ್ಲ ಸಮಯದಲ್ಲೂ ಕಾಣುತ್ತಿರುತ್ತದೆ. ಈ ವೈಶಿಷ್ಟ್ಯವು ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡದಿದ್ದರೆ, ಆಫ್ ಮಾಡಿ."</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ನೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"ಸ್ಲೈಡಿಂಗ್ ಹ್ಯಾಂಡಲ್. ಸ್ಪರ್ಶಿಸಿ & ಇರಿಸಿ."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಸ್ವೈಪ್ ಮಾಡಿ."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"ಹೇಳಲಾಗುವ ಪಾಸ್ವರ್ಡ್ ಕೀಗಳನ್ನು ಆಲಿಸಲು ಹೆಡ್ಸೆಟ್ ಪ್ಲಗ್ ಇನ್ ಮಾಡಿ."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"ಡಾಟ್."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"ಮುಖಪುಟ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"ಮೇಲಕ್ಕೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು"</string>
@@ -1695,18 +1702,25 @@
<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>
- <!-- no translation found for time_picker_hour_label (2979075098868106450) -->
+ <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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
<skip />
- <!-- no translation found for time_picker_minute_label (5168864173796598399) -->
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
<skip />
- <!-- no translation found for time_picker_header_text (143536825321922567) -->
+ <!-- no translation found for autofill_save_yes (6398026094049005921) -->
<skip />
- <!-- no translation found for time_picker_input_error (7574999942502513765) -->
+ <!-- no translation found for autofill_save_no (2625132258725581787) -->
<skip />
- <!-- no translation found for time_picker_prompt_label (7588093983899966783) -->
+ <!-- no translation found for autofill_save_type_password (5288448918465971568) -->
<skip />
- <!-- no translation found for time_picker_text_input_mode_description (4148166758173708199) -->
+ <!-- no translation found for autofill_save_type_address (4936707762193009542) -->
<skip />
- <!-- no translation found for time_picker_radial_mode_description (4953403779779557198) -->
+ <!-- no translation found for autofill_save_type_credit_card (7127694776265563071) -->
<skip />
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 20e99bc..22d6dc6 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"앱이 다른 앱의 백그라운드 프로세스를 종료할 수 있도록 허용합니다. 이 경우 다른 앱이 실행 중지될 수 있습니다."</string>
<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">"앱이 메모리를 지속적으로 사용할 수 있도록 허용합니다. 이는 TV의 속도를 늦춰 다른 앱에서 사용할 수 있는 메모리를 제한할 수 있습니다."</string>
@@ -372,8 +376,8 @@
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"앱이 음량이나 출력을 위해 사용하는 스피커 등 전체 오디오 설정을 변경할 수 있도록 허용합니다."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"오디오 녹음"</string>
<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_sim_communication" msgid="2935852302216852065">"SIM 카드로 명령 전송"</string>
+ <string name="permdesc_sim_communication" msgid="5725159654279639498">"앱이 SIM에 명령어를 전송할 수 있도록 허용합니다. 이 기능은 매우 신중히 허용해야 합니다."</string>
<string name="permlab_camera" msgid="3616391919559751192">"사진과 동영상 찍기"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"이 앱은 언제든지 카메라를 사용하여 사진을 촬영하고 동영상을 녹화할 수 있습니다."</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"진동 제어"</string>
@@ -490,7 +494,7 @@
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"통화 화면과 상호작용"</string>
<string name="permdesc_bind_incall_service" msgid="8343471381323215005">"앱에서 사용자가 통화 화면을 보는 시기와 방법을 제어하도록 허용합니다."</string>
<string name="permlab_bind_connection_service" msgid="3557341439297014940">"전화 서비스와 상호 작용"</string>
- <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"앱을 전화 서비스와 상호 작용하도록 허용하여 전화를 송수신하세요."</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"앱에서 전화 서비스와 상호 작용하여 전화를 받거나 걸 수 있습니다."</string>
<string name="permlab_control_incall_experience" msgid="9061024437607777619">"통화 사용자 경험 제공"</string>
<string name="permdesc_control_incall_experience" msgid="915159066039828124">"앱에서 통화 사용자 경험을 제공하도록 허용합니다."</string>
<string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"이전 네트워크 사용량 읽기"</string>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"입력 방법"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"텍스트 작업"</string>
<string name="email" msgid="4560673117055050403">"이메일"</string>
- <string name="dial" msgid="2275093056198652749">"전화걸기"</string>
+ <string name="dial" msgid="4204975095406423102">"전화"</string>
<string name="map" msgid="5441053548030107189">"지도"</string>
+ <string name="browse" msgid="6079864138582486027">"탐색"</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>
@@ -1162,6 +1167,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g>이(가) 다른 앱 위에 표시됨"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> 앱이 상단에 표시됨"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"이 앱의 일부는 항상 표시될 수도 있습니다. 기능이 제대로 작동되지 않으면 사용 중지하세요."</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>와(과) 공유"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"슬라이딩 핸들을 길게 터치하세요."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"스와이프하여 잠급니다."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"비밀번호 키를 음성으로 들으려면 헤드셋을 연결하세요."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"점"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"홈 탐색"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"위로 탐색"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"옵션 더보기"</string>
@@ -1701,4 +1708,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 4285bd6..99d0ffd 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Колдонмого башка колдонмолордун фондо иштеп жаткан процесстерин токтотуу уруксатын берет. Бул башка колдонмолордун иштебей калышына алып келиши мүмкүн."</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Киргизүү ыкмасы"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Текст боюнча иштер"</string>
<string name="email" msgid="4560673117055050403">"Электрондук почта"</string>
- <string name="dial" msgid="2275093056198652749">"Терүү"</string>
+ <string name="dial" msgid="4204975095406423102">"Телефон"</string>
<string name="map" msgid="5441053548030107189">"Карта"</string>
+ <string name="browse" msgid="6079864138582486027">"Карап чыгуу"</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>
@@ -1163,6 +1168,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> колдонмосун башка терезелердин үстүнөн көрсөтүү"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> колд-сун эң үстүндө көрсөтүү"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Бул колдонмонун бөлүктөрү дайыма көрүнүп турушу мүмкүн. Эгер бул функция туура иштебесе, аны өчүрүп коюңуз."</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> менен бөлүшүү"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Сүрүү туткасы. Коё бербей & тийип туруңуз."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Бөгөттөн чыгарыш үчүн сүртүңүз."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Айтылган сырсөз белгилерин угуш үчүн, кулакчын туташтырыңыз."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Чекит."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Башкы бетке чабыттоо"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Жогору чабыттоо"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Дагы параметрлер"</string>
@@ -1702,4 +1709,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 0facaaa..654d8e6 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"ອະນຸຍາດໃຫ້ແອັບຯປິດໂປຣເຊສພື້ນຫຼັງຂອງແອັບຯອື່ນໄດ້. ນີ້ອາດເຮັດໃຫ້ແອັບຯອື່ນນັ້ນຢຸດການເຮັດວຽກໄປນຳ."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"This app can appear on top of other apps"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"This app can appear on top of other apps or other parts of the screen. This may interfere with normal app usage and change the way that other apps appear."</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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"ຮູບແບບການປ້ອນຂໍ້ມູນ"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"ການເຮັດວຽກຂອງຂໍ້ຄວາມ"</string>
<string name="email" msgid="4560673117055050403">"ອີເມວ"</string>
- <string name="dial" msgid="2275093056198652749">"ໂທອອກ"</string>
+ <string name="dial" msgid="4204975095406423102">"ໂທລະສັບ"</string>
<string name="map" msgid="5441053548030107189">"ແຜນທີ່"</string>
+ <string name="browse" msgid="6079864138582486027">"ເລືອກເບິ່ງ"</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>
@@ -1162,6 +1167,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> ແຕ້ມທັບແອັບອື່ນ"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"ແອັບ <xliff:g id="NAME">%s</xliff:g> ກຳລັງສະແດງຢູ່ໜ້າສຸດ."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"ບາງພາກສ່ວນຂອງແອັບນີ້ຈະປາກົດຢູ່ຕະຫຼອດເວລາ. ຫາກຄຸນສົມບັດນີ້ໃຊ້ໄດ້ບໍ່ດີ, ໃຫ້ປິດມັນໄວ້."</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"ແບ່ງປັນໃຫ້ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"ເລື່ອນບ່ອນຖື ແລ້ວແຕະຄ້າງໄວ້."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"ປັດເພື່ອປົດລັອກ."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"ສຽບສາຍຫູຟັງເພື່ອຟັງລະຫັດຜ່ານ."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"ຈໍ້າເມັດ."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"ກັບໄປໜ້າຫຼັກ"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"ຂຶ້ນເທິງ"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"ໂຕເລືອກອື່ນ"</string>
@@ -1701,4 +1708,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 5691706..f808a99 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -326,6 +326,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Leidžiama programai baigti kitų programų fone vykdomus procesus. Dėl to gali būti sustabdytos kitos programos."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Ši programa gali būti rodoma virš kitų programų"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Ši programa gali būti rodoma virš kitų programų arba kitų ekrano sričių. Tai gali trukdyti įprastai naudoti programas ir pakeisti kitų programų rodymo būdą."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"vykdyti fone"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Ši programa gali būti vykdoma fone. Dėl to akumuliatorius gali būti greičiau išeikvojamas."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"naudoti duomenis fone"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Ši programa gali naudoti duomenis fone. Dėl to gali būti sunaudojama daugiau duomenų."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"nustatyti, kad programa būtų visada vykdoma"</string>
<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>
@@ -992,8 +996,9 @@
<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>
- <string name="dial" msgid="2275093056198652749">"Rinkti numerį"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefonas"</string>
<string name="map" msgid="5441053548030107189">"Žemėlapis"</string>
+ <string name="browse" msgid="6079864138582486027">"Naršyti"</string>
<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>
@@ -1202,6 +1207,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Palieskite, kad pasirinktumėte kalbą ir išdėstymą"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> programa rodoma virš kitų programų"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> programa rodoma virš kitų."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Šios programos dalys gali likti matomos visą laiką. Jei ši funkcija tinkamai neveikia, 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>
@@ -1358,8 +1367,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Bendrinti su „<xliff:g id="APPLICATION_NAME">%s</xliff:g>“"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Slydimo valdymas. Palieskite ir laikykite."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Perbraukite pirštu, kad atrakintumėte."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Prijunkite ausines, kad išgirstumėte sakomus slaptažodžio klavišus."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Taškas."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Naršyti pagrindinį puslapį"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Naršyti į viršų"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Daugiau parinkčių"</string>
@@ -1763,4 +1770,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Įveskite laiką"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Laiko įvestį pateikti perjungus į teksto įvesties režimą."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Laiko įvestį pateikti perjungus į laikrodžio režimą."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 07595c1..e7b4800 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -323,6 +323,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Ļauj lietotnei pabeigt citu lietotņu fonā darbinātos procesus. Rezultātā var tikt apturēta citu lietotņu darbība."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Šo lietotni var rādīt virs citām lietotnēm"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Šo lietotni var rādīt virs citām lietotnēm vai ekrāna daļām. Tādējādi var būt traucēta citu lietotņu izmantošana un var mainīties citu lietotņu izskats."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"darboties fonā"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Šī lietotne var darboties fonā. Tā var ātrāk pazemināt akumulatora uzlādes līmeni."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"izmantot datus fonā"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Šī lietotne var izmantot datus fonā. Tā var palielināt datu lietojuma apjomu."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"likt lietotnei vienmēr darboties"</string>
<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>
@@ -972,8 +976,9 @@
<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="dial" msgid="2275093056198652749">"Sastādīt numuru"</string>
+ <string name="dial" msgid="4204975095406423102">"Tālrunis"</string>
<string name="map" msgid="5441053548030107189">"Maps"</string>
+ <string name="browse" msgid="6079864138582486027">"Pārlūkot"</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>
@@ -1182,6 +1187,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Pieskarieties, lai atlasītu valodu un izkārtojumu"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"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="5399998516035621282">"Lietotne <xliff:g id="NAME">%s</xliff:g> ir redzama virspusē."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Šīs lietotnes daļas joprojām var būt redzamas visu laiku. Ja šī funkcija nedarbojas pareizi, izslēdziet to."</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>
@@ -1337,8 +1346,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Kopīgot ar lietojumprogrammu <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Bīdāms turis. Pieskarieties tam un turiet to nospiestu."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Velciet ar pirkstu, lai atbloķētu."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Pievienojiet austiņas, lai dzirdētu paroles taustiņu nosaukumus."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punkts."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Pārvietoties uz sākuma ekrānu"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Pārvietoties augšup"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Vairāk opciju"</string>
@@ -1732,4 +1739,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Ierakstiet laiku"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Lai ievadītu laiku, ieslēdziet teksta ievades režīmu."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Lai ievadītu laiku, ieslēdziet pulksteņa režīmu."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index afe0fb8..8dae798 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -83,10 +83,10 @@
<string name="RuacMmi" msgid="7827887459138308886">"Одбивање несакани вознемирувачки повици"</string>
<string name="CndMmi" msgid="3116446237081575808">"Испорака на повикувачки број"</string>
<string name="DndMmi" msgid="1265478932418334331">"Не вознемирувај"</string>
- <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Стандардно, повикувачот со овој ИД е ограничен. Следен повик: ограничен"</string>
- <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Стандардно, повикувачот со овој ИД е ограничен. Следен повик: не е ограничен"</string>
- <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Стандардно, повикувачот со овој ИД не е ограничен. Следен повик: ограничен"</string>
- <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Стандардно, повикувачот со овој ИД не е ограничен. Следен повик: не е ограничен"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Стандардно, повикувачот со овој ID е ограничен. Следен повик: ограничен"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Стандардно, повикувачот со овој ID е ограничен. Следен повик: не е ограничен"</string>
+ <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Стандардно, повикувачот со овој ID не е ограничен. Следен повик: ограничен"</string>
+ <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Стандардно, повикувачот со овој ID не е ограничен. Следен повик: не е ограничен"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Услугата не е предвидена."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Не може да го промените поставувањето за ID на повикувач."</string>
<string name="RestrictedOnData" msgid="8653794784690065540">"Услугата за податоци е блокирана."</string>
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Овозможува апликацијата да заврши заднински процеси на други апликации. Ова може да предизвика други апликации да престанат да работат."</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Метод на внес"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Дејства со текст"</string>
<string name="email" msgid="4560673117055050403">"E-пошта"</string>
- <string name="dial" msgid="2275093056198652749">"Бирај"</string>
+ <string name="dial" msgid="4204975095406423102">"Телефон"</string>
<string name="map" msgid="5441053548030107189">"Карта"</string>
+ <string name="browse" msgid="6079864138582486027">"Прелистувајте"</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>
@@ -1163,6 +1168,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> пишува врз други апликации"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Апликацијата <xliff:g id="NAME">%s</xliff:g> е одозгора."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Делови од апликацијава може да бидат видливи цело време. Ако функцијава не работи правилно, исклучете ја."</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Сподели со <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Рачка на лизгање. Допрете и задржете."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Помини со прст за да отклучиш."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Приклучи слушалки да ги слушнеш изговорените лозинки."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Dot."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Движи се кон дома"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Движи се нагоре"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Повеќе опции"</string>
@@ -1704,4 +1711,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 57a4a2d..0226a85 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"മറ്റ് അപ്ലിക്കേഷനുകളുടെ പശ്ചാത്തല പ്രോസസ്സുകൾ അവസാനിപ്പിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഇത് മറ്റ് അപ്ലിക്കേഷനുകൾ പ്രവർത്തനം നിർത്താനിടയാക്കാം."</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"ടൈപ്പുചെയ്യൽ രീതി"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"ടെക്സ്റ്റ് പ്രവർത്തനങ്ങൾ"</string>
<string name="email" msgid="4560673117055050403">"ഇമെയിൽ"</string>
- <string name="dial" msgid="2275093056198652749">"ഡയൽ ചെയ്യുക"</string>
+ <string name="dial" msgid="4204975095406423102">"ഫോണ്"</string>
<string name="map" msgid="5441053548030107189">"മാപ്പ്"</string>
+ <string name="browse" msgid="6079864138582486027">"ബ്രൗസുചെയ്യുക"</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>
@@ -1163,6 +1168,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രവർത്തിക്കും"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> മുകളിൽ ദൃശ്യമാകുന്നു."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"ഈ ആപ്പിന്റെ ഭാഗങ്ങൾ തുടർന്നും ദൃശ്യമായേക്കാം. ഈ ഫീച്ചർ ശരിയായി പ്രവർത്തിക്കുന്നില്ലെങ്കിൽ അത് ഓഫ് ചെയ്യുക."</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>-മായി പങ്കിടുക"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"സ്ലൈഡുചെയ്യുന്ന ഹാൻഡിൽ. സ്പർശിച്ച് പിടിക്കുക."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"അൺലോക്കുചെയ്യാൻ സ്വൈപ്പുചെയ്യുക."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"പറയുന്ന പാസ്വേഡ് കീകൾ കേൾക്കാൻ ഹെഡ്സെറ്റ് പ്ലഗ്ഗുചെയ്യുക."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"ഡോട്ട്."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"ഹോമിലേക്ക് നാവിഗേറ്റുചെയ്യുക"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"മുകളിലേക്ക് നാവിഗേറ്റുചെയ്യുക"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"കൂടുതൽ ഓപ്ഷനുകള്"</string>
@@ -1695,18 +1702,25 @@
<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>
- <!-- no translation found for time_picker_hour_label (2979075098868106450) -->
+ <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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
<skip />
- <!-- no translation found for time_picker_minute_label (5168864173796598399) -->
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
<skip />
- <!-- no translation found for time_picker_header_text (143536825321922567) -->
+ <!-- no translation found for autofill_save_yes (6398026094049005921) -->
<skip />
- <!-- no translation found for time_picker_input_error (7574999942502513765) -->
+ <!-- no translation found for autofill_save_no (2625132258725581787) -->
<skip />
- <!-- no translation found for time_picker_prompt_label (7588093983899966783) -->
+ <!-- no translation found for autofill_save_type_password (5288448918465971568) -->
<skip />
- <!-- no translation found for time_picker_text_input_mode_description (4148166758173708199) -->
+ <!-- no translation found for autofill_save_type_address (4936707762193009542) -->
<skip />
- <!-- no translation found for time_picker_radial_mode_description (4953403779779557198) -->
+ <!-- no translation found for autofill_save_type_credit_card (7127694776265563071) -->
<skip />
</resources>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 5631f1c..2af2a21 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Апп нь бусад апп-н арын процессыг дуусгах боломжтой. Энэ бусад апп-г зогсоох боломжийг олгоно."</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Оруулах арга"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Текст үйлдэл"</string>
<string name="email" msgid="4560673117055050403">"Имэйл"</string>
- <string name="dial" msgid="2275093056198652749">"Залгах"</string>
+ <string name="dial" msgid="4204975095406423102">"Утас"</string>
<string name="map" msgid="5441053548030107189">"Газрын зураг"</string>
+ <string name="browse" msgid="6079864138582486027">"Хөтлөх"</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>
@@ -1162,6 +1167,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> бусад аппын дээр гарч ирсэн"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> апп дээр харагдаж байна."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Энэ аппын зарим хэсэг нь тогтмол харагдана. Энэ онцлог буруу ажиллаж байвал унтраана уу."</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>-тай хуваалцана уу"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Бариулыг гулсуулна. Хүрээд хүлээнэ."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Түгжээг тайлах бол татна уу"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Нууц үгний дуудлагыг сонсох бол чихэвчийг залгана уу."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Цэг."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Нүүр хуудасруу шилжих"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Дээш шилжих"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Нэмэлт сонголтууд"</string>
@@ -1699,4 +1706,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 73f3975..de3bed5 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"अन्य अॅप्सच्या पार्श्वभूमी प्रक्रिया समाप्त करण्यासाठी अॅप ला अनुमती देते. यामुळे अन्य अॅप्स चालणे थांबू शकते."</string>
<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>
@@ -511,8 +515,8 @@
<string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"होल्डरला वाहकद्वारे-प्रदान केलेल्या कॉन्फिगरेशन अॅपची विनंती करण्याची अनुमती देते. सामान्य अॅप्ससाठी कधीही आवश्यक नसावे."</string>
<string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"नेटवर्क स्थितींवरील निरीक्षणांसाठी ऐका"</string>
<string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"अनु्प्रयोगाला नेटवर्क स्थितींवरील निरीक्षणे ऐकण्यासाठी अनुमती देते. सामान्य अॅप्ससाठी कधीही आवश्यक नसावे."</string>
- <string name="permlab_setInputCalibration" msgid="4902620118878467615">"इनपुट डिव्हाइस अंशांकन बदला"</string>
- <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"स्पर्श स्क्रीनची मापन प्राचले सुधारित करण्यासाठी अॅप ला अनुमती देते. सामान्य अॅप्स साठी कधीही आवश्यक नसते."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"इनपुट डिव्हाइस कॅलिब्रेशन बदला"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"स्पर्श स्क्रीनची कॅलिब्रेशन प्राचले सुधारित करण्यासाठी अॅप ला अनुमती देते. सामान्य अॅप्स साठी कधीही आवश्यक नसते."</string>
<string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM प्रमाणपत्रांवर प्रवेश करा"</string>
<string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"DRM प्रमाणपत्रांची तरतूद करण्यासाठी आणि वापरण्यासाठी अनुप्रयोगास अनुमती देते. सामान्य अॅप्सकरिता कधीही आवश्यकता नसते."</string>
<string name="permlab_handoverStatus" msgid="7820353257219300883">"Android बीम स्थानांतरण स्थिती प्राप्त करा"</string>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"इनपुट पद्धत"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"मजकूर क्रिया"</string>
<string name="email" msgid="4560673117055050403">"ईमेल"</string>
- <string name="dial" msgid="2275093056198652749">"डायल करा"</string>
+ <string name="dial" msgid="4204975095406423102">"फोन"</string>
<string name="map" msgid="5441053548030107189">"नकाशा"</string>
+ <string name="browse" msgid="6079864138582486027">"ब्राउझ करा"</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>
@@ -1163,6 +1168,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> इतर अॅप्सवर काढा"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> अॅप शीर्षस्थानी प्रदर्शित होत आहे"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"या अॅपचे भाग सर्व वेळी दृश्यमान असू शकतात. हे वैशिष्ट्य बरोबर काम करत नसल्यास, ते बंद करा."</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सह सामायिक करा"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"स्लायडिंग हँडल. स्पर्श करा आणि धरुन ठेवा."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"अनलॉक करण्यासाठी स्वाइप करा."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"बोललेल्या संकेतशब्द की ऐकण्यासाठी हेडसेट लावा."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"बिंदू."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"मुख्यपृष्ठ नेव्हिगेट करा"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"वर नेव्हिगेट करा"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"अधिक पर्याय"</string>
@@ -1702,4 +1709,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index d7d8ca4..171a02a 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Membenarkan apl untuk menamatkan proses latar belakang apl lain. Ini boleh menyebabkan apl lain berhenti berjalan."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Apl ini boleh muncul di sebelah atas apl lain"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Apl ini boleh muncul di sebelah atas apl lain atau pada bahagian lain skrin. Hal ini mungkin mengganggu penggunaan biasa apl dan mengubah cara apl lain itu muncul."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"berjalan di latar belakang"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Apl ini boleh berjalan di latar belakang. Tindakan ini mungkin menyusutkan bateri dengan lebih pantas."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"gunakan data di latar belakang"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Apl ini boleh menggunakan data di latar belakang. Tindakan ini mungkin meningkatkan penggunaan data."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"buatkan apl sentiasa berjalan"</string>
<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>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Dail"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefon"</string>
<string name="map" msgid="5441053548030107189">"Peta"</string>
+ <string name="browse" msgid="6079864138582486027">"Semak imbas"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ketik untuk memilih bahasa dan susun atur"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> melukis di atas apl lain"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Apl <xliff:g id="NAME">%s</xliff:g> dipaparkan di bahagian atas."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Sebahagian daripada apl ini mungkin kekal kelihatan pada sepanjang masa. Jika ciri ini tidak berfungsi dengan betul, matikan ciri ini."</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Kongsi dengan <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Pemegang gelongsor. Sentuh & tahan."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Leret untuk membuka kunci."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Pasangkan set kepala untuk mendengar kekunci kata laluan disebutkan."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Titik."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navigasi laman utama"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navigasi ke atas"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Lagi pilihan"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Taipkan masa"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Beralih ke mod input teks untuk input masa."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Beralih ke mod jam untuk input masa."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 4fcddfd..9bd2602 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"အပလီကေးရှင်းအား နောက်ကွယ်တွင် ဖွင့်ထားသော အခြားအပလီကေးရှင်းများရဲ့ လုပ်ဆောင်မှုများအား ရပ်ခွင့်ပေးပါ။ ဒီလိုလုပ်ခြင်းဖြင့် အခြား အပလီကေးရှင်းများ ရပ်တန့်သွားနိုင်ပါသည်"</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"ထည့်သွင်းရန်နည်းလမ်း"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"စာတို လုပ်ဆောင်ချက်"</string>
<string name="email" msgid="4560673117055050403">"အီးမေးလ်"</string>
- <string name="dial" msgid="2275093056198652749">"ခေါ်ဆိုရန်"</string>
+ <string name="dial" msgid="4204975095406423102">"ဖုန်း"</string>
<string name="map" msgid="5441053548030107189">"မြေပုံ"</string>
+ <string name="browse" msgid="6079864138582486027">"အကြမ်းဖျင်း ကြည့်ရန်"</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>
@@ -1163,6 +1168,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> သည် အခြားအက်ပ်များအပေါ်တွင် ပေါ်ပါမည်"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> အက်ပ်ကို အပေါ်ဆုံးတွင် ပြမည်။"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"ဤအက်ပ်၏ တစ်စိတ်တစ်ဒေသကို အမြဲမြင်တွေ့နိုင်ပါမည်။ အကယ်၍ ဤဝန်ဆောင်မှုသည် မှန်မှန်ကန်ကန် အလုပ်မလုပ်လျှင် ၎င်းကို ပိတ်လိုက်ပါ။"</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>နှင့် မျှဝေပါမည်"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"ဆွဲယူနိုင်သည့် လက်ကိုင်။ ထိပါ & ကိုင်ထားပါ။"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"သော့ဖွင့်ရန် ပွတ်ဆွဲပါ"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"စကားဝှက်ပြောဆိုမှုကို ကြားနိုင်ရန် မိုက်ခွက်ပါနားကြပ် တပ်ပြီး နားထောင်ပါ"</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"ဒေါ့"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"ပင်မစာမျက်နှာကို ပြန်သွားရန်"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"အပေါ်သို့သွားရန်"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"ပိုမိုရွေးချယ်စရာများ"</string>
@@ -1702,4 +1709,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 66c4cc3..8643a2e 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Lar appen avslutte andre appers bakgrunnsprosesser. Dette kan føre til at andre apper slutter å kjøre."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Denne appen kan ligge over andre apper"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Denne appen kan vises over andre apper eller andre deler av skjermen. Dette kan påvirke normal bruk av apper og endre måten andre apper vises på."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"kjør i bakgrunnen"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Denne appen kan kjøre i bakgrunnen. Det kan øke batteribruken."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"bruk data i bakgrunnen"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Denne appen kan bruke data i bakgrunnen. Det kan øke databruken."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"angi at appen alltid skal kjøre"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Lar appen gjøre deler av seg selv vedvarende i minnet. Dette kan begrense minnet for andre apper og gjøre nettbrettet tregt."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Gjør at deler av appen kan legge seg vedvarende i minnet. Dette kan begrense minnets tilgjengelighet for andre apper, noe som gjør at TV-en går langsommere."</string>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Inndatametode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksthandlinger"</string>
<string name="email" msgid="4560673117055050403">"E-post"</string>
- <string name="dial" msgid="2275093056198652749">"Ring"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefon"</string>
<string name="map" msgid="5441053548030107189">"Kart"</string>
+ <string name="browse" msgid="6079864138582486027">"Bla gjennom"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Trykk for å velge språk og layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> ligger over andre apper"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g>-appen vises øverst."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Deler av denne appen kan være synlige til enhver tid. Slå denne funksjonen av hvis den ikke fungerer som den skal."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Del med <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Glidebryter. Trykk og hold inne."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Sveip for å låse opp."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Koble til hodetelefoner for å høre opplesing av bokstavene i passordet."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punktum."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Gå til startsiden"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Gå opp"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Flere alternativer"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Skriv inn klokkeslett"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Bytt til tekstinndatamodus for tidsinndata."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Bytt til klokkemodus for tidsinndata."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 92190ef..f41269a 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -88,7 +88,7 @@
<string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"कलर ID पूर्वनिर्धारितदेखि प्रतिबन्धित छैन। अर्को कल: प्रतिबन्धित छ"</string>
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"कलर ID पूर्वनिर्धारितको लागि रोकावट छैन। अर्को कल: रोकावट छैन"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"सेवाको व्यवस्था छैन।"</string>
- <string name="CLIRPermanent" msgid="3377371145926835671">"तपाईँ कलर ID सेटिङ परिवर्तन गर्न सक्नुहुन्न।"</string>
+ <string name="CLIRPermanent" msgid="3377371145926835671">"तपाईं कलर ID सेटिङ परिवर्तन गर्न सक्नुहुन्न।"</string>
<string name="RestrictedOnData" msgid="8653794784690065540">"डेटा सेवा रोकिएको छ।"</string>
<string name="RestrictedOnEmergency" msgid="6581163779072833665">"आपतकालीन सेवा रोकिएको छ।"</string>
<string name="RestrictedOnNormal" msgid="4953867011389750673">"भ्वाइस सेवा ब्लक भएको छ।"</string>
@@ -209,9 +209,9 @@
<string name="shutdown_confirm" product="tv" msgid="476672373995075359">"तपाईंको TV बन्द हुनेछ।"</string>
<string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"तपाईँको घडी बन्द गरिने छ।"</string>
<string name="shutdown_confirm" product="default" msgid="649792175242821353">"तपाईँको फोन बन्द हुने छ।"</string>
- <string name="shutdown_confirm_question" msgid="2906544768881136183">"के तपाईँ बन्द गर्न चाहनुहुन्छ?"</string>
+ <string name="shutdown_confirm_question" msgid="2906544768881136183">"के तपाईं बन्द गर्न चाहनुहुन्छ?"</string>
<string name="reboot_safemode_title" msgid="7054509914500140361">"सुरक्षित मोडमा पुनःबुट गर्नुहोस्"</string>
- <string name="reboot_safemode_confirm" msgid="55293944502784668">"सुरक्षित मोडमा तपाईँ पुनःबुट गर्न चाहनु हुन्छ? तपाईँले स्थापना गरेका सबै तेस्रो पक्षका अनुप्रयोगहरूलाई असक्षम गराउने छ।"</string>
+ <string name="reboot_safemode_confirm" msgid="55293944502784668">"सुरक्षित मोडमा तपाईं पुनःबुट गर्न चाहनु हुन्छ? तपाईंले स्थापना गरेका सबै तेस्रो पक्षका अनुप्रयोगहरूलाई असक्षम गराउने छ।"</string>
<string name="recent_tasks_title" msgid="3691764623638127888">"नयाँ"</string>
<string name="no_recent_tasks" msgid="8794906658732193473">"कुनै नयाँ अनुप्रयोगहरू छैनन्।"</string>
<string name="global_actions" product="tablet" msgid="408477140088053665">"ट्याब्लेट विकल्पहरू"</string>
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"अनुप्रयोगलाई अन्य अनुप्रयोगहरूको पृष्ठभूमि प्रक्रियाहरू बन्द गर्न अनुमति दिन्छ। यसले अन्य अनुप्रयोगहरूलाई चल्नबाट रोक्न सक्दछ।"</string>
<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">"अनुप्रयोगलाई अनुमति दिन्छ मेमोरीमा आफैंलाई स्थायी भागका रूपमा प्रस्तुत गर्न। यसले अन्य अनुप्रयोगलाई उपलब्ध मेमोरीलाई सीमित गरी TV लाई ढिलो बनाउन सक्छ।"</string>
@@ -782,7 +786,7 @@
<string name="js_dialog_before_unload_title" msgid="2619376555525116593">"मार्गनिर्देशन पक्का गर्नुहोस्"</string>
<string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"यस पृष्ठलाई छोड्नुहोस्"</string>
<string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"यही पृष्ठमा रहनुहोस्"</string>
- <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nके तपाईँ यो पेजबाट नेभिगेट गर्न चाहनु हुन्छ भन्ने निश्चत छ?"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nके तपाईं यो पेजबाट नेभिगेट गर्न चाहनु हुन्छ भन्ने निश्चत छ?"</string>
<string name="save_password_label" msgid="6860261758665825069">"निश्चित गर्नुहोस्"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"जुक्ति: जुमलाई ठूलो र सानो पार्न दुई पटक हान्नुहोस्।"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"स्वतः भर्ने"</string>
@@ -815,7 +819,7 @@
<string name="permdesc_addVoicemail" msgid="6604508651428252437">"तपाईँको भ्वाइसमेल इनबक्समा सन्देश थप्नको लागि अनुप्रयोगलाई अनुमति दिन्छ।"</string>
<string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"भूस्थान अनुमतिहरू ब्राउजर परिवर्तन गर्नुहोस्"</string>
<string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"ब्राउजरको भू-स्थान अनुमतिहरू परिमार्जन गर्न अनुप्रयोगलाई अनुमति दिन्छ। खराब अनुप्रयोगहरूले स्थान सूचना मनपरी वेब साइटहरूमा पठाउने अनुमतिको लागि यसलाई प्रयोग गर्न सक्छन्।"</string>
- <string name="save_password_message" msgid="767344687139195790">"के तपाईँ ब्राउजरले यो पासवर्ड सम्झेको चाहनुहुन्छ?"</string>
+ <string name="save_password_message" msgid="767344687139195790">"के तपाईं ब्राउजरले यो पासवर्ड सम्झेको चाहनुहुन्छ?"</string>
<string name="save_password_notnow" msgid="6389675316706699758">"अहिले होइन"</string>
<string name="save_password_remember" msgid="6491879678996749466">"सम्झनुहोस्"</string>
<string name="save_password_never" msgid="8274330296785855105">"कहिल्यै पनि होइन"</string>
@@ -834,8 +838,8 @@
<string name="searchview_description_submit" msgid="2688450133297983542">"जिज्ञासा पेस गर्नुहोस्"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"भ्वाइस खोजी"</string>
<string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"छोएर अन्वेषण गर्ने सक्षम पार्न चाहनु हुन्छ?"</string>
- <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>ले स्पर्षद्वारा अन्वेषण सक्षम गर्न चाहन्छ। स्पर्षद्वारा अन्वेषण सक्षम भएको बेला, तपाईँ आफ्नो औँलाको मुनि भएका विषयवस्तुहरू बारे सुन्न वा विवरण हेर्न सक्नुहुन्छ वा ट्याब्लेटसँग अन्तर्क्रिया गर्न इशारा गर्नुहोस्।"</string>
- <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="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>ले स्पर्षद्वारा अन्वेषण सक्षम गर्न चाहन्छ। स्पर्षद्वारा अन्वेषण सक्षम भएको बेला, तपाईं आफ्नो औँलाको मुनि भएका विषयवस्तुहरू बारे सुन्न वा विवरण हेर्न सक्नुहुन्छ वा ट्याब्लेटसँग अन्तर्क्रिया गर्न इशारा गर्नुहोस्।"</string>
+ <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>
<plurals name="last_num_days" formatted="false" msgid="5104533550723932025">
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"निवेश विधि"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"पाठ कार्यहरू"</string>
<string name="email" msgid="4560673117055050403">"इमेल"</string>
- <string name="dial" msgid="2275093056198652749">"डायल गर्नुहोस्"</string>
+ <string name="dial" msgid="4204975095406423102">"फोन गर्नुहोस्"</string>
<string name="map" msgid="5441053548030107189">"नक्सा"</string>
+ <string name="browse" msgid="6079864138582486027">"ब्राउज गर्नुहोस्"</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>
@@ -1018,7 +1023,7 @@
<string name="force_close" msgid="8346072094521265605">"ठीक छ"</string>
<string name="report" msgid="4060218260984795706">"रिपोर्ट गर्नुहोस्"</string>
<string name="wait" msgid="7147118217226317732">"प्रतीक्षा गर्नुहोस्"</string>
- <string name="webpage_unresponsive" msgid="3272758351138122503">"पृष्ठ गैर जिम्मेवारी भएको छ।\n\nके तपाईँ यसलाई बन्द गर्न चाहनुहुन्छ?"</string>
+ <string name="webpage_unresponsive" msgid="3272758351138122503">"पृष्ठ गैर जिम्मेवारी भएको छ।\n\nके तपाईं यसलाई बन्द गर्न चाहनुहुन्छ?"</string>
<string name="launch_warning_title" msgid="1547997780506713581">"अनुप्रयोग पुनः निर्देशीत"</string>
<string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> अहिले चलिरहेको छ।"</string>
<string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> वास्तविक सुरुवात भएको थियो।"</string>
@@ -1113,20 +1118,20 @@
<string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"जब यो <xliff:g id="DEVICE_NAME">%1$s</xliff:g> सँग जडित हुन्छ, फोन अस्थायी रूपमा वाइ-फाइबाट विच्छेद हुने छ"</string>
<string name="select_character" msgid="3365550120617701745">"अक्षरहरू प्रवेश गराउनुहोस्"</string>
<string name="sms_control_title" msgid="7296612781128917719">"SMS सन्देशहरू पठाइँदै"</string>
- <string name="sms_control_message" msgid="3867899169651496433">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ले धरै संख्यामा SMS सन्देशहरू पठाउँदैछ। के तपाईँ यस अनुप्रयोगलाई सन्देशहरू पठाउन सुचारु गर्न अनुमति दिन चाहनु हुन्छ?"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ले धरै संख्यामा SMS सन्देशहरू पठाउँदैछ। के तपाईं यस अनुप्रयोगलाई सन्देशहरू पठाउन सुचारु गर्न अनुमति दिन चाहनु हुन्छ?"</string>
<string name="sms_control_yes" msgid="3663725993855816807">"अनुमति दिनुहोस्"</string>
<string name="sms_control_no" msgid="625438561395534982">"अस्वीकार गर्नुहोस्"</string>
- <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> के तपाईँ सन्देश पठाउन चाहुनु हुन्छ <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b>."</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> के तपाईं सन्देश पठाउन चाहुनु हुन्छ <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b>."</string>
<string name="sms_short_code_details" msgid="5873295990846059400">"यसको "<b>" कारणले तपाईँको मोबाइल खातामा शुल्क"</b>" लाग्नेछ।"</string>
<string name="sms_premium_short_code_details" msgid="7869234868023975"><b>"यसको कारणले तपाईँको मोबाइल खातामा शुल्क लाग्नेछ।"</b></string>
<string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"पठाउनुहोस्"</string>
<string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"रद्द गर्नुहोस्"</string>
<string name="sms_short_code_remember_choice" msgid="5289538592272218136">"मेरो छनौट याद राख्नुहोस्"</string>
- <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"तपाईँ यसलाई पछि सेटिङहरूमा बदल्न सक्नु हुन्छ > अनुप्रयोगहरू"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"तपाईं यसलाई पछि सेटिङहरूमा बदल्न सक्नु हुन्छ > अनुप्रयोगहरू"</string>
<string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"सधैँ अनुमति दिनुहोस्"</string>
<string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"कहिल्यै अनुमति नदिनुहोस्"</string>
<string name="sim_removed_title" msgid="6227712319223226185">"SIM कार्ड हटाइयो"</string>
- <string name="sim_removed_message" msgid="5450336489923274918">"तपाईँ मान्य SIM कार्डसँग फेरि सुरु नगरे सम्म सेलुलर सञ्जाल उपलब्ध हुने छ।"</string>
+ <string name="sim_removed_message" msgid="5450336489923274918">"तपाईं मान्य SIM कार्डसँग फेरि सुरु नगरे सम्म सेलुलर सञ्जाल उपलब्ध हुने छ।"</string>
<string name="sim_done_button" msgid="827949989369963775">"भयो"</string>
<string name="sim_added_title" msgid="3719670512889674693">"SIM कार्ड थप गरियो"</string>
<string name="sim_added_message" msgid="7797975656153714319">"सेलुलर सञ्जाल पहुँच गर्न तपाईँको उपकरण पुनः सुरु गर्नुहोस्।"</string>
@@ -1168,6 +1173,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> लाई अन्य अनुप्रयोगहरूमा देखिन दिनुहोस्"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> अनुप्रयोग शीर्षमा देखाउँदै।"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"यो अनुप्रयोगका केही अंशहरू सधैँ देखिरहन सक्छन्। यो सुविधाले सही ढंगले काम गरिरहेको छैन भने, यसलाई बन्द गर्नुहोस्।"</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>
@@ -1227,14 +1236,14 @@
<string name="dial_number_using" msgid="5789176425167573586">\n"नम्बर डायल गर्नुहोस् <xliff:g id="NUMBER">%s</xliff:g> प्रयोग गरेर"</string>
<string name="create_contact_using" msgid="4947405226788104538">"सम्पर्क सिर्जना गर्नुहोस्\nयो <xliff:g id="NUMBER">%s</xliff:g> प्रयोग गरेर"</string>
<string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"निम्न एउटा वा धेरै अनुप्रयोगहरूले तपाईँको खातामा पहुँचको लागि अनुमति अहिले र भविष्यमा अनुरोध गर्छन्।"</string>
- <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"के तपाईँ यस अनुरोधलाई अनुमति दिन चाहनुहुन्छ?"</string>
+ <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"के तपाईं यस अनुरोधलाई अनुमति दिन चाहनुहुन्छ?"</string>
<string name="grant_permissions_header_text" msgid="6874497408201826708">"अनुरोध पहुँच गर्नुहोस्"</string>
<string name="allow" msgid="7225948811296386551">"अनुमति दिनुहोस्"</string>
<string name="deny" msgid="2081879885755434506">"अस्वीकार गर्नुहोस्"</string>
<string name="permission_request_notification_title" msgid="6486759795926237907">"अनुरोध गरिएको अनुमति"</string>
<string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">\n"खाता <xliff:g id="ACCOUNT">%s</xliff:g>को लागि अनुरोध गरिएको अनुमति।"</string>
- <string name="forward_intent_to_owner" msgid="1207197447013960896">"तपाईँ तपाईँको कार्य प्रोफाइल बाहिर यो अनुप्रयोग प्रयोग गरिरहनु भएको छ"</string>
- <string name="forward_intent_to_work" msgid="621480743856004612">"तपाईँ आफ्नो कार्य प्रोफाइलमा यो अनुप्रयोग प्रयोग गरिरहनु भएको छ"</string>
+ <string name="forward_intent_to_owner" msgid="1207197447013960896">"तपाईं तपाईंको कार्य प्रोफाइल बाहिर यो अनुप्रयोग प्रयोग गरिरहनु भएको छ"</string>
+ <string name="forward_intent_to_work" msgid="621480743856004612">"तपाईं आफ्नो कार्य प्रोफाइलमा यो अनुप्रयोग प्रयोग गरिरहनु भएको छ"</string>
<string name="input_method_binding_label" msgid="1283557179944992649">"इनपुट विधि"</string>
<string name="sync_binding_label" msgid="3687969138375092423">"सिंक गर्नुहोस्"</string>
<string name="accessibility_binding_label" msgid="4148120742096474641">"उपलब्धता"</string>
@@ -1284,7 +1293,7 @@
<string name="gpsVerifYes" msgid="2346566072867213563">"हो"</string>
<string name="gpsVerifNo" msgid="1146564937346454865">"होइन"</string>
<string name="sync_too_many_deletes" msgid="5296321850662746890">"सीमा नाघेकाहरू मेट्नुहोस्"</string>
- <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"त्यहाँ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> मेटाइएका आइटमहरू छन् <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>को लागि, खाता <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>। तपाईँ के गर्न चाहनु हुन्छ?"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"त्यहाँ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> मेटाइएका आइटमहरू छन् <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>को लागि, खाता <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>। तपाईं के गर्न चाहनु हुन्छ?"</string>
<string name="sync_really_delete" msgid="2572600103122596243">"वस्तुहरू मेट्नुहोस्"</string>
<string name="sync_undo_deletes" msgid="2941317360600338602">"मेटिएकाहरू पूर्ववत बनाउनुहोस्।"</string>
<string name="sync_do_nothing" msgid="3743764740430821845">"अहिलेको लागि केही नगर्नुहोस्"</string>
@@ -1322,8 +1331,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सँग साझेदारी गर्नुहोस्"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"धिसार्ने ह्यान्डल। छुनुहोस् & समाउनुहोस्।"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"खोल्नलाइ हुत्त्याउनुहोस्।"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"बोलिएको पासवर्ड कुञ्जीहरू सुन्नको लागि हेडसेट प्लग इन गर्नुहोस्।"</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"डट।"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"गृह खोज्नुहोस्"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"माथि खोज्नुहोस्"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"थप विकल्पहरू"</string>
@@ -1580,7 +1587,7 @@
<string name="package_installed_device_owner" msgid="8420696545959087545">"तपाईँको प्रशासकद्वारा स्थापना गरिएको"</string>
<string name="package_updated_device_owner" msgid="8856631322440187071">"तपाईँको प्रशासकद्वारा अद्यावधिक गरिएको"</string>
<string name="package_deleted_device_owner" msgid="7650577387493101353">"तपाईँको प्रशासकद्वारा हटाइएको"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"ब्याट्रीको आयु सुधार्न, ब्याट्री संरक्षकले तपाईँको यन्त्रको कार्यसम्पादन घटाउँछ र भाइब्रेसन, स्थान सेवा र बहुसंख्यक पृष्ठभूमि डेटा सीमित गर्दछ। इमेल, सन्देश, र अन्य अनुप्रयोगहरू जुन सिङ्कमा भर पर्छन् अद्यावधिक नहुन सक्छन् जबसम्म तपाईँ तिनीहरूलाई खोल्नुहुन्न\n\n ब्याट्री संरक्षक स्वत: निस्कृय हुन्छ जब तपाईँको यन्त्र चार्ज हुँदै हुन्छ।"</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"ब्याट्रीको आयु सुधार्न, ब्याट्री संरक्षकले तपाईंको यन्त्रको कार्यसम्पादन घटाउँछ र भाइब्रेसन, स्थान सेवा र बहुसंख्यक पृष्ठभूमि डेटा सीमित गर्दछ। इमेल, सन्देश, र अन्य अनुप्रयोगहरू जुन सिङ्कमा भर पर्छन् अद्यावधिक नहुन सक्छन् जबसम्म तपाईं तिनीहरूलाई खोल्नुहुन्न\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>
@@ -1684,7 +1691,7 @@
<string name="demo_starting_message" msgid="5268556852031489931">"डेमो सुरु गर्दै…"</string>
<string name="demo_restarting_message" msgid="952118052531642451">"यन्त्रलाई रिसेट गर्दै…"</string>
<string name="demo_user_inactivity_timeout_title" msgid="6596109959002331334">"यन्त्रलाई रिसेट गर्ने हो?"</string>
- <string name="demo_user_inactivity_timeout_countdown" msgid="5675588824402569506">"तपाईँ सबै परिवर्तनहरू गुमाउनु हुनेछ र <xliff:g id="TIMEOUT">%1$s</xliff:g> सेकेन्डमा डेमो फेरि सुरु हुनेछ…"</string>
+ <string name="demo_user_inactivity_timeout_countdown" msgid="5675588824402569506">"तपाईं सबै परिवर्तनहरू गुमाउनु हुनेछ र <xliff:g id="TIMEOUT">%1$s</xliff:g> सेकेन्डमा डेमो फेरि सुरु हुनेछ…"</string>
<string name="demo_user_inactivity_timeout_left_button" msgid="5314271347014802475">"रद्द गर्नुहोस्"</string>
<string name="demo_user_inactivity_timeout_right_button" msgid="5019306703066964808">"अहिले रिसेट गर्नुहोस्"</string>
<string name="suspended_widget_accessibility" msgid="6712143096475264190">"<xliff:g id="LABEL">%1$s</xliff:g> लाई असक्षम गरियो"</string>
@@ -1700,18 +1707,25 @@
<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>
- <!-- no translation found for time_picker_hour_label (2979075098868106450) -->
+ <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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
<skip />
- <!-- no translation found for time_picker_minute_label (5168864173796598399) -->
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
<skip />
- <!-- no translation found for time_picker_header_text (143536825321922567) -->
+ <!-- no translation found for autofill_save_yes (6398026094049005921) -->
<skip />
- <!-- no translation found for time_picker_input_error (7574999942502513765) -->
+ <!-- no translation found for autofill_save_no (2625132258725581787) -->
<skip />
- <!-- no translation found for time_picker_prompt_label (7588093983899966783) -->
+ <!-- no translation found for autofill_save_type_password (5288448918465971568) -->
<skip />
- <!-- no translation found for time_picker_text_input_mode_description (4148166758173708199) -->
+ <!-- no translation found for autofill_save_type_address (4936707762193009542) -->
<skip />
- <!-- no translation found for time_picker_radial_mode_description (4953403779779557198) -->
+ <!-- no translation found for autofill_save_type_credit_card (7127694776265563071) -->
<skip />
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 41d77b3..60f3363 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Hiermee kan de app achtergrondprocessen van andere apps beëindigen. Hierdoor kunnen andere apps worden gestopt."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Deze app kan op de voorgrond vóór andere apps worden weergegeven"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Deze app kan op de voorgrond worden weergegeven vóór andere apps of andere gedeelten van het scherm. Dit kan het normale app-gebruik verstoren en de manier wijzigen waarop andere apps worden weergegeven."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"uitvoeren op de achtergrond"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Deze app kan op de achtergrond worden uitgevoerd. Dit kan meer batterijlading verbruiken."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"data gebruiken op de achtergrond"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Deze app kan op de achtergrond data verbruiken. Dit kan het datagebruik verhogen."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"app altijd laten uitvoeren"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Hiermee kan de app gedeelten van zichzelf persistent maken in het geheugen. Dit kan de hoeveelheid geheugen beperken die beschikbaar is voor andere apps, waardoor de tablet trager kan worden."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Hiermee kan de app gedeelten van zichzelf persistent maken in het geheugen. Dit kan de hoeveelheid geheugen beperken die beschikbaar is voor andere apps, waardoor de tv trager kan worden."</string>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Invoermethode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tekstacties"</string>
<string name="email" msgid="4560673117055050403">"E-mail"</string>
- <string name="dial" msgid="2275093056198652749">"Bellen"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefoon"</string>
<string name="map" msgid="5441053548030107189">"Kaart"</string>
+ <string name="browse" msgid="6079864138582486027">"Browsen"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tik om een taal en indeling te selecteren"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> wordt weergegeven over andere apps"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g>-app bovenop weergeven."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Delen van deze app blijven altijd zichtbaar. Als deze functie niet correct werkt, schakel je deze uit."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Delen met <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Schuifgreep. Tikken en blijven aanraken."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Vegen om te ontgrendelen"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Sluit een headset aan om wachtwoordtoetsen te laten voorlezen."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Stip."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navigeren naar startpositie"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Omhoog navigeren"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Meer opties"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Typ een tijd"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Schakel naar de tekstinvoermodus om de tijd in te voeren."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Schakel naar de klokmodus om de tijd in te voeren."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 9d723af..34c0396 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"ਐਪ ਨੂੰ ਹੋਰਾਂ ਐਪਸ ਦੀਆਂ ਪਿਛੋਕੜ ਪ੍ਰਕਿਰਿਆਵਾਂ ਖ਼ਤਮ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸ ਨਾਲ ਹੋਰ ਚੱਲ ਰਹੇ ਐਪਸ ਰੁਕ ਸਕਦੇ ਹਨ।"</string>
<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">"ਐਪ ਨੂੰ ਮੈਮਰੀ ਵਿੱਚ ਖੁਦ ਦੇ ਭਾਗਾਂ ਨੂੰ ਸਥਾਈ ਬਣਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ TV ਨੂੰ ਹੌਲੀ ਕਰਦੇ ਹੋਏ ਹੋਰਾਂ ਐਪਸ ਤੇ ਉਪਲਬਧ ਮੈਮਰੀ ਨੂੰ ਸੀਮਿਤ ਕਰ ਸਕਦਾ ਹੈ।"</string>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"ਇਨਪੁਟ ਵਿਧੀ"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"ਟੈਕਸਟ ਕਿਰਿਆਵਾਂ"</string>
<string name="email" msgid="4560673117055050403">"ਈਮੇਲ ਕਰੋ"</string>
- <string name="dial" msgid="2275093056198652749">"ਕਾਲ ਕਰੋ"</string>
+ <string name="dial" msgid="4204975095406423102">"ਫ਼ੋਨ ਕਰੋ"</string>
<string name="map" msgid="5441053548030107189">"ਨਕਸ਼ਾ ਖੋਲ੍ਹੋ"</string>
+ <string name="browse" msgid="6079864138582486027">"ਬ੍ਰਾਊਜ਼ ਕਰੋ"</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>
@@ -1163,6 +1168,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> ਹੋਰਾਂ ਐਪਾਂ ਉੱਤੇ ਪਸਰ ਸਕਦੀ ਹੈ"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> ਐਪ ਹੋਰ ਐਪਾਂ ਉੱਤੇ ਪਸਰੀ ਦਿਸ ਰਹੀ ਹੈ।"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਸ ਐਪ ਦੇ ਕੁਝ ਹਿੱਸੇ ਹਰ ਸਮੇਂ ਵਿਖਾਈ ਦੇਣ। ਜੇਕਰ ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀ ਹੈ, ਤਾਂ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ਨਾਲ ਸਾਂਝਾ ਕਰੋ"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"ਹੈਂਡਲ ਸਲਾਈਡ ਕਰ ਰਿਹਾ ਹੈ। ਸਪੱਰਸ਼ ਕਰੋ & ਹੋਲਡ ਕਰੋ।"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"ਅਨਲੌਕ ਕਰਨ ਲਈ ਸਵਾਈਪ ਕਰੋ।"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"ਬੋਲੀਆਂ ਗਈਆਂ ਪਾਸਵਰਡ ਕੁੰਜੀਆਂ ਸੁਣਨ ਲਈ ਇੱਕ ਹੈਡਸੈਟ ਪਲਗ ਇਨ ਕਰੋ।"</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"ਬਿੰਦੀ।"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"ਹੋਮ ਨੈਵੀਗੇਟ ਕਰੋ"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"ਉੱਪਰ ਨੈਵੀਗੇਟ ਕਰੋ"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"ਹੋਰ ਚੋਣਾਂ"</string>
@@ -1702,4 +1709,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index a3cfb49..9ce2f69 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -326,6 +326,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Pozwala aplikacji na kończenie procesów innych aplikacji działających w tle. Może to spowodować przerwanie działania innych aplikacji."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Ta aplikacja może wyświetlać się nad innymi aplikacjami"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Ta aplikacja może pojawić się nad innymi aplikacjami lub częściami ekranu. Może to przeszkadzać w jej zwykłym używaniu i zmieniać sposób wyświetlania innych aplikacji."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"działanie w tle"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Ta aplikacja może działać w tle. Bateria może się szybciej rozładowywać."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"transmisja danych w tle"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Ta aplikacja może przesyłać i odbierać dane w tle. Transmisja danych może się zwiększyć."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"sprawianie, że aplikacja jest cały czas uruchomiona"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Pozwala aplikacji na trwałe zapisywanie swoich fragmentów w pamięci. Może to zmniejszyć ilość pamięci dostępnej dla innych aplikacji i spowolnić działanie tabletu."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Pozwala aplikacji zapewnić nieusuwalność swoich fragmentów z pamięci. Może to ograniczyć ilość pamięci dostępną dla innych aplikacji i spowalniać działanie telewizora."</string>
@@ -992,8 +996,9 @@
<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="dial" msgid="2275093056198652749">"Wybierz numer"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefon"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
+ <string name="browse" msgid="6079864138582486027">"Przeglądarka"</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>
@@ -1202,6 +1207,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Kliknij, by wybrać język i układ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUVWXYZŹŻ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Aplikacja <xliff:g id="NAME">%s</xliff:g> wyświetla się nad innymi"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Aplikacja <xliff:g id="NAME">%s</xliff:g> jest nad innymi."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Fragmenty tej aplikacji mogą być widoczne przez cały czas. Jeśli ta funkcja nie działa prawidłowo, wyłącz ją."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1358,8 +1367,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Udostępnij przez <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Uchwyt przesuwny. Dotknij i przytrzymaj."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Przesuń, aby odblokować."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Podłącz zestaw słuchawkowy, aby wysłuchać znaków hasła wypowiadanych na głos."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Kropka"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Przejdź do strony głównej"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Przejdź wyżej"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Więcej opcji"</string>
@@ -1763,4 +1770,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Podaj czas"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Aby wprowadzić czas, włącz tryb wprowadzania tekstu."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Aby wprowadzić czas, włącz tryb zegara."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 6ef918c..92dcc90b 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Permite que o app encerre processos em segundo plano de outros apps. Pode ser que outros apps parem de funcionar."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Este app pode se sobrepor visualmente a outros apps"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Este app pode se sobrepor visualmente a outros apps ou a outras partes da tela. Isso pode interferir no uso normal do app e alterar a forma como os outros apps são exibidos."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"executar em segundo plano"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Este app pode ser executado em segundo plano, o que pode esgotar a bateria mais rapidamente."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"usar dados em segundo plano"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Este app pode usar dados em segundo plano, o que pode aumentar o uso de dados."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"sempre executar o app"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permite que o app torne partes de si mesmo persistentes na memória. Pode limitar a memória disponível para outros apps, deixando o tablet mais lento."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permite que o app torne partes de si mesmo persistentes na memória. Isso pode limitar a memória disponível para outros apps, deixando a TV mais lenta."</string>
@@ -441,7 +445,7 @@
<string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"Permite que o app veja a configuração do Bluetooth na TV, faça e aceite conexões com dispositivos pareados."</string>
<string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Permite que o app acesse a configuração do Bluetooth no telefone, além de fazer e aceitar conexões com dispositivos pareados."</string>
<string name="permlab_nfc" msgid="4423351274757876953">"controlar a comunicação a curta distância"</string>
- <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="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_manageFingerprint" msgid="5640858826254575638">"gerenciar hardware de impressão digital"</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Discar"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefone"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
+ <string name="browse" msgid="6079864138582486027">"Procurar"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toque para selecionar o idioma e o layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Sobreposição do <xliff:g id="NAME">%s</xliff:g> a outros apps"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> exibido na parte superior da tela."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Partes desse app podem ficar sempre visíveis. Se esse recurso não estiver funcionando corretamente, desative-o."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Compartilhar com <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Recurso deslizante. Toque e segure."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Deslize para desbloquear."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Conecte um fone de ouvido para ouvir as teclas da senha."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Ponto final."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navegar na página inicial"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navegar para cima"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Mais opções"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Digite o horário"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Alterne para o modo de entrada de texto para informar o horário."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Alterne para o modo de relógio para informar o horário."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index ac59f18..dfc64d3 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Permite que a aplicação termine processos em segundo plano de outras aplicações. Isto pode fazer com que outras aplicações deixem de funcionar."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Esta aplicação pode aparecer por cima de outras aplicações"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Esta aplicação pode aparecer por cima de outras aplicações ou de outras partes do ecrã. Tal pode interferir com a utilização normal das aplicações e alterar a forma como as outras aplicações aparecem."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"executar em segundo plano"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Esta aplicação pode ser executada em segundo plano, o que pode descarregar a bateria mais rapidamente."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"utilizar dados em segundo plano"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Esta aplicação pode utilizar dados em segundo plano, o que pode aumentar a utilização de dados."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"fazer com que a aplicação seja sempre executada"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permite que a aplicação torne partes de si mesma persistentes na memória. Isto pode limitar a disponibilidade da memória para outras aplicações, tornando o tablet mais lento."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permite à aplicação tornar partes de si própria persistentes na memória. Isto pode limitar a memória disponível para outras aplicações, o que torna a TV mais lenta."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Marcar"</string>
+ <string name="dial" msgid="4204975095406423102">"Telemóvel"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
+ <string name="browse" msgid="6079864138582486027">"Procurar"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toque para selecionar o idioma e o esquema"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Sobrepor a aplicação <xliff:g id="NAME">%s</xliff:g> a outras aplicações"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Aplic. <xliff:g id="NAME">%s</xliff:g> apresentada por cima."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"É possível que partes desta aplicação permaneçam sempre visíveis. Se esta funcionalidade não estiver a funcionar corretamente, desative-a."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESATIVAR"</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Compartilhar com <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Barra deslizante. Toque & não solte."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Deslizar rapidamente para desbloquear."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Ligue os auscultadores com microfone integrado para ouvir as teclas da palavra-passe."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Ponto."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navegar para página inicial"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navegar para cima"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Mais opções"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Introduza a hora"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Mude para o modo de introdução de texto para a introdução da hora."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Mude para o modo de relógio para a introdução da hora."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 6ef918c..92dcc90b 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Permite que o app encerre processos em segundo plano de outros apps. Pode ser que outros apps parem de funcionar."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Este app pode se sobrepor visualmente a outros apps"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Este app pode se sobrepor visualmente a outros apps ou a outras partes da tela. Isso pode interferir no uso normal do app e alterar a forma como os outros apps são exibidos."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"executar em segundo plano"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Este app pode ser executado em segundo plano, o que pode esgotar a bateria mais rapidamente."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"usar dados em segundo plano"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Este app pode usar dados em segundo plano, o que pode aumentar o uso de dados."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"sempre executar o app"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permite que o app torne partes de si mesmo persistentes na memória. Pode limitar a memória disponível para outros apps, deixando o tablet mais lento."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permite que o app torne partes de si mesmo persistentes na memória. Isso pode limitar a memória disponível para outros apps, deixando a TV mais lenta."</string>
@@ -441,7 +445,7 @@
<string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"Permite que o app veja a configuração do Bluetooth na TV, faça e aceite conexões com dispositivos pareados."</string>
<string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Permite que o app acesse a configuração do Bluetooth no telefone, além de fazer e aceitar conexões com dispositivos pareados."</string>
<string name="permlab_nfc" msgid="4423351274757876953">"controlar a comunicação a curta distância"</string>
- <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="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_manageFingerprint" msgid="5640858826254575638">"gerenciar hardware de impressão digital"</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Discar"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefone"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
+ <string name="browse" msgid="6079864138582486027">"Procurar"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toque para selecionar o idioma e o layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Sobreposição do <xliff:g id="NAME">%s</xliff:g> a outros apps"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> exibido na parte superior da tela."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Partes desse app podem ficar sempre visíveis. Se esse recurso não estiver funcionando corretamente, desative-o."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Compartilhar com <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Recurso deslizante. Toque e segure."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Deslize para desbloquear."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Conecte um fone de ouvido para ouvir as teclas da senha."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Ponto final."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navegar na página inicial"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navegar para cima"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Mais opções"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Digite o horário"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Alterne para o modo de entrada de texto para informar o horário."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Alterne para o modo de relógio para informar o horário."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 42d2775..d95e715 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -323,6 +323,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Permite aplicației să oprească procesele derulate în fundal de alte aplicații. Acest lucru poate face ca respectivele aplicații să nu mai ruleze."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Această aplicație poate apărea deasupra altor aplicații"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Această aplicație poate apărea deasupra altor aplicații sau a altor părți ale ecranului. Acest lucru poate să afecteze utilizarea normală a aplicației și să schimbe modul în care se afișează alte aplicații."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"să ruleze în fundal"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Această aplicație poate rula în fundal. Astfel, bateria se poate consuma mai repede."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"să utilizeze date în fundal"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Această aplicație poate utiliza date în fundal. Astfel, gradul de utilizare a datelor poate crește."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"rulare continuă a aplicației"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permite aplicației să declare persistente în memorie anumite părți ale sale. Acest lucru poate limita memoria disponibilă pentru alte aplicații și poate încetini funcționarea tabletei."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permite aplicației să declare persistente în memorie anumite părți ale sale. Acest lucru poate limita memoria disponibilă pentru alte aplicații și poate încetini funcționarea televizorului."</string>
@@ -972,8 +976,9 @@
<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="dial" msgid="2275093056198652749">"Apelați"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefon"</string>
<string name="map" msgid="5441053548030107189">"Hartă"</string>
+ <string name="browse" msgid="6079864138582486027">"Răsfoiți"</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>
@@ -1182,6 +1187,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Atingeți pentru a selecta limba și aspectul"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> afișează deasupra altor aplicații"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> se afișează deasupra."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Este posibil ca unele părți ale acestei aplicații să rămână vizibile permanent. Dacă această caracteristică nu funcționează corect, dezactivați-o."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1337,8 +1346,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Permiteți accesul pentru <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Mâner glisant. Atingeți și țineți apăsat."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Glisați pentru a debloca."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Conectați un set căști-microfon pentru a auzi tastele apăsate când introduceți parola."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punct."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navigați la ecranul de pornire"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navigați în sus"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Mai multe opțiuni"</string>
@@ -1732,4 +1739,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Introduceți ora"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Pentru a introduce ora, comutați la modul de introducere a textului."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Pentru a introduce ora, comutați la modul ceas."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 9a82c38..97c7b987 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -326,6 +326,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Приложение сможет завершать фоновые процессы других приложений. Из-за этого другие приложения могут прекратить работу."</string>
<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>
@@ -992,8 +996,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Способ ввода"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Операции с текстом"</string>
<string name="email" msgid="4560673117055050403">"Письмо"</string>
- <string name="dial" msgid="2275093056198652749">"Вызов"</string>
+ <string name="dial" msgid="4204975095406423102">"Телефон"</string>
<string name="map" msgid="5441053548030107189">"Карта"</string>
+ <string name="browse" msgid="6079864138582486027">"Поиск"</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>
@@ -1202,6 +1207,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Интерфейс этих приложений показывается поверх других окон: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g>: показ поверх других окон"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Некоторые элементы интерфейса этого приложения могут всегда находиться поверх других окон. Если функция работает некорректно, отключите ее."</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>
@@ -1358,8 +1367,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Открыть доступ приложению \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\""</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Перетаскиваемый значок блокировки. Нажмите и удерживайте."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Проведите по экрану, чтобы разблокировать устройство."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Подключите гарнитуру, чтобы услышать пароль."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Точка"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Перейти на главную"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Перейти вверх"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Ещё"</string>
@@ -1763,4 +1770,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index e5fac69..ff0c7d5 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"අනෙක් යෙදුම්වල පසුබිම් ක්රියාවලි අවසන් කිරීමට යෙදුමට අවසර දෙන්න. අනෙක් යෙදුම් ධාවනය නැවතීමට මෙය හේතුවක් වේ."</string>
<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>
@@ -954,8 +958,9 @@
<string name="inputMethod" msgid="1653630062304567879">"ආදාන ක්රමය"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"පෙළ ක්රියාවන්"</string>
<string name="email" msgid="4560673117055050403">"ඊ-තැපෑල"</string>
- <string name="dial" msgid="2275093056198652749">"අමතන්න"</string>
+ <string name="dial" msgid="4204975095406423102">"දුරකථනය"</string>
<string name="map" msgid="5441053548030107189">"සිතියම"</string>
+ <string name="browse" msgid="6079864138582486027">"සොයන්න"</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>
@@ -1164,6 +1169,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"අනෙක් යෙදුම්වලට උඩින් <xliff:g id="NAME">%s</xliff:g> අදින්න"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> යෙදුම ඉහළින්ම සංදර්ශනය වේ."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"මෙම යෙදුමෙහි කොටස් සැම විටම දෘශ්යමානව පවතිනු ඇත. මෙම විශේෂාංගය නිවැරදිව ක්රියා නොකරන්නේ නම්, එය ක්රියාවිරහිත කරන්න."</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>
@@ -1318,8 +1327,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> සමඟින් බෙදා ගන්න"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"සර්පණ හැඩලය. ස්පර්ශ කර රඳවා සිටීම."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"අගුළු ඇරීමට ස්වයිප් කරන්න."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"මුරපද යතුරු කියවනු ඇසීමට ඉස් බණුවක් සම්බන්ධ කරන්න."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"නැවතුම."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"මුල් පිටුවට සංචාලනය කරන්න"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"ඉහලට සංචාලනය කරන්න"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"තවත් විකල්ප"</string>
@@ -1703,4 +1710,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 03bb2d4..660a256 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -326,6 +326,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Umožňuje aplikácii ukončiť procesy na pozadí ostatných aplikácií. Môže to zapríčiniť zastavenie ostatných aplikácií."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Táto aplikácia sa môže zobraziť nad ostatnými aplikáciami"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Táto aplikácia sa môže zobraziť nad ostatnými aplikáciami alebo ďalšími časťami obrazovky. Môže tak narušovať normálne používanie aplikácií a zmeniť spôsob zobrazenia ďalších aplikácií."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"spustenie na pozadí"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Táto aplikácia sa môže spustiť na pozadí a rýchlejšie tak vybiť batériu."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"využívanie dát na pozadí"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Táto aplikácia môže využívať dáta na pozadí a zvýšiť tak spotrebu dát."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"nastaviť, aby bola aplikácia neustále spustená"</string>
<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>
@@ -992,8 +996,9 @@
<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="dial" msgid="2275093056198652749">"Vytočiť"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefón"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
+ <string name="browse" msgid="6079864138582486027">"Prehliadať"</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>
@@ -1202,6 +1207,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Klepnutím vyberte jazyk a rozloženie"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁÄBCČDĎDZDŽEÉFGHCHIÍJKLĽMNŇOÓÔPRŔSŠTŤUÚVWXYÝZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Aplikácia <xliff:g id="NAME">%s</xliff:g> sa vykreslí nad ostatnými aplikáciami"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Apl. <xliff:g id="NAME">%s</xliff:g> sa zobrazuje navrchu."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Časti tejto aplikácie môžu zostať neustále viditeľné. Ak táto funkcia nepracuje správne, 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>
@@ -1358,8 +1367,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Zdieľať s aplikáciou <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Posuvné tlačidlo. Dotknite sa a podržte."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Posunom odomknúť."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Ak si chcete vypočuť vyslovené klávesy hesla, pripojte náhlavnú súpravu."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Bodka."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Prejsť na plochu"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Prejsť na"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Viac možností"</string>
@@ -1763,4 +1770,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Zadajte čas"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Ak chcete zadať čas, prepnite na textový režim vstupu"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Ak chcete zadať čas, prepnite na režim hodín."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 718ab5c..0abd212 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -326,6 +326,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Aplikaciji omogoča, da konča procese v ozadju drugih aplikacij. S tem lahko druge aplikacije nehajo delovati."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Prikaz aplikacije s prekrivanjem drugih aplikacij"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Ta aplikacija lahko prekrije druge aplikacije ali druge dele zaslona. To lahko vpliva na normalno delovanje aplikacije in na način prikaza drugih aplikacij."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"izvajanje v ozadju"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Ta aplikacija se lahko izvaja tudi v ozadju, kar lahko privede do hitrejšega praznjenja akumulatorja."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"prenos podatkov v ozadju"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Ta aplikacija lahko prenaša podatke tudi v ozadju, kar lahko privede do večje porabe prenosa podatkov."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"neprekinjeno izvajanje aplikacij"</string>
<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>
@@ -992,8 +996,9 @@
<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="dial" msgid="2275093056198652749">"Kliči"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefon"</string>
<string name="map" msgid="5441053548030107189">"Zemljevid"</string>
+ <string name="browse" msgid="6079864138582486027">"Brskanje"</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>
@@ -1202,6 +1207,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dotaknite se, če želite izbrati jezik in postavitev."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Aplikacija <xliff:g id="NAME">%s</xliff:g> riše čez druge aplikacije"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Apl. <xliff:g id="NAME">%s</xliff:g> se prikazuje čez druge."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Deli te aplikacije lahko ostanejo vseskozi vidni. Če ta funkcija ne deluje pravilno, jo 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>
@@ -1358,8 +1367,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Delite z aplikacijo <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Drsna ročica. Dotaknite se in pridržite."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Povlecite, če želite odkleniti."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Priključite slušalke, če želite slišati izgovorjene tipke gesla."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Pika."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Krmarjenje domov"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Krmarjenje navzgor"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Več možnosti"</string>
@@ -1763,4 +1770,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Vnesite uro"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Preklopite na način za vnašanje besedila, da vnesete čas."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Preklopite na način ure, da vnesete čas."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 15f0e1e..cc740a6 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Lejon aplikacionin t\'u japë fund proceseve në sfond të aplikacioneve të tjera. Kjo mund të shkaktojë mosfunksionimin e aplikacioneve të tjera."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Ky aplikacion mund të shfaqet mbi aplikacionet e tjera"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Ky aplikacion mund të shfaqet mbi aplikacionet e tjera ose në pjesë të tjera të ekranit. Kjo mund të shkaktojë ndërhyrje në përdorimin normal të aplikacionit dhe në mënyrën se si shfaqen aplikacionet e tjera."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"ekzekuto në sfond"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Ky aplikacion mund të ekzekutohet në sfond. Kjo mund ta shkarkojë më shpejt baterinë."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"përdor të dhënat në sfond"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Ky aplikacion mund të përdorë të dhënat në sfond. Kjo mund të rritë përdorimin e të dhënave."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"bëje aplikacionin të qëndrojë gjithmonë në punë"</string>
<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>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Formo numrin"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefoni"</string>
<string name="map" msgid="5441053548030107189">"Harta"</string>
+ <string name="browse" msgid="6079864138582486027">"Shfleto"</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>
@@ -1163,6 +1168,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Trokit për të zgjedhur gjuhën dhe strukturën"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> mbivendoset mbi aplikacionet e tjera"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Aplikacioni <xliff:g id="NAME">%s</xliff:g> po shfaqet në krye."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Disa pjesë të këtij aplikacioni mund të mbeten të dukshme gjatë të gjithë kohës. Nëse ky funksion nuk po funksionon si duhet, çaktivizoje atë."</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Shpërnda me <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Dorezë me rrëshqitje. Preke dhe mbaje të shtypur."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Rrëshqit për të shkyçur."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Vendos kufjet për të dëgjuar fjalëkalimin"</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Pikë."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Orientohu për në shtëpi"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Ngjitu lart"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Opsione të tjera"</string>
@@ -1702,4 +1709,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Shkruaj kohën"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Kalo te modaliteti i hyrjes së tekstit për hyrjen e kohës."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Kalo te modaliteti i orës për hyrjen e kohës."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 3edae1b..27f780a 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -323,6 +323,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Дозвољава апликацији да заустави позадинске процесе других апликација. Ово може да заустави друге апликације."</string>
<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>
@@ -972,8 +976,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Метод уноса"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Радње у вези са текстом"</string>
<string name="email" msgid="4560673117055050403">"Пошаљи имејл"</string>
- <string name="dial" msgid="2275093056198652749">"Позови"</string>
+ <string name="dial" msgid="4204975095406423102">"Позови"</string>
<string name="map" msgid="5441053548030107189">"Мапа"</string>
+ <string name="browse" msgid="6079864138582486027">"Прегледај"</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>
@@ -1182,6 +1187,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Апликација <xliff:g id="NAME">%s</xliff:g> се приказује преко других апликација"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Апликација <xliff:g id="NAME">%s</xliff:g> се приказује преко."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Делови ове апликације могу да остану видљиви у сваком тренутку. Ако ова функција не ради исправно, искључите је."</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>
@@ -1337,8 +1346,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Дели са апликацијом <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Клизна ручица. Додирните и задржите."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Превуците да бисте откључали."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Прикључите слушалице да бисте чули изговорене тастере за лозинку."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Тачка."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Кретање до Почетне"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Кретање нагоре"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Још опција"</string>
@@ -1732,4 +1739,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 4c673d0..7410322 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -183,7 +183,7 @@
<string name="work_profile_deleted_details" msgid="226615743462361248">"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="6019770344820507579">"Din jobbprofil är inte längre tillgänglig på den här enheten."</string>
<string name="network_logging_notification_title" msgid="1805392571290161924">"Nätverkstrafiken övervakas"</string>
- <string name="network_logging_notification_text" msgid="2671761001956320094">"Tryck här om du vill läsa mer"</string>
+ <string name="network_logging_notification_text" msgid="2671761001956320094">"Tryck här för att läsa mer"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Enheten kommer att rensas"</string>
<string name="factory_reset_message" msgid="4905025204141900666">"Administratörsappen saknar delar eller är skadad och kan inte användas. Enheten kommer nu att rensas. Kontakta administratören om du behöver hjälp."</string>
<string name="me" msgid="6545696007631404292">"Jag"</string>
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Tillåter att appen avslutar andra appars bakgrundsprocesser. Detta kan göra så att andra appar avslutas."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Appen kan visas ovanpå andra appar"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Appen kan visas ovanpå andra appar eller andra delar av skärmen. Detta kan störa den vanliga användningen av appar och påverka hur andra appar visas."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"kör i bakgrunden"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Appen kan köras i bakgrunden. Det kan minska batteritiden."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"använd data i bakgrunden"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Data kan användas i bakgrunden av appen. Det kan öka dataanvändningen."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"se till att appen alltid körs"</string>
<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>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Ring"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefon"</string>
<string name="map" msgid="5441053548030107189">"Karta"</string>
+ <string name="browse" msgid="6079864138582486027">"Bläddra"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tryck om du vill välja språk och layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> gör överlagringar på andra appar"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Appen <xliff:g id="NAME">%s</xliff:g> visas ovanpå."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Delar av den här appen kanske alltid är synliga. Inaktivera funktionen om den inte fungerar som den ska."</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Dela med <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Skärmlåsfunktion. Tryck och dra."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Lås upp genom att svepa."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Anslut mikrofonlurar om du vill att lösenordet ska läsas upp."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punkt."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Visa startsidan"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navigera uppåt"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Fler alternativ"</string>
@@ -1401,7 +1408,7 @@
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Ange PIN-kod för SIM-kortet"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Ange PIN-kod"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"Ange lösenord"</string>
- <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM-kortet är nu inaktiverat. Ange PUK-koden om du vill fortsätta. Kontakta operatören om du vill få mer information."</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM-kortet är nu inaktiverat. Ange PUK-koden för att fortsätta. Kontakta operatören om du vill ha mer information."</string>
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Ange önskad PIN-kod"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Bekräfta önskad PIN-kod"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Låser upp SIM-kort …"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Ange tid"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Byt till textinmatningsläget och ange tid."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Byt till klockläget och ange tid."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 98fcc6b..f266496 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -318,6 +318,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Inaruhusu programu kukamilisha michakato ya usuli ya programu nyingine. Hii inaweza kusababisha programu nyingine kukoma kufanyakazi."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Pogramu hii inaweza kuonekana juu ya programu zingine"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Programu hii inaweza kuonekana juu ya programu zingine au sehemu zingine za skrini. Hii huenda ikaathiri matumizi ya kawaida ya programu na kubadilisha jinsi ambavyo programu zingine zinavyoonekana."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"tumia chini chini"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Programu hii inaweza kutumika chini chini. Hali hii inaweza kumaliza chaji ya betri haraka."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"tumia data chini chini"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Programu hii inaweza kutumia data chini chini. Hali hii inaweza kuongeza matumizi ya data."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"Fanya programu kuendeshwa kila mara"</string>
<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>
@@ -668,14 +672,14 @@
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Kazi"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"Nyinginezo"</string>
<string name="quick_contacts_not_available" msgid="746098007828579688">"Hakuna programu iliyopatikana ili kuona anwani hii."</string>
- <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Ingiza msimbo wa PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Ingiza PUK na msimbo mpya wa PIN"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Weka nambari ya PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Weka PUK na nambari mpya ya PIN"</string>
<string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Msimbo wa PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Msimbo mpya wa PIN"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Nambari mpya ya PIN"</string>
<string name="keyguard_password_entry_touch_hint" msgid="2644215452200037944"><font size="17">"Gusa ili uandike nenosiri"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Charaza nenosiri ili kufungua"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Ingiza PIN ili kufungua"</string>
- <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Msimbo wa PIN usio sahihi."</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Nambari ya PIN uliyoweka si sahihi."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Ili kufungua, bofya Menyu kisha 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Nambari ya dharura"</string>
<string name="lockscreen_carrier_default" msgid="6169005837238288522">"Hakuna huduma"</string>
@@ -923,7 +927,7 @@
<item quantity="one">baada ya mwaka <xliff:g id="COUNT_0">%d</xliff:g></item>
</plurals>
<string name="VideoView_error_title" msgid="3534509135438353077">"Shida ya video"</string>
- <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Video hii si halali kutiririshwa kwa kifaa hiki."</string>
+ <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Video hii hairuhusiwi kutiririshwa kwenye kifaa hiki."</string>
<string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Haiwezi kucheza video hii."</string>
<string name="VideoView_error_button" msgid="2822238215100679592">"Sawa"</string>
<string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -950,8 +954,9 @@
<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="dial" msgid="2275093056198652749">"Piga simu"</string>
+ <string name="dial" msgid="4204975095406423102">"Simu"</string>
<string name="map" msgid="5441053548030107189">"Ramani"</string>
+ <string name="browse" msgid="6079864138582486027">"Vinjari"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Nafasi ya kuhafadhi inakwisha"</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>
@@ -1160,6 +1165,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Gonga ili uchague lugha na muundo"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> huchomoza kwenye programu zingine"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Programu ya <xliff:g id="NAME">%s</xliff:g> inaonekana juu ya zingine."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Huenda sehemu za programu hii zikaendelea kuonekana kila wakati. Zima kipengele hiki kama hakifanyi kazi vizuri."</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>
@@ -1314,8 +1323,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Shiriki na <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Utambo unaosonga. Gusa & shika"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Pitisha ili kufungua."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Chomeka kifaa cha sauti ili kusikiliza vibonye vya nenosiri vikizungumzwa."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Nukta."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Abiri nyumbani"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Ongoza"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Chaguo zaidi"</string>
@@ -1400,10 +1407,10 @@
<string name="kg_pin_instructions" msgid="2377242233495111557">"Ingiza PIN"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"Weka Nenosiri"</string>
<string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM sasa imelemazwa. Ingiza msimbo wa PUK ili kuendelea. Wasiliana na mtoa huduma kwa maelezo."</string>
- <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Ingiza msimbo wa PIN unaopendelewa"</string>
- <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Thibitisha msimbo wa PIN unaopendelewa"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Weka nambari yako ya PIN"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Thibitisha nambari ya PIN uliyoweka"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Inafungua SIM kadi..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Msimbo wa PIN usio sahihi."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Nambari ya PIN uliyoweka si sahihi."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Charaza PIN iliyo na tarakimu kati ya 4 na 8."</string>
<string name="kg_invalid_sim_puk_hint" msgid="6025069204539532000">"Msimbo wa PUK lazima uwe na tarakimu 8."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Ingiza upya msimbo sahihi wa PUK. Majaribio yanayorudiwa yatalemaza SIM kabisa."</string>
@@ -1694,9 +1701,23 @@
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"Utatuzi wa USB"</string>
<string name="time_picker_hour_label" msgid="2979075098868106450">"saa"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"dakika"</string>
- <string name="time_picker_header_text" msgid="143536825321922567">"Weka muda"</string>
+ <string name="time_picker_header_text" msgid="143536825321922567">"Weka saa"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"Weka muda sahihi"</string>
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Andika wakati"</string>
- <string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Badilisha data ya wakati iwe katika hali ya maandishi."</string>
- <string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Badilisha data ya wakati iwe katika hali ya saa ya mviringo."</string>
+ <string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Badilisha iwe katika hali ya maandishi wakati wa kuweka muda."</string>
+ <string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Badilisha umbo liwe la saa ya mishale wakati wa kuweka muda."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index ee3a41d..7ab8c79 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"பிற பயன்பாடுகளின் பின்புலச் செயல்முறைகளை நிறுத்த பயன்பாட்டை அனுமதிக்கிறது. இதனால் பிற பயன்பாடுகள் இயங்குவதை நிறுத்தலாம்."</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"உள்ளீட்டு முறை"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"உரை நடவடிக்கைகள்"</string>
<string name="email" msgid="4560673117055050403">"மின்னஞ்சல்"</string>
- <string name="dial" msgid="2275093056198652749">"டயல்"</string>
+ <string name="dial" msgid="4204975095406423102">"ஃபோன்"</string>
<string name="map" msgid="5441053548030107189">"வரைபடம்"</string>
+ <string name="browse" msgid="6079864138582486027">"உலாவு"</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>
@@ -1163,6 +1168,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"பிற பயன்பாடுகளின் மேல் <xliff:g id="NAME">%s</xliff:g> செயல்படும்"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"பிற பயன்பாடுகளின் மேலே <xliff:g id="NAME">%s</xliff:g> பயன்பாடு காட்டப்படுகிறது."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"இந்தப் பயன்பாட்டின் பகுதிகள், எல்லா நேரமும் காட்டப்படக்கூடும். இந்த அம்சம் சரியாகச் செயல்படவில்லை எனில், அதை முடக்கவும்."</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> உடன் பகிர்"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"ஸ்லைடிங் ஹேன்டில். தொட்டுப் பிடிக்கவும்."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"திறக்க ஸ்வைப் செய்யவும்."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"கூறப்படும் கடவுச்சொல் விசைகளைக் கேட்பதற்கு ஹெட்செட்டைச் செருகவும்."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"புள்ளி."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"முகப்பிற்கு வழிசெலுத்து"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"மேலே வழிசெலுத்து"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"மேலும் விருப்பங்கள்"</string>
@@ -1702,4 +1709,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 46c5bce..905ccbe 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -255,7 +255,7 @@
<string name="permgrouplab_calendar" msgid="5863508437783683902">"క్యాలెండర్"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"మీ క్యాలెండర్ను ప్రాప్యత చేయడానికి"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
- <string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS సందేశాలను పంపడానికి మరియు వీక్షించడానికి"</string>
+ <string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS సందేశాలను పంపడం మరియు వీక్షించడం"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"నిల్వ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైల్లను ప్రాప్యత చేయడానికి"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"మైక్రోఫోన్"</string>
@@ -263,7 +263,7 @@
<string name="permgrouplab_camera" msgid="4820372495894586615">"కెమెరా"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"చిత్రాలను తీయడానికి మరియు వీడియోను రికార్డ్ చేయడానికి"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ఫోన్"</string>
- <string name="permgroupdesc_phone" msgid="6234224354060641055">"ఫోన్ కాల్లను చేయడానికి మరియు నిర్వహించడానికి"</string>
+ <string name="permgroupdesc_phone" msgid="6234224354060641055">"ఫోన్ కాల్లు చేయడం మరియు నిర్వహించడం"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"శరీర సెన్సార్లు"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"మీ అత్యంత కీలకమైన గుర్తుల గురించి సెన్సార్ డేటాని ప్రాప్యత చేస్తుంది"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"విండో కంటెంట్ను తిరిగి పొందుతుంది"</string>
@@ -300,7 +300,7 @@
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"మీ పరికరం స్వీకరించిన సెల్ ప్రసార సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సెల్ ప్రసార హెచ్చరికలు అత్యవసర పరిస్థితుల గురించి మిమ్మల్ని హెచ్చరించడానికి కొన్ని స్థానాల్లో అందించబడతాయి. అత్యవసర సెల్ ప్రసారం స్వీకరించినప్పుడు హానికరమైన అనువర్తనాలు మీ పరికరం యొక్క పనితీరు లేదా నిర్వహణకు అంతరాయం కలిగించవచ్చు."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"చందా చేయబడిన ఫీడ్లను చదవడం"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"ప్రస్తుతం సమకాలీకరించిన ఫీడ్ల గురించి వివరాలను పొందడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
- <string name="permlab_sendSms" msgid="7544599214260982981">"SMS సందేశాలను పంపడానికి మరియు వీక్షించడానికి"</string>
+ <string name="permlab_sendSms" msgid="7544599214260982981">"SMS సందేశాలను పంపడం మరియు వీక్షించడం"</string>
<string name="permdesc_sendSms" msgid="7094729298204937667">"SMS సందేశాలు పంపడానికి అనువర్తనాన్ని అనుమతిస్తుంది. దీని వలన ఊహించని ఛార్జీలు విధించబడవచ్చు. హానికరమైన అనువర్తనాలు మీ నిర్ధారణ లేకుండానే సందేశాలను పంపడం ద్వారా మీకు డబ్బు ఖర్చయ్యేలా చేయవచ్చు."</string>
<string name="permlab_readSms" msgid="8745086572213270480">"మీ వచన సందేశాలు (SMS లేదా MMS) చదవడం"</string>
<string name="permdesc_readSms" product="tablet" msgid="4741697454888074891">"ఈ అనువర్తనం మీ టాబ్లెట్లో నిల్వ చేసిన అన్ని SMS (వచన) సందేశాలను చదవగలదు."</string>
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"ఇతర అనువర్తనాల నేపథ్య ప్రాసెస్లను ముగించడానికి అనువర్తనాన్ని అనుమతిస్తుంది. దీని వలన ఇతర అనువర్తనాలు అమలు కాకుండా ఆపివేయబడవచ్చు."</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"ఇన్పుట్ పద్ధతి"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"వచనానికి సంబంధించిన చర్యలు"</string>
<string name="email" msgid="4560673117055050403">"ఇమెయిల్"</string>
- <string name="dial" msgid="2275093056198652749">"డయల్ చేయి"</string>
+ <string name="dial" msgid="4204975095406423102">"ఫోన్"</string>
<string name="map" msgid="5441053548030107189">"మ్యాప్"</string>
+ <string name="browse" msgid="6079864138582486027">"బ్రౌజ్ చేయండి"</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>
@@ -1163,6 +1168,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g>ని ఇతర అనువర్తనాలలో చూపండి"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"ఎగువన <xliff:g id="NAME">%s</xliff:g> అనువర్తనం కనిపిస్తోంది."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"ఈ అనువర్తనంలోని భాగాలు అన్ని సమయాల్లో కనిపిస్తూ ఉండవచ్చు. ఈ లక్షణం సరిగ్గా పని చేయకపోతే, దీన్ని ఆఫ్ చేయండి."</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>తో భాగస్వామ్యం చేయండి"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"స్లైడింగ్ హ్యాండిల్. తాకి, ఆపై నొక్కి ఉంచండి."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"అన్లాక్ చేయడానికి స్వైప్ చేయండి."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"చదివి వినిపించే పాస్వర్డ్ కీలను వినడానికి హెడ్సెట్ను ప్లగిన్ చేయండి."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"చుక్క."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"హోమ్కు నావిగేట్ చేయండి"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"పైకి నావిగేట్ చేయండి"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"మరిన్ని ఎంపికలు"</string>
@@ -1702,4 +1709,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 230d42a..bb893fb 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"อนุญาตให้แอปพลิเคชันหยุดการทำงานในพื้นหลังของแอปพลิเคชันอื่นๆ ซึ่งอาจทำให้แอปพลิเคชันอื่นๆ หยุดการทำงาน"</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"วิธีป้อนข้อมูล"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"การทำงานของข้อความ"</string>
<string name="email" msgid="4560673117055050403">"อีเมล"</string>
- <string name="dial" msgid="2275093056198652749">"หมุนหมายเลข"</string>
+ <string name="dial" msgid="4204975095406423102">"โทรศัพท์"</string>
<string name="map" msgid="5441053548030107189">"แผนที่"</string>
+ <string name="browse" msgid="6079864138582486027">"เรียกดู"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"แตะเพื่อเลือกภาษาและรูปแบบ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> แสดงทับแอปอื่น"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"แอป <xliff:g id="NAME">%s</xliff:g> แสดงอยู่ด้านบนสุด"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"ส่วนต่างๆ ของแอปนี้อาจปรากฏอยู่ตลอดเวลา หากคุณลักษณะนี้ไม่ทำงานอย่างถูกต้อง ให้ปิดแอป"</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"แชร์ด้วย <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"ที่จับสำหรับเลื่อน แตะค้างไว้"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"กวาดเพื่อปลดล็อก"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"เสียบชุดหูฟังเพื่อฟังเสียงเมื่อพิมพ์รหัสผ่าน"</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"เครื่องหมายจุด"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"นำทางไปหน้าแรก"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"นำทางขึ้น"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"ตัวเลือกเพิ่มเติม"</string>
@@ -1701,4 +1708,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index e59ed9d..05ae6bf 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Pinapayagan ang app na tapusin ang mga proseso sa background ng iba pang apps. Maaari itong maging sanhi ng paghinto sa paggana ng iba pang apps."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Maaaring lumabas ang app na ito sa ibabaw ng iba pang mga app"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Maaaring lumabas ang app na ito sa ibabaw ng iba pang mga app o iba pang mga bahagi ng screen. Maaaring makasagabal ito sa normal na paggamit ng app at mabago nito ang paraan kung paano lumalabas ang iba pang mga app."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"patakbuhin sa background"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Maaaring tumakbo sa background ang app na ito. Maaaring mas mabilis nitong maubos ang baterya."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"gumamit ng data sa background"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Maaaring gumamit ng data sa background ang app na ito. Maaaring mas maraming data ang magamit nito."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"palaging patakbuhin ang app"</string>
<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>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Mag-dial"</string>
+ <string name="dial" msgid="4204975095406423102">"Telepono"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
+ <string name="browse" msgid="6079864138582486027">"Mag-browse"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"I-tap upang pumili ng wika at layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"I-draw over ang <xliff:g id="NAME">%s</xliff:g> sa iba pang app"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Ipinapakita ang <xliff:g id="NAME">%s</xliff:g> app sa itaas."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Maaaring manatiling nakikita ang mga bahagi ng app na ito sa lahat ng oras. Kung hindi gumagana nang tama ang feature na ito, 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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Ibahagi sa <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Hawakan sa pag-slide. Pindutin nang matagal."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Mag-swipe upang i-unlock."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Mag-plug in ng isang headset upang marinig ang mga password key na binabanggit."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Dot."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Magnabiga sa home"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Magnabiga pataas"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Higit pang mga pagpipilian"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"I-type ang oras"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Lumipat sa pamamaraan ng pag-input ng text para sa input na oras."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Lumipat sa mode ng orasan para sa input na oras."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 1a2bf72..b56d466 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Uygulamaya diğer uygulamalara ait arka plan işlemleri sonlandırma izni verir. Bu izin, diğer uygulamaların çalışmayı durdurmasına neden olabilir."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Bu uygulama, diğer uygulamaların üzerinde görünebilir"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Bu uygulama, uygulamaların üzerinde veya ekranın diğer kısımlarında görünebilir. Bu durum, normal uygulama kullanımını etkileyebilir ve diğer uygulamaların görünümünü değiştirebilir."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"arka planda çalıştırma"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Bu uygulama arka planda çalıştırılabilir. Bu durum pilinizin daha hızlı boşalmasına neden olabilir."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"arka planda veri kullanma"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Bu uygulama, arka planda verileri kullanabilir. Bu durum veri kullanımını artırabilir."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"uygulamayı her zaman çalıştırma"</string>
<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>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Çevir"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefon"</string>
<string name="map" msgid="5441053548030107189">"Harita"</string>
+ <string name="browse" msgid="6079864138582486027">"Göz at"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dili ve düzeni seçmek için hafifçe dokunun"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> diğer uygulamaların üzerinde görüntüleniyor"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> üstte gösteriliyor."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Bu uygulamanın bazı bölümleri her zaman görünür durumda kalabilir. Bu özellik düzgün çalışmıyorsa 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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ile paylaş"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Kayan tutma yeri. Dokunun ve basılı tutun."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Kilidi açmak için kaydırın."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Şifre tuşlarının sesli okunmasını dinlemek için mikrofonlu kulaklık takın."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Nokta."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Ana sayfaya git"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Yukarı git"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Diğer seçenekler"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Zamanı yazın"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Zaman girişi için metin girişi moduna geçin."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Zaman girişi için saat moduna geçin."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 913a13b..e99d88b 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -326,6 +326,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Дозволяє програмі припиняти фонові процеси інших програм. Це може зупиняти запущені програми."</string>
<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>
@@ -992,8 +996,9 @@
<string name="inputMethod" msgid="1653630062304567879">"Метод введення"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Дії з текстом"</string>
<string name="email" msgid="4560673117055050403">"Електронна пошта"</string>
- <string name="dial" msgid="2275093056198652749">"Набрати номер"</string>
+ <string name="dial" msgid="4204975095406423102">"Телефонувати"</string>
<string name="map" msgid="5441053548030107189">"Карта"</string>
+ <string name="browse" msgid="6079864138582486027">"Переглянути"</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>
@@ -1202,6 +1207,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Торкніться, щоб вибрати мову та розкладку"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> відображається поверх інших додатків"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> відображається поверх."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Частина цього додатка може постійно залишатися видимою. Якщо ця функція працює неправильно, вимкніть її."</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>
@@ -1358,8 +1367,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Надіслати через <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Вказівник-повзунок. Торкніться й утримуйте."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Гортайте, щоб розблокувати."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Підключіть гарнітуру, щоб прослухати відтворені вголос символи пароля."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Крапка."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Перейти на головну"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Перейти вгору"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Більше"</string>
@@ -1763,4 +1770,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 82366e8..41c265d 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"ایپ کو دوسرے ایپس کے پس منظر کی کارروائیوں کو ختم کرنے کی اجازت دیتا ہے۔ اس کی وجہ سے دوسرے ایپس کا چلنا بند ہوسکتا ہے۔"</string>
<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">"ایپ کو خود اپنے ہی حصوں کو میموری میں استقلال پذیر بنانے کی اجازت دیتا ہے۔ یہ TV کو سُست بناکر دوسری ایپس کیلئے دستیاب میموری کو محدود کرسکتا ہے۔"</string>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"اندراج کا طریقہ"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"متن کی کارروائیاں"</string>
<string name="email" msgid="4560673117055050403">"ای میل"</string>
- <string name="dial" msgid="2275093056198652749">"ڈائل کریں"</string>
+ <string name="dial" msgid="4204975095406423102">"فون کریں"</string>
<string name="map" msgid="5441053548030107189">"نقشہ"</string>
+ <string name="browse" msgid="6079864138582486027">"براؤز کریں"</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>
@@ -1163,6 +1168,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> کو دیگر ایپس پر ڈرا کریں"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> ایپ اوپر ڈسپلے ہورہی ہے۔"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"ممکن ہے اس ایپ کے حصے ہر وقت مرئی رہیں۔ اگر یہ خصوصیت ٹھیک سے کام نہیں کررہی ہے، تو اسے آف کردیں۔"</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> کے ساتھ اشتراک کریں"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"سلائیڈنگ ہینڈل۔ ٹچ کریں اور پکڑ کر رکھیں۔"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"غیر مقفل کرنے کیلئے سوائپ کریں۔"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"بولی گئی پاس ورڈ کلیدیں سننے کیلئے ایک ہیڈ سیٹ لگائیں۔"</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"ڈاٹ۔"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"ہوم پر نیویگیٹ کریں"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"اوپر نیویگیٹ کریں"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"مزید اختیارات"</string>
@@ -1702,4 +1709,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 114584c..5309181 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Ilovaga boshqa ilovalarning orqa fonda amalga oshirilayotgan jarayonlarini to‘xtatish uchun ruxsat beradi. Bu boshqa ilovalarning to‘xtatilishiga sabab bo‘lishi mumkin."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Bu ilova boshqa oynalar ustidan ko‘rsatilishi mumkin"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Bu ilova ilovalar yoki ekranning boshqa qismlaridan yuqorida ko‘rinishi mumkin. Bu ilovadan odatiy foydalanishga halaqit berishi va boshqa ilovalar ko‘rinishining usullarini o‘zgartirib yuborishi mumkin."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"orqa fonda ishlaydi"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Bu ilova orqa fonda ham ishlaydi. Bunda batareya quvvati ko‘proq sarflanishi mumkin."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"orqa fonda internetdan foydalanadi"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Bu ilova orqa fonda internetdan foydalanadi. Bunda trafik sarflanishi mumkin."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"ilovani doim ishlab turadigan qilish"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Ilovaga o‘zining komponentlarini xotirada doimiy saqlashga ruxsat beradi. Bu mavjud xotirani cheklashi va planshetni sekin ishlashiga sabab bo‘lishi mumkin."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Ilovaga o‘zining muayyan qismlarining xotiraning turg‘un qismiga aylantirish huquqini beradi. Bunda, boshqa ilovalar uchun xotiradan ajratilgan joy cheklanib, televizorning ishlashi sekinlashishi mumkin."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Chaqiruv"</string>
+ <string name="dial" msgid="4204975095406423102">"Telefon"</string>
<string name="map" msgid="5441053548030107189">"Xarita"</string>
+ <string name="browse" msgid="6079864138582486027">"Tanlash"</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>
@@ -1163,6 +1168,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Til va sxemani belgilash uchun bosing"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> boshqa ilovalar ustidan ochiladi"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> eng tepada ochilgan."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Bu ilovaning ba’zi qismlari har doim ko‘rinib qolishi mumkin. Agar bu funksiya to‘g‘ri ishlamasa, uni o‘chirib qo‘ying."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"O‘CHIRIB QO‘YISH"</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>
@@ -1317,8 +1326,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ilovasiga ruxsat berish"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Surish uchun dastak. Bosing va ushlab turing."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Qulfdan chiqarish uchun silang."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Parol kalitlarini eshitish uchun garnitura ulang."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Dot."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Boshiga o‘tish"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Yuqoriga o‘tish"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Ko‘proq sozlamalar"</string>
@@ -1702,4 +1709,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Vaqtni kiriting"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Vaqtni kiritish uchun matn kiritish rejimiga o‘ting."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Vaqtni kiritish uchun soat rejimiga o‘ting."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 4f8e020..69e0ec3 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Cho phép ứng dụng kết thúc các quá trình nền của các ứng dụng khác. Việc này có thể khiến các ứng dụng khác dừng chạy."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Ứng dụng này có thể xuất hiện ở phía trên cùng của các ứng dụng khác"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Ứng dụng này có thể xuất hiện ở phía trên cùng của các ứng dụng khác hoặc các phần khác của màn hình. Điều này có thể cản trở hoạt động sử dụng ứng dụng thông thường và thay đổi cách các ứng dụng khác xuất hiện."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"chạy trong nền"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Ứng dụng này có thể chạy trong nền. Việc này có thể tiêu hao pin nhanh hơn."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"sử dụng dữ liệu trong nền"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Ứng dụng này có thể sử dụng dữ liệu trong nền. Việc này có thể tăng mức sử dụng dữ liệu."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"đặt ứng dụng luôn chạy"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Cho phép ứng dụng tạo sự đồng nhất cho các phần của mình trong bộ nhớ. Việc này có thể hạn chế bộ nhớ đối với các ứng dụng khác đang làm chậm máy tính bảng."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Cho phép ứng dụng làm cho các phần của ứng dụng trở nên ổn định trong bộ nhớ. Việc này có thể hạn chế bộ nhớ đối với các ứng dụng khác đang làm chậm TV."</string>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Quay số"</string>
+ <string name="dial" msgid="4204975095406423102">"Điện thoại"</string>
<string name="map" msgid="5441053548030107189">"Bản đồ"</string>
+ <string name="browse" msgid="6079864138582486027">"Duyệt qua"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Nhấn để chọn ngôn ngữ và bố cục"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> vẽ lên các ứng dụng khác"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Ứng dụng <xliff:g id="NAME">%s</xliff:g> hiển thị ở trên cùng."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Các phần của ứng dụng này có thể vẫn hiển thị mọi lúc. Nếu tính năng này không hoạt động bình thường, hãy tắt tính năng này."</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Chia sẻ với <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Tay trượt. Chạm & giữ."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Trượt để mở khóa."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Cắm tai nghe để nghe các khóa mật khẩu được đọc."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Dấu chấm."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Điều hướng về trang chủ"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Điều hướng lên trên"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Tùy chọn khác"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Nhập thời gian"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Chuyển sang chế độ nhập văn bản để nhập thời gian."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Chuyển sang chế độ đồng hồ để nhập thời gian."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index af155e2..2236f1f 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"允许该应用结束其他应用的后台进程。此权限可导致其他应用停止运行。"</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"输入法"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"文字操作"</string>
<string name="email" msgid="4560673117055050403">"电子邮件"</string>
- <string name="dial" msgid="2275093056198652749">"拨号"</string>
+ <string name="dial" msgid="4204975095406423102">"电话"</string>
<string name="map" msgid="5441053548030107189">"地图"</string>
+ <string name="browse" msgid="6079864138582486027">"浏览"</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>
@@ -1162,6 +1167,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g>会在其他应用的上层显示内容"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g>应用目前显示在上层。"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"此应用的某些部分可能会一直保持可见状态。如果此功能未能正常运行,请将其关闭。"</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"使用<xliff:g id="APPLICATION_NAME">%s</xliff:g>分享"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"滑动手柄。触摸并按住。"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"滑动解锁。"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"需要插入耳机才能听到密码的按键声。"</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"点。"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"导航首页"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"向上导航"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"更多选项"</string>
@@ -1694,18 +1701,25 @@
<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>
- <!-- no translation found for time_picker_hour_label (2979075098868106450) -->
+ <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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
<skip />
- <!-- no translation found for time_picker_minute_label (5168864173796598399) -->
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
<skip />
- <!-- no translation found for time_picker_header_text (143536825321922567) -->
+ <!-- no translation found for autofill_save_yes (6398026094049005921) -->
<skip />
- <!-- no translation found for time_picker_input_error (7574999942502513765) -->
+ <!-- no translation found for autofill_save_no (2625132258725581787) -->
<skip />
- <!-- no translation found for time_picker_prompt_label (7588093983899966783) -->
+ <!-- no translation found for autofill_save_type_password (5288448918465971568) -->
<skip />
- <!-- no translation found for time_picker_text_input_mode_description (4148166758173708199) -->
+ <!-- no translation found for autofill_save_type_address (4936707762193009542) -->
<skip />
- <!-- no translation found for time_picker_radial_mode_description (4953403779779557198) -->
+ <!-- no translation found for autofill_save_type_credit_card (7127694776265563071) -->
<skip />
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 988a322..db98761 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"允許應用程式終止其他應用程式的背景處理程序。這樣可能會導致其他應用程式停止運行。"</string>
<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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"輸入法"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"文字操作"</string>
<string name="email" msgid="4560673117055050403">"電郵"</string>
- <string name="dial" msgid="2275093056198652749">"撥號"</string>
+ <string name="dial" msgid="4204975095406423102">"撥打電話"</string>
<string name="map" msgid="5441053548030107189">"地圖"</string>
+ <string name="browse" msgid="6079864138582486027">"瀏覽"</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>
@@ -1162,6 +1167,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"「<xliff:g id="NAME">%s</xliff:g>」會覆蓋其他應用程式"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"「<xliff:g id="NAME">%s</xliff:g>」應用程式目前在最上層顯示。"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"畫面上可能會一直保持顯示此應用程式的某些部分。如果此功能無法正常運作,請將其關閉。"</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"與「<xliff:g id="APPLICATION_NAME">%s</xliff:g>」分享"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"滑動控制。持續輕觸。"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"滑動即可解鎖。"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"插上耳機即可聽到系統朗讀密碼鍵。"</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"點。"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"瀏覽首頁"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"向上瀏覽"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"更多選項"</string>
@@ -1701,4 +1708,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 31fc918..7f4c01b 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -127,10 +127,10 @@
<string name="roamingTextSearching" msgid="8360141885972279963">"正在搜尋服務"</string>
<string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi 通話"</string>
<string-array name="wfcOperatorErrorAlertMessages">
- <item msgid="2254967670088539682">"如要透過 Wi-FI 撥打電話及傳送訊息,請先要求您的行動通訊業者開通這項服務,然後再到「設定」啟用 Wi-Fi 通話功能。"</item>
+ <item msgid="2254967670088539682">"如要透過 Wi-FI 撥打電話及傳送訊息,請先要求您的電信業者開通這項服務,然後再到「設定」啟用 Wi-Fi 通話功能。"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="6177300162212449033">"向您的行動通訊業者註冊"</item>
+ <item msgid="6177300162212449033">"向您的電信業者註冊"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"允許應用程式終止其他應用程式的背景處理程序。這項設定可能會導致其他應用程式停止執行。"</string>
<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>
@@ -507,8 +511,8 @@
<string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"允許應用程式繫結至條件提供者服務的頂層介面 (一般應用程式並不需要)。"</string>
<string name="permlab_bindDreamService" msgid="4153646965978563462">"繫結至 Dream 服務"</string>
<string name="permdesc_bindDreamService" msgid="7325825272223347863">"允許應用程式繫結至 Dream 服務的頂層介面 (一般應用程式不需使用)。"</string>
- <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"叫用行動通訊業者提供的設定應用程式"</string>
- <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"允許應用程式叫用行動通訊業者提供的設定應用程式 (一般應用程式並不需要)。"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"叫用電信業者提供的設定應用程式"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"允許應用程式叫用電信業者提供的設定應用程式 (一般應用程式並不需要)。"</string>
<string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"監聽網路狀況觀察資訊"</string>
<string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"允許應用程式監聽網路狀況觀察資訊 (一般應用程式並不需要)。"</string>
<string name="permlab_setInputCalibration" msgid="4902620118878467615">"變更輸入裝置校正設定"</string>
@@ -519,10 +523,10 @@
<string name="permdesc_handoverStatus" msgid="4788144087245714948">"允許應用程式接收 Android Beam 目前傳輸的資訊"</string>
<string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"移除 DRM 憑證"</string>
<string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"允許應用程式移除 DRM 憑證 (一般應用程式並不需要)。"</string>
- <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"與行動通訊業者簡訊服務繫結"</string>
- <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"允許應用程式與行動通訊業者簡訊服務的頂層介面繫結 (一般應用程式並不需要)。"</string>
- <string name="permlab_bindCarrierServices" msgid="3233108656245526783">"與行動通訊業者服務繫結"</string>
- <string name="permdesc_bindCarrierServices" msgid="1391552602551084192">"允許應用程式繫結至行動通訊業者服務 (一般應用程式並不需要)。"</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"與電信業者簡訊服務繫結"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"允許應用程式與電信業者簡訊服務的頂層介面繫結 (一般應用程式並不需要)。"</string>
+ <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>
@@ -952,8 +956,9 @@
<string name="inputMethod" msgid="1653630062304567879">"輸入法"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"文字動作"</string>
<string name="email" msgid="4560673117055050403">"電子郵件"</string>
- <string name="dial" msgid="2275093056198652749">"撥號"</string>
+ <string name="dial" msgid="4204975095406423102">"電話"</string>
<string name="map" msgid="5441053548030107189">"地圖"</string>
+ <string name="browse" msgid="6079864138582486027">"瀏覽"</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>
@@ -1125,7 +1130,7 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM 卡已新增"</string>
<string name="sim_added_message" msgid="7797975656153714319">"請重新啟動裝置,才能使用行動網路。"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"重新啟動"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"要讓新的 SIM 卡正常運作,您必須先安裝行動通訊業者提供的應用程式,並開啟該應用程式。"</string>
+ <string name="carrier_app_dialog_message" msgid="7066156088266319533">"要讓新的 SIM 卡正常運作,您必須先安裝電信業者提供的應用程式,並開啟該應用程式。"</string>
<string name="carrier_app_dialog_button" msgid="7900235513678617329">"取得應用程式"</string>
<string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"暫時不要"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"已插入新的 SIM 卡"</string>
@@ -1162,6 +1167,10 @@
<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>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g>會在其他應用程式上層繪製內容"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g>應用程式目前顯示在最上層。"</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"這個應用程式的某些部分會一直保持顯示。如果這項功能未正常運作,請將它關閉。"</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>
@@ -1227,7 +1236,7 @@
<string name="deny" msgid="2081879885755434506">"拒絕"</string>
<string name="permission_request_notification_title" msgid="6486759795926237907">"已要求權限"</string>
<string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"帳戶 <xliff:g id="ACCOUNT">%s</xliff:g> 已提出\n權限要求。"</string>
- <string name="forward_intent_to_owner" msgid="1207197447013960896">"您目前並非透過工作設定檔使用這個應用程式"</string>
+ <string name="forward_intent_to_owner" msgid="1207197447013960896">"您目前並非透過 Work 設定檔使用這個應用程式"</string>
<string name="forward_intent_to_work" msgid="621480743856004612">"您目前透過工作設定檔使用這個應用程式"</string>
<string name="input_method_binding_label" msgid="1283557179944992649">"輸入法"</string>
<string name="sync_binding_label" msgid="3687969138375092423">"同步處理"</string>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"與「<xliff:g id="APPLICATION_NAME">%s</xliff:g>」分享"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"滑動控制。持續輕觸。"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"滑動即可解鎖。"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"連接耳機即可聽取系統朗讀密碼按鍵。"</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"點。"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"瀏覽首頁"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"向上瀏覽"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"更多選項"</string>
@@ -1401,7 +1408,7 @@
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"輸入 SIM PIN"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"輸入 PIN"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"輸入密碼"</string>
- <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM 卡已遭停用,必須輸入 PUK 碼才能繼續使用。詳情請洽您的行動通訊業者。"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM 卡已遭停用,必須輸入 PUK 碼才能繼續使用。詳情請洽您的電信業者。"</string>
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"輸入所需的 PIN 碼"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"確認所需的 PIN 碼"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"正在解除 SIM 卡鎖定..."</string>
@@ -1701,4 +1708,18 @@
<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>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 1ca690c..dadd6c0 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -320,6 +320,10 @@
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Ivumela uhelo lokusebenza ukuqeda izinqubo zangokwasemuva zezinhlelo zokusebenza. Lokhu kungababangela ezinye izinhlelo zokusebenza ukuyeka ukusebenza."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Lolu hlelo lokusebenza lungabonakala phezu kwezinhlelo zokusebenza"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Lolu hlelo lokusebenza lungabonakala phezu kwezinye izinhlelo zokusebenza noma ezinye izingxenye zesikrini. Lokhu kungaphazamisana nokusebenza okuvamile kohlelo lokusebenza futhi kushintshe indlela ezinye izinhlelo zokusebenza zibonakala ngakhona."</string>
+ <string name="permlab_runInBackground" msgid="7365290743781858803">"isebenza ngasemuva"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Lolu hlelo lokusebenza lungaqalisa ngasemuva. Lokhu kungaqeda ibhethri lakho ngokushesha."</string>
+ <string name="permlab_useDataInBackground" msgid="8694951340794341809">"sebenzisa idatha ngasemuva"</string>
+ <string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Lolu hlelo lokusebenza lingasebenzisa idatha ngasemuva. Lokhu kungabangela ukusetshenziswa kwedatha okwengeziwe."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"yenza uhlelo lokusebenza ukuthi ihlale isebenza"</string>
<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>
@@ -952,8 +956,9 @@
<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="dial" msgid="2275093056198652749">"Dayela"</string>
+ <string name="dial" msgid="4204975095406423102">"Ifoni"</string>
<string name="map" msgid="5441053548030107189">"Imephu"</string>
+ <string name="browse" msgid="6079864138582486027">"Dlulisa amehlo"</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>
@@ -1162,6 +1167,10 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Thepha ukuze ukhethe ulimi nesakhiwo"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"I-<xliff:g id="NAME">%s</xliff:g> yokudweba ngaphezu kwezinye izinhlelo zokusebenza"</string>
+ <string name="alert_windows_notification_title" msgid="5399998516035621282">"Uhlelo lokusebenza lwe-<xliff:g id="NAME">%s</xliff:g> liboniswa ngaphezulu."</string>
+ <string name="alert_windows_notification_message" msgid="2456738662997073459">"Izingxenye zalolu hlelo lokusebenza zingahlala zibonakala ngazo zonke izikhathi. Uma lesi sici singasebenzi ngokufanelekile, sivale."</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>
@@ -1316,8 +1325,6 @@
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Yabelana no <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Ihaambis isibambo. Thinta & ubambe."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Swayipha ukuze uvule."</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Plaka ku-headset ukuze uzwe okhiye bephasiwedi ezindlebeni zakho bezwakala kakhulu."</string>
- <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Icashazi."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Zulazulela ekhaya"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Zulazulela phezulu"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Izinketho ezingaphezulu"</string>
@@ -1701,4 +1708,18 @@
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Thayipha isikhathi"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Shintshela kumodi yokufaka umbhalo ngokufaka isikhathi."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Shintshela kumodi yewashi ngokufakwa kwesikhathi."</string>
+ <!-- no translation found for autofill_save_title (7081244500504163245) -->
+ <skip />
+ <!-- no translation found for autofill_save_title_with_type (4977385733042555659) -->
+ <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 />
</resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 4d5e45b..be77603 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -66,6 +66,9 @@
<attr name="primaryContentAlpha" format="float" />
<!-- The alpha applied to the foreground color to create the secondary text color. -->
<attr name="secondaryContentAlpha" format="float" />
+ <!-- Color used for error states and things that need to be drawn to
+ the users attention.. -->
+ <attr name="colorError" format="reference|color" />
<!-- Default background dim amount when a menu, dialog, or something similar pops up. -->
<attr name="backgroundDimAmount" format="float" />
<!-- Control whether dimming behind the window is enabled. The default
@@ -135,9 +138,6 @@
<!-- Color of list item text in alert dialogs. -->
<attr name="textColorAlertDialogListItem" format="reference|color" />
- <!-- Text color for errors. -->
- <attr name="textColorError" format="reference|color" />
-
<!-- Search widget more corpus result item background. -->
<attr name="searchWidgetCorpusItemBackground" format="reference|color" />
@@ -2287,6 +2287,17 @@
<enum name="auto" value="0x00000010" />
</attr>
+ <!-- Controls the auto-fill behavior for this view -->
+ <attr name="autoFillMode">
+ <!-- Inherit the behavior from the parent. If there is no parent it is auto. -->
+ <enum name="inherit" value="0" />
+ <!-- Allows this view to automatically trigger an auto-fill request when it get focus.
+ -->
+ <enum name="auto" value="1" />
+ <!-- The user has to manually force an auto-fill request for this view. -->
+ <enum name="manual" value="2" />
+ </attr>
+
<!-- Boolean that controls whether a view can take focus while in touch mode.
If this is true for a view, that view can gain focus when clicked on, and can keep
focus if another view is clicked on that doesn't have this attribute set to true. -->
@@ -4710,18 +4721,19 @@
</attr>
<!-- Specify the type of auto-size. Note that this feature is not supported by EditText,
works only for TextView -->
- <attr name="autoSizeText" format="enum">
+ <attr name="autoSizeTextType" format="enum">
<!-- No auto-sizing (default). -->
<enum name="none" value="0" />
- <!-- Uniform horizontal and vertical scaling. -->
+ <!-- Uniform horizontal and vertical text size scaling to fit within the
+ container -->
<enum name="uniform" value="1" />
</attr>
- <!-- Specify the auto-size step size if <code>autoSizeText</code> is set to
- <code>xy</code>. The default is 1px. Overwrites
+ <!-- Specify the auto-size step size if <code>autoSizeTextType</code> is set to
+ <code>uniform</code>. The default is 1px. Overwrites
<code>autoSizePresetSizes</code> if set. -->
<attr name="autoSizeStepGranularity" format="dimension" />
- <!-- Array of dimensions to be used in conjunction with
- <code>autoSizeText</code> set to <code>xy</code>. Overwrites
+ <!-- Resource array of dimensions to be used in conjunction with
+ <code>autoSizeTextType</code> set to <code>uniform</code>. Overrides
<code>autoSizeStepGranularity</code> if set. -->
<attr name="autoSizePresetSizes"/>
<!-- The minimum text size constraint to be used when auto-sizing text -->
@@ -5844,8 +5856,8 @@
<attr name="color" />
</declare-styleable>
- <!-- Drawable used to draw masked icons with foreground and background layers. -->
- <declare-styleable name="MaskableIconDrawableLayer">
+ <!-- Drawable used to draw adaptive icons with foreground and background layers. -->
+ <declare-styleable name="AdaptiveIconDrawableLayer">
<!-- The drawable to use for the layer. -->
<attr name="drawable" />
</declare-styleable>
@@ -8520,4 +8532,6 @@
<attr name="reverseLayout" format="boolean" />
<attr name="stackFromEnd" format="boolean" />
</declare-styleable>
+
+ <attr name="lockPatternStyle" format="reference" />
</resources>
diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml
index b28c6f2..6015ed5 100644
--- a/core/res/res/values/colors.xml
+++ b/core/res/res/values/colors.xml
@@ -75,8 +75,6 @@
<drawable name="input_method_fullscreen_background">#fff9f9f9</drawable>
<color name="input_method_navigation_guard">#ff000000</color>
- <color name="system_error">#fff4511e</color> <!-- deep orange 600 -->
-
<!-- For date picker widget -->
<drawable name="selected_day_background">#ff0092f4</drawable>
@@ -88,7 +86,6 @@
<color name="perms_dangerous_grp_color">#33b5e5</color>
<color name="perms_dangerous_perm_color">#33b5e5</color>
<color name="shadow">#cc222222</color>
- <color name="perms_costs_money">#fff4511e</color>
<!-- For search-related UIs -->
<color name="search_url_text_normal">#7fa87f</color>
@@ -121,7 +118,6 @@
<!-- LockPatternView -->
<color name="lock_pattern_view_regular_color">#ffffffff</color>
<color name="lock_pattern_view_success_color">#ffffffff</color>
- <color name="lock_pattern_view_error_color">@color/system_error</color>
<!-- FaceLock -->
<color name="facelock_spotlight_mask">#CC000000</color>
@@ -156,7 +152,6 @@
<color name="accessibility_focus_highlight">#bf39b500</color>
<color name="system_notification_accent_color">#ff607D8B</color>
- <color name="battery_saver_mode_color">#fff4511e</color><!-- deep orange 600 -->
<!-- Default user icon colors -->
<color name="user_icon_1">#ff00bcd4</color><!-- cyan 500 -->
diff --git a/core/res/res/values/colors_material.xml b/core/res/res/values/colors_material.xml
index 0a24565..e0cc5b5 100644
--- a/core/res/res/values/colors_material.xml
+++ b/core/res/res/values/colors_material.xml
@@ -46,6 +46,7 @@
<color name="button_material_dark">#ff5a595b</color>
<color name="button_material_light">#ffd6d7d7</color>
+ <color name="error_color_material">#F4511E</color>
<color name="switch_thumb_normal_material_dark">#ffbdbdbd</color>
<color name="switch_thumb_normal_material_light">#fff1f1f1</color>
@@ -65,9 +66,6 @@
<!-- 70% white -->
<color name="secondary_text_default_material_dark">#b3ffffff</color>
- <color name="error_text_material_light">@color/material_red_A700</color>
- <color name="error_text_material_dark">@color/material_red_A100</color>
-
<item name="hint_alpha_material_dark" format="float" type="dimen">0.50</item>
<item name="hint_alpha_material_light" format="float" type="dimen">0.38</item>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 72a2e43..2843f46 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1273,18 +1273,15 @@
config_enableFusedLocationOverlay is false. -->
<string name="config_fusedLocationProviderPackageName" translatable="false">com.android.location.fused</string>
- <!-- A list of potential packages, in priority order, that may contain a
- network recommendation provider. A network recommendation provider must:
+ <!-- The package name of the default network recommendation app.
+ A network recommendation provider must:
* Be granted the SCORE_NETWORKS permission.
* Include a Service for the android.net.scoring.RECOMMEND_NETWORKS action
protected by the BIND_NETWORK_RECOMMENDATION_SERVICE permission.
- This may be empty if network scoring and recommending isn't supported.
- -->
- <string-array name="config_networkRecommendationPackageNames" translatable="false">
- <!-- The standard AOSP network recommendation provider -->
- <item>com.android.networkrecommendation</item>
- </string-array>
+ This must be set to a valid network recommendation app.
+ -->
+ <string name="config_defaultNetworkRecommendationProviderPackage" translatable="false">com.android.networkrecommendation</string>
<!-- Whether to enable Hardware FLP overlay which allows Hardware FLP to be
replaced by an app at run-time. When disabled, only the
@@ -1863,6 +1860,10 @@
<!-- Amount of time in ms the user needs to press the relevant key to bring up the global actions dialog -->
<integer name="config_globalActionsKeyTimeout">500</integer>
+ <!-- Default width of a vertical scrollbar and height of a horizontal scrollbar.
+ Takes effect only if the scrollbar drawables have no intrinsic size. -->
+ <dimen name="config_scrollbarSize">4dp</dimen>
+
<!-- Distance that should be scrolled in response to a {@link MotionEvent#ACTION_SCROLL event}
with an axis value of 1. -->
<dimen name="config_scrollFactor">64dp</dimen>
@@ -2598,6 +2599,10 @@
<!-- True if the device supports split screen as a form of multi-window. -->
<bool name="config_supportsSplitScreenMultiWindow">true</bool>
+ <!-- True if the device has no home screen. That is a launcher activity
+ where the user can launch other applications from. -->
+ <bool name="config_noHomeScreen">false</bool>
+
<!-- True if the device requires AppWidgetService even if it does not have
the PackageManager.FEATURE_APP_WIDGETS feature -->
<bool name="config_enableAppWidgetService">false</bool>
@@ -2730,10 +2735,10 @@
<!-- Flag indicates that whether non-system apps can be installed on internal storage. -->
<bool name="config_allow3rdPartyAppOnInternal">true</bool>
- <!-- Component name of the default cell broadcast receiver -->
- <string name="config_defaultCellBroadcastReceiverComponent" translatable="false">com.android.cellbroadcastreceiver/.PrivilegedCellBroadcastReceiver</string>
+ <!-- Package name of the default cell broadcast receiver -->
+ <string name="config_defaultCellBroadcastReceiverPkg" translatable="false">com.android.cellbroadcastreceiver</string>
- <!-- Specifies the path that is used by MaskableIconDrawable class to crop launcher icons. -->
+ <!-- Specifies the path that is used by AdaptiveIconDrawable class to crop launcher icons. -->
<string name="config_icon_mask" translatable="false">"M50,0L100,0 100,100 0,100 0,0z"</string>
<!-- The component name, flattened to a string, for the default accessibility service to be
@@ -2741,4 +2746,16 @@
without explicit consent of the user. If no accessibility service with the specified name
exists on the device, the accessibility shortcut will be disabled by default. -->
<string name="config_defaultAccessibilityService" translatable="false"></string>
+
+ <!-- Flag indicates that whether escrow token API is enabled for TrustAgent -->
+ <!-- Warning: This API can be dangerous when not implemented properly. In particular,
+ escrow token must NOT be retrievable from device storage. In other words, either
+ escrow token is not stored on device or its ciphertext is stored on device while
+ the decryption key is not. Before enabling this feature, please ensure you've read
+ and followed the pertinent sections of the escrow tokens section of the CDD <link>-->
+ <!-- TODO(b/35230407) complete the link field -->
+ <bool name="config_allowEscrowTokenForTrustAgent">false</bool>
+
+ <!-- Colon separated list of package names that should be granted Notification Listener access -->
+ <string name="config_defaultListenerAccessPackages" translatable="false"></string>
</resources>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 640e74d..0ab1784 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -459,6 +459,7 @@
<!-- Floating toolbar dimensions -->
<dimen name="floating_toolbar_height">48dp</dimen>
+ <dimen name="floating_toolbar_menu_image_width">24dp</dimen>
<dimen name="floating_toolbar_menu_image_button_width">56dp</dimen>
<dimen name="floating_toolbar_menu_image_button_vertical_padding">12dp</dimen>
<dimen name="floating_toolbar_menu_button_side_padding">11dp</dimen>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 78489eb..01737e7 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2765,7 +2765,7 @@
<public name="font" />
<public name="fontWeight" />
<public name="tooltipText" />
- <public name="autoSizeText" />
+ <public name="autoSizeTextType" />
<public name="autoSizeStepGranularity" />
<public name="autoSizePresetSizes" />
<public name="autoSizeMinTextSize" />
@@ -2780,7 +2780,7 @@
<public name="targetProcess" />
<public name="nextClusterForward" />
<public name="__removed1" />
- <public name="textColorError" />
+ <public name="colorError" />
<public name="focusedByDefault" />
<public name="appCategory" />
<public name="autoSizeMaxTextSize" />
@@ -2796,6 +2796,7 @@
<public name="numericModifiers" />
<public name="fontProviderAuthority" />
<public name="fontProviderQuery" />
+ <public name="autoFillMode" />
</public-group>
<public-group type="style" first-id="0x010302e0">
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 2309866..b0c532c 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -816,6 +816,16 @@
<string name="permdesc_systemAlertWindow">This app can appear on top of other apps or other parts of the screen. This may interfere with normal app usage and change the way that other apps appear.</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_runInBackground">run in the background</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_runInBackground">This app can run in the background. This may drain battery faster.</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_useDataInBackground">use data in the background</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_useDataInBackground">This app can use data in the background. This may increase data usage.</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_persistentActivity">make app always run</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_persistentActivity" product="tablet">Allows the app to make parts of itself persistent in memory. This can limit memory available to other apps slowing down the tablet.</string>
@@ -3106,6 +3116,21 @@
<string name="fast_scroll_alphabet">\u0020ABCDEFGHIJKLMNOPQRSTUVWXYZ</string>
<string name="fast_scroll_numeric_alphabet">\u00200123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ</string>
+ <!-- Alert windows notification strings -->
+ <skip />
+ <!-- Name of notification channel the system post notification to inform the use about apps
+ that are drawing ui on-top of other apps (alert-windows) [CHAR LIMIT=NONE] -->
+ <string name="alert_windows_notification_channel_name"><xliff:g id="name" example="Google Maps">%s</xliff:g> draw over other apps</string>
+ <!-- Notification title when an application is displaying ui on-top of other apps
+ [CHAR LIMIT=30] -->
+ <string name="alert_windows_notification_title"><xliff:g id="name" example="Google Maps">%s</xliff:g> app displaying on top.</string>
+ <!-- Notification body when an application is displaying ui on-top of other apps
+ [CHAR LIMIT=NONE] -->
+ <string name="alert_windows_notification_message">Parts of this app may remain visible at all times. If this feature isn\'t working correctly, turn it off.</string>
+ <!-- Notification action to turn-off app displaying on-top of other apps. [CHAR LIMIT=20] -->
+ <string name="alert_windows_notification_turn_off_action">TURN OFF</string>
+
+
<!-- External media notification strings -->
<skip />
@@ -3502,11 +3527,6 @@
<!-- Description of the unlock handle in the Slide unlock screen for tablets. [CHAR LIMIT=NONE] -->
<string name="description_target_unlock_tablet">Swipe to unlock.</string>
- <!-- Announce that a headset is required to hear keyboard keys while typing a password. [CHAR LIMIT=NONE] -->
- <string name="keyboard_headset_required_to_hear_password">Plug in a headset to hear password keys spoken.</string>
- <!-- The value of a keyboard key announced when accessibility is enabled and no headsed is used. [CHAR LIMIT=NONE] -->
- <string name="keyboard_password_character_no_headset">Dot.</string>
-
<!-- Content description for the action bar "home" affordance. [CHAR LIMIT=NONE] -->
<string name="action_bar_home_description">Navigate home</string>
<!-- Content description for the action bar "up" affordance. [CHAR LIMIT=NONE] -->
@@ -4490,4 +4510,22 @@
<!-- Accessibility string used for describing the button in time picker that changes the dialog to circular clock mode. [CHAR LIMIT=NONE] -->
<string name="time_picker_radial_mode_description">Switch to clock mode for the time input.</string>
+ <!-- Title for the auto-fill save dialog shown when the the contents of the activity can be saved
+ by an auto-fill service, but the service does not know what the activity represents [CHAR LIMIT=NONE] -->
+ <string name="autofill_save_title">Save to <xliff:g id="label" example="MyPass">%1$s</xliff:g>?</string>
+ <!-- Title for the auto-fill save dialog shown when the the contents of the activity can be saved
+ by an auto-fill service, and the service does knows what the activity represents (for example, credit card info) [CHAR LIMIT=NONE] -->
+ <string name="autofill_save_title_with_type">Save <xliff:g id="type" example="Credit Card">%1$s</xliff:g> to <xliff:g id="label" example="MyPass">%2$s</xliff:g>?</string>
+ <!-- Label for the auto-fill save button [CHAR LIMIT=NONE] -->
+ <string name="autofill_save_yes">Save</string>
+ <!-- Label for the auto-fill cancel button [CHAR LIMIT=NONE] -->
+ <string name="autofill_save_no">No thanks</string>
+
+ <!-- Label for the type of data being saved for auto-fill when it represent user credentials with a password [CHAR LIMIT=NONE] -->
+ <string name="autofill_save_type_password">password</string>
+ <!-- Label for the type of data being saved for auto-fill when it represent an address (street, city, etc.) [CHAR LIMIT=NONE] -->
+ <string name="autofill_save_type_address">address</string>
+ <!-- Label for the type of data being saved for auto-fill when it represents a credit card [CHAR LIMIT=NONE] -->
+ <string name="autofill_save_type_credit_card">credit card</string>
+
</resources>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index faf451b..25873d2 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -1475,4 +1475,10 @@
<item name="padding">16dp</item>
</style>
+ <style name="Widget.LockPatternView">
+ <item name="regularColor">@color/lock_pattern_view_regular_color</item>
+ <item name="errorColor">?attr/colorError</item>
+ <item name="successColor">@color/lock_pattern_view_success_color</item>
+ </style>
+
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 1324e38..15abf74 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -312,6 +312,7 @@
<java-symbol type="bool" name="config_freeformWindowManagement" />
<java-symbol type="bool" name="config_supportsMultiWindow" />
<java-symbol type="bool" name="config_supportsSplitScreenMultiWindow" />
+ <java-symbol type="bool" name="config_noHomeScreen" />
<java-symbol type="bool" name="config_guestUserEphemeral" />
<java-symbol type="bool" name="config_localDisplaysMirrorContent" />
<java-symbol type="integer" name="config_defaultDisplayDefaultColorMode" />
@@ -428,6 +429,7 @@
<java-symbol type="dimen" name="config_viewConfigurationTouchSlop" />
<java-symbol type="dimen" name="config_viewMinFlingVelocity" />
<java-symbol type="dimen" name="config_viewMaxFlingVelocity" />
+ <java-symbol type="dimen" name="config_scrollbarSize" />
<java-symbol type="dimen" name="config_scrollFactor" />
<java-symbol type="dimen" name="default_app_widget_padding_bottom" />
<java-symbol type="dimen" name="default_app_widget_padding_left" />
@@ -707,8 +709,6 @@
<java-symbol type="string" name="js_dialog_before_unload" />
<java-symbol type="string" name="js_dialog_title" />
<java-symbol type="string" name="js_dialog_title_default" />
- <java-symbol type="string" name="keyboard_headset_required_to_hear_password" />
- <java-symbol type="string" name="keyboard_password_character_no_headset" />
<java-symbol type="string" name="keyboardview_keycode_alt" />
<java-symbol type="string" name="keyboardview_keycode_cancel" />
<java-symbol type="string" name="keyboardview_keycode_delete" />
@@ -1195,7 +1195,6 @@
<java-symbol type="drawable" name="btn_check_off" />
<java-symbol type="color" name="lock_pattern_view_regular_color" />
<java-symbol type="color" name="lock_pattern_view_success_color" />
- <java-symbol type="color" name="lock_pattern_view_error_color" />
<java-symbol type="dimen" name="lock_pattern_dot_line_width" />
<java-symbol type="dimen" name="lock_pattern_dot_size" />
<java-symbol type="dimen" name="lock_pattern_dot_size_activated" />
@@ -2310,7 +2309,6 @@
<java-symbol type="layout" name="select_dialog_singlechoice_material" />
<java-symbol type="layout" name="select_dialog_multichoice_material" />
<java-symbol type="array" name="no_ems_support_sim_operators" />
- <java-symbol type="color" name="battery_saver_mode_color" />
<java-symbol type="color" name="system_notification_accent_color" />
<java-symbol type="dimen" name="text_handle_min_size" />
<java-symbol type="id" name="transitionTransform" />
@@ -2398,15 +2396,13 @@
<java-symbol type="drawable" name="ic_usb_48dp" />
<!-- Floating toolbar -->
- <java-symbol type="id" name="floating_toolbar_menu_item_image_button" />
+ <java-symbol type="id" name="floating_toolbar_menu_item_image" />
+ <java-symbol type="id" name="floating_toolbar_menu_item_text" />
<java-symbol type="id" name="overflow" />
<java-symbol type="layout" name="floating_popup_container" />
<java-symbol type="layout" name="floating_popup_menu_button" />
<java-symbol type="layout" name="floating_popup_open_overflow_button" />
<java-symbol type="layout" name="floating_popup_close_overflow_button" />
- <java-symbol type="layout" name="floating_popup_menu_image_button" />
- <java-symbol type="layout" name="floating_popup_overflow_list_item" />
- <java-symbol type="layout" name="floating_popup_overflow_image_list_item" />
<java-symbol type="layout" name="floating_popup_overflow_button" />
<java-symbol type="string" name="floating_toolbar_open_overflow_description" />
<java-symbol type="string" name="floating_toolbar_close_overflow_description" />
@@ -2789,7 +2785,7 @@
<java-symbol type="layout" name="notification_template_material_ambient" />
<!-- Network Recommendation -->
- <java-symbol type="array" name="config_networkRecommendationPackageNames" />
+ <java-symbol type="string" name="config_defaultNetworkRecommendationProviderPackage" />
<!-- Whether allow 3rd party apps on internal storage. -->
<java-symbol type="bool" name="config_allow3rdPartyAppOnInternal" />
@@ -2799,7 +2795,7 @@
<java-symbol type="drawable" name="lockscreen_selected" />
<java-symbol type="string" name="notification_header_divider_symbol_with_spaces" />
- <java-symbol type="string" name="config_defaultCellBroadcastReceiverComponent" />
+ <java-symbol type="string" name="config_defaultCellBroadcastReceiverPkg" />
<java-symbol type="color" name="notification_primary_text_color_light" />
<java-symbol type="color" name="notification_primary_text_color_dark" />
@@ -2839,14 +2835,27 @@
<java-symbol type="dimen" name="autofill_fill_item_height" />
<java-symbol type="dimen" name="autofill_fill_min_margin" />
<java-symbol type="layout" name="autofill_save"/>
+ <java-symbol type="layout" name="autofill_dataset_picker"/>
<java-symbol type="id" name="autofill_save_title" />
+ <java-symbol type="id" name="autofill_save_subtitle" />
<java-symbol type="id" name="autofill_save_no" />
<java-symbol type="id" name="autofill_save_yes" />
+ <java-symbol type="id" name="autofill_save_close" />
+ <java-symbol type="string" name="autofill_save_title" />
+ <java-symbol type="string" name="autofill_save_title_with_type" />
+ <java-symbol type="string" name="autofill_save_yes" />
+ <java-symbol type="string" name="autofill_save_no" />
+ <java-symbol type="string" name="autofill_save_type_password" />
+ <java-symbol type="string" name="autofill_save_type_address" />
+ <java-symbol type="string" name="autofill_save_type_credit_card" />
<!-- Accessibility fingerprint gestures -->
<java-symbol type="string" name="capability_title_canCaptureFingerprintGestures" />
<java-symbol type="string" name="capability_desc_canCaptureFingerprintGestures" />
+ <!-- android.service.trust -->
+ <java-symbol type="bool" name="config_allowEscrowTokenForTrustAgent"/>
+
<!-- Time picker -->
<java-symbol type="id" name="toggle_mode"/>
<java-symbol type="id" name="input_mode"/>
@@ -2866,4 +2875,16 @@
<!-- resolver activity -->
<java-symbol type="drawable" name="resolver_icon_placeholder" />
+
+ <!-- Alert windows notification -->
+ <java-symbol type="string" name="alert_windows_notification_channel_name" />
+ <java-symbol type="string" name="alert_windows_notification_title" />
+ <java-symbol type="string" name="alert_windows_notification_message" />
+ <java-symbol type="string" name="alert_windows_notification_turn_off_action" />
+ <java-symbol type="drawable" name="alert_window_layer" />
+ <java-symbol type="style" name="Widget.LockPatternView" />
+ <java-symbol type="attr" name="lockPatternStyle" />
+
+ <!-- Colon separated list of package names that should be granted Notification Listener access -->
+ <java-symbol type="string" name="config_defaultListenerAccessPackages" />
</resources>
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index e357678..d100c63 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -63,6 +63,7 @@
<item name="colorControlHighlight">@color/legacy_button_pressed</item>
<item name="colorButtonNormal">@color/legacy_button_normal</item>
<item name="colorEdgeEffect">?attr/colorPrimary</item>
+ <item name="colorError">@color/red</item>
<item name="disabledAlpha">0.5</item>
<item name="backgroundDimAmount">0.6</item>
@@ -93,7 +94,6 @@
<item name="textColorLink">@color/link_text_dark</item>
<item name="textColorLinkInverse">@color/link_text_light</item>
<item name="textColorAlertDialogListItem">@color/primary_text_light_disable_only</item>
- <item name="textColorError">@color/red</item>
<item name="textAppearanceLarge">@style/TextAppearance.Large</item>
<item name="textAppearanceMedium">@style/TextAppearance.Medium</item>
diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml
index b063baf..008c817 100644
--- a/core/res/res/values/themes_material.xml
+++ b/core/res/res/values/themes_material.xml
@@ -51,6 +51,7 @@
<item name="primaryContentAlpha">@dimen/primary_content_alpha_material_dark</item>
<item name="secondaryContentAlpha">@dimen/secondary_content_alpha_material_dark</item>
<item name="backgroundDimAmount">0.6</item>
+ <item name="colorError">@color/error_color_material</item>
<!-- Text styles -->
<item name="textAppearance">@style/TextAppearance.Material</item>
@@ -73,7 +74,6 @@
<item name="textColorLinkInverse">?attr/colorAccent</item>
<item name="textColorSearchUrl">@color/search_url_text_material_dark</item>
<item name="textColorAlertDialogListItem">@color/primary_text_material_dark</item>
- <item name="textColorError">@color/error_text_material_dark</item>
<item name="textAppearanceLarge">@style/TextAppearance.Material.Large</item>
<item name="textAppearanceLargeInverse">@style/TextAppearance.Material.Large.Inverse</item>
@@ -214,7 +214,7 @@
<!-- Scrollbar attributes -->
<item name="scrollbarFadeDuration">250</item>
<item name="scrollbarDefaultDelayBeforeFade">400</item>
- <item name="scrollbarSize">10dp</item>
+ <item name="scrollbarSize">@dimen/config_scrollbarSize</item>
<item name="scrollbarThumbHorizontal">@drawable/scrollbar_handle_material</item>
<item name="scrollbarThumbVertical">@drawable/config_scrollbarThumbVertical</item>
<item name="scrollbarTrackHorizontal">@null</item>
@@ -441,7 +441,6 @@
<item name="textColorLinkInverse">?attr/colorAccent</item>
<item name="textColorSearchUrl">@color/search_url_text_material_light</item>
<item name="textColorAlertDialogListItem">@color/primary_text_material_light</item>
- <item name="textColorError">@color/error_text_material_light</item>
<item name="textAppearanceLarge">@style/TextAppearance.Material.Large</item>
<item name="textAppearanceLargeInverse">@style/TextAppearance.Material.Large.Inverse</item>
@@ -583,7 +582,7 @@
<!-- Scrollbar attributes -->
<item name="scrollbarFadeDuration">250</item>
<item name="scrollbarDefaultDelayBeforeFade">400</item>
- <item name="scrollbarSize">10dp</item>
+ <item name="scrollbarSize">@dimen/config_scrollbarSize</item>
<item name="scrollbarThumbHorizontal">@drawable/scrollbar_handle_material</item>
<item name="scrollbarThumbVertical">@drawable/config_scrollbarThumbVertical</item>
<item name="scrollbarTrackHorizontal">@null</item>
@@ -823,7 +822,6 @@
<item name="textColorHighlightInverse">@color/highlighted_text_material</item>
<item name="textColorSearchUrl">@color/search_url_text_material_light</item>
<item name="textColorAlertDialogListItem">@color/primary_text_material_light</item>
- <item name="textColorError">@color/error_text_material_light</item>
<item name="textCheckMark">@drawable/indicator_check_mark_light</item>
<item name="textCheckMarkInverse">@drawable/indicator_check_mark_dark</item>
@@ -856,7 +854,6 @@
<item name="textColorHighlightInverse">@color/highlighted_text_material</item>
<item name="textColorSearchUrl">@color/search_url_text_material_dark</item>
<item name="textColorAlertDialogListItem">@color/primary_text_material_dark</item>
- <item name="textColorError">@color/error_text_material_dark</item>
<item name="textCheckMark">@drawable/indicator_check_mark_dark</item>
<item name="textCheckMarkInverse">@drawable/indicator_check_mark_light</item>
diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk
index 48b78d4..ef09c35 100644
--- a/core/tests/coretests/Android.mk
+++ b/core/tests/coretests/Android.mk
@@ -21,6 +21,7 @@
$(call all-java-files-under, DisabledTestApp/src) \
$(call all-java-files-under, EnabledTestApp/src)
+LOCAL_DX_FLAGS := --core-library
LOCAL_AAPT_FLAGS = -0 dat -0 gld -c fa
LOCAL_STATIC_JAVA_LIBRARIES := \
core-tests-support \
diff --git a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
index 4e70bb1..b2ff927 100644
--- a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
+++ b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
@@ -197,7 +197,8 @@
final Configuration overrideConfig = new Configuration();
overrideConfig.orientation = Configuration.ORIENTATION_LANDSCAPE;
- mResourcesManager.updateResourcesForActivity(activity1, overrideConfig);
+ mResourcesManager.updateResourcesForActivity(activity1, overrideConfig,
+ Display.DEFAULT_DISPLAY, false /* movedToDifferentDisplay */);
assertSame(resources1, theme.getResources());
// Make sure we can still access the data.
@@ -246,7 +247,8 @@
// Now update the Activity base override, and both resources should update.
config1.orientation = Configuration.ORIENTATION_LANDSCAPE;
- mResourcesManager.updateResourcesForActivity(activity1, config1);
+ mResourcesManager.updateResourcesForActivity(activity1, config1, Display.DEFAULT_DISPLAY,
+ false /* movedToDifferentDisplay */);
expectedConfig1.orientation = Configuration.ORIENTATION_LANDSCAPE;
assertEquals(expectedConfig1, resources1.getConfiguration());
diff --git a/core/tests/coretests/src/android/net/NetworkKeyTest.java b/core/tests/coretests/src/android/net/NetworkKeyTest.java
index 1afe9da..fff23a0 100644
--- a/core/tests/coretests/src/android/net/NetworkKeyTest.java
+++ b/core/tests/coretests/src/android/net/NetworkKeyTest.java
@@ -4,6 +4,7 @@
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.when;
+import android.net.wifi.ScanResult;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiSsid;
import android.support.test.runner.AndroidJUnit4;
@@ -17,7 +18,9 @@
@RunWith(AndroidJUnit4.class)
public class NetworkKeyTest {
private static final String VALID_SSID = "\"ssid1\"";
+ private static final String VALID_UNQUOTED_SSID = "ssid1";
private static final String VALID_BSSID = "00:00:00:00:00:00";
+ private static final String INVALID_BSSID = "invalid_bssid";
@Mock private WifiInfo mWifiInfo;
@Before
@@ -64,6 +67,13 @@
}
@Test
+ public void createFromWifi_invalidBssid() throws Exception {
+ when(mWifiInfo.getSSID()).thenReturn(VALID_SSID);
+ when(mWifiInfo.getBSSID()).thenReturn(INVALID_BSSID);
+ assertNull(NetworkKey.createFromWifiInfo(mWifiInfo));
+ }
+
+ @Test
public void createFromWifi_validWifiInfo() throws Exception {
when(mWifiInfo.getSSID()).thenReturn(VALID_SSID);
when(mWifiInfo.getBSSID()).thenReturn(VALID_BSSID);
@@ -72,4 +82,72 @@
final NetworkKey actual = NetworkKey.createFromWifiInfo(mWifiInfo);
assertEquals(expected, actual);
}
+
+ @Test
+ public void createFromScanResult_nullInput() {
+ assertNull(NetworkKey.createFromScanResult(null));
+ }
+
+ @Test
+ public void createFromScanResult_nullWifiSsid() {
+ ScanResult scanResult = new ScanResult();
+ scanResult.BSSID = VALID_BSSID;
+
+ assertNull(NetworkKey.createFromScanResult(scanResult));
+ }
+
+ @Test
+ public void createFromScanResult_emptyWifiSsid() {
+ ScanResult scanResult = new ScanResult();
+ scanResult.wifiSsid = WifiSsid.createFromAsciiEncoded("");
+ scanResult.BSSID = VALID_BSSID;
+
+ assertNull(NetworkKey.createFromScanResult(scanResult));
+ }
+
+ @Test
+ public void createFromScanResult_noneWifiSsid() {
+ ScanResult scanResult = new ScanResult();
+ scanResult.wifiSsid = WifiSsid.createFromAsciiEncoded(WifiSsid.NONE);
+ scanResult.BSSID = VALID_BSSID;
+
+ assertNull(NetworkKey.createFromScanResult(scanResult));
+ }
+
+ @Test
+ public void createFromScanResult_nullBssid() {
+ ScanResult scanResult = new ScanResult();
+ scanResult.wifiSsid = WifiSsid.createFromAsciiEncoded(VALID_UNQUOTED_SSID);
+
+ assertNull(NetworkKey.createFromScanResult(scanResult));
+ }
+
+ @Test
+ public void createFromScanResult_emptyBssid() {
+ ScanResult scanResult = new ScanResult();
+ scanResult.wifiSsid = WifiSsid.createFromAsciiEncoded(VALID_UNQUOTED_SSID);
+ scanResult.BSSID = "";
+
+ assertNull(NetworkKey.createFromScanResult(scanResult));
+ }
+
+ @Test
+ public void createFromScanResult_invalidBssid() {
+ ScanResult scanResult = new ScanResult();
+ scanResult.wifiSsid = WifiSsid.createFromAsciiEncoded(VALID_UNQUOTED_SSID);
+ scanResult.BSSID = INVALID_BSSID;
+
+ assertNull(NetworkKey.createFromScanResult(scanResult));
+ }
+
+ @Test
+ public void createFromScanResult_validWifiSsid() {
+ ScanResult scanResult = new ScanResult();
+ scanResult.wifiSsid = WifiSsid.createFromAsciiEncoded(VALID_UNQUOTED_SSID);
+ scanResult.BSSID = VALID_BSSID;
+
+ NetworkKey expected = new NetworkKey(new WifiKey(VALID_SSID, VALID_BSSID));
+ NetworkKey actual = NetworkKey.createFromScanResult(scanResult);
+ assertEquals(expected, actual);
+ }
}
diff --git a/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java b/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java
index bdc0200..497bc5c 100644
--- a/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java
+++ b/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java
@@ -3,61 +3,62 @@
import static android.net.NetworkRecommendationProvider.EXTRA_RECOMMENDATION_RESULT;
import static android.net.NetworkRecommendationProvider.EXTRA_SEQUENCE;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertSame;
+import static junit.framework.Assert.fail;
+import static junit.framework.TestCase.assertEquals;
+
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+
+import android.Manifest.permission;
import android.content.Context;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.HandlerThread;
import android.os.IRemoteCallback;
-import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* Unit test for the {@link NetworkRecommendationProvider}.
*/
-public class NetworkRecommendationProviderTest extends InstrumentationTestCase {
+@RunWith(AndroidJUnit4.class)
+public class NetworkRecommendationProviderTest {
@Mock private IRemoteCallback mMockRemoteCallback;
+ @Mock private Context mContext;
private NetworkRecProvider mRecProvider;
- private Handler mHandler;
private INetworkRecommendationProvider mStub;
private CountDownLatch mRecRequestLatch;
private CountDownLatch mScoreRequestLatch;
private NetworkKey[] mTestNetworkKeys;
- @Override
+ @Before
public void setUp() throws Exception {
- super.setUp();
-
- // Configuration needed to make mockito/dexcache work.
- final Context context = getInstrumentation().getTargetContext();
- System.setProperty("dexmaker.dexcache",
- context.getCacheDir().getPath());
- ClassLoader newClassLoader = getInstrumentation().getClass().getClassLoader();
- Thread.currentThread().setContextClassLoader(newClassLoader);
-
MockitoAnnotations.initMocks(this);
- HandlerThread thread = new HandlerThread("NetworkRecommendationProviderTest");
- thread.start();
+ Executor executor = Executors.newSingleThreadExecutor();
mRecRequestLatch = new CountDownLatch(1);
mScoreRequestLatch = new CountDownLatch(1);
- mHandler = new Handler(thread.getLooper());
- mRecProvider = new NetworkRecProvider(mHandler, mRecRequestLatch, mScoreRequestLatch);
+ mRecProvider = new NetworkRecProvider(mContext, executor, mRecRequestLatch,
+ mScoreRequestLatch);
mStub = INetworkRecommendationProvider.Stub.asInterface(mRecProvider.getBinder());
mTestNetworkKeys = new NetworkKey[2];
mTestNetworkKeys[0] = new NetworkKey(new WifiKey("\"ssid_01\"", "00:00:00:00:00:11"));
mTestNetworkKeys[1] = new NetworkKey(new WifiKey("\"ssid_02\"", "00:00:00:00:00:22"));
}
- @MediumTest
+ @Test
public void testRecommendationRequestReceived() throws Exception {
final RecommendationRequest request = new RecommendationRequest.Builder().build();
final int sequence = 100;
@@ -71,7 +72,23 @@
assertEquals(expectedResultCallback, mRecProvider.mCapturedCallback);
}
- @SmallTest
+ @Test
+ public void testRecommendationRequest_permissionsEnforced() throws Exception {
+ final RecommendationRequest request = new RecommendationRequest.Builder().build();
+ final int sequence = 100;
+ Mockito.doThrow(new SecurityException())
+ .when(mContext)
+ .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES), anyString());
+
+ try {
+ mStub.requestRecommendation(request, mMockRemoteCallback, sequence);
+ fail("SecurityException expected.");
+ } catch (SecurityException e) {
+ // expected
+ }
+ }
+
+ @Test
public void testResultCallbackOnResult() throws Exception {
final int sequence = 100;
final NetworkRecommendationProvider.ResultCallback callback =
@@ -87,7 +104,7 @@
assertSame(result, capturedBundle.getParcelable(EXTRA_RECOMMENDATION_RESULT));
}
- @SmallTest
+ @Test
public void testResultCallbackOnResult_runTwice_throwsException() throws Exception {
final int sequence = 100;
final NetworkRecommendationProvider.ResultCallback callback =
@@ -104,7 +121,7 @@
}
}
- @MediumTest
+ @Test
public void testScoreRequestReceived() throws Exception {
mStub.requestScores(mTestNetworkKeys);
@@ -114,7 +131,7 @@
assertSame(mTestNetworkKeys, mRecProvider.mCapturedNetworks);
}
- @MediumTest
+ @Test
public void testScoreRequest_nullInput() throws Exception {
mStub.requestScores(null);
@@ -122,7 +139,7 @@
assertFalse(mScoreRequestLatch.await(200, TimeUnit.MILLISECONDS));
}
- @MediumTest
+ @Test
public void testScoreRequest_emptyInput() throws Exception {
mStub.requestScores(new NetworkKey[0]);
@@ -130,6 +147,20 @@
assertFalse(mScoreRequestLatch.await(200, TimeUnit.MILLISECONDS));
}
+ @Test
+ public void testScoreRequest_permissionsEnforced() throws Exception {
+ Mockito.doThrow(new SecurityException())
+ .when(mContext)
+ .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES), anyString());
+
+ try {
+ mStub.requestScores(mTestNetworkKeys);
+ fail("SecurityException expected.");
+ } catch (SecurityException e) {
+ // expected
+ }
+ }
+
private static class NetworkRecProvider extends NetworkRecommendationProvider {
private final CountDownLatch mRecRequestLatch;
private final CountDownLatch mScoreRequestLatch;
@@ -137,9 +168,9 @@
ResultCallback mCapturedCallback;
NetworkKey[] mCapturedNetworks;
- NetworkRecProvider(Handler handler, CountDownLatch recRequestLatch,
+ NetworkRecProvider(Context context, Executor executor, CountDownLatch recRequestLatch,
CountDownLatch networkRequestLatch) {
- super(handler);
+ super(context, executor);
mRecRequestLatch = recRequestLatch;
mScoreRequestLatch = networkRequestLatch;
}
diff --git a/core/tests/coretests/src/android/net/NetworkScorerAppManagerTest.java b/core/tests/coretests/src/android/net/NetworkScorerAppManagerTest.java
deleted file mode 100644
index ce5d3ef..0000000
--- a/core/tests/coretests/src/android/net/NetworkScorerAppManagerTest.java
+++ /dev/null
@@ -1,216 +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 android.net;
-
-import static org.mockito.Mockito.when;
-
-import android.Manifest.permission;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-import android.content.res.Resources;
-import android.net.NetworkScorerAppManager.NetworkScorerAppData;
-import android.provider.Settings;
-import android.test.InstrumentationTestCase;
-
-import com.android.internal.R;
-
-import org.mockito.ArgumentMatcher;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
-
-import java.util.List;
-
-public class NetworkScorerAppManagerTest extends InstrumentationTestCase {
- @Mock private Context mMockContext;
- @Mock private PackageManager mMockPm;
- @Mock private Resources mResources;
- @Mock private ContentResolver mContentResolver;
- private Context mTargetContext;
- private NetworkScorerAppManager mNetworkScorerAppManager;
-
- @Override
- public void setUp() throws Exception {
- super.setUp();
-
- // Configuration needed to make mockito/dexcache work.
- mTargetContext = getInstrumentation().getTargetContext();
- System.setProperty("dexmaker.dexcache", mTargetContext.getCacheDir().getPath());
- ClassLoader newClassLoader = getInstrumentation().getClass().getClassLoader();
- Thread.currentThread().setContextClassLoader(newClassLoader);
-
- MockitoAnnotations.initMocks(this);
- when(mMockContext.getPackageManager()).thenReturn(mMockPm);
- when(mMockContext.getResources()).thenReturn(mResources);
- when(mMockContext.getContentResolver()).thenReturn(mTargetContext.getContentResolver());
- mNetworkScorerAppManager = new NetworkScorerAppManager(mMockContext);
- }
-
- public void testGetPotentialRecommendationProviderPackages_emptyConfig() throws Exception {
- setNetworkRecommendationPackageNames(/*no configured packages*/);
- assertTrue(mNetworkScorerAppManager.getPotentialRecommendationProviderPackages().isEmpty());
- }
-
- public void testGetPotentialRecommendationProviderPackages_permissionNotGranted()
- throws Exception {
- setNetworkRecommendationPackageNames("package1");
- mockScoreNetworksDenied("package1");
-
- assertTrue(mNetworkScorerAppManager.getPotentialRecommendationProviderPackages().isEmpty());
- }
-
- public void testGetPotentialRecommendationProviderPackages_permissionGranted()
- throws Exception {
- setNetworkRecommendationPackageNames("package1");
- mockScoreNetworksGranted("package1");
-
- List<String> potentialProviderPackages =
- mNetworkScorerAppManager.getPotentialRecommendationProviderPackages();
-
- assertFalse(potentialProviderPackages.isEmpty());
- assertEquals("package1", potentialProviderPackages.get(0));
- }
-
- public void testGetPotentialRecommendationProviderPackages_multipleConfigured()
- throws Exception {
- setNetworkRecommendationPackageNames("package1", "package2");
- mockScoreNetworksDenied("package1");
- mockScoreNetworksGranted("package2");
-
- List<String> potentialProviderPackages =
- mNetworkScorerAppManager.getPotentialRecommendationProviderPackages();
-
- assertEquals(1, potentialProviderPackages.size());
- assertEquals("package2", potentialProviderPackages.get(0));
- }
-
- public void testGetNetworkRecommendationProviderData_noPotentialPackages() throws Exception {
- setNetworkRecommendationPackageNames(/*no configured packages*/);
- assertNull(mNetworkScorerAppManager.getNetworkRecommendationProviderData());
- }
-
- public void testGetNetworkRecommendationProviderData_serviceMissing() throws Exception {
- setNetworkRecommendationPackageNames("package1");
- mockScoreNetworksGranted("package1");
-
- assertNull(mNetworkScorerAppManager.getNetworkRecommendationProviderData());
- }
-
- public void testGetNetworkRecommendationProviderData_scoreNetworksNotGranted()
- throws Exception {
- final ComponentName recoComponent = new ComponentName("package1", "class1");
- setNetworkRecommendationPackageNames(recoComponent.getPackageName());
- mockScoreNetworksDenied(recoComponent.getPackageName());
- mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
-
- assertNull(mNetworkScorerAppManager.getNetworkRecommendationProviderData());
- }
-
- public void testGetNetworkRecommendationProviderData_available() throws Exception {
- final ComponentName recoComponent = new ComponentName("package1", "class1");
- setNetworkRecommendationPackageNames(recoComponent.getPackageName());
- mockScoreNetworksGranted(recoComponent.getPackageName());
- mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
-
- NetworkScorerAppData appData =
- mNetworkScorerAppManager.getNetworkRecommendationProviderData();
- assertNotNull(appData);
- assertEquals(recoComponent, appData.getRecommendationServiceComponent());
- assertEquals(924, appData.packageUid);
- }
-
- public void testGetActiveScorer_providerAvailable() throws Exception {
- final ComponentName recoComponent = new ComponentName("package1", "class1");
- setNetworkRecommendationPackageNames(recoComponent.getPackageName());
- mockScoreNetworksGranted(recoComponent.getPackageName());
- mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
-
- ContentResolver cr = mTargetContext.getContentResolver();
- Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
-
- final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
- assertNotNull(activeScorer);
- assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
- assertEquals(924, activeScorer.packageUid);
- }
-
- public void testGetActiveScorer_providerNotAvailable()
- throws Exception {
- ContentResolver cr = mTargetContext.getContentResolver();
- Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
-
- final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
- assertNull(activeScorer);
- }
-
- public void testGetActiveScorer_recommendationsDisabled() throws Exception {
- final ComponentName recoComponent = new ComponentName("package1", "class1");
- setNetworkRecommendationPackageNames(recoComponent.getPackageName());
- mockScoreNetworksGranted(recoComponent.getPackageName());
- mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
- ContentResolver cr = mTargetContext.getContentResolver();
- Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0);
-
- final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
- assertNull(activeScorer);
- }
-
- private void setNetworkRecommendationPackageNames(String... names) {
- if (names == null) {
- names = new String[0];
- }
- when(mResources.getStringArray(R.array.config_networkRecommendationPackageNames))
- .thenReturn(names);
- }
-
- private void mockScoreNetworksGranted(String packageName) {
- when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
- .thenReturn(PackageManager.PERMISSION_GRANTED);
- }
-
- private void mockScoreNetworksDenied(String packageName) {
- when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
- .thenReturn(PackageManager.PERMISSION_DENIED);
- }
-
- private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid) {
- final ResolveInfo serviceInfo = new ResolveInfo();
- serviceInfo.serviceInfo = new ServiceInfo();
- serviceInfo.serviceInfo.name = compName.getClassName();
- serviceInfo.serviceInfo.packageName = compName.getPackageName();
- serviceInfo.serviceInfo.applicationInfo = new ApplicationInfo();
- serviceInfo.serviceInfo.applicationInfo.uid = packageUid;
-
- final int flags = 0;
- when(mMockPm.resolveService(
- Mockito.argThat(new ArgumentMatcher<Intent>() {
- @Override
- public boolean matches(Object object) {
- Intent intent = (Intent) object;
- return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS
- .equals(intent.getAction())
- && compName.getPackageName().equals(intent.getPackage());
- }
- }), Mockito.eq(flags))).thenReturn(serviceInfo);
- }
-}
diff --git a/core/tests/coretests/src/android/net/ScoredNetworkTest.java b/core/tests/coretests/src/android/net/ScoredNetworkTest.java
index e818c56..dc17da2 100644
--- a/core/tests/coretests/src/android/net/ScoredNetworkTest.java
+++ b/core/tests/coretests/src/android/net/ScoredNetworkTest.java
@@ -18,13 +18,10 @@
import static org.junit.Assert.*;
-import android.os.Build;
import android.os.Bundle;
import android.os.Parcel;
-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;
@@ -170,41 +167,41 @@
@Test
public void calculateBadgeShouldReturnNoBadgeWhenNoAttributesBundle() {
ScoredNetwork network = new ScoredNetwork(KEY, CURVE);
- assertEquals(ScoredNetwork.BADGING_NONE, network.calculateBadge(TEST_RSSI));
+ assertEquals(NetworkBadging.BADGING_NONE, network.calculateBadge(TEST_RSSI));
}
@Test
public void calculateBadgeShouldReturnNoBadgeWhenNoBadgingCurveInBundle() {
ScoredNetwork network = new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
- assertEquals(ScoredNetwork.BADGING_NONE, network.calculateBadge(TEST_RSSI));
+ assertEquals(NetworkBadging.BADGING_NONE, network.calculateBadge(TEST_RSSI));
}
@Test
public void calculateBadgeShouldReturn4kBadge() {
ScoredNetwork network =
- buildScoredNetworkWithGivenBadgeForTestRssi(ScoredNetwork.BADGING_4K);
- assertEquals(ScoredNetwork.BADGING_4K, network.calculateBadge(TEST_RSSI));
+ buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_4K);
+ assertEquals(NetworkBadging.BADGING_4K, network.calculateBadge(TEST_RSSI));
}
@Test
public void calculateBadgeShouldReturnHdBadge() {
ScoredNetwork network =
- buildScoredNetworkWithGivenBadgeForTestRssi(ScoredNetwork.BADGING_HD);
- assertEquals(ScoredNetwork.BADGING_HD, network.calculateBadge(TEST_RSSI));
+ buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_HD);
+ assertEquals(NetworkBadging.BADGING_HD, network.calculateBadge(TEST_RSSI));
}
@Test
public void calculateBadgeShouldReturnSdBadge() {
ScoredNetwork network =
- buildScoredNetworkWithGivenBadgeForTestRssi(ScoredNetwork.BADGING_SD);
- assertEquals(ScoredNetwork.BADGING_SD, network.calculateBadge(TEST_RSSI));
+ buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_SD);
+ assertEquals(NetworkBadging.BADGING_SD, network.calculateBadge(TEST_RSSI));
}
@Test
public void calculateBadgeShouldReturnNoBadge() {
ScoredNetwork network =
- buildScoredNetworkWithGivenBadgeForTestRssi(ScoredNetwork.BADGING_NONE);
- assertEquals(ScoredNetwork.BADGING_NONE, network.calculateBadge(TEST_RSSI));
+ buildScoredNetworkWithGivenBadgeForTestRssi(NetworkBadging.BADGING_NONE);
+ assertEquals(NetworkBadging.BADGING_NONE, network.calculateBadge(TEST_RSSI));
}
private ScoredNetwork buildScoredNetworkWithGivenBadgeForTestRssi(int badge) {
diff --git a/core/tests/coretests/src/android/os/FileUtilsTest.java b/core/tests/coretests/src/android/os/FileUtilsTest.java
index bd90079..5c7da70 100644
--- a/core/tests/coretests/src/android/os/FileUtilsTest.java
+++ b/core/tests/coretests/src/android/os/FileUtilsTest.java
@@ -311,6 +311,28 @@
assertNameEquals("test.foo (1).bar", FileUtils.buildUniqueFile(mTarget, "test.foo.bar"));
}
+ public void testRoundStorageSize() throws Exception {
+ final long M128 = 134217728L;
+ final long M256 = M128 * 2;
+ final long M512 = M256 * 2;
+ final long M1024 = M512 * 2;
+ final long G16 = M1024 * 16;
+ final long G32 = M1024 * 32;
+ final long G64 = M1024 * 64;
+
+ assertEquals(M128, FileUtils.roundStorageSize(M128));
+ assertEquals(M256, FileUtils.roundStorageSize(M128 + 1));
+ assertEquals(M256, FileUtils.roundStorageSize(M256 - 1));
+ assertEquals(M256, FileUtils.roundStorageSize(M256));
+ assertEquals(M512, FileUtils.roundStorageSize(M256 + 1));
+
+ assertEquals(G16, FileUtils.roundStorageSize(G16));
+ assertEquals(G32, FileUtils.roundStorageSize(G16 + 1));
+ assertEquals(G32, FileUtils.roundStorageSize(G32 - 1));
+ assertEquals(G32, FileUtils.roundStorageSize(G32));
+ assertEquals(G64, FileUtils.roundStorageSize(G32 + 1));
+ }
+
private static void assertNameEquals(String expected, File actual) {
assertEquals(expected, actual.getName());
}
diff --git a/core/tests/coretests/src/android/provider/SettingsTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
similarity index 97%
rename from core/tests/coretests/src/android/provider/SettingsTest.java
rename to core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 019f837..105a351 100644
--- a/core/tests/coretests/src/android/provider/SettingsTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -24,8 +24,7 @@
import static java.lang.reflect.Modifier.isPublic;
import static java.lang.reflect.Modifier.isStatic;
-import android.annotation.TargetApi;
-
+import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -36,11 +35,11 @@
import org.junit.Test;
import org.junit.runner.RunWith;
-/** Unit test for Settings. */
-@TargetApi(25)
+/** Tests that ensure appropriate settings are backed up. */
@RunWith(AndroidJUnit4.class)
+@Presubmit
@SmallTest
-public class SettingsTest {
+public class SettingsBackupTest {
/**
* The following blacklists contain settings that should *not* be backed up and restored to
@@ -64,7 +63,6 @@
Settings.System.NOTIFICATION_SOUND_CACHE, // internal cache
Settings.System.POINTER_LOCATION, // backup candidate?
Settings.System.RINGTONE_CACHE, // internal cache
- Settings.System.SCREEN_BRIGHTNESS_FOR_VR, // bug?
Settings.System.SETUP_WIZARD_HAS_RUN, // Only used by SuW
Settings.System.SHOW_GTALK_SERVICE_STATUS, // candidate for backup?
Settings.System.SHOW_TOUCHES, // bug?
@@ -181,6 +179,7 @@
Settings.Global.DROPBOX_TAG_PREFIX,
Settings.Global.EMERGENCY_AFFORDANCE_NEEDED,
Settings.Global.ENABLE_ACCESSIBILITY_GLOBAL_GESTURE_ENABLED,
+ Settings.Global.ENABLE_CACHE_QUOTA_CALCULATION,
Settings.Global.ENABLE_CELLULAR_ON_BOOT,
Settings.Global.ENABLE_DISKSTATS_LOGGING,
Settings.Global.ENABLE_EPHEMERAL_FEATURE,
@@ -246,6 +245,7 @@
Settings.Global.NETWORK_AVOID_BAD_WIFI,
Settings.Global.NETWORK_METERED_MULTIPATH_PREFERENCE,
Settings.Global.NETWORK_PREFERENCE,
+ Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE,
Settings.Global.NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS,
Settings.Global.NETWORK_SCORER_APP,
Settings.Global.NETWORK_SCORING_PROVISIONED,
@@ -281,6 +281,7 @@
Settings.Global.RADIO_NFC,
Settings.Global.RADIO_WIFI,
Settings.Global.RADIO_WIMAX,
+ Settings.Global.RECOMMENDED_NETWORK_EVALUATOR_CACHE_EXPIRY_MS,
Settings.Global.READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT,
Settings.Global.REQUIRE_PASSWORD_TO_DECRYPT,
Settings.Global.RETAIL_DEMO_MODE_CONSTANTS,
@@ -306,6 +307,8 @@
Settings.Global.STORAGE_BENCHMARK_INTERVAL,
Settings.Global.SYNC_MAX_RETRY_DELAY_IN_SECONDS,
Settings.Global.SYS_FREE_STORAGE_LOG_INTERVAL,
+ Settings.Global.SYS_STORAGE_CACHE_MAX_BYTES,
+ Settings.Global.SYS_STORAGE_CACHE_PERCENTAGE,
Settings.Global.SYS_STORAGE_FULL_THRESHOLD_BYTES,
Settings.Global.SYS_STORAGE_THRESHOLD_MAX_BYTES,
Settings.Global.SYS_STORAGE_THRESHOLD_PERCENTAGE,
@@ -383,7 +386,6 @@
Settings.Secure.ASSIST_STRUCTURE_ENABLED,
Settings.Secure.AUTO_FILL_SERVICE,
Settings.Secure.AUTOMATIC_STORAGE_MANAGER_BYTES_CLEARED,
- Settings.Secure.AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
Settings.Secure.AUTOMATIC_STORAGE_MANAGER_LAST_RUN,
Settings.Secure.BACKUP_AUTO_RESTORE,
@@ -392,6 +394,7 @@
Settings.Secure.BACKUP_TRANSPORT,
Settings.Secure.BLUETOOTH_HCI_LOG,
Settings.Secure.CARRIER_APPS_HANDLED,
+ Settings.Secure.CMAS_ADDITIONAL_BROADCAST_PKG,
Settings.Secure.COMPLETED_CATEGORY_PREFIX,
Settings.Secure.CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS,
Settings.Secure.DEFAULT_INPUT_METHOD,
@@ -422,6 +425,7 @@
Settings.Secure.MANAGED_PROFILE_CONTACT_REMOTE_SEARCH,
Settings.Secure.MULTI_PRESS_TIMEOUT,
Settings.Secure.NFC_PAYMENT_FOREGROUND,
+ Settings.Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME,
Settings.Secure.PACKAGE_VERIFIER_STATE,
Settings.Secure.PACKAGE_VERIFIER_USER_CONSENT,
Settings.Secure.PARENTAL_CONTROL_LAST_UPDATE,
@@ -460,6 +464,7 @@
Settings.Secure.TV_INPUT_CUSTOM_LABELS,
Settings.Secure.TV_INPUT_HIDDEN_INPUTS,
Settings.Secure.UI_NIGHT_MODE, // candidate?
+ Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED,
Settings.Secure.UNSAFE_VOLUME_MUSIC_ACTIVE_MS,
Settings.Secure.USB_AUDIO_AUTOMATIC_ROUTING_DISABLED,
Settings.Secure.USER_SETUP_COMPLETE,
diff --git a/core/tests/coretests/src/android/text/method/BackspaceTest.java b/core/tests/coretests/src/android/text/method/BackspaceTest.java
index a260e94..864b48a 100644
--- a/core/tests/coretests/src/android/text/method/BackspaceTest.java
+++ b/core/tests/coretests/src/android/text/method/BackspaceTest.java
@@ -37,23 +37,12 @@
// Sync the state to the TextView and call onKeyDown with KEYCODE_DEL key event.
// Then update the state to the result of TextView.
private void backspace(final EditorState state, int modifiers) {
- mActivity.runOnUiThread(new Runnable() {
- public void run() {
- mTextView.setText(state.mText, BufferType.EDITABLE);
- mTextView.setKeyListener(mKeyListener);
- mTextView.setSelection(state.mSelectionStart, state.mSelectionEnd);
- }
- });
- mInstrumentation.waitForIdleSync();
- assertTrue(mTextView.hasWindowFocus());
+ mTextView.setText(state.mText, BufferType.EDITABLE);
+ mTextView.setKeyListener(mKeyListener);
+ mTextView.setSelection(state.mSelectionStart, state.mSelectionEnd);
final KeyEvent keyEvent = getKey(KeyEvent.KEYCODE_DEL, modifiers);
- mActivity.runOnUiThread(new Runnable() {
- public void run() {
- mTextView.onKeyDown(keyEvent.getKeyCode(), keyEvent);
- }
- });
- mInstrumentation.waitForIdleSync();
+ mTextView.onKeyDown(keyEvent.getKeyCode(), keyEvent);
state.mText = mTextView.getText();
state.mSelectionStart = mTextView.getSelectionStart();
@@ -247,6 +236,51 @@
state.assertEquals("U+1F1FA U+1F1F8 |");
backspace(state, 0);
state.assertEquals("|");
+
+ // Incomplete sequence. (no tag_term: U+E007E)
+ state.setByString("'a' U+1F3F4 U+E0067 'b' |");
+ backspace(state, 0);
+ state.assertEquals("'a' U+1F3F4 U+E0067 |");
+ backspace(state, 0);
+ state.assertEquals("'a' U+1F3F4 |");
+ backspace(state, 0);
+ state.assertEquals("'a' |");
+
+ // No tag_base
+ state.setByString("'a' U+E0067 U+E007F 'b' |");
+ backspace(state, 0);
+ state.assertEquals("'a' U+E0067 U+E007F |");
+ backspace(state, 0);
+ state.assertEquals("'a' U+E0067 |");
+ backspace(state, 0);
+ state.assertEquals("'a' |");
+
+ // Isolated tag chars
+ state.setByString("'a' U+E0067 U+E0067 'b' |");
+ backspace(state, 0);
+ state.assertEquals("'a' U+E0067 U+E0067 |");
+ backspace(state, 0);
+ state.assertEquals("'a' U+E0067 |");
+ backspace(state, 0);
+ state.assertEquals("'a' |");
+
+ // Isolated tab term.
+ state.setByString("'a' U+E007F U+E007F 'b' |");
+ backspace(state, 0);
+ state.assertEquals("'a' U+E007F U+E007F |");
+ backspace(state, 0);
+ state.assertEquals("'a' U+E007F |");
+ backspace(state, 0);
+ state.assertEquals("'a' |");
+
+ // Immediate tag_term after tag_base
+ state.setByString("'a' U+1F3F4 U+E007F U+1F3F4 U+E007F 'b' |");
+ backspace(state, 0);
+ state.assertEquals("'a' U+1F3F4 U+E007F U+1F3F4 U+E007F |");
+ backspace(state, 0);
+ state.assertEquals("'a' U+1F3F4 U+E007F |");
+ backspace(state, 0);
+ state.assertEquals("'a' |");
}
@SmallTest
diff --git a/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java b/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java
index 1990fd0..839d380 100644
--- a/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java
+++ b/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java
@@ -37,23 +37,12 @@
// Sync the state to the TextView and call onKeyDown with KEYCODE_FORWARD_DEL key event.
// Then update the state to the result of TextView.
private void forwardDelete(final EditorState state, int modifiers) {
- mActivity.runOnUiThread(new Runnable() {
- public void run() {
- mTextView.setText(state.mText, BufferType.EDITABLE);
- mTextView.setKeyListener(mKeyListener);
- mTextView.setSelection(state.mSelectionStart, state.mSelectionEnd);
- }
- });
- mInstrumentation.waitForIdleSync();
- assertTrue(mTextView.hasWindowFocus());
+ mTextView.setText(state.mText, BufferType.EDITABLE);
+ mTextView.setKeyListener(mKeyListener);
+ mTextView.setSelection(state.mSelectionStart, state.mSelectionEnd);
final KeyEvent keyEvent = getKey(KeyEvent.KEYCODE_FORWARD_DEL, modifiers);
- mActivity.runOnUiThread(new Runnable() {
- public void run() {
- mTextView.onKeyDown(keyEvent.getKeyCode(), keyEvent);
- }
- });
- mInstrumentation.waitForIdleSync();
+ mTextView.onKeyDown(keyEvent.getKeyCode(), keyEvent);
state.mText = mTextView.getText();
state.mSelectionStart = mTextView.getSelectionStart();
@@ -186,6 +175,46 @@
state.assertEquals("| U+1F1FA");
forwardDelete(state, 0);
state.assertEquals("|");
+
+ // Incomplete sequence. (no tag_term:U+E007E)
+ state.setByString("| 'a' U+1F3F4 U+E0067 'b'");
+ forwardDelete(state, 0);
+ state.assertEquals("| U+1F3F4 U+E0067 'b'");
+ forwardDelete(state, 0);
+ state.assertEquals("| 'b'");
+
+ // No tag_base
+ state.setByString("| 'a' U+E0067 U+E007F 'b'");
+ forwardDelete(state, 0);
+ state.assertEquals("| 'b'");
+
+ // Isolated tag chars
+ state.setByString("| 'a' U+E0067 U+E0067 'b'");
+ forwardDelete(state, 0);
+ state.assertEquals("| 'b'");
+
+ // Isolated tag base.
+ state.setByString("| 'a' U+1F3F4 U+1F3F4 'b'");
+ forwardDelete(state, 0);
+ state.assertEquals("| U+1F3F4 U+1F3F4 'b'");
+ forwardDelete(state, 0);
+ state.assertEquals("| U+1F3F4 'b'");
+ forwardDelete(state, 0);
+ state.assertEquals("| 'b'");
+
+ // Isolated tab term.
+ state.setByString("| 'a' U+E007F U+E007F 'b'");
+ forwardDelete(state, 0);
+ state.assertEquals("| 'b'");
+
+ // Immediate tag_term after tag_base
+ state.setByString("| 'a' U+1F3F4 U+E007F U+1F3F4 U+E007F 'b'");
+ forwardDelete(state, 0);
+ state.assertEquals("| U+1F3F4 U+E007F U+1F3F4 U+E007F 'b'");
+ forwardDelete(state, 0);
+ state.assertEquals("| U+1F3F4 U+E007F 'b'");
+ forwardDelete(state, 0);
+ state.assertEquals("| 'b'");
}
@SmallTest
diff --git a/core/tests/coretests/src/android/text/method/KeyListenerTestCase.java b/core/tests/coretests/src/android/text/method/KeyListenerTestCase.java
index 4b4e7af..f005d7b 100644
--- a/core/tests/coretests/src/android/text/method/KeyListenerTestCase.java
+++ b/core/tests/coretests/src/android/text/method/KeyListenerTestCase.java
@@ -17,41 +17,26 @@
package android.text.method;
import android.app.Instrumentation;
-import android.test.ActivityInstrumentationTestCase2;
-import android.text.format.DateUtils;
+import android.test.InstrumentationTestCase;
import android.view.KeyEvent;
import android.widget.EditText;
-import android.widget.TextViewActivity;
import com.android.frameworks.coretests.R;
-public abstract class KeyListenerTestCase extends
- ActivityInstrumentationTestCase2<TextViewActivity> {
+public abstract class KeyListenerTestCase extends InstrumentationTestCase {
- protected TextViewActivity mActivity;
protected Instrumentation mInstrumentation;
protected EditText mTextView;
public KeyListenerTestCase() {
- super(TextViewActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
- mActivity = getActivity();
mInstrumentation = getInstrumentation();
- mTextView = (EditText) mActivity.findViewById(R.id.textview);
-
- mActivity.runOnUiThread(new Runnable() {
- public void run() {
- // Ensure that the screen is on for this test.
- mTextView.setKeepScreenOn(true);
- }
- });
-
- assertTrue(mActivity.waitForWindowFocus(5 * DateUtils.SECOND_IN_MILLIS));
+ mTextView = new EditText(mInstrumentation.getContext());
}
protected static KeyEvent getKey(int keycode, int metaState) {
diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
index 1080a9f..3dfecc6 100644
--- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
@@ -16,6 +16,17 @@
package com.android.internal.app;
+import android.app.Instrumentation;
+import android.content.ComponentName;
+import android.content.IntentFilter;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.LauncherApps;
+import android.content.pm.PackageManager;
+import android.content.pm.ShortcutInfo;
+import android.content.pm.ShortcutManager;
+import android.graphics.drawable.Icon;
+import android.os.SystemClock;
import com.android.internal.R;
import com.android.internal.app.ResolverActivity.ResolvedComponentInfo;
@@ -48,25 +59,31 @@
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
-import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.isA;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
/**
* Chooser activity instrumentation tests
*/
@RunWith(AndroidJUnit4.class)
public class ChooserActivityTest {
+ private Instrumentation instrumentation;
+
+ @Before
+ public void setUp() {
+ instrumentation = InstrumentationRegistry.getInstrumentation();
+ sOverrides.reset();
+ }
+
@Rule
public ActivityTestRule<ChooserWrapperActivity> mActivityRule =
new ActivityTestRule<>(ChooserWrapperActivity.class, false,
false);
- @Before
- public void cleanOverrideData() {
- sOverrides.reset();
- }
-
@Test
public void customTitle() throws InterruptedException {
Intent sendIntent = createSendImageIntent();
@@ -235,7 +252,6 @@
chosen[0] = targetInfo.getResolveInfo();
return true;
};
-
// Make a stable copy of the components as the original list may be modified
List<ResolvedComponentInfo> stableCopy =
createResolvedComponentsForTestWithOtherProfile(2);
@@ -324,6 +340,32 @@
assertThat(chosen[0], is(toChoose));
}
+ public void pushedChooserTarget() {
+ ResolveInfo[] chosen = new ResolveInfo[1];
+ sOverrides.onSafelyStartCallback = targetInfo -> {
+ chosen[0] = targetInfo.getResolveInfo();
+ return true;
+ };
+
+ setChooserShortcuts(1);
+ List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
+ when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
+ Mockito.anyBoolean(),
+ Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
+
+ Intent sendIntent = createSendImageIntent();
+ final ChooserWrapperActivity activity = mActivityRule
+ .launchActivity(Intent.createChooser(sendIntent, null));
+
+ waitForIdle();
+
+ onView(withText("short chooser label 0"))
+ .perform(click());
+ waitForIdle();
+ assertThat(chosen[0].resolvePackageName,
+ is(ResolverDataProvider.createActivityInfo(0).packageName));
+ }
+
private Intent createSendImageIntent() {
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
@@ -371,4 +413,48 @@
}
return packageStats.mChooserCounts.get(action).getOrDefault(annotation, 0);
}
+
+ private void setChooserShortcuts(int numShortcuts) {
+ ArrayList<ShortcutInfo> shortcuts = new ArrayList<>();
+ for (int i = 0; i < numShortcuts; i++) {
+ shortcuts.add(makeShortcut(i));
+ }
+ when(sOverrides.launcherApps.getShortcuts(
+ Mockito.isA(LauncherApps.ShortcutQuery.class),
+ Mockito.eq(UserHandle.SYSTEM)))
+ .thenReturn(shortcuts);
+ }
+
+ private ShortcutInfo makeShortcut(int i) {
+ try {
+ IntentFilter filter = new IntentFilter(Intent.ACTION_SEND, "image/jpeg");
+
+ ComponentName component = new ComponentName("foo.bar", "foo.bar" + ".MainActivity");
+ ShortcutInfo.Builder b = new ShortcutInfo.Builder(instrumentation.getContext(), "" + i)
+ .setActivity(component)
+ .setShortLabel("short chooser label " + i)
+ .setLongLabel("long chooser label" + i)
+ .setRank(i)
+ .setIntent(createSendImageIntent())
+ .setIcon(Icon.createWithResource(instrumentation.getContext(),
+ android.R.drawable.ic_menu_add))
+ .addChooserIntentFilter(
+ filter,
+ component);
+
+ sOverrides.createPackageManager = pm -> {
+ final PackageManager spied = spy(pm);
+ try {
+ doAnswer(invocation -> ResolverDataProvider.createActivityInfo(i))
+ .when(spied).getActivityInfo(
+ Mockito.isA(ComponentName.class), Mockito.anyInt());
+ } catch (Exception e) {
+ // this is ok, just not found
+ e.printStackTrace();
+ }
+ return spied;
+ };
+ return b.build();
+ } catch (Exception e) {return null;}
+ }
}
\ No newline at end of file
diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
index c446f3c..0dac260 100644
--- a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
+++ b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
@@ -18,6 +18,7 @@
import android.app.usage.UsageStatsManager;
import android.content.Context;
+import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import java.util.function.Function;
@@ -74,6 +75,11 @@
return super.getPackageManager();
}
+ @Override
+ public LauncherApps getLauncherApps() {
+ return sOverrides.launcherApps;
+ }
+
/**
* We cannot directly mock the activity created since instrumentation creates it.
* <p>
@@ -82,6 +88,7 @@
static class OverrideData {
@SuppressWarnings("Since15")
public Function<PackageManager, PackageManager> createPackageManager;
+ public LauncherApps launcherApps;
public Function<TargetInfo, Boolean> onSafelyStartCallback;
public ResolverListController resolverListController;
public Boolean isVoiceInteraction;
@@ -90,6 +97,7 @@
onSafelyStartCallback = null;
isVoiceInteraction = null;
createPackageManager = null;
+ launcherApps = mock(LauncherApps.class);
resolverListController = mock(ResolverListController.class);
}
}
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java
index 0bdf7ca..e152163 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java
@@ -48,9 +48,11 @@
bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_RECEIVER);
bi.noteStartSensorLocked(UID, SENSOR_ID);
+ bi.noteStartSensorLocked(UID, SENSOR_ID);
clocks.realtime = 400;
clocks.uptime = 400;
bi.noteStopSensorLocked(UID, SENSOR_ID);
+ bi.noteStopSensorLocked(UID, SENSOR_ID);
BatteryStats.Timer sensorTimer = bi.getUidStats().get(UID).getSensorStats()
.get(SENSOR_ID).getSensorTime();
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk
index 836ede6..14b032e 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk
@@ -31,9 +31,28 @@
LOCAL_JAVACFLAGS := -nowarn
+mainDexList:= \
+ $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME),$(LOCAL_IS_HOST_MODULE),common)/maindex.list
+
+LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
LOCAL_JACK_FLAGS := -D jack.dex.output.policy=minimal-multidex -D jack.preprocessor=true\
-D jack.preprocessor.file=$(LOCAL_PATH)/test.jpp -D jack.dex.output.multidex.legacy=true
+#################################
+include $(BUILD_SYSTEM)/configure_local_jack.mk
+#################################
+
+ifdef LOCAL_JACK_ENABLED
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/test.jpp
+endif
include $(BUILD_PACKAGE)
+
+ifndef LOCAL_JACK_ENABLED
+$(mainDexList): $(full_classes_proguard_jar) | $(MAINDEXCLASSES)
+ $(hide) mkdir -p $(dir $@)
+ $(MAINDEXCLASSES) $< 1>$@
+ echo "com/android/multidexlegacyandexception/Test.class" >> $@
+
+$(built_dex_intermediate): $(mainDexList)
+endif
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk
index 2915914..208eceb 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk
@@ -29,13 +29,32 @@
LOCAL_DEX_PREOPT := false
+mainDexList:= \
+ $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME),$(LOCAL_IS_HOST_MODULE),common)/maindex.list
+
+LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
LOCAL_JACK_FLAGS := -D jack.dex.output.policy=minimal-multidex -D jack.preprocessor=true\
-D jack.preprocessor.file=$(LOCAL_PATH)/test.jpp -D jack.dex.output.multidex.legacy=true
+#################################
+include $(BUILD_SYSTEM)/configure_local_jack.mk
+#################################
+
+ifdef LOCAL_JACK_ENABLED
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/test.jpp
+endif
include $(BUILD_PACKAGE)
+ifndef LOCAL_JACK_ENABLED
+$(mainDexList): $(full_classes_proguard_jar) | $(MAINDEXCLASSES)
+ $(hide) mkdir -p $(dir $@)
+ $(MAINDEXCLASSES) $< 1>$@
+ echo "com/android/multidexlegacytestapp/Test.class" >> $@
+
+$(built_dex_intermediate): $(mainDexList)
+endif
+
## The application with a full main dex
include $(CLEAR_VARS)
@@ -51,9 +70,28 @@
LOCAL_DEX_PREOPT := false
+mainDexList2:= \
+ $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME),$(LOCAL_IS_HOST_MODULE),common)/maindex.list
+
+LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList2)
LOCAL_JACK_FLAGS := -D jack.dex.output.policy=multidex -D jack.preprocessor=true\
-D jack.preprocessor.file=$(LOCAL_PATH)/test.jpp -D jack.dex.output.multidex.legacy=true
+#################################
+include $(BUILD_SYSTEM)/configure_local_jack.mk
+#################################
+
+ifdef LOCAL_JACK_ENABLED
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/test.jpp
+endif
include $(BUILD_PACKAGE)
+
+ifndef LOCAL_JACK_ENABLED
+$(mainDexList2): $(full_classes_proguard_jar) | $(MAINDEXCLASSES)
+ $(hide) mkdir -p $(dir $@)
+ $(MAINDEXCLASSES) $< 1>$@
+ echo "com/android/multidexlegacytestapp/Test.class" >> $@
+
+$(built_dex_intermediate): $(mainDexList2)
+endif
\ No newline at end of file
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk
index 2732372..99bcd6c 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk
@@ -26,8 +26,20 @@
LOCAL_STATIC_JAVA_LIBRARIES := android-support-multidex
+mainDexList:= \
+ $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME),$(LOCAL_IS_HOST_MODULE),common)/maindex.list
+
+LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
LOCAL_JACK_FLAGS := -D jack.dex.output.policy=minimal-multidex -D jack.dex.output.multidex.legacy=true
LOCAL_DEX_PREOPT := false
include $(BUILD_PACKAGE)
+
+ifndef LOCAL_JACK_ENABLED
+$(mainDexList): $(full_classes_proguard_jar) | $(MAINDEXCLASSES)
+ $(hide) mkdir -p $(dir $@)
+ $(MAINDEXCLASSES) $< 1>$@
+
+$(built_dex_intermediate): $(mainDexList)
+endif
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk
index b4a666f..1c7d807 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk
@@ -28,9 +28,28 @@
LOCAL_DEX_PREOPT := false
+mainDexList:= \
+ $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME),$(LOCAL_IS_HOST_MODULE),common)/maindex.list
+
+LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
LOCAL_JACK_FLAGS := -D jack.dex.output.policy=minimal-multidex -D jack.preprocessor=true\
-D jack.preprocessor.file=$(LOCAL_PATH)/test.jpp -D jack.dex.output.multidex.legacy=true
+#################################
+include $(BUILD_SYSTEM)/configure_local_jack.mk
+#################################
+
+ifdef LOCAL_JACK_ENABLED
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/test.jpp
+endif
include $(BUILD_PACKAGE)
+
+ifndef LOCAL_JACK_ENABLED
+$(mainDexList): $(full_classes_proguard_jar) | $(MAINDEXCLASSES)
+ $(hide) mkdir -p $(dir $@)
+ $(MAINDEXCLASSES) $< 1>$@
+ echo "com/android/framework/multidexlegacyversionedtestapp/MultiDexUpdateTest.class" >> $@
+
+$(built_dex_intermediate): $(mainDexList)
+endif
\ No newline at end of file
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk
index f38bd4f..b77cf31 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk
@@ -28,9 +28,28 @@
LOCAL_DEX_PREOPT := false
+mainDexList:= \
+ $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME),$(LOCAL_IS_HOST_MODULE),common)/maindex.list
+
+LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
LOCAL_JACK_FLAGS := -D jack.dex.output.policy=minimal-multidex -D jack.preprocessor=true\
-D jack.preprocessor.file=$(LOCAL_PATH)/test.jpp -D jack.dex.output.multidex.legacy=true
+#################################
+include $(BUILD_SYSTEM)/configure_local_jack.mk
+#################################
+
+ifdef LOCAL_JACK_ENABLED
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/test.jpp
+endif
include $(BUILD_PACKAGE)
+
+ifndef LOCAL_JACK_ENABLED
+$(mainDexList): $(full_classes_proguard_jar) | $(MAINDEXCLASSES)
+ $(hide) mkdir -p $(dir $@)
+ $(MAINDEXCLASSES) $< 1>$@
+ echo "com/android/framework/multidexlegacyversionedtestapp/MultiDexUpdateTest.class" >> $@
+
+$(built_dex_intermediate): $(mainDexList)
+endif
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk
index 5bc2c95..3631626 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk
@@ -26,11 +26,31 @@
LOCAL_STATIC_JAVA_LIBRARIES := android-support-multidex
+mainDexList:= \
+ $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME),$(LOCAL_IS_HOST_MODULE),common)/maindex.list
+
LOCAL_DEX_PREOPT := false
+LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
LOCAL_JACK_FLAGS := -D jack.dex.output.policy=minimal-multidex -D jack.preprocessor=true\
-D jack.preprocessor.file=$(LOCAL_PATH)/test.jpp -D jack.dex.output.multidex.legacy=true
+#################################
+include $(BUILD_SYSTEM)/configure_local_jack.mk
+#################################
+
+ifdef LOCAL_JACK_ENABLED
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/test.jpp
+endif
include $(BUILD_PACKAGE)
+
+ifndef LOCAL_JACK_ENABLED
+$(mainDexList): $(full_classes_proguard_jar) | $(MAINDEXCLASSES)
+ $(hide) mkdir -p $(dir $@)
+ $(MAINDEXCLASSES) $< 1>$@
+ echo "com/android/framework/multidexlegacyversionedtestapp/MultiDexUpdateTest.class" >> $@
+
+$(built_dex_intermediate): $(mainDexList)
+endif
+
diff --git a/core/tests/systemproperties/Android.mk b/core/tests/systemproperties/Android.mk
index e16c367..4c2e224 100644
--- a/core/tests/systemproperties/Android.mk
+++ b/core/tests/systemproperties/Android.mk
@@ -8,6 +8,7 @@
LOCAL_SRC_FILES := \
$(call all-java-files-under, src)
+LOCAL_DX_FLAGS := --core-library
LOCAL_STATIC_JAVA_LIBRARIES := android-common frameworks-core-util-lib
LOCAL_JAVA_LIBRARIES := android.test.runner
LOCAL_PACKAGE_NAME := FrameworksCoreSystemPropertiesTests
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 344f3c8..6248856 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -60,7 +60,6 @@
</permission>
<permission name="android.permission.WRITE_MEDIA_STORAGE" >
- <group gid="media_rw" />
<group gid="sdcard_rw" />
</permission>
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 039ab1f..bf3e793 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -253,6 +253,7 @@
<permission name="android.permission.BIND_APPWIDGET"/>
<permission name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
<permission name="android.permission.CHANGE_CONFIGURATION"/>
+ <permission name="android.permission.CHANGE_OVERLAY_PACKAGES"/>
<permission name="android.permission.CONNECTIVITY_INTERNAL"/>
<permission name="android.permission.DELETE_CACHE_FILES"/>
<permission name="android.permission.DELETE_PACKAGES"/>
@@ -264,6 +265,7 @@
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.MANAGE_ACTIVITY_STACKS"/>
<permission name="android.permission.MANAGE_DEVICE_ADMINS"/>
+ <permission name="android.permission.MANAGE_USB"/>
<permission name="android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS"/>
<permission name="android.permission.MODIFY_PHONE_STATE"/>
<permission name="android.permission.MOUNT_FORMAT_FILESYSTEMS"/>
diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml
index d8e6db7..76598a0 100644
--- a/data/fonts/fonts.xml
+++ b/data/fonts/fonts.xml
@@ -1,8 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- All fonts without names are added to the default list. Fonts are chosen
- based on a match: full BCP-47 language tag including script, then just
- language, and finally order (the first font containing the glyph).
+ WARNING: Parsing of this file by third-party apps is not supported. The
+ file, and the font files it refers to, will be renamed and/or moved out
+ from their respective location in the next Android release, and/or the
+ format or syntax of the file may change significantly. You must not
+ parse this file for information about system fonts. Instead, you must
+ call android.text.FontManager#getSystemFonts(). For example, it can be
+ called as context.getSystemService(FontManager.class).getSystemFonts().
+ Note that the returned FontConfig includes data on all the defined font
+ families and all the details about weight, style, etc. It also provides
+ an open file descriptor to each font file. Note that callers of the API
+ should ensure they close the given file descriptors once they are done
+ using them.
+
+ In this file, all fonts without names are added to the default list.
+ Fonts are chosen based on a match: full BCP-47 language tag including
+ script, then just language, and finally order (the first font containing
+ the glyph).
Order of appearance is also the tiebreaker for weight matching. This is
the reason why the 900 weights of Roboto precede the 700 weights - we
diff --git a/graphics/java/android/graphics/Color.java b/graphics/java/android/graphics/Color.java
index ff21cac..33d19d4 100644
--- a/graphics/java/android/graphics/Color.java
+++ b/graphics/java/android/graphics/Color.java
@@ -1023,9 +1023,9 @@
"The color space must use a color model with at most 3 components");
}
- @HalfFloat short r = Half.valueOf(red);
- @HalfFloat short g = Half.valueOf(green);
- @HalfFloat short b = Half.valueOf(blue);
+ @HalfFloat short r = Half.toHalf(red);
+ @HalfFloat short g = Half.toHalf(green);
+ @HalfFloat short b = Half.toHalf(blue);
int a = (int) (Math.max(0.0f, Math.min(alpha, 1.0f)) * 1023.0f + 0.5f);
diff --git a/graphics/java/android/graphics/ColorSpace.java b/graphics/java/android/graphics/ColorSpace.java
index ec00c45..b1a433c 100644
--- a/graphics/java/android/graphics/ColorSpace.java
+++ b/graphics/java/android/graphics/ColorSpace.java
@@ -805,7 +805,8 @@
*/
public enum Adaptation {
/**
- * Bradford matrix for the von Kries chromatic adaptation transform.
+ * Bradford chromatic adaptation transform, as defined in the
+ * CIECAM97s color appearance model.
*/
BRADFORD(new float[] {
0.8951f, -0.7502f, 0.0389f,
@@ -813,12 +814,21 @@
-0.1614f, 0.0367f, 1.0296f
}),
/**
- * von Kries matrix for the von Kries chromatic adaptation transform.
+ * von Kries chromatic adaptation transform.
*/
VON_KRIES(new float[] {
0.40024f, -0.22630f, 0.00000f,
0.70760f, 1.16532f, 0.00000f,
-0.08081f, 0.04570f, 0.91822f
+ }),
+ /**
+ * CIECAT02 chromatic adaption transform, as defined in the
+ * CIECAM02 color appearance model.
+ */
+ CIECAT02(new float[] {
+ 0.7328f, -0.7036f, 0.0030f,
+ 0.4296f, 1.6975f, 0.0136f,
+ -0.1624f, 0.0061f, 0.9834f
});
final float[] mTransform;
diff --git a/graphics/java/android/graphics/FontFamily.java b/graphics/java/android/graphics/FontFamily.java
index 2c93c32..317f232 100644
--- a/graphics/java/android/graphics/FontFamily.java
+++ b/graphics/java/android/graphics/FontFamily.java
@@ -111,12 +111,24 @@
return nAddFontWeightStyle(mBuilderPtr, font, ttcIndex, axes, weight, style);
}
+ /**
+ * @param mgr The AssetManager to use for this context.
+ * @param path The path to the font file to load.
+ * @param cookie If available, the resource cookie given by Resources.
+ * @param isAsset {@code true} if this is from the assets/ folder, {@code false} if from
+ * resources
+ * @param weight The weight of the font. If 0 is given, the weight and italic will be resolved
+ * using the OS/2 table in the font.
+ * @param isItalic Whether this font is italic. If the weight is set to 0, this will be resolved
+ * using the OS/2 table in the font.
+ * @return
+ */
public boolean addFontFromAssetManager(AssetManager mgr, String path, int cookie,
- boolean isAsset) {
+ boolean isAsset, int weight, boolean isItalic) {
if (mBuilderPtr == 0) {
throw new IllegalStateException("Unable to call addFontFromAsset after freezing.");
}
- return nAddFontFromAssetManager(mBuilderPtr, mgr, path, cookie, isAsset);
+ return nAddFontFromAssetManager(mBuilderPtr, mgr, path, cookie, isAsset, weight, isItalic);
}
private static native long nInitBuilder(String lang, int variant);
@@ -134,5 +146,5 @@
int ttcIndex, List<FontConfig.Axis> listOfAxis,
int weight, boolean isItalic);
private static native boolean nAddFontFromAssetManager(long builderPtr, AssetManager mgr,
- String path, int cookie, boolean isAsset);
+ String path, int cookie, boolean isAsset, int weight, boolean isItalic);
}
diff --git a/graphics/java/android/graphics/PixelFormat.java b/graphics/java/android/graphics/PixelFormat.java
index c3a9443..f93886d 100644
--- a/graphics/java/android/graphics/PixelFormat.java
+++ b/graphics/java/android/graphics/PixelFormat.java
@@ -29,65 +29,66 @@
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef({RGBA_8888, RGBX_8888, RGBA_F16, RGB_888, RGB_565})
- public @interface Format { };
+ @IntDef({RGBA_8888, RGBX_8888, RGBA_F16, RGBA_1010102, RGB_888, RGB_565})
+ public @interface Format { }
// NOTE: these constants must match the values from graphics/common/x.x/types.hal
- public static final int UNKNOWN = 0;
+ public static final int UNKNOWN = 0;
/** System chooses a format that supports translucency (many alpha bits) */
- public static final int TRANSLUCENT = -3;
+ public static final int TRANSLUCENT = -3;
/**
* System chooses a format that supports transparency
* (at least 1 alpha bit)
*/
- public static final int TRANSPARENT = -2;
+ public static final int TRANSPARENT = -2;
/** System chooses an opaque format (no alpha bits required) */
- public static final int OPAQUE = -1;
+ public static final int OPAQUE = -1;
- public static final int RGBA_8888 = 1;
- public static final int RGBX_8888 = 2;
- public static final int RGB_888 = 3;
- public static final int RGB_565 = 4;
+ public static final int RGBA_8888 = 1;
+ public static final int RGBX_8888 = 2;
+ public static final int RGB_888 = 3;
+ public static final int RGB_565 = 4;
@Deprecated
- public static final int RGBA_5551 = 6;
+ public static final int RGBA_5551 = 6;
@Deprecated
- public static final int RGBA_4444 = 7;
+ public static final int RGBA_4444 = 7;
@Deprecated
- public static final int A_8 = 8;
+ public static final int A_8 = 8;
@Deprecated
- public static final int L_8 = 9;
+ public static final int L_8 = 9;
@Deprecated
- public static final int LA_88 = 0xA;
+ public static final int LA_88 = 0xA;
@Deprecated
- public static final int RGB_332 = 0xB;
+ public static final int RGB_332 = 0xB;
/**
* @deprecated use {@link android.graphics.ImageFormat#NV16
* ImageFormat.NV16} instead.
*/
@Deprecated
- public static final int YCbCr_422_SP= 0x10;
+ public static final int YCbCr_422_SP = 0x10;
/**
* @deprecated use {@link android.graphics.ImageFormat#NV21
* ImageFormat.NV21} instead.
*/
@Deprecated
- public static final int YCbCr_420_SP= 0x11;
+ public static final int YCbCr_420_SP = 0x11;
/**
* @deprecated use {@link android.graphics.ImageFormat#YUY2
* ImageFormat.YUY2} instead.
*/
@Deprecated
- public static final int YCbCr_422_I = 0x14;
+ public static final int YCbCr_422_I = 0x14;
- public static final int RGBA_F16 = 0x16;
+ public static final int RGBA_F16 = 0x16;
+ public static final int RGBA_1010102 = 0x2B;
/**
* @deprecated use {@link android.graphics.ImageFormat#JPEG
@@ -103,6 +104,7 @@
switch (format) {
case RGBA_8888:
case RGBX_8888:
+ case RGBA_1010102:
info.bitsPerPixel = 32;
info.bytesPerPixel = 4;
break;
@@ -149,6 +151,7 @@
case PixelFormat.RGBA_5551:
case PixelFormat.RGBA_8888:
case PixelFormat.RGBA_F16:
+ case PixelFormat.RGBA_1010102:
case PixelFormat.TRANSLUCENT:
case PixelFormat.TRANSPARENT:
return true;
@@ -176,6 +179,7 @@
case RGB_888:
case RGB_565:
case RGBA_F16:
+ case RGBA_1010102:
return true;
}
diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java
index efb46b90..90bdd81 100644
--- a/graphics/java/android/graphics/SurfaceTexture.java
+++ b/graphics/java/android/graphics/SurfaceTexture.java
@@ -403,11 +403,4 @@
private native int nativeGetQueuedCount();
private native void nativeRelease();
private native boolean nativeIsReleased();
-
- /*
- * We use a class initializer to allow the native code to cache some
- * field offsets.
- */
- private static native void nativeClassInit();
- static { nativeClassInit(); }
}
diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java
index 7eb8099..52e18a9 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -144,7 +144,8 @@
if (typeface != null) return typeface;
FontFamily fontFamily = new FontFamily();
- if (fontFamily.addFontFromAssetManager(mgr, path, cookie, false /* isAsset */)) {
+ if (fontFamily.addFontFromAssetManager(mgr, path, cookie, false /* isAsset */,
+ 0 /* use OS/2 table to determine weight and italic */, false)) {
fontFamily.freeze();
FontFamily[] families = {fontFamily};
typeface = createFromFamiliesWithDefault(families);
@@ -199,7 +200,8 @@
FontConfig.Font font = fonts.get(i);
// TODO: Use style and weight info
if (!fontFamily.addFontFromAssetManager(mgr, font.getFontName(),
- 0 /* resourceCookie */, false /* isAsset */)) {
+ 0 /* resourceCookie */, false /* isAsset */, font.getWeight(),
+ font.isItalic())) {
return null;
}
}
@@ -498,7 +500,8 @@
if (typeface != null) return typeface;
FontFamily fontFamily = new FontFamily();
- if (fontFamily.addFontFromAssetManager(mgr, path, 0, true /* isAsset */)) {
+ if (fontFamily.addFontFromAssetManager(mgr, path, 0, true /* isAsset */,
+ 0 /* use OS/2 table to determine weight and italic */, false)) {
fontFamily.freeze();
FontFamily[] families = { fontFamily };
typeface = createFromFamiliesWithDefault(families);
diff --git a/graphics/java/android/graphics/drawable/MaskableIconDrawable.java b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
similarity index 97%
rename from graphics/java/android/graphics/drawable/MaskableIconDrawable.java
rename to graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
index 472b229..9896a88 100644
--- a/graphics/java/android/graphics/drawable/MaskableIconDrawable.java
+++ b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
@@ -29,7 +29,6 @@
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
-import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Matrix;
import android.graphics.Outline;
@@ -56,10 +55,10 @@
*
* <p>The layers are clipped when rendering using the mask path defined in the device configuration.
*
- * <p>This class can also be created via XML inflation using <code><maskable-icon></code> tag
+ * <p>This class can also be created via XML inflation using <code><adaptive-icon></code> tag
* in addition to dynamic creation.
*/
-public class MaskableIconDrawable extends Drawable implements Drawable.Callback {
+public class AdaptiveIconDrawable extends Drawable implements Drawable.Callback {
/**
* Mask path is defined inside device configuration in following dimension: [100 x 100]
@@ -122,7 +121,7 @@
/**
* Constructor used for xml inflation.
*/
- MaskableIconDrawable() {
+ AdaptiveIconDrawable() {
this((LayerState) null, null);
}
@@ -130,7 +129,7 @@
* The one constructor to rule them all. This is called by all public
* constructors to set the state and initialize local properties.
*/
- MaskableIconDrawable(@Nullable LayerState state, @Nullable Resources res) {
+ AdaptiveIconDrawable(@Nullable LayerState state, @Nullable Resources res) {
mLayerState = createConstantState(state, res);
if (sMask == null) {
@@ -163,7 +162,7 @@
* @param foregroundDrawable drawable that should be rendered in the foreground
* @hide
*/
- public MaskableIconDrawable(Drawable backgroundDrawable,
+ public AdaptiveIconDrawable(Drawable backgroundDrawable,
Drawable foregroundDrawable) {
this((LayerState)null, null);
if (backgroundDrawable != null) {
@@ -367,7 +366,7 @@
if (layer.mThemeAttrs != null) {
final TypedArray a = t.resolveAttributes(
- layer.mThemeAttrs, R.styleable.MaskableIconDrawableLayer);
+ layer.mThemeAttrs, R.styleable.AdaptiveIconDrawableLayer);
updateLayerFromTypedArray(layer, a);
a.recycle();
}
@@ -414,7 +413,7 @@
final ChildDrawable layer = new ChildDrawable(state.mDensity);
final TypedArray a = obtainAttributes(r, theme, attrs,
- R.styleable.MaskableIconDrawableLayer);
+ R.styleable.AdaptiveIconDrawableLayer);
updateLayerFromTypedArray(layer, a);
a.recycle();
@@ -450,7 +449,7 @@
// Extract the theme attributes, if any.
layer.mThemeAttrs = a.extractThemeAttrs();
- Drawable dr = a.getDrawable(R.styleable.MaskableIconDrawableLayer_drawable);
+ Drawable dr = a.getDrawable(R.styleable.AdaptiveIconDrawableLayer_drawable);
if (dr != null) {
if (layer.mDrawable != null) {
// It's possible that a drawable was already set, in which case
@@ -841,7 +840,7 @@
mDensity = density;
}
- ChildDrawable(@NonNull ChildDrawable orig, @NonNull MaskableIconDrawable owner,
+ ChildDrawable(@NonNull ChildDrawable orig, @NonNull AdaptiveIconDrawable owner,
@Nullable Resources res) {
final Drawable dr = orig.mDrawable;
@@ -899,7 +898,7 @@
private boolean mIsStateful;
private boolean mAutoMirrored = false;
- LayerState(@Nullable LayerState orig, @NonNull MaskableIconDrawable owner,
+ LayerState(@Nullable LayerState orig, @NonNull AdaptiveIconDrawable owner,
@Nullable Resources res) {
mDensity = Drawable.resolveDensity(res, orig != null ? orig.mDensity : 0);
mChildren = new ChildDrawable[N_CHILDREN];
@@ -952,12 +951,12 @@
@Override
public Drawable newDrawable() {
- return new MaskableIconDrawable(this, null);
+ return new AdaptiveIconDrawable(this, null);
}
@Override
public Drawable newDrawable(@Nullable Resources res) {
- return new MaskableIconDrawable(this, res);
+ return new AdaptiveIconDrawable(this, res);
}
@Override
diff --git a/graphics/java/android/graphics/drawable/DrawableInflater.java b/graphics/java/android/graphics/drawable/DrawableInflater.java
index 6d0bbdf..3404d8c 100644
--- a/graphics/java/android/graphics/drawable/DrawableInflater.java
+++ b/graphics/java/android/graphics/drawable/DrawableInflater.java
@@ -147,8 +147,8 @@
return new TransitionDrawable();
case "ripple":
return new RippleDrawable();
- case "maskable-icon":
- return new MaskableIconDrawable();
+ case "adaptive-icon":
+ return new AdaptiveIconDrawable();
case "color":
return new ColorDrawable();
case "shape":
diff --git a/graphics/java/android/graphics/drawable/Icon.java b/graphics/java/android/graphics/drawable/Icon.java
index 60c3b1c..ff1312a 100644
--- a/graphics/java/android/graphics/drawable/Icon.java
+++ b/graphics/java/android/graphics/drawable/Icon.java
@@ -290,7 +290,7 @@
case TYPE_BITMAP:
return new BitmapDrawable(context.getResources(), getBitmap());
case TYPE_BITMAP_MASKABLE:
- return new MaskableIconDrawable(null,
+ return new AdaptiveIconDrawable(null,
new BitmapDrawable(context.getResources(), getBitmap()));
case TYPE_RESOURCE:
if (getResources() == null) {
@@ -563,7 +563,7 @@
/**
* Create an Icon pointing to a bitmap in memory that follows the icon design guideline defined
- * by {@link MaskableIconDrawable}.
+ * by {@link AdaptiveIconDrawable}.
* @param bits A valid {@link android.graphics.Bitmap} object
*/
public static Icon createWithMaskableBitmap(Bitmap bits) {
diff --git a/graphics/java/android/graphics/drawable/ShapeDrawable.java b/graphics/java/android/graphics/drawable/ShapeDrawable.java
index fe82a93..a24b970 100644
--- a/graphics/java/android/graphics/drawable/ShapeDrawable.java
+++ b/graphics/java/android/graphics/drawable/ShapeDrawable.java
@@ -16,9 +16,11 @@
package android.graphics.drawable;
+import android.annotation.NonNull;
import android.content.pm.ActivityInfo.Config;
import android.content.res.ColorStateList;
import android.content.res.Resources;
+import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
@@ -31,10 +33,10 @@
import android.graphics.Rect;
import android.graphics.Shader;
import android.graphics.drawable.shapes.Shape;
-import android.content.res.Resources.Theme;
import android.util.AttributeSet;
import com.android.internal.R;
+
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -69,7 +71,7 @@
* @attr ref android.R.styleable#ShapeDrawable_height
*/
public class ShapeDrawable extends Drawable {
- private ShapeState mShapeState;
+ private @NonNull ShapeState mShapeState;
private PorterDuffColorFilter mTintFilter;
private boolean mMutated;
@@ -77,7 +79,7 @@
* ShapeDrawable constructor.
*/
public ShapeDrawable() {
- this(new ShapeState(null), null);
+ this(new ShapeState(), null);
}
/**
@@ -86,7 +88,7 @@
* @param s the Shape that this ShapeDrawable should be
*/
public ShapeDrawable(Shape s) {
- this(new ShapeState(null), null);
+ this(new ShapeState(), null);
mShapeState.mShape = s;
}
@@ -402,7 +404,7 @@
}
// Update local properties.
- updateLocalState(r);
+ updateLocalState();
}
@Override
@@ -426,7 +428,7 @@
}
// Update local properties.
- updateLocalState(t.getResources());
+ updateLocalState();
}
private void updateStateFromTypedArray(TypedArray a) {
@@ -447,10 +449,10 @@
dither = a.getBoolean(R.styleable.ShapeDrawable_dither, dither);
paint.setDither(dither);
- setIntrinsicWidth((int) a.getDimension(
- R.styleable.ShapeDrawable_width, state.mIntrinsicWidth));
- setIntrinsicHeight((int) a.getDimension(
- R.styleable.ShapeDrawable_height, state.mIntrinsicHeight));
+ state.mIntrinsicWidth = (int) a.getDimension(
+ R.styleable.ShapeDrawable_width, state.mIntrinsicWidth);
+ state.mIntrinsicHeight = (int) a.getDimension(
+ R.styleable.ShapeDrawable_height, state.mIntrinsicHeight);
final int tintMode = a.getInt(R.styleable.ShapeDrawable_tintMode, -1);
if (tintMode != -1) {
@@ -494,21 +496,8 @@
@Override
public Drawable mutate() {
if (!mMutated && super.mutate() == this) {
- if (mShapeState.mPaint != null) {
- mShapeState.mPaint = new Paint(mShapeState.mPaint);
- } else {
- mShapeState.mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- }
- if (mShapeState.mPadding != null) {
- mShapeState.mPadding = new Rect(mShapeState.mPadding);
- } else {
- mShapeState.mPadding = new Rect();
- }
- try {
- mShapeState.mShape = mShapeState.mShape.clone();
- } catch (CloneNotSupportedException e) {
- return null;
- }
+ mShapeState = new ShapeState(mShapeState);
+ updateLocalState();
mMutated = true;
}
return this;
@@ -525,12 +514,13 @@
/**
* Defines the intrinsic properties of this ShapeDrawable's Shape.
*/
- final static class ShapeState extends ConstantState {
- int[] mThemeAttrs;
+ static final class ShapeState extends ConstantState {
+ final @NonNull Paint mPaint;
+
@Config int mChangingConfigurations;
- Paint mPaint;
+ int[] mThemeAttrs;
Shape mShape;
- ColorStateList mTint = null;
+ ColorStateList mTint;
Mode mTintMode = DEFAULT_TINT_MODE;
Rect mPadding;
int mIntrinsicWidth;
@@ -538,21 +528,43 @@
int mAlpha = 255;
ShaderFactory mShaderFactory;
- ShapeState(ShapeState orig) {
- if (orig != null) {
- mThemeAttrs = orig.mThemeAttrs;
- mPaint = orig.mPaint;
- mShape = orig.mShape;
- mTint = orig.mTint;
- mTintMode = orig.mTintMode;
- mPadding = orig.mPadding;
- mIntrinsicWidth = orig.mIntrinsicWidth;
- mIntrinsicHeight = orig.mIntrinsicHeight;
- mAlpha = orig.mAlpha;
- mShaderFactory = orig.mShaderFactory;
- } else {
- mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ /**
+ * Constructs a new ShapeState.
+ */
+ ShapeState() {
+ mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ }
+
+ /**
+ * Constructs a new ShapeState that contains a deep copy of the
+ * specified ShapeState.
+ *
+ * @param orig the state to create a deep copy of
+ */
+ ShapeState(@NonNull ShapeState orig) {
+ mChangingConfigurations = orig.mChangingConfigurations;
+ mPaint = new Paint(orig.mPaint);
+ mThemeAttrs = orig.mThemeAttrs;
+ if (mShape != null) {
+ try {
+ mShape = orig.mShape.clone();
+ } catch (CloneNotSupportedException e) {
+ // Well, at least we tried.
+ mShape = orig.mShape;
+ }
}
+ mTint = orig.mTint;
+ mTintMode = orig.mTintMode;
+ if (orig.mPadding != null) {
+ mPadding = new Rect(orig.mPadding);
+ }
+ mIntrinsicWidth = orig.mIntrinsicWidth;
+ mIntrinsicHeight = orig.mIntrinsicHeight;
+ mAlpha = orig.mAlpha;
+
+ // We don't have any way to clone a shader factory, so hopefully
+ // this class doesn't contain any local state.
+ mShaderFactory = orig.mShaderFactory;
}
@Override
@@ -585,7 +597,7 @@
private ShapeDrawable(ShapeState state, Resources res) {
mShapeState = state;
- updateLocalState(res);
+ updateLocalState();
}
/**
@@ -593,7 +605,7 @@
* after significant state changes, e.g. from the One True Constructor and
* after inflating or applying a theme.
*/
- private void updateLocalState(Resources res) {
+ private void updateLocalState() {
mTintFilter = updateTintFilter(mTintFilter, mShapeState.mTint, mShapeState.mTintMode);
}
@@ -617,8 +629,4 @@
*/
public abstract Shader resize(int width, int height);
}
-
- // other subclass could wack the Shader's localmatrix based on the
- // resize params (e.g. scaletofit, etc.). This could be used to scale
- // a bitmap to fill the bounds without needing any other special casing.
}
diff --git a/graphics/java/android/graphics/drawable/shapes/ArcShape.java b/graphics/java/android/graphics/drawable/shapes/ArcShape.java
index c4b239f..85ba0a9 100644
--- a/graphics/java/android/graphics/drawable/shapes/ArcShape.java
+++ b/graphics/java/android/graphics/drawable/shapes/ArcShape.java
@@ -21,31 +21,47 @@
import android.graphics.Paint;
/**
- * Creates an arc shape. The arc shape starts at a specified
- * angle and sweeps clockwise, drawing slices of pie.
- * The arc can be drawn to a Canvas with its own draw() method,
- * but more graphical control is available if you instead pass
- * the ArcShape to a {@link android.graphics.drawable.ShapeDrawable}.
+ * Creates an arc shape. The arc shape starts at a specified angle and sweeps
+ * clockwise, drawing slices of pie.
+ * <p>
+ * The arc can be drawn to a {@link Canvas} with its own
+ * {@link #draw(Canvas, Paint)} method, but more graphical control is available
+ * if you instead pass the ArcShape to a
+ * {@link android.graphics.drawable.ShapeDrawable}.
*/
public class ArcShape extends RectShape {
- private float mStart;
- private float mSweep;
-
+ private final float mStartAngle;
+ private final float mSweepAngle;
+
/**
- * ArcShape constructor.
- *
+ * ArcShape constructor.
+ *
* @param startAngle the angle (in degrees) where the arc begins
- * @param sweepAngle the sweep angle (in degrees). Anything equal to or
+ * @param sweepAngle the sweep angle (in degrees). Anything equal to or
* greater than 360 results in a complete circle/oval.
*/
public ArcShape(float startAngle, float sweepAngle) {
- mStart = startAngle;
- mSweep = sweepAngle;
+ mStartAngle = startAngle;
+ mSweepAngle = sweepAngle;
}
-
+
+ /**
+ * @return the angle (in degrees) where the arc begins
+ */
+ public final float getStartAngle() {
+ return mStartAngle;
+ }
+
+ /**
+ * @return the sweep angle (in degrees)
+ */
+ public final float getSweepAngle() {
+ return mSweepAngle;
+ }
+
@Override
public void draw(Canvas canvas, Paint paint) {
- canvas.drawArc(rect(), mStart, mSweep, true, paint);
+ canvas.drawArc(rect(), mStartAngle, mSweepAngle, true, paint);
}
@Override
@@ -53,5 +69,10 @@
// Since we don't support concave outlines, arc shape does not attempt
// to provide an outline.
}
+
+ @Override
+ public ArcShape clone() throws CloneNotSupportedException {
+ return (ArcShape) super.clone();
+ }
}
diff --git a/graphics/java/android/graphics/drawable/shapes/OvalShape.java b/graphics/java/android/graphics/drawable/shapes/OvalShape.java
index c9473f0..fb87d28 100644
--- a/graphics/java/android/graphics/drawable/shapes/OvalShape.java
+++ b/graphics/java/android/graphics/drawable/shapes/OvalShape.java
@@ -22,7 +22,8 @@
import android.graphics.RectF;
/**
- * Defines an oval shape.
+ * Defines an oval shape.
+ * <p>
* The oval can be drawn to a Canvas with its own draw() method,
* but more graphical control is available if you instead pass
* the OvalShape to a {@link android.graphics.drawable.ShapeDrawable}.
@@ -42,5 +43,10 @@
outline.setOval((int) Math.ceil(rect.left), (int) Math.ceil(rect.top),
(int) Math.floor(rect.right), (int) Math.floor(rect.bottom));
}
+
+ @Override
+ public OvalShape clone() throws CloneNotSupportedException {
+ return (OvalShape) super.clone();
+ }
}
diff --git a/graphics/java/android/graphics/drawable/shapes/PathShape.java b/graphics/java/android/graphics/drawable/shapes/PathShape.java
index 30b7347..ce5552b 100644
--- a/graphics/java/android/graphics/drawable/shapes/PathShape.java
+++ b/graphics/java/android/graphics/drawable/shapes/PathShape.java
@@ -16,41 +16,44 @@
package android.graphics.drawable.shapes;
+import android.annotation.NonNull;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
/**
* Creates geometric paths, utilizing the {@link android.graphics.Path} class.
+ * <p>
* The path can be drawn to a Canvas with its own draw() method,
* but more graphical control is available if you instead pass
* the PathShape to a {@link android.graphics.drawable.ShapeDrawable}.
*/
public class PathShape extends Shape {
- private Path mPath;
- private float mStdWidth;
- private float mStdHeight;
-
- private float mScaleX; // cached from onResize
- private float mScaleY; // cached from onResize
-
+ private final float mStdWidth;
+ private final float mStdHeight;
+
+ private Path mPath;
+
+ private float mScaleX; // cached from onResize
+ private float mScaleY; // cached from onResize
+
/**
* PathShape constructor.
- *
- * @param path a Path that defines the geometric paths for this shape
- * @param stdWidth the standard width for the shape. Any changes to the
- * width with resize() will result in a width scaled based
- * on the new width divided by this width.
- * @param stdHeight the standard height for the shape. Any changes to the
- * height with resize() will result in a height scaled based
- * on the new height divided by this height.
+ *
+ * @param path a Path that defines the geometric paths for this shape
+ * @param stdWidth the standard width for the shape. Any changes to the
+ * width with resize() will result in a width scaled based
+ * on the new width divided by this width.
+ * @param stdHeight the standard height for the shape. Any changes to the
+ * height with resize() will result in a height scaled based
+ * on the new height divided by this height.
*/
- public PathShape(Path path, float stdWidth, float stdHeight) {
+ public PathShape(@NonNull Path path, float stdWidth, float stdHeight) {
mPath = path;
mStdWidth = stdWidth;
mStdHeight = stdHeight;
}
-
+
@Override
public void draw(Canvas canvas, Paint paint) {
canvas.save();
@@ -58,7 +61,7 @@
canvas.drawPath(mPath, paint);
canvas.restore();
}
-
+
@Override
protected void onResize(float width, float height) {
mScaleX = width / mStdWidth;
@@ -67,7 +70,7 @@
@Override
public PathShape clone() throws CloneNotSupportedException {
- PathShape shape = (PathShape) super.clone();
+ final PathShape shape = (PathShape) super.clone();
shape.mPath = new Path(mPath);
return shape;
}
diff --git a/graphics/java/android/graphics/drawable/shapes/RectShape.java b/graphics/java/android/graphics/drawable/shapes/RectShape.java
index 04cf293..e339a21 100644
--- a/graphics/java/android/graphics/drawable/shapes/RectShape.java
+++ b/graphics/java/android/graphics/drawable/shapes/RectShape.java
@@ -23,6 +23,7 @@
/**
* Defines a rectangle shape.
+ * <p>
* The rectangle can be drawn to a Canvas with its own draw() method,
* but more graphical control is available if you instead pass
* the RectShape to a {@link android.graphics.drawable.ShapeDrawable}.
diff --git a/graphics/java/android/graphics/drawable/shapes/RoundRectShape.java b/graphics/java/android/graphics/drawable/shapes/RoundRectShape.java
index e5253b8..f5cbb24 100644
--- a/graphics/java/android/graphics/drawable/shapes/RoundRectShape.java
+++ b/graphics/java/android/graphics/drawable/shapes/RoundRectShape.java
@@ -16,6 +16,7 @@
package android.graphics.drawable.shapes;
+import android.annotation.Nullable;
import android.graphics.Canvas;
import android.graphics.Outline;
import android.graphics.Paint;
@@ -24,40 +25,41 @@
/**
* Creates a rounded-corner rectangle. Optionally, an inset (rounded) rectangle
- * can be included (to make a sort of "O" shape).
+ * can be included (to make a sort of "O" shape).
+ * <p>
* The rounded rectangle can be drawn to a Canvas with its own draw() method,
* but more graphical control is available if you instead pass
* the RoundRectShape to a {@link android.graphics.drawable.ShapeDrawable}.
*/
public class RoundRectShape extends RectShape {
private float[] mOuterRadii;
- private RectF mInset;
+ private RectF mInset;
private float[] mInnerRadii;
private RectF mInnerRect;
- private Path mPath; // this is what we actually draw
+ private Path mPath; // this is what we actually draw
/**
* RoundRectShape constructor.
+ * <p>
* Specifies an outer (round)rect and an optional inner (round)rect.
*
* @param outerRadii An array of 8 radius values, for the outer roundrect.
- * The first two floats are for the
- * top-left corner (remaining pairs correspond clockwise).
- * For no rounded corners on the outer rectangle,
- * pass null.
- * @param inset A RectF that specifies the distance from the inner
- * rect to each side of the outer rect.
- * For no inner, pass null.
+ * The first two floats are for the top-left corner
+ * (remaining pairs correspond clockwise). For no rounded
+ * corners on the outer rectangle, pass {@code null}.
+ * @param inset A RectF that specifies the distance from the inner
+ * rect to each side of the outer rect. For no inner, pass
+ * {@code null}.
* @param innerRadii An array of 8 radius values, for the inner roundrect.
- * The first two floats are for the
- * top-left corner (remaining pairs correspond clockwise).
- * For no rounded corners on the inner rectangle,
- * pass null.
- * If inset parameter is null, this parameter is ignored.
+ * The first two floats are for the top-left corner
+ * (remaining pairs correspond clockwise). For no rounded
+ * corners on the inner rectangle, pass {@code null}. If
+ * inset parameter is {@code null}, this parameter is
+ * ignored.
*/
- public RoundRectShape(float[] outerRadii, RectF inset,
- float[] innerRadii) {
+ public RoundRectShape(@Nullable float[] outerRadii, @Nullable RectF inset,
+ @Nullable float[] innerRadii) {
if (outerRadii != null && outerRadii.length < 8) {
throw new ArrayIndexOutOfBoundsException("outer radii must have >= 8 values");
}
@@ -97,8 +99,7 @@
final RectF rect = rect();
outline.setRoundRect((int) Math.ceil(rect.left), (int) Math.ceil(rect.top),
- (int) Math.floor(rect.right), (int) Math.floor(rect.bottom),
- radius);
+ (int) Math.floor(rect.right), (int) Math.floor(rect.bottom), radius);
}
@Override
@@ -128,7 +129,7 @@
@Override
public RoundRectShape clone() throws CloneNotSupportedException {
- RoundRectShape shape = (RoundRectShape) super.clone();
+ final RoundRectShape shape = (RoundRectShape) super.clone();
shape.mOuterRadii = mOuterRadii != null ? mOuterRadii.clone() : null;
shape.mInnerRadii = mInnerRadii != null ? mInnerRadii.clone() : null;
shape.mInset = new RectF(mInset);
diff --git a/graphics/java/android/graphics/drawable/shapes/Shape.java b/graphics/java/android/graphics/drawable/shapes/Shape.java
index eab8666..30b28f3 100644
--- a/graphics/java/android/graphics/drawable/shapes/Shape.java
+++ b/graphics/java/android/graphics/drawable/shapes/Shape.java
@@ -23,21 +23,25 @@
/**
* Defines a generic graphical "shape."
- * Any Shape can be drawn to a Canvas with its own draw() method,
- * but more graphical control is available if you instead pass
- * it to a {@link android.graphics.drawable.ShapeDrawable}.
+ * <p>
+ * Any Shape can be drawn to a Canvas with its own draw() method, but more
+ * graphical control is available if you instead pass it to a
+ * {@link android.graphics.drawable.ShapeDrawable}.
+ * <p>
+ * Custom Shape classes must implement {@link #clone()} and return an instance
+ * of the custom Shape class.
*/
public abstract class Shape implements Cloneable {
private float mWidth;
private float mHeight;
-
+
/**
* Returns the width of the Shape.
*/
public final float getWidth() {
return mWidth;
}
-
+
/**
* Returns the height of the Shape.
*/
@@ -46,9 +50,10 @@
}
/**
- * Draw this shape into the provided Canvas, with the provided Paint.
+ * Draws this shape into the provided Canvas, with the provided Paint.
+ * <p>
* Before calling this, you must call {@link #resize(float,float)}.
- *
+ *
* @param canvas the Canvas within which this shape should be drawn
* @param paint the Paint object that defines this shape's characteristics
*/
@@ -56,8 +61,9 @@
/**
* Resizes the dimensions of this shape.
+ * <p>
* Must be called before {@link #draw(Canvas,Paint)}.
- *
+ *
* @param width the width of the shape (in pixels)
* @param height the height of the shape (in pixels)
*/
@@ -74,30 +80,34 @@
onResize(width, height);
}
}
-
+
/**
* Checks whether the Shape is opaque.
- * Default impl returns true. Override if your subclass can be opaque.
- *
- * @return true if any part of the drawable is <em>not</em> opaque.
+ * <p>
+ * Default impl returns {@code true}. Override if your subclass can be
+ * opaque.
+ *
+ * @return true if any part of the drawable is <em>not</em> opaque.
*/
public boolean hasAlpha() {
return true;
}
-
+
/**
* Callback method called when {@link #resize(float,float)} is executed.
- *
+ *
* @param width the new width of the Shape
* @param height the new height of the Shape
*/
protected void onResize(float width, float height) {}
/**
- * Compute the Outline of the shape and return it in the supplied Outline
- * parameter. The default implementation does nothing and {@code outline} is not changed.
+ * Computes the Outline of the shape and return it in the supplied Outline
+ * parameter. The default implementation does nothing and {@code outline}
+ * is not changed.
*
- * @param outline The Outline to be populated with the result. Should not be null.
+ * @param outline the Outline to be populated with the result. Must be
+ * non-{@code null}.
*/
public void getOutline(@NonNull Outline outline) {}
@@ -105,5 +115,4 @@
public Shape clone() throws CloneNotSupportedException {
return (Shape) super.clone();
}
-
}
diff --git a/graphics/tests/graphicstests/src/android/graphics/drawable/IconTest.java b/graphics/tests/graphicstests/src/android/graphics/drawable/IconTest.java
index 50c498b..d3e1a43 100644
--- a/graphics/tests/graphicstests/src/android/graphics/drawable/IconTest.java
+++ b/graphics/tests/graphicstests/src/android/graphics/drawable/IconTest.java
@@ -117,16 +117,16 @@
final Icon im1 = Icon.createWithMaskableBitmap(bm1);
- final MaskableIconDrawable draw1 = (MaskableIconDrawable) im1.loadDrawable(mContext);
+ final AdaptiveIconDrawable draw1 = (AdaptiveIconDrawable) im1.loadDrawable(mContext);
final Bitmap test1 = Bitmap.createBitmap(
- (int)(draw1.getIntrinsicWidth() * (1 + 2 * MaskableIconDrawable.getExtraInsetPercentage())),
- (int)(draw1.getIntrinsicHeight() * (1 + 2 * MaskableIconDrawable.getExtraInsetPercentage())),
+ (int)(draw1.getIntrinsicWidth() * (1 + 2 * AdaptiveIconDrawable.getExtraInsetPercentage())),
+ (int)(draw1.getIntrinsicHeight() * (1 + 2 * AdaptiveIconDrawable.getExtraInsetPercentage())),
Bitmap.Config.ARGB_8888);
draw1.setBounds(0, 0,
- (int) (draw1.getIntrinsicWidth() * (1 + 2 * MaskableIconDrawable.getExtraInsetPercentage())),
- (int) (draw1.getIntrinsicHeight() * (1 + 2 * MaskableIconDrawable.getExtraInsetPercentage())));
+ (int) (draw1.getIntrinsicWidth() * (1 + 2 * AdaptiveIconDrawable.getExtraInsetPercentage())),
+ (int) (draw1.getIntrinsicHeight() * (1 + 2 * AdaptiveIconDrawable.getExtraInsetPercentage())));
draw1.draw(new Canvas(test1));
final File dir = getContext().getExternalFilesDir(null);
diff --git a/keystore/java/android/security/IKeyChainAliasCallback.aidl b/keystore/java/android/security/IKeyChainAliasCallback.aidl
index 1ea9521..b9d3753 100644
--- a/keystore/java/android/security/IKeyChainAliasCallback.aidl
+++ b/keystore/java/android/security/IKeyChainAliasCallback.aidl
@@ -20,7 +20,7 @@
*
* @hide
*/
-interface IKeyChainAliasCallback {
+oneway interface IKeyChainAliasCallback {
void alias(String alias);
}
diff --git a/legacy-test/Android.mk b/legacy-test/Android.mk
index 0a814f3..05fec5e 100644
--- a/legacy-test/Android.mk
+++ b/legacy-test/Android.mk
@@ -50,5 +50,5 @@
LOCAL_SRC_FILES := src/android/test/PerformanceTestCase.java
LOCAL_MODULE := legacy-performance-test-hostdex
-include $(BUILD_HOST_DALVIK_JAVA_LIBRARY)
+include $(BUILD_HOST_DALVIK_STATIC_JAVA_LIBRARY)
endif # HOST_OS == linux
diff --git a/libs/androidfw/ApkAssets.cpp b/libs/androidfw/ApkAssets.cpp
index fe68ec0..a5b1d29 100644
--- a/libs/androidfw/ApkAssets.cpp
+++ b/libs/androidfw/ApkAssets.cpp
@@ -18,7 +18,10 @@
#include "androidfw/ApkAssets.h"
+#include <algorithm>
+
#include "android-base/logging.h"
+#include "utils/FileMap.h"
#include "utils/Trace.h"
#include "ziparchive/zip_archive.h"
@@ -62,13 +65,13 @@
LOG(WARNING) << "resources.arsc is compressed.";
}
+ loaded_apk->path_ = path;
loaded_apk->resources_asset_ =
loaded_apk->Open("resources.arsc", Asset::AccessMode::ACCESS_BUFFER);
if (loaded_apk->resources_asset_ == nullptr) {
return {};
}
- loaded_apk->path_ = path;
loaded_apk->loaded_arsc_ =
LoadedArsc::Load(loaded_apk->resources_asset_->getBuffer(true /*wordAligned*/),
loaded_apk->resources_asset_->getLength(), system, load_as_shared_library);
@@ -80,37 +83,93 @@
return std::move(loaded_apk);
}
-std::unique_ptr<Asset> ApkAssets::Open(const std::string& path, Asset::AccessMode /*mode*/) const {
- ATRACE_NAME("ApkAssets::Open");
+std::unique_ptr<Asset> ApkAssets::Open(const std::string& path, Asset::AccessMode mode) const {
+ ATRACE_CALL();
CHECK(zip_handle_ != nullptr);
::ZipString name(path.c_str());
::ZipEntry entry;
int32_t result = ::FindEntry(zip_handle_.get(), name, &entry);
if (result != 0) {
- LOG(ERROR) << "No entry '" << path << "' found in APK.";
+ LOG(ERROR) << "No entry '" << path << "' found in APK '" << path_ << "'";
return {};
}
if (entry.method == kCompressDeflated) {
- auto compressed_asset = util::make_unique<_CompressedAsset>();
- if (compressed_asset->openChunk(::GetFileDescriptor(zip_handle_.get()), entry.offset,
- entry.method, entry.uncompressed_length,
- entry.compressed_length) != NO_ERROR) {
+ std::unique_ptr<FileMap> map = util::make_unique<FileMap>();
+ if (!map->create(path_.c_str(), ::GetFileDescriptor(zip_handle_.get()), entry.offset,
+ entry.compressed_length, true /*readOnly*/)) {
+ LOG(ERROR) << "Failed to mmap file '" << path << "' in APK '" << path_ << "'";
+ return {};
+ }
+
+ std::unique_ptr<Asset> asset =
+ Asset::createFromCompressedMap(std::move(map), entry.uncompressed_length, mode);
+ if (asset == nullptr) {
LOG(ERROR) << "Failed to decompress '" << path << "'.";
return {};
}
- return std::move(compressed_asset);
+ return asset;
} else {
- auto uncompressed_asset = util::make_unique<_FileAsset>();
- if (uncompressed_asset->openChunk(path.c_str(), ::GetFileDescriptor(zip_handle_.get()),
- entry.offset, entry.uncompressed_length) != NO_ERROR) {
- LOG(ERROR) << "Failed to mmap '" << path << "'.";
+ std::unique_ptr<FileMap> map = util::make_unique<FileMap>();
+ if (!map->create(path_.c_str(), ::GetFileDescriptor(zip_handle_.get()), entry.offset,
+ entry.uncompressed_length, true /*readOnly*/)) {
+ LOG(ERROR) << "Failed to mmap file '" << path << "' in APK '" << path_ << "'";
return {};
}
- return std::move(uncompressed_asset);
+
+ std::unique_ptr<Asset> asset = Asset::createFromUncompressedMap(std::move(map), mode);
+ if (asset == nullptr) {
+ LOG(ERROR) << "Failed to mmap file '" << path << "' in APK '" << path_ << "'";
+ return {};
+ }
+ return asset;
}
- return {};
+}
+
+bool ApkAssets::ForEachFile(const std::string& root_path,
+ const std::function<void(const StringPiece&, FileType)>& f) const {
+ CHECK(zip_handle_ != nullptr);
+
+ std::string root_path_full = root_path;
+ if (root_path_full.back() != '/') {
+ root_path_full += '/';
+ }
+
+ ::ZipString prefix(root_path_full.c_str());
+ void* cookie;
+ if (::StartIteration(zip_handle_.get(), &cookie, &prefix, nullptr) != 0) {
+ return false;
+ }
+
+ ::ZipString name;
+ ::ZipEntry entry;
+
+ // We need to hold back directories because many paths will contain them and we want to only
+ // surface one.
+ std::set<std::string> dirs;
+
+ int32_t result;
+ while ((result = ::Next(cookie, &entry, &name)) == 0) {
+ StringPiece full_file_path(reinterpret_cast<const char*>(name.name), name.name_length);
+ StringPiece leaf_file_path = full_file_path.substr(root_path_full.size());
+ auto iter = std::find(leaf_file_path.begin(), leaf_file_path.end(), '/');
+ if (iter != leaf_file_path.end()) {
+ dirs.insert(
+ leaf_file_path.substr(0, std::distance(leaf_file_path.begin(), iter)).to_string());
+ } else if (!leaf_file_path.empty()) {
+ f(leaf_file_path, kFileTypeRegular);
+ }
+ }
+ ::EndIteration(cookie);
+
+ // Now present the unique directories.
+ for (const std::string& dir : dirs) {
+ f(dir, kFileTypeDirectory);
+ }
+
+ // -1 is end of iteration, anything else is an error.
+ return result == -1;
}
} // namespace android
diff --git a/libs/androidfw/Asset.cpp b/libs/androidfw/Asset.cpp
index 8e8c6a2..247458d 100644
--- a/libs/androidfw/Asset.cpp
+++ b/libs/androidfw/Asset.cpp
@@ -23,6 +23,7 @@
#include <androidfw/Asset.h>
#include <androidfw/StreamingZipInflater.h>
+#include <androidfw/Util.h>
#include <androidfw/ZipFileRO.h>
#include <androidfw/ZipUtils.h>
#include <utils/Atomic.h>
@@ -298,6 +299,22 @@
return pAsset;
}
+/*static*/ std::unique_ptr<Asset> Asset::createFromUncompressedMap(std::unique_ptr<FileMap> dataMap,
+ AccessMode mode)
+{
+ std::unique_ptr<_FileAsset> pAsset = util::make_unique<_FileAsset>();
+
+ status_t result = pAsset->openChunk(dataMap.get());
+ if (result != NO_ERROR) {
+ return NULL;
+ }
+
+ // We succeeded, so relinquish control of dataMap
+ (void) dataMap.release();
+ pAsset->mAccessMode = mode;
+ return std::move(pAsset);
+}
+
/*
* Create a new Asset from compressed data in a memory mapping.
*/
@@ -316,6 +333,21 @@
return pAsset;
}
+/*static*/ std::unique_ptr<Asset> Asset::createFromCompressedMap(std::unique_ptr<FileMap> dataMap,
+ size_t uncompressedLen, AccessMode mode)
+{
+ std::unique_ptr<_CompressedAsset> pAsset = util::make_unique<_CompressedAsset>();
+
+ status_t result = pAsset->openChunk(dataMap.get(), uncompressedLen);
+ if (result != NO_ERROR) {
+ return NULL;
+ }
+
+ // We succeeded, so relinquish control of dataMap
+ (void) dataMap.release();
+ pAsset->mAccessMode = mode;
+ return std::move(pAsset);
+}
/*
* Do generic seek() housekeeping. Pass in the offset/whence values from
diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp
index acacd76..84111ae 100644
--- a/libs/androidfw/AssetManager.cpp
+++ b/libs/androidfw/AssetManager.cpp
@@ -202,15 +202,6 @@
*cookie = static_cast<int32_t>(mAssetPaths.size());
}
-#ifdef __ANDROID__
- // Load overlays, if any
- asset_path oap;
- for (size_t idx = 0; mZipSet.getOverlay(ap.path, idx, &oap); idx++) {
- oap.isSystemAsset = isSystemAsset;
- mAssetPaths.add(oap);
- }
-#endif
-
if (mResources != NULL) {
appendPathToResTable(ap, appAsLib);
}
@@ -493,11 +484,6 @@
}
bool AssetManager::appendPathToResTable(const asset_path& ap, bool appAsLib) const {
- // skip those ap's that correspond to system overlays
- if (ap.isSystemOverlay) {
- return true;
- }
-
Asset* ass = NULL;
ResTable* sharedRes = NULL;
bool shared = true;
@@ -539,14 +525,6 @@
ALOGV("Creating shared resources for %s", ap.path.string());
sharedRes = new ResTable();
sharedRes->add(ass, idmap, nextEntryIdx + 1, false);
-#ifdef __ANDROID__
- const char* data = getenv("ANDROID_DATA");
- LOG_ALWAYS_FATAL_IF(data == NULL, "ANDROID_DATA not set");
- String8 overlaysListPath(data);
- overlaysListPath.appendPath(kResourceCache);
- overlaysListPath.appendPath("overlays.list");
- addSystemOverlays(overlaysListPath.string(), ap.path, sharedRes, nextEntryIdx);
-#endif
sharedRes = const_cast<AssetManager*>(this)->
mZipSet.setZipResourceTable(ap.path, sharedRes);
}
@@ -655,58 +633,6 @@
return ass;
}
-void AssetManager::addSystemOverlays(const char* pathOverlaysList,
- const String8& targetPackagePath, ResTable* sharedRes, size_t offset) const
-{
- FILE* fin = fopen(pathOverlaysList, "r");
- if (fin == NULL) {
- return;
- }
-
-#ifndef _WIN32
- if (TEMP_FAILURE_RETRY(flock(fileno(fin), LOCK_SH)) != 0) {
- fclose(fin);
- return;
- }
-#endif
- char buf[1024];
- while (fgets(buf, sizeof(buf), fin)) {
- // format of each line:
- // <path to apk><space><path to idmap><newline>
- char* space = strchr(buf, ' ');
- char* newline = strchr(buf, '\n');
- asset_path oap;
-
- if (space == NULL || newline == NULL || newline < space) {
- continue;
- }
-
- oap.path = String8(buf, space - buf);
- oap.type = kFileTypeRegular;
- oap.idmap = String8(space + 1, newline - space - 1);
- oap.isSystemOverlay = true;
-
- Asset* oass = const_cast<AssetManager*>(this)->
- openNonAssetInPathLocked("resources.arsc",
- Asset::ACCESS_BUFFER,
- oap);
-
- if (oass != NULL) {
- Asset* oidmap = openIdmapLocked(oap);
- offset++;
- sharedRes->add(oass, oidmap, offset + 1, false);
- const_cast<AssetManager*>(this)->mAssetPaths.add(oap);
- const_cast<AssetManager*>(this)->mZipSet.addOverlay(targetPackagePath, oap);
- delete oidmap;
- }
- }
-
-#ifndef _WIN32
- TEMP_FAILURE_RETRY(flock(fileno(fin), LOCK_UN));
-#endif
- fclose(fin);
-}
-
const ResTable& AssetManager::getResources(bool required) const
{
const ResTable* rt = getResTable(required);
@@ -1446,20 +1372,6 @@
return mModWhen == modWhen;
}
-void AssetManager::SharedZip::addOverlay(const asset_path& ap)
-{
- mOverlays.add(ap);
-}
-
-bool AssetManager::SharedZip::getOverlay(size_t idx, asset_path* out) const
-{
- if (idx >= mOverlays.size()) {
- return false;
- }
- *out = mOverlays[idx];
- return true;
-}
-
AssetManager::SharedZip::~SharedZip()
{
if (kIsDebug) {
@@ -1578,22 +1490,6 @@
return true;
}
-void AssetManager::ZipSet::addOverlay(const String8& path, const asset_path& overlay)
-{
- int idx = getIndex(path);
- sp<SharedZip> zip = mZipFile[idx];
- zip->addOverlay(overlay);
-}
-
-bool AssetManager::ZipSet::getOverlay(const String8& path, size_t idx, asset_path* out) const
-{
- sp<SharedZip> zip = SharedZip::get(path, false);
- if (zip == NULL) {
- return false;
- }
- return zip->getOverlay(idx, out);
-}
-
/*
* Compute the zip file's index.
*
diff --git a/libs/androidfw/AssetManager2.cpp b/libs/androidfw/AssetManager2.cpp
index ef0c967..5667f92 100644
--- a/libs/androidfw/AssetManager2.cpp
+++ b/libs/androidfw/AssetManager2.cpp
@@ -138,6 +138,17 @@
return &package_groups_[idx].dynamic_ref_table;
}
+const DynamicRefTable* AssetManager2::GetDynamicRefTableForCookie(ApkAssetsCookie cookie) const {
+ for (const PackageGroup& package_group : package_groups_) {
+ for (const ApkAssetsCookie& package_cookie : package_group.cookies_) {
+ if (package_cookie == cookie) {
+ return &package_group.dynamic_ref_table;
+ }
+ }
+ }
+ return nullptr;
+}
+
void AssetManager2::SetConfiguration(const ResTable_config& configuration) {
const int diff = configuration_.diff(configuration);
configuration_ = configuration;
@@ -188,6 +199,35 @@
return OpenNonAsset(new_path, cookie, mode);
}
+std::unique_ptr<AssetDir> AssetManager2::OpenDir(const std::string& dirname) {
+ ATRACE_CALL();
+
+ std::string full_path = "assets/" + dirname;
+ std::unique_ptr<SortedVector<AssetDir::FileInfo>> files =
+ util::make_unique<SortedVector<AssetDir::FileInfo>>();
+
+ // Start from the back.
+ for (auto iter = apk_assets_.rbegin(); iter != apk_assets_.rend(); ++iter) {
+ const ApkAssets* apk_assets = *iter;
+
+ auto func = [&](const StringPiece& name, FileType type) {
+ AssetDir::FileInfo info;
+ info.setFileName(String8(name.data(), name.size()));
+ info.setFileType(type);
+ info.setSourceName(String8(apk_assets->GetPath().c_str()));
+ files->add(info);
+ };
+
+ if (!apk_assets->ForEachFile(full_path, func)) {
+ return {};
+ }
+ }
+
+ std::unique_ptr<AssetDir> asset_dir = util::make_unique<AssetDir>();
+ asset_dir->setFileList(files.release());
+ return asset_dir;
+}
+
// Search in reverse because that's how we used to do it and we need to preserve behaviour.
// This is unfortunate, because ClassLoaders delegate to the parent first, so the order
// is inconsistent for split APKs.
@@ -237,15 +277,15 @@
desired_config = &density_override_config;
}
- const uint32_t package_id = get_package_id(resid);
- const uint8_t type_id = get_type_id(resid);
- const uint16_t entry_id = get_entry_id(resid);
-
- if (type_id == 0) {
+ if (!is_valid_resid(resid)) {
LOG(ERROR) << base::StringPrintf("Invalid ID 0x%08x.", resid);
return kInvalidCookie;
}
+ const uint32_t package_id = get_package_id(resid);
+ const uint8_t type_idx = get_type_id(resid) - 1;
+ const uint16_t entry_id = get_entry_id(resid);
+
const uint8_t idx = package_ids_[package_id];
if (idx == 0xff) {
LOG(ERROR) << base::StringPrintf("No package ID %02x found for ID 0x%08x.", package_id, resid);
@@ -265,7 +305,7 @@
uint32_t current_flags = 0;
const LoadedPackage* loaded_package = package_group.packages_[i];
- if (!loaded_package->FindEntry(type_id - 1, entry_id, *desired_config, ¤t_entry,
+ if (!loaded_package->FindEntry(type_idx, entry_id, *desired_config, ¤t_entry,
¤t_config, ¤t_flags)) {
continue;
}
@@ -385,16 +425,16 @@
ApkAssetsCookie AssetManager2::ResolveReference(ApkAssetsCookie cookie, Res_value* in_out_value,
ResTable_config* in_out_selected_config,
uint32_t* in_out_flags,
- ResTable_ref* out_last_reference) {
+ uint32_t* out_last_reference) {
ATRACE_CALL();
constexpr const int kMaxIterations = 20;
- out_last_reference->ident = 0u;
+ *out_last_reference = 0u;
for (size_t iteration = 0u; in_out_value->dataType == Res_value::TYPE_REFERENCE &&
in_out_value->data != 0u && iteration < kMaxIterations;
iteration++) {
if (out_last_reference != nullptr) {
- out_last_reference->ident = in_out_value->data;
+ *out_last_reference = in_out_value->data;
}
uint32_t new_flags = 0u;
cookie = GetResource(in_out_value->data, true /*may_be_bag*/, 0u /*density_override*/,
@@ -405,7 +445,7 @@
if (in_out_flags != nullptr) {
*in_out_flags |= new_flags;
}
- if (out_last_reference->ident == in_out_value->data) {
+ if (*out_last_reference == in_out_value->data) {
// This reference can't be resolved, so exit now and let the caller deal with it.
return cookie;
}
@@ -832,6 +872,25 @@
return kInvalidCookie;
}
+ApkAssetsCookie Theme::ResolveAttributeReference(ApkAssetsCookie cookie, Res_value* in_out_value,
+ ResTable_config* in_out_selected_config,
+ uint32_t* in_out_type_spec_flags,
+ uint32_t* out_last_ref) {
+ if (in_out_value->dataType == Res_value::TYPE_ATTRIBUTE) {
+ uint32_t new_flags;
+ cookie = GetAttribute(in_out_value->data, in_out_value, &new_flags);
+ if (cookie == kInvalidCookie) {
+ return kInvalidCookie;
+ }
+
+ if (in_out_type_spec_flags != nullptr) {
+ *in_out_type_spec_flags |= new_flags;
+ }
+ }
+ return asset_manager_->ResolveReference(cookie, in_out_value, in_out_selected_config,
+ in_out_type_spec_flags, out_last_ref);
+}
+
void Theme::Clear() {
type_spec_flags_ = 0u;
for (std::unique_ptr<Package>& package : packages_) {
diff --git a/libs/androidfw/CursorWindow.cpp b/libs/androidfw/CursorWindow.cpp
index 166863c..5694115 100644
--- a/libs/androidfw/CursorWindow.cpp
+++ b/libs/androidfw/CursorWindow.cpp
@@ -98,9 +98,14 @@
if (dupAshmemFd < 0) {
result = -errno;
} else {
+ // the size of the ashmem descriptor can be modified between ashmem_get_size_region
+ // call and mmap, so we'll check again immediately after memory is mapped
void* data = ::mmap(NULL, size, PROT_READ, MAP_SHARED, dupAshmemFd, 0);
if (data == MAP_FAILED) {
result = -errno;
+ } else if (ashmem_get_size_region(dupAshmemFd) != size) {
+ ::munmap(data, size);
+ result = BAD_VALUE;
} else {
CursorWindow* window = new CursorWindow(name, dupAshmemFd,
data, size, true /*readOnly*/);
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index 763a178..b8d95e4 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -6074,6 +6074,10 @@
return true;
}
+static bool keyCompare(const ResTable_sparseTypeEntry& entry , uint16_t entryIdx) {
+ return dtohs(entry.idx) < entryIdx;
+}
+
status_t ResTable::getEntry(
const PackageGroup* packageGroup, int typeIndex, int entryIndex,
const ResTable_config* config,
@@ -6115,6 +6119,9 @@
currentTypeIsOverlay = true;
}
+ // Check that the entry idx is within range of the declared entry count (ResTable_typeSpec).
+ // Particular types (ResTable_type) may be encoded with sparse entries, and so their
+ // entryCount do not need to match.
if (static_cast<size_t>(realEntryIndex) >= typeSpec->entryCount) {
ALOGW("For resource 0x%08x, entry index(%d) is beyond type entryCount(%d)",
Res_MAKEID(packageGroup->id - 1, typeIndex, entryIndex),
@@ -6169,11 +6176,37 @@
continue;
}
- // Check if there is the desired entry in this type.
const uint32_t* const eindex = reinterpret_cast<const uint32_t*>(
reinterpret_cast<const uint8_t*>(thisType) + dtohs(thisType->header.headerSize));
- uint32_t thisOffset = dtohl(eindex[realEntryIndex]);
+ uint32_t thisOffset;
+
+ // Check if there is the desired entry in this type.
+ if (thisType->flags & ResTable_type::FLAG_SPARSE) {
+ // This is encoded as a sparse map, so perform a binary search.
+ const ResTable_sparseTypeEntry* sparseIndices =
+ reinterpret_cast<const ResTable_sparseTypeEntry*>(eindex);
+ const ResTable_sparseTypeEntry* result = std::lower_bound(
+ sparseIndices, sparseIndices + dtohl(thisType->entryCount), realEntryIndex,
+ keyCompare);
+ if (result == sparseIndices + dtohl(thisType->entryCount)
+ || dtohs(result->idx) != realEntryIndex) {
+ // No entry found.
+ continue;
+ }
+
+ // Extract the offset from the entry. Each offset must be a multiple of 4
+ // so we store it as the real offset divided by 4.
+ thisOffset = dtohs(result->offset) * 4u;
+ } else {
+ if (static_cast<uint32_t>(realEntryIndex) >= dtohl(thisType->entryCount)) {
+ // Entry does not exist.
+ continue;
+ }
+
+ thisOffset = dtohl(eindex[realEntryIndex]);
+ }
+
if (thisOffset == ResTable_type::NO_ENTRY) {
// There is no entry for this index and configuration.
continue;
@@ -6480,12 +6513,6 @@
}
Type* t = typeList.editItemAt(typeList.size() - 1);
- if (newEntryCount != t->entryCount) {
- ALOGE("ResTable_type entry count inconsistent: given %d, previously %d",
- (int)newEntryCount, (int)t->entryCount);
- return (mError=BAD_TYPE);
- }
-
if (t->package != package) {
ALOGE("No TypeSpec for type %d", type->id);
return (mError=BAD_TYPE);
@@ -6532,6 +6559,8 @@
return NO_ERROR;
}
+DynamicRefTable::DynamicRefTable() : DynamicRefTable(0, false) {}
+
DynamicRefTable::DynamicRefTable(uint8_t packageId, bool appAsLib)
: mAssignedPackageId(packageId)
, mAppAsLib(appAsLib)
@@ -6637,11 +6666,11 @@
// Do a proper lookup.
uint8_t translatedId = mLookupTable[packageId];
if (translatedId == 0) {
- ALOGV("DynamicRefTable(0x%02x): No mapping for build-time package ID 0x%02x.",
+ ALOGW("DynamicRefTable(0x%02x): No mapping for build-time package ID 0x%02x.",
(uint8_t)mAssignedPackageId, (uint8_t)packageId);
for (size_t i = 0; i < 256; i++) {
if (mLookupTable[i] != 0) {
- ALOGV("e[0x%02x] -> 0x%02x", (uint8_t)i, mLookupTable[i]);
+ ALOGW("e[0x%02x] -> 0x%02x", (uint8_t)i, mLookupTable[i]);
}
}
return UNKNOWN_ERROR;
@@ -7096,8 +7125,17 @@
thisConfig.copyFromDtoH(type->config);
String8 configStr = thisConfig.toString();
- printf(" config %s:\n", configStr.size() > 0
+ printf(" config %s", configStr.size() > 0
? configStr.string() : "(default)");
+ if (type->flags != 0u) {
+ printf(" flags=0x%02x", type->flags);
+ if (type->flags & ResTable_type::FLAG_SPARSE) {
+ printf(" [sparse]");
+ }
+ }
+
+ printf(":\n");
+
size_t entryCount = dtohl(type->entryCount);
uint32_t entriesStart = dtohl(type->entriesStart);
if ((entriesStart&0x3) != 0) {
@@ -7109,18 +7147,30 @@
printf(" NON-INTEGER ResTable_type header.size: 0x%x\n", typeSize);
continue;
}
- for (size_t entryIndex=0; entryIndex<entryCount; entryIndex++) {
- const uint32_t* const eindex = (const uint32_t*)
- (((const uint8_t*)type) + dtohs(type->header.headerSize));
- uint32_t thisOffset = dtohl(eindex[entryIndex]);
- if (thisOffset == ResTable_type::NO_ENTRY) {
- continue;
+ const uint32_t* const eindex = (const uint32_t*)
+ (((const uint8_t*)type) + dtohs(type->header.headerSize));
+ for (size_t entryIndex=0; entryIndex<entryCount; entryIndex++) {
+ size_t entryId;
+ uint32_t thisOffset;
+ if (type->flags & ResTable_type::FLAG_SPARSE) {
+ const ResTable_sparseTypeEntry* entry =
+ reinterpret_cast<const ResTable_sparseTypeEntry*>(
+ eindex + entryIndex);
+ entryId = dtohs(entry->idx);
+ // Offsets are encoded as divided by 4.
+ thisOffset = static_cast<uint32_t>(dtohs(entry->offset)) * 4u;
+ } else {
+ entryId = entryIndex;
+ thisOffset = dtohl(eindex[entryIndex]);
+ if (thisOffset == ResTable_type::NO_ENTRY) {
+ continue;
+ }
}
uint32_t resID = (0xff000000 & ((packageId)<<24))
| (0x00ff0000 & ((typeIndex+1)<<16))
- | (0x0000ffff & (entryIndex));
+ | (0x0000ffff & (entryId));
if (packageId == 0) {
pg->dynamicRefTable.lookupResourceId(&resID);
}
diff --git a/libs/androidfw/TypeWrappers.cpp b/libs/androidfw/TypeWrappers.cpp
index 06b4040..647aa19 100644
--- a/libs/androidfw/TypeWrappers.cpp
+++ b/libs/androidfw/TypeWrappers.cpp
@@ -16,23 +16,45 @@
#include <androidfw/TypeWrappers.h>
+#include <algorithm>
+
namespace android {
+TypeVariant::TypeVariant(const ResTable_type* data) : data(data), mLength(dtohl(data->entryCount)) {
+ if (data->flags & ResTable_type::FLAG_SPARSE) {
+ const uint32_t entryCount = dtohl(data->entryCount);
+ const uintptr_t containerEnd = reinterpret_cast<uintptr_t>(data) + dtohl(data->header.size);
+ const uint32_t* const entryIndices = reinterpret_cast<const uint32_t*>(
+ reinterpret_cast<uintptr_t>(data) + dtohs(data->header.headerSize));
+ if (reinterpret_cast<uintptr_t>(entryIndices) + (sizeof(uint32_t) * entryCount)
+ > containerEnd) {
+ ALOGE("Type's entry indices extend beyond its boundaries");
+ mLength = 0;
+ } else {
+ mLength = ResTable_sparseTypeEntry{entryIndices[entryCount - 1]}.idx + 1;
+ }
+ }
+}
+
TypeVariant::iterator& TypeVariant::iterator::operator++() {
mIndex++;
- if (mIndex > dtohl(mTypeVariant->data->entryCount)) {
- mIndex = dtohl(mTypeVariant->data->entryCount);
+ if (mIndex > mTypeVariant->mLength) {
+ mIndex = mTypeVariant->mLength;
}
return *this;
}
+static bool keyCompare(uint32_t entry, uint16_t index) {
+ return dtohs(ResTable_sparseTypeEntry{entry}.idx) < index;
+}
+
const ResTable_entry* TypeVariant::iterator::operator*() const {
const ResTable_type* type = mTypeVariant->data;
- const uint32_t entryCount = dtohl(type->entryCount);
- if (mIndex >= entryCount) {
+ if (mIndex >= mTypeVariant->mLength) {
return NULL;
}
+ const uint32_t entryCount = dtohl(mTypeVariant->data->entryCount);
const uintptr_t containerEnd = reinterpret_cast<uintptr_t>(type)
+ dtohl(type->header.size);
const uint32_t* const entryIndices = reinterpret_cast<const uint32_t*>(
@@ -42,7 +64,19 @@
return NULL;
}
- const uint32_t entryOffset = dtohl(entryIndices[mIndex]);
+ uint32_t entryOffset;
+ if (type->flags & ResTable_type::FLAG_SPARSE) {
+ auto iter = std::lower_bound(entryIndices, entryIndices + entryCount, mIndex, keyCompare);
+ if (iter == entryIndices + entryCount
+ || dtohs(ResTable_sparseTypeEntry{*iter}.idx) != mIndex) {
+ return NULL;
+ }
+
+ entryOffset = static_cast<uint32_t>(dtohs(ResTable_sparseTypeEntry{*iter}.offset)) * 4u;
+ } else {
+ entryOffset = dtohl(entryIndices[mIndex]);
+ }
+
if (entryOffset == ResTable_type::NO_ENTRY) {
return NULL;
}
diff --git a/libs/androidfw/Util.cpp b/libs/androidfw/Util.cpp
index 202bc8e..575cd18 100644
--- a/libs/androidfw/Util.cpp
+++ b/libs/androidfw/Util.cpp
@@ -41,5 +41,31 @@
}
}
+std::u16string Utf8ToUtf16(const StringPiece& utf8) {
+ ssize_t utf16_length =
+ utf8_to_utf16_length(reinterpret_cast<const uint8_t*>(utf8.data()), utf8.length());
+ if (utf16_length <= 0) {
+ return {};
+ }
+
+ std::u16string utf16;
+ utf16.resize(utf16_length);
+ utf8_to_utf16(reinterpret_cast<const uint8_t*>(utf8.data()), utf8.length(), &*utf16.begin(),
+ utf16_length + 1);
+ return utf16;
+}
+
+std::string Utf16ToUtf8(const StringPiece16& utf16) {
+ ssize_t utf8_length = utf16_to_utf8_length(utf16.data(), utf16.length());
+ if (utf8_length <= 0) {
+ return {};
+ }
+
+ std::string utf8;
+ utf8.resize(utf8_length);
+ utf16_to_utf8(utf16.data(), utf16.length(), &*utf8.begin(), utf8_length + 1);
+ return utf8;
+}
+
} // namespace util
} // namespace android
diff --git a/libs/androidfw/include/androidfw/ApkAssets.h b/libs/androidfw/include/androidfw/ApkAssets.h
index 6d1578c..b7e66fb 100644
--- a/libs/androidfw/include/androidfw/ApkAssets.h
+++ b/libs/androidfw/include/androidfw/ApkAssets.h
@@ -25,6 +25,7 @@
#include "androidfw/Asset.h"
#include "androidfw/LoadedArsc.h"
+#include "androidfw/misc.h"
namespace android {
@@ -38,6 +39,9 @@
std::unique_ptr<Asset> Open(const std::string& path,
Asset::AccessMode mode = Asset::AccessMode::ACCESS_RANDOM) const;
+ bool ForEachFile(const std::string& path,
+ const std::function<void(const StringPiece&, FileType)>& f) const;
+
inline const std::string& GetPath() const { return path_; }
inline const LoadedArsc* GetLoadedArsc() const { return loaded_arsc_.get(); }
@@ -56,6 +60,7 @@
using ZipArchivePtr =
std::unique_ptr<typename std::remove_pointer<::ZipArchiveHandle>::type, ZipArchivePtrCloser>;
+
ZipArchivePtr zip_handle_;
std::string path_;
std::unique_ptr<Asset> resources_asset_;
diff --git a/libs/androidfw/include/androidfw/Asset.h b/libs/androidfw/include/androidfw/Asset.h
index 461e773..9d12a35 100644
--- a/libs/androidfw/include/androidfw/Asset.h
+++ b/libs/androidfw/include/androidfw/Asset.h
@@ -24,6 +24,8 @@
#include <stdio.h>
#include <sys/types.h>
+#include <memory>
+
#include <utils/Compat.h>
#include <utils/Errors.h>
#include <utils/String8.h>
@@ -150,6 +152,7 @@
/* AssetManager needs access to our "create" functions */
friend class AssetManager;
+ friend class ApkAssets;
/*
* Create the asset from a named file on disk.
@@ -194,6 +197,9 @@
*/
static Asset* createFromUncompressedMap(FileMap* dataMap, AccessMode mode);
+ static std::unique_ptr<Asset> createFromUncompressedMap(std::unique_ptr<FileMap> dataMap,
+ AccessMode mode);
+
/*
* Create the asset from a memory-mapped file segment with compressed
* data.
@@ -203,6 +209,9 @@
static Asset* createFromCompressedMap(FileMap* dataMap,
size_t uncompressedLen, AccessMode mode);
+ static std::unique_ptr<Asset> createFromCompressedMap(std::unique_ptr<FileMap> dataMap,
+ size_t uncompressedLen, AccessMode mode);
+
/*
* Create from a reference-counted chunk of shared memory.
diff --git a/libs/androidfw/include/androidfw/AssetDir.h b/libs/androidfw/include/androidfw/AssetDir.h
index bd89d7d..7aef02d 100644
--- a/libs/androidfw/include/androidfw/AssetDir.h
+++ b/libs/androidfw/include/androidfw/AssetDir.h
@@ -70,6 +70,7 @@
const AssetDir& operator=(const AssetDir& src);
friend class AssetManager;
+ friend class AssetManager2;
/*
* This holds information about files in the asset hierarchy.
diff --git a/libs/androidfw/include/androidfw/AssetManager.h b/libs/androidfw/include/androidfw/AssetManager.h
index becd307..f1e8b93 100644
--- a/libs/androidfw/include/androidfw/AssetManager.h
+++ b/libs/androidfw/include/androidfw/AssetManager.h
@@ -202,12 +202,10 @@
private:
struct asset_path
{
- asset_path() : path(""), type(kFileTypeRegular), idmap(""),
- isSystemOverlay(false), isSystemAsset(false) {}
+ asset_path() : path(""), type(kFileTypeRegular), idmap(""), isSystemAsset(false) {}
String8 path;
FileType type;
String8 idmap;
- bool isSystemOverlay;
bool isSystemAsset;
};
@@ -237,9 +235,6 @@
Asset* openIdmapLocked(const struct asset_path& ap) const;
- void addSystemOverlays(const char* pathOverlaysList, const String8& targetPackagePath,
- ResTable* sharedRes, size_t offset) const;
-
class SharedZip : public RefBase {
public:
static sp<SharedZip> get(const String8& path, bool createIfNotPresent = true);
@@ -254,9 +249,6 @@
bool isUpToDate();
- void addOverlay(const asset_path& ap);
- bool getOverlay(size_t idx, asset_path* out) const;
-
protected:
~SharedZip();
@@ -271,8 +263,6 @@
Asset* mResourceTableAsset;
ResTable* mResourceTable;
- Vector<asset_path> mOverlays;
-
static Mutex gLock;
static DefaultKeyedVector<String8, wp<SharedZip> > gOpen;
};
@@ -306,9 +296,6 @@
bool isUpToDate();
- void addOverlay(const String8& path, const asset_path& overlay);
- bool getOverlay(const String8& path, size_t idx, asset_path* out) const;
-
private:
void closeZip(int idx);
diff --git a/libs/androidfw/include/androidfw/AssetManager2.h b/libs/androidfw/include/androidfw/AssetManager2.h
index 81cdc46..d2bc6ee 100644
--- a/libs/androidfw/include/androidfw/AssetManager2.h
+++ b/libs/androidfw/include/androidfw/AssetManager2.h
@@ -107,6 +107,9 @@
// Returns the DynamicRefTable for the given package ID.
const DynamicRefTable* GetDynamicRefTableForPackage(uint32_t package_id) const;
+ // Returns the DynamicRefTable for the ApkAssets represented by the cookie.
+ const DynamicRefTable* GetDynamicRefTableForCookie(ApkAssetsCookie cookie) const;
+
// Sets/resets the configuration for this AssetManager. This will cause all
// caches that are related to the configuration change to be invalidated.
void SetConfiguration(const ResTable_config& configuration);
@@ -143,6 +146,11 @@
std::unique_ptr<Asset> Open(const std::string& filename, ApkAssetsCookie cookie,
Asset::AccessMode mode);
+ // Opens the directory specified by `dirname`. The result is an AssetDir that is the combination
+ // of all directories matching `dirname` under the assets/ directory of every ApkAssets loaded.
+ // The entries are sorted by their ASCII name.
+ std::unique_ptr<AssetDir> OpenDir(const std::string& dirname);
+
// Searches the set of APKs loaded by this AssetManager and opens the first one found.
// `mode` controls how the file is opened.
// `out_cookie` is populated with the cookie of the APK this file was found in.
@@ -203,7 +211,7 @@
// it was not found.
ApkAssetsCookie ResolveReference(ApkAssetsCookie cookie, Res_value* in_out_value,
ResTable_config* in_out_selected_config, uint32_t* in_out_flags,
- ResTable_ref* out_last_reference);
+ uint32_t* out_last_reference);
// Retrieves the best matching bag/map resource with ID `resid`.
// This method will resolve all parent references for this bag and merge keys with the child.
@@ -298,6 +306,8 @@
inline const AssetManager2* GetAssetManager() const { return asset_manager_; }
+ inline AssetManager2* GetAssetManager() { return asset_manager_; }
+
// Returns a bit mask of configuration changes that will impact this
// theme (and thus require completely reloading it).
inline uint32_t GetChangingConfigurations() const { return type_spec_flags_; }
@@ -318,10 +328,10 @@
// This is like AssetManager2::ResolveReference(), but also takes
// care of resolving attribute references to the theme.
- ApkAssetsCookie ResolveAttributeReference(Res_value* in_out_value, ApkAssetsCookie src_cookie,
- uint32_t* out_last_ref = nullptr,
+ ApkAssetsCookie ResolveAttributeReference(ApkAssetsCookie cookie, Res_value* in_out_value,
+ ResTable_config* in_out_selected_config = nullptr,
uint32_t* in_out_type_spec_flags = nullptr,
- ResTable_config* out_selected_config = nullptr) const;
+ uint32_t* out_last_ref = nullptr);
private:
DISALLOW_COPY_AND_ASSIGN(Theme);
diff --git a/libs/androidfw/include/androidfw/CursorWindow.h b/libs/androidfw/include/androidfw/CursorWindow.h
index f543565..ad64b24 100644
--- a/libs/androidfw/include/androidfw/CursorWindow.h
+++ b/libs/androidfw/include/androidfw/CursorWindow.h
@@ -17,6 +17,7 @@
#ifndef _ANDROID__DATABASE_WINDOW_H
#define _ANDROID__DATABASE_WINDOW_H
+#include <inttypes.h>
#include <stddef.h>
#include <stdint.h>
@@ -128,12 +129,13 @@
inline const char* getFieldSlotValueString(FieldSlot* fieldSlot,
size_t* outSizeIncludingNull) {
*outSizeIncludingNull = fieldSlot->data.buffer.size;
- return static_cast<char*>(offsetToPtr(fieldSlot->data.buffer.offset));
+ return static_cast<char*>(offsetToPtr(
+ fieldSlot->data.buffer.offset, fieldSlot->data.buffer.size));
}
inline const void* getFieldSlotValueBlob(FieldSlot* fieldSlot, size_t* outSize) {
*outSize = fieldSlot->data.buffer.size;
- return offsetToPtr(fieldSlot->data.buffer.offset);
+ return offsetToPtr(fieldSlot->data.buffer.offset, fieldSlot->data.buffer.size);
}
private:
@@ -166,7 +168,16 @@
bool mReadOnly;
Header* mHeader;
- inline void* offsetToPtr(uint32_t offset) {
+ inline void* offsetToPtr(uint32_t offset, uint32_t bufferSize = 0) {
+ if (offset >= mSize) {
+ ALOGE("Offset %" PRIu32 " out of bounds, max value %zu", offset, mSize);
+ return NULL;
+ }
+ if (offset + bufferSize > mSize) {
+ ALOGE("End offset %" PRIu32 " out of bounds, max value %zu",
+ offset + bufferSize, mSize);
+ return NULL;
+ }
return static_cast<uint8_t*>(mData) + offset;
}
diff --git a/libs/androidfw/include/androidfw/ResourceTypes.h b/libs/androidfw/include/androidfw/ResourceTypes.h
index 04a5d95..d982a35 100644
--- a/libs/androidfw/include/androidfw/ResourceTypes.h
+++ b/libs/androidfw/include/androidfw/ResourceTypes.h
@@ -1339,12 +1339,21 @@
/**
* A collection of resource entries for a particular resource data
- * type. Followed by an array of uint32_t defining the resource
+ * type.
+ *
+ * If the flag FLAG_SPARSE is not set in `flags`, then this struct is
+ * followed by an array of uint32_t defining the resource
* values, corresponding to the array of type strings in the
* ResTable_package::typeStrings string block. Each of these hold an
* index from entriesStart; a value of NO_ENTRY means that entry is
* not defined.
*
+ * If the flag FLAG_SPARSE is set in `flags`, then this struct is followed
+ * by an array of ResTable_sparseTypeEntry defining only the entries that
+ * have values for this type. Each entry is sorted by their entry ID such
+ * that a binary search can be performed over the entries. The ID and offset
+ * are encoded in a uint32_t. See ResTabe_sparseTypeEntry.
+ *
* There may be multiple of these chunks for a particular resource type,
* supply different configuration variations for the resource values of
* that type.
@@ -1365,10 +1374,17 @@
// resource identifier). 0 is invalid.
uint8_t id;
+ enum {
+ // If set, the entry is sparse, and encodes both the entry ID and offset into each entry,
+ // and a binary search is used to find the key. Only available on platforms >= O.
+ // Mark any types that use this with a v26 qualifier to prevent runtime issues on older
+ // platforms.
+ FLAG_SPARSE = 0x01,
+ };
+ uint8_t flags;
+
// Must be 0.
- uint8_t res0;
- // Must be 0.
- uint16_t res1;
+ uint16_t reserved;
// Number of uint32_t entry indices that follow.
uint32_t entryCount;
@@ -1381,6 +1397,24 @@
};
/**
+ * An entry in a ResTable_type with the flag `FLAG_SPARSE` set.
+ */
+union ResTable_sparseTypeEntry {
+ // Holds the raw uint32_t encoded value. Do not read this.
+ uint32_t entry;
+ struct {
+ // The index of the entry.
+ uint16_t idx;
+
+ // The offset from ResTable_type::entriesStart, divided by 4.
+ uint16_t offset;
+ };
+};
+
+static_assert(sizeof(ResTable_sparseTypeEntry) == sizeof(uint32_t),
+ "ResTable_sparseTypeEntry must be 4 bytes in size");
+
+/**
* This is the beginning of information about an entry in the resource
* table. It holds the reference to the name of this entry, and is
* immediately followed by one of:
@@ -1554,7 +1588,7 @@
{
friend class AssetManager2;
public:
- DynamicRefTable() = default;
+ DynamicRefTable();
DynamicRefTable(uint8_t packageId, bool appAsLib);
// Loads an unmapped reference table from the package.
@@ -1577,10 +1611,10 @@
}
private:
- uint8_t mAssignedPackageId = 0;
+ uint8_t mAssignedPackageId;
uint8_t mLookupTable[256];
KeyedVector<String16, uint8_t> mEntries;
- bool mAppAsLib = false;
+ bool mAppAsLib;
};
bool U16StringToInt(const char16_t* s, size_t len, Res_value* outValue);
diff --git a/libs/androidfw/include/androidfw/TypeWrappers.h b/libs/androidfw/include/androidfw/TypeWrappers.h
index f1daf33..5cfe54e5 100644
--- a/libs/androidfw/include/androidfw/TypeWrappers.h
+++ b/libs/androidfw/include/androidfw/TypeWrappers.h
@@ -23,8 +23,7 @@
namespace android {
struct TypeVariant {
- TypeVariant(const ResTable_type* data)
- : data(data) {}
+ TypeVariant(const ResTable_type* data);
class iterator {
public:
@@ -72,10 +71,13 @@
}
iterator endEntries() const {
- return iterator(this, dtohl(data->entryCount));
+ return iterator(this, mLength);
}
const ResTable_type* data;
+
+private:
+ size_t mLength;
};
} // namespace android
diff --git a/libs/androidfw/include/androidfw/Util.h b/libs/androidfw/include/androidfw/Util.h
index 3950cf2..e4cd6a8 100644
--- a/libs/androidfw/include/androidfw/Util.h
+++ b/libs/androidfw/include/androidfw/Util.h
@@ -22,6 +22,8 @@
#include "android-base/macros.h"
+#include "androidfw/StringPiece.h"
+
namespace android {
namespace util {
@@ -108,6 +110,12 @@
void ReadUtf16StringFromDevice(const uint16_t* src, size_t len, std::string* out);
+// Converts a UTF-8 string to a UTF-16 string.
+std::u16string Utf8ToUtf16(const StringPiece& utf8);
+
+// Converts a UTF-16 string to a UTF-8 string.
+std::string Utf16ToUtf8(const StringPiece16& utf16);
+
} // namespace util
} // namespace android
diff --git a/libs/androidfw/tests/Android.mk b/libs/androidfw/tests/Android.mk
index 19527c5..921fd14 100644
--- a/libs/androidfw/tests/Android.mk
+++ b/libs/androidfw/tests/Android.mk
@@ -45,6 +45,8 @@
benchmarkFiles := \
AssetManager2_bench.cpp \
BenchMain.cpp \
+ BenchmarkHelpers.cpp \
+ SparseEntry_bench.cpp \
TestHelpers.cpp \
Theme_bench.cpp
diff --git a/libs/androidfw/tests/ApkAssets_test.cpp b/libs/androidfw/tests/ApkAssets_test.cpp
index 6b4a719..c85b0b9 100644
--- a/libs/androidfw/tests/ApkAssets_test.cpp
+++ b/libs/androidfw/tests/ApkAssets_test.cpp
@@ -16,6 +16,9 @@
#include "androidfw/ApkAssets.h"
+#include "android-base/file.h"
+#include "android-base/unique_fd.h"
+
#include "TestHelpers.h"
#include "data/basic/R.h"
@@ -51,4 +54,41 @@
EXPECT_TRUE(loaded_arsc->GetPackages()[0]->IsDynamic());
}
+TEST(ApkAssetsTest, CreateAndDestroyAssetKeepsApkAssetsOpen) {
+ std::unique_ptr<const ApkAssets> loaded_apk =
+ ApkAssets::Load(GetTestDataPath() + "/basic/basic.apk");
+ ASSERT_NE(nullptr, loaded_apk);
+
+ {
+ std::unique_ptr<Asset> assets = loaded_apk->Open("res/layout/main.xml", Asset::ACCESS_BUFFER);
+ ASSERT_NE(nullptr, assets);
+ }
+
+ {
+ std::unique_ptr<Asset> assets = loaded_apk->Open("res/layout/main.xml", Asset::ACCESS_BUFFER);
+ ASSERT_NE(nullptr, assets);
+ }
+}
+
+TEST(ApkAssetsTest, OpenUncompressedAssetFd) {
+ std::unique_ptr<const ApkAssets> loaded_apk =
+ ApkAssets::Load(GetTestDataPath() + "/basic/basic.apk");
+ ASSERT_NE(nullptr, loaded_apk);
+
+ auto asset = loaded_apk->Open("assets/uncompressed.txt", Asset::ACCESS_UNKNOWN);
+ ASSERT_NE(nullptr, asset);
+
+ off64_t start, length;
+ base::unique_fd fd(asset->openFileDescriptor(&start, &length));
+ EXPECT_GE(fd.get(), 0);
+
+ lseek64(fd.get(), start, SEEK_SET);
+
+ std::string buffer;
+ buffer.resize(length);
+ ASSERT_TRUE(base::ReadFully(fd.get(), &*buffer.begin(), length));
+
+ EXPECT_EQ("This should be uncompressed.\n\n", buffer);
+}
+
} // namespace android
diff --git a/libs/androidfw/tests/AssetManager2_bench.cpp b/libs/androidfw/tests/AssetManager2_bench.cpp
index 273290a..67de741 100644
--- a/libs/androidfw/tests/AssetManager2_bench.cpp
+++ b/libs/androidfw/tests/AssetManager2_bench.cpp
@@ -22,6 +22,7 @@
#include "androidfw/AssetManager2.h"
#include "androidfw/ResourceTypes.h"
+#include "BenchmarkHelpers.h"
#include "TestHelpers.h"
#include "data/basic/R.h"
#include "data/libclient/R.h"
@@ -112,34 +113,6 @@
}
}
-static void GetResourceBenchmarkOld(const std::vector<std::string>& paths,
- const ResTable_config* config, uint32_t resid,
- benchmark::State& state) {
- AssetManager assetmanager;
- for (const std::string& path : paths) {
- if (!assetmanager.addAssetPath(String8(path.c_str()), nullptr /* cookie */,
- false /* appAsLib */, false /* isSystemAssets */)) {
- state.SkipWithError(base::StringPrintf("Failed to load assets %s", path.c_str()).c_str());
- return;
- }
- }
-
- if (config != nullptr) {
- assetmanager.setConfiguration(*config);
- }
-
- const ResTable& table = assetmanager.getResources(true);
-
- Res_value value;
- ResTable_config selected_config;
- uint32_t flags;
-
- while (state.KeepRunning()) {
- table.getResource(resid, &value, false /*may_be_bag*/, 0u /*density*/, &flags,
- &selected_config);
- }
-}
-
static void BM_AssetManagerGetResource(benchmark::State& state) {
GetResourceBenchmark({GetTestDataPath() + "/basic/basic.apk"}, nullptr /*config*/,
basic::R::integer::number1, state);
diff --git a/libs/androidfw/tests/AssetManager2_test.cpp b/libs/androidfw/tests/AssetManager2_test.cpp
index 78fbb0f..d8e5abf 100644
--- a/libs/androidfw/tests/AssetManager2_test.cpp
+++ b/libs/androidfw/tests/AssetManager2_test.cpp
@@ -312,12 +312,12 @@
EXPECT_EQ(Res_value::TYPE_REFERENCE, value.dataType);
EXPECT_EQ(basic::R::integer::ref2, value.data);
- ResTable_ref last_ref;
+ uint32_t last_ref;
cookie = assetmanager.ResolveReference(cookie, &value, &selected_config, &flags, &last_ref);
ASSERT_NE(kInvalidCookie, cookie);
EXPECT_EQ(Res_value::TYPE_INT_DEC, value.dataType);
EXPECT_EQ(12000u, value.data);
- EXPECT_EQ(basic::R::integer::ref2, last_ref.ident);
+ EXPECT_EQ(basic::R::integer::ref2, last_ref);
}
TEST_F(AssetManager2Test, ResolveReferenceToBag) {
@@ -335,12 +335,12 @@
EXPECT_EQ(Res_value::TYPE_REFERENCE, value.dataType);
EXPECT_EQ(basic::R::array::integerArray1, value.data);
- ResTable_ref last_ref;
+ uint32_t last_ref;
cookie = assetmanager.ResolveReference(cookie, &value, &selected_config, &flags, &last_ref);
ASSERT_NE(kInvalidCookie, cookie);
EXPECT_EQ(Res_value::TYPE_REFERENCE, value.dataType);
EXPECT_EQ(basic::R::array::integerArray1, value.data);
- EXPECT_EQ(basic::R::array::integerArray1, last_ref.ident);
+ EXPECT_EQ(basic::R::array::integerArray1, last_ref);
}
static bool IsConfigurationPresent(const std::set<ResTable_config>& configurations,
diff --git a/libs/androidfw/tests/BenchmarkHelpers.cpp b/libs/androidfw/tests/BenchmarkHelpers.cpp
new file mode 100644
index 0000000..3619b7e
--- /dev/null
+++ b/libs/androidfw/tests/BenchmarkHelpers.cpp
@@ -0,0 +1,51 @@
+/*
+ * 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 "BenchmarkHelpers.h"
+
+#include "android-base/stringprintf.h"
+#include "androidfw/AssetManager.h"
+
+namespace android {
+
+void GetResourceBenchmarkOld(const std::vector<std::string>& paths, const ResTable_config* config,
+ uint32_t resid, benchmark::State& state) {
+ AssetManager assetmanager;
+ for (const std::string& path : paths) {
+ if (!assetmanager.addAssetPath(String8(path.c_str()), nullptr /* cookie */,
+ false /* appAsLib */, false /* isSystemAssets */)) {
+ state.SkipWithError(base::StringPrintf("Failed to load assets %s", path.c_str()).c_str());
+ return;
+ }
+ }
+
+ if (config != nullptr) {
+ assetmanager.setConfiguration(*config);
+ }
+
+ const ResTable& table = assetmanager.getResources(true);
+
+ Res_value value;
+ ResTable_config selected_config;
+ uint32_t flags;
+
+ while (state.KeepRunning()) {
+ table.getResource(resid, &value, false /*may_be_bag*/, 0u /*density*/, &flags,
+ &selected_config);
+ }
+}
+
+} // namespace android
diff --git a/libs/androidfw/tests/BenchmarkHelpers.h b/libs/androidfw/tests/BenchmarkHelpers.h
new file mode 100644
index 0000000..fc36664
--- /dev/null
+++ b/libs/androidfw/tests/BenchmarkHelpers.h
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+
+#ifndef TESTS_BENCHMARKHELPERS_H_
+#define TESTS_BENCHMARKHELPERS_H_
+
+#include <string>
+#include <vector>
+
+#include "benchmark/benchmark.h"
+
+#include "androidfw/ResourceTypes.h"
+
+namespace android {
+
+void GetResourceBenchmarkOld(const std::vector<std::string>& paths, const ResTable_config* config,
+ uint32_t resid, benchmark::State& state);
+
+} // namespace android
+
+#endif /* TESTS_BENCHMARKHELPERS_H_ */
diff --git a/libs/androidfw/tests/ResTable_test.cpp b/libs/androidfw/tests/ResTable_test.cpp
index ad1cd2b..2df4130 100644
--- a/libs/androidfw/tests/ResTable_test.cpp
+++ b/libs/androidfw/tests/ResTable_test.cpp
@@ -41,6 +41,34 @@
ASSERT_EQ(NO_ERROR, table.add(contents.data(), contents.size()));
}
+TEST(ResTableTest, ShouldLoadSparseEntriesSuccessfully) {
+ std::string contents;
+ ASSERT_TRUE(ReadFileFromZipToString(GetTestDataPath() + "/sparse/sparse.apk", "resources.arsc",
+ &contents));
+
+ ResTable table;
+ ASSERT_EQ(NO_ERROR, table.add(contents.data(), contents.size()));
+
+ ResTable_config config;
+ memset(&config, 0, sizeof(config));
+ config.sdkVersion = 26;
+ table.setParameters(&config);
+
+ String16 name(u"com.android.sparse:integer/foo_9");
+ uint32_t flags;
+ uint32_t resid =
+ table.identifierForName(name.string(), name.size(), nullptr, 0, nullptr, 0, &flags);
+ ASSERT_NE(0u, resid);
+
+ Res_value val;
+ ResTable_config selected_config;
+ ASSERT_GE(
+ table.getResource(resid, &val, false /*mayBeBag*/, 0u /*density*/, &flags, &selected_config),
+ 0);
+ EXPECT_EQ(Res_value::TYPE_INT_DEC, val.dataType);
+ EXPECT_EQ(900u, val.data);
+}
+
TEST(ResTableTest, SimpleTypeIsRetrievedCorrectly) {
std::string contents;
ASSERT_TRUE(ReadFileFromZipToString(GetTestDataPath() + "/basic/basic.apk",
diff --git a/libs/androidfw/tests/SparseEntry_bench.cpp b/libs/androidfw/tests/SparseEntry_bench.cpp
new file mode 100644
index 0000000..1ebf7ce
--- /dev/null
+++ b/libs/androidfw/tests/SparseEntry_bench.cpp
@@ -0,0 +1,64 @@
+/*
+ * 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 "androidfw/AssetManager.h"
+#include "androidfw/ResourceTypes.h"
+
+#include "BenchmarkHelpers.h"
+#include "TestHelpers.h"
+#include "data/sparse/R.h"
+
+namespace sparse = com::android::sparse;
+
+namespace android {
+
+static void BM_SparseEntryGetResourceSparseSmall(benchmark::State& state) {
+ ResTable_config config;
+ memset(&config, 0, sizeof(config));
+ config.sdkVersion = 26;
+ GetResourceBenchmarkOld({GetTestDataPath() + "/sparse/sparse.apk"}, &config,
+ sparse::R::integer::foo_9, state);
+}
+BENCHMARK(BM_SparseEntryGetResourceSparseSmall);
+
+static void BM_SparseEntryGetResourceNotSparseSmall(benchmark::State& state) {
+ ResTable_config config;
+ memset(&config, 0, sizeof(config));
+ config.sdkVersion = 26;
+ GetResourceBenchmarkOld({GetTestDataPath() + "/sparse/not_sparse.apk"}, &config,
+ sparse::R::integer::foo_9, state);
+}
+BENCHMARK(BM_SparseEntryGetResourceNotSparseSmall);
+
+static void BM_SparseEntryGetResourceSparseLarge(benchmark::State& state) {
+ ResTable_config config;
+ memset(&config, 0, sizeof(config));
+ config.sdkVersion = 26;
+ GetResourceBenchmarkOld({GetTestDataPath() + "/sparse/sparse.apk"}, &config,
+ sparse::R::string::foo_999, state);
+}
+BENCHMARK(BM_SparseEntryGetResourceSparseLarge);
+
+static void BM_SparseEntryGetResourceNotSparseLarge(benchmark::State& state) {
+ ResTable_config config;
+ memset(&config, 0, sizeof(config));
+ config.sdkVersion = 26;
+ GetResourceBenchmarkOld({GetTestDataPath() + "/sparse/not_sparse.apk"}, &config,
+ sparse::R::string::foo_999, state);
+}
+BENCHMARK(BM_SparseEntryGetResourceNotSparseLarge);
+
+} // namespace android
diff --git a/libs/androidfw/tests/TestHelpers.h b/libs/androidfw/tests/TestHelpers.h
index a11ea84..ec78b2a 100644
--- a/libs/androidfw/tests/TestHelpers.h
+++ b/libs/androidfw/tests/TestHelpers.h
@@ -19,6 +19,7 @@
#include <ostream>
#include <string>
+#include <vector>
#include "androidfw/ResourceTypes.h"
#include "gtest/gtest.h"
diff --git a/libs/androidfw/tests/data/basic/assets/uncompressed.txt b/libs/androidfw/tests/data/basic/assets/uncompressed.txt
new file mode 100644
index 0000000..c3d39c5
--- /dev/null
+++ b/libs/androidfw/tests/data/basic/assets/uncompressed.txt
@@ -0,0 +1,2 @@
+This should be uncompressed.
+
diff --git a/libs/androidfw/tests/data/basic/basic.apk b/libs/androidfw/tests/data/basic/basic.apk
index 7ee6734..0c17328 100644
--- a/libs/androidfw/tests/data/basic/basic.apk
+++ b/libs/androidfw/tests/data/basic/basic.apk
Binary files differ
diff --git a/libs/androidfw/tests/data/basic/build b/libs/androidfw/tests/data/basic/build
index af0fd87..d619800 100755
--- a/libs/androidfw/tests/data/basic/build
+++ b/libs/androidfw/tests/data/basic/build
@@ -19,4 +19,11 @@
PATH_TO_FRAMEWORK_RES=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/android.jar
-aapt package -M AndroidManifest.xml -S res -I $PATH_TO_FRAMEWORK_RES --split hdpi --split xhdpi --split xxhdpi --split fr,de -F basic.apk -f
+aapt package \
+ -M AndroidManifest.xml \
+ -S res \
+ -A assets \
+ -I $PATH_TO_FRAMEWORK_RES \
+ --split hdpi --split xhdpi --split xxhdpi --split fr,de \
+ -F basic.apk \
+ -f
diff --git a/libs/androidfw/tests/data/sparse/.gitignore b/libs/androidfw/tests/data/sparse/.gitignore
new file mode 100644
index 0000000..52e32d4
--- /dev/null
+++ b/libs/androidfw/tests/data/sparse/.gitignore
@@ -0,0 +1 @@
+*.flata
diff --git a/libs/androidfw/tests/data/sparse/AndroidManifest.xml b/libs/androidfw/tests/data/sparse/AndroidManifest.xml
new file mode 100644
index 0000000..27911b6
--- /dev/null
+++ b/libs/androidfw/tests/data/sparse/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.sparse">
+ <application />
+</manifest>
diff --git a/libs/androidfw/tests/data/sparse/R.h b/libs/androidfw/tests/data/sparse/R.h
new file mode 100644
index 0000000..243e74f
--- /dev/null
+++ b/libs/androidfw/tests/data/sparse/R.h
@@ -0,0 +1,53 @@
+/*
+ * 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.
+ */
+
+#ifndef TESTS_DATA_SPARSE_R_H_
+#define TESTS_DATA_SPARSE_R_H_
+
+#include <cstdint>
+
+namespace com {
+namespace android {
+namespace sparse {
+
+struct R {
+ struct integer {
+ enum : uint32_t {
+ foo_0 = 0x7f010000,
+ foo_1 = 0x7f010000,
+ foo_2 = 0x7f010000,
+ foo_3 = 0x7f010000,
+ foo_4 = 0x7f010000,
+ foo_5 = 0x7f010000,
+ foo_6 = 0x7f010000,
+ foo_7 = 0x7f010000,
+ foo_8 = 0x7f010000,
+ foo_9 = 0x7f010000,
+ };
+ };
+
+ struct string {
+ enum : uint32_t {
+ foo_999 = 0x7f0203e7,
+ };
+ };
+};
+
+} // namespace sparse
+} // namespace android
+} // namespace com
+
+#endif /* TESTS_DATA_SPARSE_R_H_ */
diff --git a/libs/androidfw/tests/data/sparse/build b/libs/androidfw/tests/data/sparse/build
new file mode 100755
index 0000000..305593f
--- /dev/null
+++ b/libs/androidfw/tests/data/sparse/build
@@ -0,0 +1,24 @@
+#!/bin/bash
+#
+# 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.
+#
+
+set -e
+
+PATH_TO_FRAMEWORK_RES=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/android.jar
+
+aapt2 compile --dir res -o compiled.flata
+aapt2 link --manifest AndroidManifest.xml -I $PATH_TO_FRAMEWORK_RES -o sparse.apk --enable-sparse-encoding compiled.flata
+aapt2 link --manifest AndroidManifest.xml -I $PATH_TO_FRAMEWORK_RES -o not_sparse.apk compiled.flata
diff --git a/libs/androidfw/tests/data/sparse/gen_strings.sh b/libs/androidfw/tests/data/sparse/gen_strings.sh
new file mode 100755
index 0000000..e7e1d60
--- /dev/null
+++ b/libs/androidfw/tests/data/sparse/gen_strings.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+OUTPUT_default=res/values/strings.xml
+OUTPUT_v26=res/values-v26/strings.xml
+
+echo "<resources>" > $OUTPUT_default
+echo "<resources>" > $OUTPUT_v26
+for i in {0..999}
+do
+ echo " <string name=\"foo_$i\">$i</string>" >> $OUTPUT_default
+ if [ "$(($i % 3))" -eq "0" ]
+ then
+ echo " <string name=\"foo_$i\">$(($i * 10))</string>" >> $OUTPUT_v26
+ fi
+done
+echo "</resources>" >> $OUTPUT_default
+echo "</resources>" >> $OUTPUT_v26
+
diff --git a/libs/androidfw/tests/data/sparse/not_sparse.apk b/libs/androidfw/tests/data/sparse/not_sparse.apk
new file mode 100644
index 0000000..599a370
--- /dev/null
+++ b/libs/androidfw/tests/data/sparse/not_sparse.apk
Binary files differ
diff --git a/libs/androidfw/tests/data/sparse/res/values-v26/strings.xml b/libs/androidfw/tests/data/sparse/res/values-v26/strings.xml
new file mode 100644
index 0000000..b6f8299
--- /dev/null
+++ b/libs/androidfw/tests/data/sparse/res/values-v26/strings.xml
@@ -0,0 +1,336 @@
+<resources>
+ <string name="foo_0">0</string>
+ <string name="foo_3">30</string>
+ <string name="foo_6">60</string>
+ <string name="foo_9">90</string>
+ <string name="foo_12">120</string>
+ <string name="foo_15">150</string>
+ <string name="foo_18">180</string>
+ <string name="foo_21">210</string>
+ <string name="foo_24">240</string>
+ <string name="foo_27">270</string>
+ <string name="foo_30">300</string>
+ <string name="foo_33">330</string>
+ <string name="foo_36">360</string>
+ <string name="foo_39">390</string>
+ <string name="foo_42">420</string>
+ <string name="foo_45">450</string>
+ <string name="foo_48">480</string>
+ <string name="foo_51">510</string>
+ <string name="foo_54">540</string>
+ <string name="foo_57">570</string>
+ <string name="foo_60">600</string>
+ <string name="foo_63">630</string>
+ <string name="foo_66">660</string>
+ <string name="foo_69">690</string>
+ <string name="foo_72">720</string>
+ <string name="foo_75">750</string>
+ <string name="foo_78">780</string>
+ <string name="foo_81">810</string>
+ <string name="foo_84">840</string>
+ <string name="foo_87">870</string>
+ <string name="foo_90">900</string>
+ <string name="foo_93">930</string>
+ <string name="foo_96">960</string>
+ <string name="foo_99">990</string>
+ <string name="foo_102">1020</string>
+ <string name="foo_105">1050</string>
+ <string name="foo_108">1080</string>
+ <string name="foo_111">1110</string>
+ <string name="foo_114">1140</string>
+ <string name="foo_117">1170</string>
+ <string name="foo_120">1200</string>
+ <string name="foo_123">1230</string>
+ <string name="foo_126">1260</string>
+ <string name="foo_129">1290</string>
+ <string name="foo_132">1320</string>
+ <string name="foo_135">1350</string>
+ <string name="foo_138">1380</string>
+ <string name="foo_141">1410</string>
+ <string name="foo_144">1440</string>
+ <string name="foo_147">1470</string>
+ <string name="foo_150">1500</string>
+ <string name="foo_153">1530</string>
+ <string name="foo_156">1560</string>
+ <string name="foo_159">1590</string>
+ <string name="foo_162">1620</string>
+ <string name="foo_165">1650</string>
+ <string name="foo_168">1680</string>
+ <string name="foo_171">1710</string>
+ <string name="foo_174">1740</string>
+ <string name="foo_177">1770</string>
+ <string name="foo_180">1800</string>
+ <string name="foo_183">1830</string>
+ <string name="foo_186">1860</string>
+ <string name="foo_189">1890</string>
+ <string name="foo_192">1920</string>
+ <string name="foo_195">1950</string>
+ <string name="foo_198">1980</string>
+ <string name="foo_201">2010</string>
+ <string name="foo_204">2040</string>
+ <string name="foo_207">2070</string>
+ <string name="foo_210">2100</string>
+ <string name="foo_213">2130</string>
+ <string name="foo_216">2160</string>
+ <string name="foo_219">2190</string>
+ <string name="foo_222">2220</string>
+ <string name="foo_225">2250</string>
+ <string name="foo_228">2280</string>
+ <string name="foo_231">2310</string>
+ <string name="foo_234">2340</string>
+ <string name="foo_237">2370</string>
+ <string name="foo_240">2400</string>
+ <string name="foo_243">2430</string>
+ <string name="foo_246">2460</string>
+ <string name="foo_249">2490</string>
+ <string name="foo_252">2520</string>
+ <string name="foo_255">2550</string>
+ <string name="foo_258">2580</string>
+ <string name="foo_261">2610</string>
+ <string name="foo_264">2640</string>
+ <string name="foo_267">2670</string>
+ <string name="foo_270">2700</string>
+ <string name="foo_273">2730</string>
+ <string name="foo_276">2760</string>
+ <string name="foo_279">2790</string>
+ <string name="foo_282">2820</string>
+ <string name="foo_285">2850</string>
+ <string name="foo_288">2880</string>
+ <string name="foo_291">2910</string>
+ <string name="foo_294">2940</string>
+ <string name="foo_297">2970</string>
+ <string name="foo_300">3000</string>
+ <string name="foo_303">3030</string>
+ <string name="foo_306">3060</string>
+ <string name="foo_309">3090</string>
+ <string name="foo_312">3120</string>
+ <string name="foo_315">3150</string>
+ <string name="foo_318">3180</string>
+ <string name="foo_321">3210</string>
+ <string name="foo_324">3240</string>
+ <string name="foo_327">3270</string>
+ <string name="foo_330">3300</string>
+ <string name="foo_333">3330</string>
+ <string name="foo_336">3360</string>
+ <string name="foo_339">3390</string>
+ <string name="foo_342">3420</string>
+ <string name="foo_345">3450</string>
+ <string name="foo_348">3480</string>
+ <string name="foo_351">3510</string>
+ <string name="foo_354">3540</string>
+ <string name="foo_357">3570</string>
+ <string name="foo_360">3600</string>
+ <string name="foo_363">3630</string>
+ <string name="foo_366">3660</string>
+ <string name="foo_369">3690</string>
+ <string name="foo_372">3720</string>
+ <string name="foo_375">3750</string>
+ <string name="foo_378">3780</string>
+ <string name="foo_381">3810</string>
+ <string name="foo_384">3840</string>
+ <string name="foo_387">3870</string>
+ <string name="foo_390">3900</string>
+ <string name="foo_393">3930</string>
+ <string name="foo_396">3960</string>
+ <string name="foo_399">3990</string>
+ <string name="foo_402">4020</string>
+ <string name="foo_405">4050</string>
+ <string name="foo_408">4080</string>
+ <string name="foo_411">4110</string>
+ <string name="foo_414">4140</string>
+ <string name="foo_417">4170</string>
+ <string name="foo_420">4200</string>
+ <string name="foo_423">4230</string>
+ <string name="foo_426">4260</string>
+ <string name="foo_429">4290</string>
+ <string name="foo_432">4320</string>
+ <string name="foo_435">4350</string>
+ <string name="foo_438">4380</string>
+ <string name="foo_441">4410</string>
+ <string name="foo_444">4440</string>
+ <string name="foo_447">4470</string>
+ <string name="foo_450">4500</string>
+ <string name="foo_453">4530</string>
+ <string name="foo_456">4560</string>
+ <string name="foo_459">4590</string>
+ <string name="foo_462">4620</string>
+ <string name="foo_465">4650</string>
+ <string name="foo_468">4680</string>
+ <string name="foo_471">4710</string>
+ <string name="foo_474">4740</string>
+ <string name="foo_477">4770</string>
+ <string name="foo_480">4800</string>
+ <string name="foo_483">4830</string>
+ <string name="foo_486">4860</string>
+ <string name="foo_489">4890</string>
+ <string name="foo_492">4920</string>
+ <string name="foo_495">4950</string>
+ <string name="foo_498">4980</string>
+ <string name="foo_501">5010</string>
+ <string name="foo_504">5040</string>
+ <string name="foo_507">5070</string>
+ <string name="foo_510">5100</string>
+ <string name="foo_513">5130</string>
+ <string name="foo_516">5160</string>
+ <string name="foo_519">5190</string>
+ <string name="foo_522">5220</string>
+ <string name="foo_525">5250</string>
+ <string name="foo_528">5280</string>
+ <string name="foo_531">5310</string>
+ <string name="foo_534">5340</string>
+ <string name="foo_537">5370</string>
+ <string name="foo_540">5400</string>
+ <string name="foo_543">5430</string>
+ <string name="foo_546">5460</string>
+ <string name="foo_549">5490</string>
+ <string name="foo_552">5520</string>
+ <string name="foo_555">5550</string>
+ <string name="foo_558">5580</string>
+ <string name="foo_561">5610</string>
+ <string name="foo_564">5640</string>
+ <string name="foo_567">5670</string>
+ <string name="foo_570">5700</string>
+ <string name="foo_573">5730</string>
+ <string name="foo_576">5760</string>
+ <string name="foo_579">5790</string>
+ <string name="foo_582">5820</string>
+ <string name="foo_585">5850</string>
+ <string name="foo_588">5880</string>
+ <string name="foo_591">5910</string>
+ <string name="foo_594">5940</string>
+ <string name="foo_597">5970</string>
+ <string name="foo_600">6000</string>
+ <string name="foo_603">6030</string>
+ <string name="foo_606">6060</string>
+ <string name="foo_609">6090</string>
+ <string name="foo_612">6120</string>
+ <string name="foo_615">6150</string>
+ <string name="foo_618">6180</string>
+ <string name="foo_621">6210</string>
+ <string name="foo_624">6240</string>
+ <string name="foo_627">6270</string>
+ <string name="foo_630">6300</string>
+ <string name="foo_633">6330</string>
+ <string name="foo_636">6360</string>
+ <string name="foo_639">6390</string>
+ <string name="foo_642">6420</string>
+ <string name="foo_645">6450</string>
+ <string name="foo_648">6480</string>
+ <string name="foo_651">6510</string>
+ <string name="foo_654">6540</string>
+ <string name="foo_657">6570</string>
+ <string name="foo_660">6600</string>
+ <string name="foo_663">6630</string>
+ <string name="foo_666">6660</string>
+ <string name="foo_669">6690</string>
+ <string name="foo_672">6720</string>
+ <string name="foo_675">6750</string>
+ <string name="foo_678">6780</string>
+ <string name="foo_681">6810</string>
+ <string name="foo_684">6840</string>
+ <string name="foo_687">6870</string>
+ <string name="foo_690">6900</string>
+ <string name="foo_693">6930</string>
+ <string name="foo_696">6960</string>
+ <string name="foo_699">6990</string>
+ <string name="foo_702">7020</string>
+ <string name="foo_705">7050</string>
+ <string name="foo_708">7080</string>
+ <string name="foo_711">7110</string>
+ <string name="foo_714">7140</string>
+ <string name="foo_717">7170</string>
+ <string name="foo_720">7200</string>
+ <string name="foo_723">7230</string>
+ <string name="foo_726">7260</string>
+ <string name="foo_729">7290</string>
+ <string name="foo_732">7320</string>
+ <string name="foo_735">7350</string>
+ <string name="foo_738">7380</string>
+ <string name="foo_741">7410</string>
+ <string name="foo_744">7440</string>
+ <string name="foo_747">7470</string>
+ <string name="foo_750">7500</string>
+ <string name="foo_753">7530</string>
+ <string name="foo_756">7560</string>
+ <string name="foo_759">7590</string>
+ <string name="foo_762">7620</string>
+ <string name="foo_765">7650</string>
+ <string name="foo_768">7680</string>
+ <string name="foo_771">7710</string>
+ <string name="foo_774">7740</string>
+ <string name="foo_777">7770</string>
+ <string name="foo_780">7800</string>
+ <string name="foo_783">7830</string>
+ <string name="foo_786">7860</string>
+ <string name="foo_789">7890</string>
+ <string name="foo_792">7920</string>
+ <string name="foo_795">7950</string>
+ <string name="foo_798">7980</string>
+ <string name="foo_801">8010</string>
+ <string name="foo_804">8040</string>
+ <string name="foo_807">8070</string>
+ <string name="foo_810">8100</string>
+ <string name="foo_813">8130</string>
+ <string name="foo_816">8160</string>
+ <string name="foo_819">8190</string>
+ <string name="foo_822">8220</string>
+ <string name="foo_825">8250</string>
+ <string name="foo_828">8280</string>
+ <string name="foo_831">8310</string>
+ <string name="foo_834">8340</string>
+ <string name="foo_837">8370</string>
+ <string name="foo_840">8400</string>
+ <string name="foo_843">8430</string>
+ <string name="foo_846">8460</string>
+ <string name="foo_849">8490</string>
+ <string name="foo_852">8520</string>
+ <string name="foo_855">8550</string>
+ <string name="foo_858">8580</string>
+ <string name="foo_861">8610</string>
+ <string name="foo_864">8640</string>
+ <string name="foo_867">8670</string>
+ <string name="foo_870">8700</string>
+ <string name="foo_873">8730</string>
+ <string name="foo_876">8760</string>
+ <string name="foo_879">8790</string>
+ <string name="foo_882">8820</string>
+ <string name="foo_885">8850</string>
+ <string name="foo_888">8880</string>
+ <string name="foo_891">8910</string>
+ <string name="foo_894">8940</string>
+ <string name="foo_897">8970</string>
+ <string name="foo_900">9000</string>
+ <string name="foo_903">9030</string>
+ <string name="foo_906">9060</string>
+ <string name="foo_909">9090</string>
+ <string name="foo_912">9120</string>
+ <string name="foo_915">9150</string>
+ <string name="foo_918">9180</string>
+ <string name="foo_921">9210</string>
+ <string name="foo_924">9240</string>
+ <string name="foo_927">9270</string>
+ <string name="foo_930">9300</string>
+ <string name="foo_933">9330</string>
+ <string name="foo_936">9360</string>
+ <string name="foo_939">9390</string>
+ <string name="foo_942">9420</string>
+ <string name="foo_945">9450</string>
+ <string name="foo_948">9480</string>
+ <string name="foo_951">9510</string>
+ <string name="foo_954">9540</string>
+ <string name="foo_957">9570</string>
+ <string name="foo_960">9600</string>
+ <string name="foo_963">9630</string>
+ <string name="foo_966">9660</string>
+ <string name="foo_969">9690</string>
+ <string name="foo_972">9720</string>
+ <string name="foo_975">9750</string>
+ <string name="foo_978">9780</string>
+ <string name="foo_981">9810</string>
+ <string name="foo_984">9840</string>
+ <string name="foo_987">9870</string>
+ <string name="foo_990">9900</string>
+ <string name="foo_993">9930</string>
+ <string name="foo_996">9960</string>
+ <string name="foo_999">9990</string>
+</resources>
diff --git a/libs/androidfw/tests/data/sparse/res/values-v26/values.xml b/libs/androidfw/tests/data/sparse/res/values-v26/values.xml
new file mode 100644
index 0000000..b396ad2
--- /dev/null
+++ b/libs/androidfw/tests/data/sparse/res/values-v26/values.xml
@@ -0,0 +1,22 @@
+<?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>
+ <integer name="foo_0">0</integer>
+ <integer name="foo_4">400</integer>
+ <integer name="foo_5">500</integer>
+ <integer name="foo_9">900</integer>
+</resources>
diff --git a/libs/androidfw/tests/data/sparse/res/values/strings.xml b/libs/androidfw/tests/data/sparse/res/values/strings.xml
new file mode 100644
index 0000000..6ff839a
--- /dev/null
+++ b/libs/androidfw/tests/data/sparse/res/values/strings.xml
@@ -0,0 +1,1002 @@
+<resources>
+ <string name="foo_0">0</string>
+ <string name="foo_1">1</string>
+ <string name="foo_2">2</string>
+ <string name="foo_3">3</string>
+ <string name="foo_4">4</string>
+ <string name="foo_5">5</string>
+ <string name="foo_6">6</string>
+ <string name="foo_7">7</string>
+ <string name="foo_8">8</string>
+ <string name="foo_9">9</string>
+ <string name="foo_10">10</string>
+ <string name="foo_11">11</string>
+ <string name="foo_12">12</string>
+ <string name="foo_13">13</string>
+ <string name="foo_14">14</string>
+ <string name="foo_15">15</string>
+ <string name="foo_16">16</string>
+ <string name="foo_17">17</string>
+ <string name="foo_18">18</string>
+ <string name="foo_19">19</string>
+ <string name="foo_20">20</string>
+ <string name="foo_21">21</string>
+ <string name="foo_22">22</string>
+ <string name="foo_23">23</string>
+ <string name="foo_24">24</string>
+ <string name="foo_25">25</string>
+ <string name="foo_26">26</string>
+ <string name="foo_27">27</string>
+ <string name="foo_28">28</string>
+ <string name="foo_29">29</string>
+ <string name="foo_30">30</string>
+ <string name="foo_31">31</string>
+ <string name="foo_32">32</string>
+ <string name="foo_33">33</string>
+ <string name="foo_34">34</string>
+ <string name="foo_35">35</string>
+ <string name="foo_36">36</string>
+ <string name="foo_37">37</string>
+ <string name="foo_38">38</string>
+ <string name="foo_39">39</string>
+ <string name="foo_40">40</string>
+ <string name="foo_41">41</string>
+ <string name="foo_42">42</string>
+ <string name="foo_43">43</string>
+ <string name="foo_44">44</string>
+ <string name="foo_45">45</string>
+ <string name="foo_46">46</string>
+ <string name="foo_47">47</string>
+ <string name="foo_48">48</string>
+ <string name="foo_49">49</string>
+ <string name="foo_50">50</string>
+ <string name="foo_51">51</string>
+ <string name="foo_52">52</string>
+ <string name="foo_53">53</string>
+ <string name="foo_54">54</string>
+ <string name="foo_55">55</string>
+ <string name="foo_56">56</string>
+ <string name="foo_57">57</string>
+ <string name="foo_58">58</string>
+ <string name="foo_59">59</string>
+ <string name="foo_60">60</string>
+ <string name="foo_61">61</string>
+ <string name="foo_62">62</string>
+ <string name="foo_63">63</string>
+ <string name="foo_64">64</string>
+ <string name="foo_65">65</string>
+ <string name="foo_66">66</string>
+ <string name="foo_67">67</string>
+ <string name="foo_68">68</string>
+ <string name="foo_69">69</string>
+ <string name="foo_70">70</string>
+ <string name="foo_71">71</string>
+ <string name="foo_72">72</string>
+ <string name="foo_73">73</string>
+ <string name="foo_74">74</string>
+ <string name="foo_75">75</string>
+ <string name="foo_76">76</string>
+ <string name="foo_77">77</string>
+ <string name="foo_78">78</string>
+ <string name="foo_79">79</string>
+ <string name="foo_80">80</string>
+ <string name="foo_81">81</string>
+ <string name="foo_82">82</string>
+ <string name="foo_83">83</string>
+ <string name="foo_84">84</string>
+ <string name="foo_85">85</string>
+ <string name="foo_86">86</string>
+ <string name="foo_87">87</string>
+ <string name="foo_88">88</string>
+ <string name="foo_89">89</string>
+ <string name="foo_90">90</string>
+ <string name="foo_91">91</string>
+ <string name="foo_92">92</string>
+ <string name="foo_93">93</string>
+ <string name="foo_94">94</string>
+ <string name="foo_95">95</string>
+ <string name="foo_96">96</string>
+ <string name="foo_97">97</string>
+ <string name="foo_98">98</string>
+ <string name="foo_99">99</string>
+ <string name="foo_100">100</string>
+ <string name="foo_101">101</string>
+ <string name="foo_102">102</string>
+ <string name="foo_103">103</string>
+ <string name="foo_104">104</string>
+ <string name="foo_105">105</string>
+ <string name="foo_106">106</string>
+ <string name="foo_107">107</string>
+ <string name="foo_108">108</string>
+ <string name="foo_109">109</string>
+ <string name="foo_110">110</string>
+ <string name="foo_111">111</string>
+ <string name="foo_112">112</string>
+ <string name="foo_113">113</string>
+ <string name="foo_114">114</string>
+ <string name="foo_115">115</string>
+ <string name="foo_116">116</string>
+ <string name="foo_117">117</string>
+ <string name="foo_118">118</string>
+ <string name="foo_119">119</string>
+ <string name="foo_120">120</string>
+ <string name="foo_121">121</string>
+ <string name="foo_122">122</string>
+ <string name="foo_123">123</string>
+ <string name="foo_124">124</string>
+ <string name="foo_125">125</string>
+ <string name="foo_126">126</string>
+ <string name="foo_127">127</string>
+ <string name="foo_128">128</string>
+ <string name="foo_129">129</string>
+ <string name="foo_130">130</string>
+ <string name="foo_131">131</string>
+ <string name="foo_132">132</string>
+ <string name="foo_133">133</string>
+ <string name="foo_134">134</string>
+ <string name="foo_135">135</string>
+ <string name="foo_136">136</string>
+ <string name="foo_137">137</string>
+ <string name="foo_138">138</string>
+ <string name="foo_139">139</string>
+ <string name="foo_140">140</string>
+ <string name="foo_141">141</string>
+ <string name="foo_142">142</string>
+ <string name="foo_143">143</string>
+ <string name="foo_144">144</string>
+ <string name="foo_145">145</string>
+ <string name="foo_146">146</string>
+ <string name="foo_147">147</string>
+ <string name="foo_148">148</string>
+ <string name="foo_149">149</string>
+ <string name="foo_150">150</string>
+ <string name="foo_151">151</string>
+ <string name="foo_152">152</string>
+ <string name="foo_153">153</string>
+ <string name="foo_154">154</string>
+ <string name="foo_155">155</string>
+ <string name="foo_156">156</string>
+ <string name="foo_157">157</string>
+ <string name="foo_158">158</string>
+ <string name="foo_159">159</string>
+ <string name="foo_160">160</string>
+ <string name="foo_161">161</string>
+ <string name="foo_162">162</string>
+ <string name="foo_163">163</string>
+ <string name="foo_164">164</string>
+ <string name="foo_165">165</string>
+ <string name="foo_166">166</string>
+ <string name="foo_167">167</string>
+ <string name="foo_168">168</string>
+ <string name="foo_169">169</string>
+ <string name="foo_170">170</string>
+ <string name="foo_171">171</string>
+ <string name="foo_172">172</string>
+ <string name="foo_173">173</string>
+ <string name="foo_174">174</string>
+ <string name="foo_175">175</string>
+ <string name="foo_176">176</string>
+ <string name="foo_177">177</string>
+ <string name="foo_178">178</string>
+ <string name="foo_179">179</string>
+ <string name="foo_180">180</string>
+ <string name="foo_181">181</string>
+ <string name="foo_182">182</string>
+ <string name="foo_183">183</string>
+ <string name="foo_184">184</string>
+ <string name="foo_185">185</string>
+ <string name="foo_186">186</string>
+ <string name="foo_187">187</string>
+ <string name="foo_188">188</string>
+ <string name="foo_189">189</string>
+ <string name="foo_190">190</string>
+ <string name="foo_191">191</string>
+ <string name="foo_192">192</string>
+ <string name="foo_193">193</string>
+ <string name="foo_194">194</string>
+ <string name="foo_195">195</string>
+ <string name="foo_196">196</string>
+ <string name="foo_197">197</string>
+ <string name="foo_198">198</string>
+ <string name="foo_199">199</string>
+ <string name="foo_200">200</string>
+ <string name="foo_201">201</string>
+ <string name="foo_202">202</string>
+ <string name="foo_203">203</string>
+ <string name="foo_204">204</string>
+ <string name="foo_205">205</string>
+ <string name="foo_206">206</string>
+ <string name="foo_207">207</string>
+ <string name="foo_208">208</string>
+ <string name="foo_209">209</string>
+ <string name="foo_210">210</string>
+ <string name="foo_211">211</string>
+ <string name="foo_212">212</string>
+ <string name="foo_213">213</string>
+ <string name="foo_214">214</string>
+ <string name="foo_215">215</string>
+ <string name="foo_216">216</string>
+ <string name="foo_217">217</string>
+ <string name="foo_218">218</string>
+ <string name="foo_219">219</string>
+ <string name="foo_220">220</string>
+ <string name="foo_221">221</string>
+ <string name="foo_222">222</string>
+ <string name="foo_223">223</string>
+ <string name="foo_224">224</string>
+ <string name="foo_225">225</string>
+ <string name="foo_226">226</string>
+ <string name="foo_227">227</string>
+ <string name="foo_228">228</string>
+ <string name="foo_229">229</string>
+ <string name="foo_230">230</string>
+ <string name="foo_231">231</string>
+ <string name="foo_232">232</string>
+ <string name="foo_233">233</string>
+ <string name="foo_234">234</string>
+ <string name="foo_235">235</string>
+ <string name="foo_236">236</string>
+ <string name="foo_237">237</string>
+ <string name="foo_238">238</string>
+ <string name="foo_239">239</string>
+ <string name="foo_240">240</string>
+ <string name="foo_241">241</string>
+ <string name="foo_242">242</string>
+ <string name="foo_243">243</string>
+ <string name="foo_244">244</string>
+ <string name="foo_245">245</string>
+ <string name="foo_246">246</string>
+ <string name="foo_247">247</string>
+ <string name="foo_248">248</string>
+ <string name="foo_249">249</string>
+ <string name="foo_250">250</string>
+ <string name="foo_251">251</string>
+ <string name="foo_252">252</string>
+ <string name="foo_253">253</string>
+ <string name="foo_254">254</string>
+ <string name="foo_255">255</string>
+ <string name="foo_256">256</string>
+ <string name="foo_257">257</string>
+ <string name="foo_258">258</string>
+ <string name="foo_259">259</string>
+ <string name="foo_260">260</string>
+ <string name="foo_261">261</string>
+ <string name="foo_262">262</string>
+ <string name="foo_263">263</string>
+ <string name="foo_264">264</string>
+ <string name="foo_265">265</string>
+ <string name="foo_266">266</string>
+ <string name="foo_267">267</string>
+ <string name="foo_268">268</string>
+ <string name="foo_269">269</string>
+ <string name="foo_270">270</string>
+ <string name="foo_271">271</string>
+ <string name="foo_272">272</string>
+ <string name="foo_273">273</string>
+ <string name="foo_274">274</string>
+ <string name="foo_275">275</string>
+ <string name="foo_276">276</string>
+ <string name="foo_277">277</string>
+ <string name="foo_278">278</string>
+ <string name="foo_279">279</string>
+ <string name="foo_280">280</string>
+ <string name="foo_281">281</string>
+ <string name="foo_282">282</string>
+ <string name="foo_283">283</string>
+ <string name="foo_284">284</string>
+ <string name="foo_285">285</string>
+ <string name="foo_286">286</string>
+ <string name="foo_287">287</string>
+ <string name="foo_288">288</string>
+ <string name="foo_289">289</string>
+ <string name="foo_290">290</string>
+ <string name="foo_291">291</string>
+ <string name="foo_292">292</string>
+ <string name="foo_293">293</string>
+ <string name="foo_294">294</string>
+ <string name="foo_295">295</string>
+ <string name="foo_296">296</string>
+ <string name="foo_297">297</string>
+ <string name="foo_298">298</string>
+ <string name="foo_299">299</string>
+ <string name="foo_300">300</string>
+ <string name="foo_301">301</string>
+ <string name="foo_302">302</string>
+ <string name="foo_303">303</string>
+ <string name="foo_304">304</string>
+ <string name="foo_305">305</string>
+ <string name="foo_306">306</string>
+ <string name="foo_307">307</string>
+ <string name="foo_308">308</string>
+ <string name="foo_309">309</string>
+ <string name="foo_310">310</string>
+ <string name="foo_311">311</string>
+ <string name="foo_312">312</string>
+ <string name="foo_313">313</string>
+ <string name="foo_314">314</string>
+ <string name="foo_315">315</string>
+ <string name="foo_316">316</string>
+ <string name="foo_317">317</string>
+ <string name="foo_318">318</string>
+ <string name="foo_319">319</string>
+ <string name="foo_320">320</string>
+ <string name="foo_321">321</string>
+ <string name="foo_322">322</string>
+ <string name="foo_323">323</string>
+ <string name="foo_324">324</string>
+ <string name="foo_325">325</string>
+ <string name="foo_326">326</string>
+ <string name="foo_327">327</string>
+ <string name="foo_328">328</string>
+ <string name="foo_329">329</string>
+ <string name="foo_330">330</string>
+ <string name="foo_331">331</string>
+ <string name="foo_332">332</string>
+ <string name="foo_333">333</string>
+ <string name="foo_334">334</string>
+ <string name="foo_335">335</string>
+ <string name="foo_336">336</string>
+ <string name="foo_337">337</string>
+ <string name="foo_338">338</string>
+ <string name="foo_339">339</string>
+ <string name="foo_340">340</string>
+ <string name="foo_341">341</string>
+ <string name="foo_342">342</string>
+ <string name="foo_343">343</string>
+ <string name="foo_344">344</string>
+ <string name="foo_345">345</string>
+ <string name="foo_346">346</string>
+ <string name="foo_347">347</string>
+ <string name="foo_348">348</string>
+ <string name="foo_349">349</string>
+ <string name="foo_350">350</string>
+ <string name="foo_351">351</string>
+ <string name="foo_352">352</string>
+ <string name="foo_353">353</string>
+ <string name="foo_354">354</string>
+ <string name="foo_355">355</string>
+ <string name="foo_356">356</string>
+ <string name="foo_357">357</string>
+ <string name="foo_358">358</string>
+ <string name="foo_359">359</string>
+ <string name="foo_360">360</string>
+ <string name="foo_361">361</string>
+ <string name="foo_362">362</string>
+ <string name="foo_363">363</string>
+ <string name="foo_364">364</string>
+ <string name="foo_365">365</string>
+ <string name="foo_366">366</string>
+ <string name="foo_367">367</string>
+ <string name="foo_368">368</string>
+ <string name="foo_369">369</string>
+ <string name="foo_370">370</string>
+ <string name="foo_371">371</string>
+ <string name="foo_372">372</string>
+ <string name="foo_373">373</string>
+ <string name="foo_374">374</string>
+ <string name="foo_375">375</string>
+ <string name="foo_376">376</string>
+ <string name="foo_377">377</string>
+ <string name="foo_378">378</string>
+ <string name="foo_379">379</string>
+ <string name="foo_380">380</string>
+ <string name="foo_381">381</string>
+ <string name="foo_382">382</string>
+ <string name="foo_383">383</string>
+ <string name="foo_384">384</string>
+ <string name="foo_385">385</string>
+ <string name="foo_386">386</string>
+ <string name="foo_387">387</string>
+ <string name="foo_388">388</string>
+ <string name="foo_389">389</string>
+ <string name="foo_390">390</string>
+ <string name="foo_391">391</string>
+ <string name="foo_392">392</string>
+ <string name="foo_393">393</string>
+ <string name="foo_394">394</string>
+ <string name="foo_395">395</string>
+ <string name="foo_396">396</string>
+ <string name="foo_397">397</string>
+ <string name="foo_398">398</string>
+ <string name="foo_399">399</string>
+ <string name="foo_400">400</string>
+ <string name="foo_401">401</string>
+ <string name="foo_402">402</string>
+ <string name="foo_403">403</string>
+ <string name="foo_404">404</string>
+ <string name="foo_405">405</string>
+ <string name="foo_406">406</string>
+ <string name="foo_407">407</string>
+ <string name="foo_408">408</string>
+ <string name="foo_409">409</string>
+ <string name="foo_410">410</string>
+ <string name="foo_411">411</string>
+ <string name="foo_412">412</string>
+ <string name="foo_413">413</string>
+ <string name="foo_414">414</string>
+ <string name="foo_415">415</string>
+ <string name="foo_416">416</string>
+ <string name="foo_417">417</string>
+ <string name="foo_418">418</string>
+ <string name="foo_419">419</string>
+ <string name="foo_420">420</string>
+ <string name="foo_421">421</string>
+ <string name="foo_422">422</string>
+ <string name="foo_423">423</string>
+ <string name="foo_424">424</string>
+ <string name="foo_425">425</string>
+ <string name="foo_426">426</string>
+ <string name="foo_427">427</string>
+ <string name="foo_428">428</string>
+ <string name="foo_429">429</string>
+ <string name="foo_430">430</string>
+ <string name="foo_431">431</string>
+ <string name="foo_432">432</string>
+ <string name="foo_433">433</string>
+ <string name="foo_434">434</string>
+ <string name="foo_435">435</string>
+ <string name="foo_436">436</string>
+ <string name="foo_437">437</string>
+ <string name="foo_438">438</string>
+ <string name="foo_439">439</string>
+ <string name="foo_440">440</string>
+ <string name="foo_441">441</string>
+ <string name="foo_442">442</string>
+ <string name="foo_443">443</string>
+ <string name="foo_444">444</string>
+ <string name="foo_445">445</string>
+ <string name="foo_446">446</string>
+ <string name="foo_447">447</string>
+ <string name="foo_448">448</string>
+ <string name="foo_449">449</string>
+ <string name="foo_450">450</string>
+ <string name="foo_451">451</string>
+ <string name="foo_452">452</string>
+ <string name="foo_453">453</string>
+ <string name="foo_454">454</string>
+ <string name="foo_455">455</string>
+ <string name="foo_456">456</string>
+ <string name="foo_457">457</string>
+ <string name="foo_458">458</string>
+ <string name="foo_459">459</string>
+ <string name="foo_460">460</string>
+ <string name="foo_461">461</string>
+ <string name="foo_462">462</string>
+ <string name="foo_463">463</string>
+ <string name="foo_464">464</string>
+ <string name="foo_465">465</string>
+ <string name="foo_466">466</string>
+ <string name="foo_467">467</string>
+ <string name="foo_468">468</string>
+ <string name="foo_469">469</string>
+ <string name="foo_470">470</string>
+ <string name="foo_471">471</string>
+ <string name="foo_472">472</string>
+ <string name="foo_473">473</string>
+ <string name="foo_474">474</string>
+ <string name="foo_475">475</string>
+ <string name="foo_476">476</string>
+ <string name="foo_477">477</string>
+ <string name="foo_478">478</string>
+ <string name="foo_479">479</string>
+ <string name="foo_480">480</string>
+ <string name="foo_481">481</string>
+ <string name="foo_482">482</string>
+ <string name="foo_483">483</string>
+ <string name="foo_484">484</string>
+ <string name="foo_485">485</string>
+ <string name="foo_486">486</string>
+ <string name="foo_487">487</string>
+ <string name="foo_488">488</string>
+ <string name="foo_489">489</string>
+ <string name="foo_490">490</string>
+ <string name="foo_491">491</string>
+ <string name="foo_492">492</string>
+ <string name="foo_493">493</string>
+ <string name="foo_494">494</string>
+ <string name="foo_495">495</string>
+ <string name="foo_496">496</string>
+ <string name="foo_497">497</string>
+ <string name="foo_498">498</string>
+ <string name="foo_499">499</string>
+ <string name="foo_500">500</string>
+ <string name="foo_501">501</string>
+ <string name="foo_502">502</string>
+ <string name="foo_503">503</string>
+ <string name="foo_504">504</string>
+ <string name="foo_505">505</string>
+ <string name="foo_506">506</string>
+ <string name="foo_507">507</string>
+ <string name="foo_508">508</string>
+ <string name="foo_509">509</string>
+ <string name="foo_510">510</string>
+ <string name="foo_511">511</string>
+ <string name="foo_512">512</string>
+ <string name="foo_513">513</string>
+ <string name="foo_514">514</string>
+ <string name="foo_515">515</string>
+ <string name="foo_516">516</string>
+ <string name="foo_517">517</string>
+ <string name="foo_518">518</string>
+ <string name="foo_519">519</string>
+ <string name="foo_520">520</string>
+ <string name="foo_521">521</string>
+ <string name="foo_522">522</string>
+ <string name="foo_523">523</string>
+ <string name="foo_524">524</string>
+ <string name="foo_525">525</string>
+ <string name="foo_526">526</string>
+ <string name="foo_527">527</string>
+ <string name="foo_528">528</string>
+ <string name="foo_529">529</string>
+ <string name="foo_530">530</string>
+ <string name="foo_531">531</string>
+ <string name="foo_532">532</string>
+ <string name="foo_533">533</string>
+ <string name="foo_534">534</string>
+ <string name="foo_535">535</string>
+ <string name="foo_536">536</string>
+ <string name="foo_537">537</string>
+ <string name="foo_538">538</string>
+ <string name="foo_539">539</string>
+ <string name="foo_540">540</string>
+ <string name="foo_541">541</string>
+ <string name="foo_542">542</string>
+ <string name="foo_543">543</string>
+ <string name="foo_544">544</string>
+ <string name="foo_545">545</string>
+ <string name="foo_546">546</string>
+ <string name="foo_547">547</string>
+ <string name="foo_548">548</string>
+ <string name="foo_549">549</string>
+ <string name="foo_550">550</string>
+ <string name="foo_551">551</string>
+ <string name="foo_552">552</string>
+ <string name="foo_553">553</string>
+ <string name="foo_554">554</string>
+ <string name="foo_555">555</string>
+ <string name="foo_556">556</string>
+ <string name="foo_557">557</string>
+ <string name="foo_558">558</string>
+ <string name="foo_559">559</string>
+ <string name="foo_560">560</string>
+ <string name="foo_561">561</string>
+ <string name="foo_562">562</string>
+ <string name="foo_563">563</string>
+ <string name="foo_564">564</string>
+ <string name="foo_565">565</string>
+ <string name="foo_566">566</string>
+ <string name="foo_567">567</string>
+ <string name="foo_568">568</string>
+ <string name="foo_569">569</string>
+ <string name="foo_570">570</string>
+ <string name="foo_571">571</string>
+ <string name="foo_572">572</string>
+ <string name="foo_573">573</string>
+ <string name="foo_574">574</string>
+ <string name="foo_575">575</string>
+ <string name="foo_576">576</string>
+ <string name="foo_577">577</string>
+ <string name="foo_578">578</string>
+ <string name="foo_579">579</string>
+ <string name="foo_580">580</string>
+ <string name="foo_581">581</string>
+ <string name="foo_582">582</string>
+ <string name="foo_583">583</string>
+ <string name="foo_584">584</string>
+ <string name="foo_585">585</string>
+ <string name="foo_586">586</string>
+ <string name="foo_587">587</string>
+ <string name="foo_588">588</string>
+ <string name="foo_589">589</string>
+ <string name="foo_590">590</string>
+ <string name="foo_591">591</string>
+ <string name="foo_592">592</string>
+ <string name="foo_593">593</string>
+ <string name="foo_594">594</string>
+ <string name="foo_595">595</string>
+ <string name="foo_596">596</string>
+ <string name="foo_597">597</string>
+ <string name="foo_598">598</string>
+ <string name="foo_599">599</string>
+ <string name="foo_600">600</string>
+ <string name="foo_601">601</string>
+ <string name="foo_602">602</string>
+ <string name="foo_603">603</string>
+ <string name="foo_604">604</string>
+ <string name="foo_605">605</string>
+ <string name="foo_606">606</string>
+ <string name="foo_607">607</string>
+ <string name="foo_608">608</string>
+ <string name="foo_609">609</string>
+ <string name="foo_610">610</string>
+ <string name="foo_611">611</string>
+ <string name="foo_612">612</string>
+ <string name="foo_613">613</string>
+ <string name="foo_614">614</string>
+ <string name="foo_615">615</string>
+ <string name="foo_616">616</string>
+ <string name="foo_617">617</string>
+ <string name="foo_618">618</string>
+ <string name="foo_619">619</string>
+ <string name="foo_620">620</string>
+ <string name="foo_621">621</string>
+ <string name="foo_622">622</string>
+ <string name="foo_623">623</string>
+ <string name="foo_624">624</string>
+ <string name="foo_625">625</string>
+ <string name="foo_626">626</string>
+ <string name="foo_627">627</string>
+ <string name="foo_628">628</string>
+ <string name="foo_629">629</string>
+ <string name="foo_630">630</string>
+ <string name="foo_631">631</string>
+ <string name="foo_632">632</string>
+ <string name="foo_633">633</string>
+ <string name="foo_634">634</string>
+ <string name="foo_635">635</string>
+ <string name="foo_636">636</string>
+ <string name="foo_637">637</string>
+ <string name="foo_638">638</string>
+ <string name="foo_639">639</string>
+ <string name="foo_640">640</string>
+ <string name="foo_641">641</string>
+ <string name="foo_642">642</string>
+ <string name="foo_643">643</string>
+ <string name="foo_644">644</string>
+ <string name="foo_645">645</string>
+ <string name="foo_646">646</string>
+ <string name="foo_647">647</string>
+ <string name="foo_648">648</string>
+ <string name="foo_649">649</string>
+ <string name="foo_650">650</string>
+ <string name="foo_651">651</string>
+ <string name="foo_652">652</string>
+ <string name="foo_653">653</string>
+ <string name="foo_654">654</string>
+ <string name="foo_655">655</string>
+ <string name="foo_656">656</string>
+ <string name="foo_657">657</string>
+ <string name="foo_658">658</string>
+ <string name="foo_659">659</string>
+ <string name="foo_660">660</string>
+ <string name="foo_661">661</string>
+ <string name="foo_662">662</string>
+ <string name="foo_663">663</string>
+ <string name="foo_664">664</string>
+ <string name="foo_665">665</string>
+ <string name="foo_666">666</string>
+ <string name="foo_667">667</string>
+ <string name="foo_668">668</string>
+ <string name="foo_669">669</string>
+ <string name="foo_670">670</string>
+ <string name="foo_671">671</string>
+ <string name="foo_672">672</string>
+ <string name="foo_673">673</string>
+ <string name="foo_674">674</string>
+ <string name="foo_675">675</string>
+ <string name="foo_676">676</string>
+ <string name="foo_677">677</string>
+ <string name="foo_678">678</string>
+ <string name="foo_679">679</string>
+ <string name="foo_680">680</string>
+ <string name="foo_681">681</string>
+ <string name="foo_682">682</string>
+ <string name="foo_683">683</string>
+ <string name="foo_684">684</string>
+ <string name="foo_685">685</string>
+ <string name="foo_686">686</string>
+ <string name="foo_687">687</string>
+ <string name="foo_688">688</string>
+ <string name="foo_689">689</string>
+ <string name="foo_690">690</string>
+ <string name="foo_691">691</string>
+ <string name="foo_692">692</string>
+ <string name="foo_693">693</string>
+ <string name="foo_694">694</string>
+ <string name="foo_695">695</string>
+ <string name="foo_696">696</string>
+ <string name="foo_697">697</string>
+ <string name="foo_698">698</string>
+ <string name="foo_699">699</string>
+ <string name="foo_700">700</string>
+ <string name="foo_701">701</string>
+ <string name="foo_702">702</string>
+ <string name="foo_703">703</string>
+ <string name="foo_704">704</string>
+ <string name="foo_705">705</string>
+ <string name="foo_706">706</string>
+ <string name="foo_707">707</string>
+ <string name="foo_708">708</string>
+ <string name="foo_709">709</string>
+ <string name="foo_710">710</string>
+ <string name="foo_711">711</string>
+ <string name="foo_712">712</string>
+ <string name="foo_713">713</string>
+ <string name="foo_714">714</string>
+ <string name="foo_715">715</string>
+ <string name="foo_716">716</string>
+ <string name="foo_717">717</string>
+ <string name="foo_718">718</string>
+ <string name="foo_719">719</string>
+ <string name="foo_720">720</string>
+ <string name="foo_721">721</string>
+ <string name="foo_722">722</string>
+ <string name="foo_723">723</string>
+ <string name="foo_724">724</string>
+ <string name="foo_725">725</string>
+ <string name="foo_726">726</string>
+ <string name="foo_727">727</string>
+ <string name="foo_728">728</string>
+ <string name="foo_729">729</string>
+ <string name="foo_730">730</string>
+ <string name="foo_731">731</string>
+ <string name="foo_732">732</string>
+ <string name="foo_733">733</string>
+ <string name="foo_734">734</string>
+ <string name="foo_735">735</string>
+ <string name="foo_736">736</string>
+ <string name="foo_737">737</string>
+ <string name="foo_738">738</string>
+ <string name="foo_739">739</string>
+ <string name="foo_740">740</string>
+ <string name="foo_741">741</string>
+ <string name="foo_742">742</string>
+ <string name="foo_743">743</string>
+ <string name="foo_744">744</string>
+ <string name="foo_745">745</string>
+ <string name="foo_746">746</string>
+ <string name="foo_747">747</string>
+ <string name="foo_748">748</string>
+ <string name="foo_749">749</string>
+ <string name="foo_750">750</string>
+ <string name="foo_751">751</string>
+ <string name="foo_752">752</string>
+ <string name="foo_753">753</string>
+ <string name="foo_754">754</string>
+ <string name="foo_755">755</string>
+ <string name="foo_756">756</string>
+ <string name="foo_757">757</string>
+ <string name="foo_758">758</string>
+ <string name="foo_759">759</string>
+ <string name="foo_760">760</string>
+ <string name="foo_761">761</string>
+ <string name="foo_762">762</string>
+ <string name="foo_763">763</string>
+ <string name="foo_764">764</string>
+ <string name="foo_765">765</string>
+ <string name="foo_766">766</string>
+ <string name="foo_767">767</string>
+ <string name="foo_768">768</string>
+ <string name="foo_769">769</string>
+ <string name="foo_770">770</string>
+ <string name="foo_771">771</string>
+ <string name="foo_772">772</string>
+ <string name="foo_773">773</string>
+ <string name="foo_774">774</string>
+ <string name="foo_775">775</string>
+ <string name="foo_776">776</string>
+ <string name="foo_777">777</string>
+ <string name="foo_778">778</string>
+ <string name="foo_779">779</string>
+ <string name="foo_780">780</string>
+ <string name="foo_781">781</string>
+ <string name="foo_782">782</string>
+ <string name="foo_783">783</string>
+ <string name="foo_784">784</string>
+ <string name="foo_785">785</string>
+ <string name="foo_786">786</string>
+ <string name="foo_787">787</string>
+ <string name="foo_788">788</string>
+ <string name="foo_789">789</string>
+ <string name="foo_790">790</string>
+ <string name="foo_791">791</string>
+ <string name="foo_792">792</string>
+ <string name="foo_793">793</string>
+ <string name="foo_794">794</string>
+ <string name="foo_795">795</string>
+ <string name="foo_796">796</string>
+ <string name="foo_797">797</string>
+ <string name="foo_798">798</string>
+ <string name="foo_799">799</string>
+ <string name="foo_800">800</string>
+ <string name="foo_801">801</string>
+ <string name="foo_802">802</string>
+ <string name="foo_803">803</string>
+ <string name="foo_804">804</string>
+ <string name="foo_805">805</string>
+ <string name="foo_806">806</string>
+ <string name="foo_807">807</string>
+ <string name="foo_808">808</string>
+ <string name="foo_809">809</string>
+ <string name="foo_810">810</string>
+ <string name="foo_811">811</string>
+ <string name="foo_812">812</string>
+ <string name="foo_813">813</string>
+ <string name="foo_814">814</string>
+ <string name="foo_815">815</string>
+ <string name="foo_816">816</string>
+ <string name="foo_817">817</string>
+ <string name="foo_818">818</string>
+ <string name="foo_819">819</string>
+ <string name="foo_820">820</string>
+ <string name="foo_821">821</string>
+ <string name="foo_822">822</string>
+ <string name="foo_823">823</string>
+ <string name="foo_824">824</string>
+ <string name="foo_825">825</string>
+ <string name="foo_826">826</string>
+ <string name="foo_827">827</string>
+ <string name="foo_828">828</string>
+ <string name="foo_829">829</string>
+ <string name="foo_830">830</string>
+ <string name="foo_831">831</string>
+ <string name="foo_832">832</string>
+ <string name="foo_833">833</string>
+ <string name="foo_834">834</string>
+ <string name="foo_835">835</string>
+ <string name="foo_836">836</string>
+ <string name="foo_837">837</string>
+ <string name="foo_838">838</string>
+ <string name="foo_839">839</string>
+ <string name="foo_840">840</string>
+ <string name="foo_841">841</string>
+ <string name="foo_842">842</string>
+ <string name="foo_843">843</string>
+ <string name="foo_844">844</string>
+ <string name="foo_845">845</string>
+ <string name="foo_846">846</string>
+ <string name="foo_847">847</string>
+ <string name="foo_848">848</string>
+ <string name="foo_849">849</string>
+ <string name="foo_850">850</string>
+ <string name="foo_851">851</string>
+ <string name="foo_852">852</string>
+ <string name="foo_853">853</string>
+ <string name="foo_854">854</string>
+ <string name="foo_855">855</string>
+ <string name="foo_856">856</string>
+ <string name="foo_857">857</string>
+ <string name="foo_858">858</string>
+ <string name="foo_859">859</string>
+ <string name="foo_860">860</string>
+ <string name="foo_861">861</string>
+ <string name="foo_862">862</string>
+ <string name="foo_863">863</string>
+ <string name="foo_864">864</string>
+ <string name="foo_865">865</string>
+ <string name="foo_866">866</string>
+ <string name="foo_867">867</string>
+ <string name="foo_868">868</string>
+ <string name="foo_869">869</string>
+ <string name="foo_870">870</string>
+ <string name="foo_871">871</string>
+ <string name="foo_872">872</string>
+ <string name="foo_873">873</string>
+ <string name="foo_874">874</string>
+ <string name="foo_875">875</string>
+ <string name="foo_876">876</string>
+ <string name="foo_877">877</string>
+ <string name="foo_878">878</string>
+ <string name="foo_879">879</string>
+ <string name="foo_880">880</string>
+ <string name="foo_881">881</string>
+ <string name="foo_882">882</string>
+ <string name="foo_883">883</string>
+ <string name="foo_884">884</string>
+ <string name="foo_885">885</string>
+ <string name="foo_886">886</string>
+ <string name="foo_887">887</string>
+ <string name="foo_888">888</string>
+ <string name="foo_889">889</string>
+ <string name="foo_890">890</string>
+ <string name="foo_891">891</string>
+ <string name="foo_892">892</string>
+ <string name="foo_893">893</string>
+ <string name="foo_894">894</string>
+ <string name="foo_895">895</string>
+ <string name="foo_896">896</string>
+ <string name="foo_897">897</string>
+ <string name="foo_898">898</string>
+ <string name="foo_899">899</string>
+ <string name="foo_900">900</string>
+ <string name="foo_901">901</string>
+ <string name="foo_902">902</string>
+ <string name="foo_903">903</string>
+ <string name="foo_904">904</string>
+ <string name="foo_905">905</string>
+ <string name="foo_906">906</string>
+ <string name="foo_907">907</string>
+ <string name="foo_908">908</string>
+ <string name="foo_909">909</string>
+ <string name="foo_910">910</string>
+ <string name="foo_911">911</string>
+ <string name="foo_912">912</string>
+ <string name="foo_913">913</string>
+ <string name="foo_914">914</string>
+ <string name="foo_915">915</string>
+ <string name="foo_916">916</string>
+ <string name="foo_917">917</string>
+ <string name="foo_918">918</string>
+ <string name="foo_919">919</string>
+ <string name="foo_920">920</string>
+ <string name="foo_921">921</string>
+ <string name="foo_922">922</string>
+ <string name="foo_923">923</string>
+ <string name="foo_924">924</string>
+ <string name="foo_925">925</string>
+ <string name="foo_926">926</string>
+ <string name="foo_927">927</string>
+ <string name="foo_928">928</string>
+ <string name="foo_929">929</string>
+ <string name="foo_930">930</string>
+ <string name="foo_931">931</string>
+ <string name="foo_932">932</string>
+ <string name="foo_933">933</string>
+ <string name="foo_934">934</string>
+ <string name="foo_935">935</string>
+ <string name="foo_936">936</string>
+ <string name="foo_937">937</string>
+ <string name="foo_938">938</string>
+ <string name="foo_939">939</string>
+ <string name="foo_940">940</string>
+ <string name="foo_941">941</string>
+ <string name="foo_942">942</string>
+ <string name="foo_943">943</string>
+ <string name="foo_944">944</string>
+ <string name="foo_945">945</string>
+ <string name="foo_946">946</string>
+ <string name="foo_947">947</string>
+ <string name="foo_948">948</string>
+ <string name="foo_949">949</string>
+ <string name="foo_950">950</string>
+ <string name="foo_951">951</string>
+ <string name="foo_952">952</string>
+ <string name="foo_953">953</string>
+ <string name="foo_954">954</string>
+ <string name="foo_955">955</string>
+ <string name="foo_956">956</string>
+ <string name="foo_957">957</string>
+ <string name="foo_958">958</string>
+ <string name="foo_959">959</string>
+ <string name="foo_960">960</string>
+ <string name="foo_961">961</string>
+ <string name="foo_962">962</string>
+ <string name="foo_963">963</string>
+ <string name="foo_964">964</string>
+ <string name="foo_965">965</string>
+ <string name="foo_966">966</string>
+ <string name="foo_967">967</string>
+ <string name="foo_968">968</string>
+ <string name="foo_969">969</string>
+ <string name="foo_970">970</string>
+ <string name="foo_971">971</string>
+ <string name="foo_972">972</string>
+ <string name="foo_973">973</string>
+ <string name="foo_974">974</string>
+ <string name="foo_975">975</string>
+ <string name="foo_976">976</string>
+ <string name="foo_977">977</string>
+ <string name="foo_978">978</string>
+ <string name="foo_979">979</string>
+ <string name="foo_980">980</string>
+ <string name="foo_981">981</string>
+ <string name="foo_982">982</string>
+ <string name="foo_983">983</string>
+ <string name="foo_984">984</string>
+ <string name="foo_985">985</string>
+ <string name="foo_986">986</string>
+ <string name="foo_987">987</string>
+ <string name="foo_988">988</string>
+ <string name="foo_989">989</string>
+ <string name="foo_990">990</string>
+ <string name="foo_991">991</string>
+ <string name="foo_992">992</string>
+ <string name="foo_993">993</string>
+ <string name="foo_994">994</string>
+ <string name="foo_995">995</string>
+ <string name="foo_996">996</string>
+ <string name="foo_997">997</string>
+ <string name="foo_998">998</string>
+ <string name="foo_999">999</string>
+</resources>
diff --git a/libs/androidfw/tests/data/sparse/res/values/values.xml b/libs/androidfw/tests/data/sparse/res/values/values.xml
new file mode 100644
index 0000000..5cc42d8
--- /dev/null
+++ b/libs/androidfw/tests/data/sparse/res/values/values.xml
@@ -0,0 +1,28 @@
+<?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>
+ <integer name="foo_0">0</integer>
+ <integer name="foo_1">1</integer>
+ <integer name="foo_2">2</integer>
+ <integer name="foo_3">3</integer>
+ <integer name="foo_4">4</integer>
+ <integer name="foo_5">5</integer>
+ <integer name="foo_6">6</integer>
+ <integer name="foo_7">7</integer>
+ <integer name="foo_8">8</integer>
+ <integer name="foo_9">9</integer>
+</resources>
diff --git a/libs/androidfw/tests/data/sparse/sparse.apk b/libs/androidfw/tests/data/sparse/sparse.apk
new file mode 100644
index 0000000..1f9bba3
--- /dev/null
+++ b/libs/androidfw/tests/data/sparse/sparse.apk
Binary files differ
diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk
index ff40c8a..9515b82 100644
--- a/libs/hwui/Android.mk
+++ b/libs/hwui/Android.mk
@@ -47,6 +47,7 @@
renderthread/RenderThread.cpp \
renderthread/TimeLord.cpp \
renderthread/Frame.cpp \
+ service/GraphicsStatsService.cpp \
thread/TaskManager.cpp \
utils/Blur.cpp \
utils/GLUtils.cpp \
@@ -293,6 +294,7 @@
tests/unit/GlopBuilderTests.cpp \
tests/unit/GpuMemoryTrackerTests.cpp \
tests/unit/GradientCacheTests.cpp \
+ tests/unit/GraphicsStatsServiceTests.cpp \
tests/unit/LayerUpdateQueueTests.cpp \
tests/unit/LeakCheckTests.cpp \
tests/unit/LinearAllocatorTests.cpp \
diff --git a/libs/hwui/DeferredLayerUpdater.cpp b/libs/hwui/DeferredLayerUpdater.cpp
index 00e8c05..ff90160 100644
--- a/libs/hwui/DeferredLayerUpdater.cpp
+++ b/libs/hwui/DeferredLayerUpdater.cpp
@@ -98,6 +98,8 @@
mUpdateTexImage = false;
doUpdateTexImage();
}
+ GLenum renderTarget = mSurfaceTexture->getCurrentTextureTarget();
+ static_cast<GlLayer*>(mLayer)->setRenderTarget(renderTarget);
}
if (mTransform) {
mLayer->getTransform().load(*mTransform);
@@ -140,12 +142,8 @@
}
#endif
mSurfaceTexture->getTransformMatrix(transform);
- GLenum renderTarget = mSurfaceTexture->getCurrentTextureTarget();
- LOG_ALWAYS_FATAL_IF(renderTarget != GL_TEXTURE_2D && renderTarget != GL_TEXTURE_EXTERNAL_OES,
- "doUpdateTexImage target %x, 2d %x, EXT %x",
- renderTarget, GL_TEXTURE_2D, GL_TEXTURE_EXTERNAL_OES);
- updateLayer(forceFilter, renderTarget, transform);
+ updateLayer(forceFilter, transform);
}
}
@@ -155,28 +153,17 @@
mLayer->getApi(), Layer::Api::OpenGL, Layer::Api::Vulkan);
static const mat4 identityMatrix;
- updateLayer(false, GL_NONE, identityMatrix.data);
+ updateLayer(false, identityMatrix.data);
VkLayer* vkLayer = static_cast<VkLayer*>(mLayer);
vkLayer->updateTexture();
}
-void DeferredLayerUpdater::updateLayer(bool forceFilter, GLenum renderTarget,
- const float* textureTransform) {
+void DeferredLayerUpdater::updateLayer(bool forceFilter, const float* textureTransform) {
mLayer->setBlend(mBlend);
mLayer->setForceFilter(forceFilter);
mLayer->setSize(mWidth, mHeight);
mLayer->getTexTransform().load(textureTransform);
-
- if (mLayer->getApi() == Layer::Api::OpenGL) {
- GlLayer* glLayer = static_cast<GlLayer*>(mLayer);
- if (renderTarget != glLayer->getRenderTarget()) {
- glLayer->setRenderTarget(renderTarget);
- glLayer->bindTexture();
- glLayer->setFilter(GL_NEAREST, false, true);
- glLayer->setWrap(GL_CLAMP_TO_EDGE, false, true);
- }
- }
}
void DeferredLayerUpdater::detachSurfaceTexture() {
diff --git a/libs/hwui/DeferredLayerUpdater.h b/libs/hwui/DeferredLayerUpdater.h
index 6717361..6164e47 100644
--- a/libs/hwui/DeferredLayerUpdater.h
+++ b/libs/hwui/DeferredLayerUpdater.h
@@ -101,7 +101,7 @@
void detachSurfaceTexture();
- void updateLayer(bool forceFilter, GLenum renderTarget, const float* textureTransform);
+ void updateLayer(bool forceFilter, const float* textureTransform);
void destroyLayer();
diff --git a/libs/hwui/GlLayer.cpp b/libs/hwui/GlLayer.cpp
index aacad54..070e954 100644
--- a/libs/hwui/GlLayer.cpp
+++ b/libs/hwui/GlLayer.cpp
@@ -55,9 +55,15 @@
texture.deleteTexture();
}
-void GlLayer::bindTexture() const {
- if (texture.mId) {
- caches.textureState().bindTexture(texture.target(), texture.mId);
+void GlLayer::setRenderTarget(GLenum renderTarget) {
+ if (renderTarget != getRenderTarget()) {
+ // new render target: bind with new target, and update filter/wrap
+ texture.mTarget = renderTarget;
+ if (texture.mId) {
+ caches.textureState().bindTexture(texture.target(), texture.mId);
+ }
+ texture.setFilter(GL_NEAREST, false, true);
+ texture.setWrap(GL_CLAMP_TO_EDGE, false, true);
}
}
diff --git a/libs/hwui/GlLayer.h b/libs/hwui/GlLayer.h
index 85ddaff..20aaf4a 100644
--- a/libs/hwui/GlLayer.h
+++ b/libs/hwui/GlLayer.h
@@ -68,23 +68,12 @@
return texture.target();
}
- inline void setRenderTarget(GLenum renderTarget) {
- texture.mTarget = renderTarget;
- }
-
inline bool isRenderable() const {
return texture.target() != GL_NONE;
}
- void setWrap(GLenum wrap, bool bindTexture = false, bool force = false) {
- texture.setWrap(wrap, bindTexture, force);
- }
+ void setRenderTarget(GLenum renderTarget);
- void setFilter(GLenum filter, bool bindTexture = false, bool force = false) {
- texture.setFilter(filter, bindTexture, force);
- }
-
- void bindTexture() const;
void generateTexture();
/**
diff --git a/libs/hwui/JankTracker.cpp b/libs/hwui/JankTracker.cpp
index 2132c2b..7be71ee 100644
--- a/libs/hwui/JankTracker.cpp
+++ b/libs/hwui/JankTracker.cpp
@@ -110,7 +110,7 @@
}
// Only called when dumping stats, less performance sensitive
-static uint32_t frameTimeForFrameCountIndex(uint32_t index) {
+int32_t JankTracker::frameTimeForFrameCountIndex(uint32_t index) {
index = index + kBucketMinThreshold;
if (index > kBucket2msIntervals) {
index += (index - kBucket2msIntervals);
@@ -123,6 +123,10 @@
return index;
}
+int32_t JankTracker::frameTimeForSlowFrameCountIndex(uint32_t index) {
+ return (index * kSlowFrameBucketIntervalMs) + kSlowFrameBucketStartMs;
+}
+
JankTracker::JankTracker(const DisplayInfo& displayInfo) {
// By default this will use malloc memory. It may be moved later to ashmem
// if there is shared space for it and a request comes in to do that.
@@ -161,8 +165,25 @@
mData = nullptr;
}
+void JankTracker::rotateStorage() {
+ // If we are mapped we want to stop using the ashmem backend and switch to malloc
+ // We are expecting a switchStorageToAshmem call to follow this, but it's not guaranteed
+ // If we aren't sitting on top of ashmem then just do a reset() as it's functionally
+ // equivalent do a free, malloc, reset.
+ if (mIsMapped) {
+ freeData();
+ mData = new ProfileData;
+ }
+ reset();
+}
+
void JankTracker::switchStorageToAshmem(int ashmemfd) {
int regionSize = ashmem_get_size_region(ashmemfd);
+ if (regionSize < 0) {
+ int err = errno;
+ ALOGW("Failed to get ashmem region size from fd %d, err %d %s", ashmemfd, err, strerror(err));
+ return;
+ }
if (regionSize < static_cast<int>(sizeof(ProfileData))) {
ALOGW("Ashmem region is too small! Received %d, required %u",
regionSize, static_cast<unsigned int>(sizeof(ProfileData)));
@@ -279,15 +300,19 @@
}
}
-void JankTracker::dumpBuffer(const void* buffer, size_t bufsize, int fd) {
- if (bufsize < sizeof(ProfileData)) {
- return;
+void JankTracker::dumpData(int fd, const ProfileDataDescription* description, const ProfileData* data) {
+ if (description) {
+ switch (description->type) {
+ case JankTrackerType::Generic:
+ break;
+ case JankTrackerType::Package:
+ dprintf(fd, "\nPackage: %s", description->name.c_str());
+ break;
+ case JankTrackerType::Window:
+ dprintf(fd, "\nWindow: %s", description->name.c_str());
+ break;
+ }
}
- const ProfileData* data = reinterpret_cast<const ProfileData*>(buffer);
- dumpData(data, fd);
-}
-
-void JankTracker::dumpData(const ProfileData* data, int fd) {
if (sFrameStart != FrameInfoIndex::IntendedVsync) {
dprintf(fd, "\nNote: Data has been filtered!");
}
@@ -308,7 +333,7 @@
data->frameCounts[i]);
}
for (size_t i = 0; i < data->slowFrameCounts.size(); i++) {
- dprintf(fd, " %zums=%u", (i * kSlowFrameBucketIntervalMs) + kSlowFrameBucketStartMs,
+ dprintf(fd, " %ums=%u", frameTimeForSlowFrameCountIndex(i),
data->slowFrameCounts[i]);
}
dprintf(fd, "\n");
diff --git a/libs/hwui/JankTracker.h b/libs/hwui/JankTracker.h
index 8b482d5..6ff5d89 100644
--- a/libs/hwui/JankTracker.h
+++ b/libs/hwui/JankTracker.h
@@ -54,29 +54,50 @@
nsecs_t statStartTime;
};
+enum class JankTrackerType {
+ // The default, means there's no description set
+ Generic,
+ // The profile data represents a package
+ Package,
+ // The profile data is for a specific window
+ Window,
+};
+
+// Metadata about the ProfileData being collected
+struct ProfileDataDescription {
+ JankTrackerType type;
+ std::string name;
+};
+
// TODO: Replace DrawProfiler with this
class JankTracker {
public:
explicit JankTracker(const DisplayInfo& displayInfo);
~JankTracker();
+ void setDescription(JankTrackerType type, const std::string&& name) {
+ mDescription.type = type;
+ mDescription.name = name;
+ }
+
void addFrame(const FrameInfo& frame);
- void dump(int fd) { dumpData(mData, fd); }
+ void dump(int fd) { dumpData(fd, &mDescription, mData); }
void reset();
+ void rotateStorage();
void switchStorageToAshmem(int ashmemfd);
uint32_t findPercentile(int p) { return findPercentile(mData, p); }
-
- ANDROID_API static void dumpBuffer(const void* buffer, size_t bufsize, int fd);
+ static int32_t frameTimeForFrameCountIndex(uint32_t index);
+ static int32_t frameTimeForSlowFrameCountIndex(uint32_t index);
private:
void freeData();
void setFrameInterval(nsecs_t frameIntervalNanos);
static uint32_t findPercentile(const ProfileData* data, int p);
- static void dumpData(const ProfileData* data, int fd);
+ static void dumpData(int fd, const ProfileDataDescription* description, const ProfileData* data);
std::array<int64_t, NUM_BUCKETS> mThresholds;
int64_t mFrameInterval;
@@ -90,6 +111,7 @@
nsecs_t mDequeueTimeForgiveness = 0;
ProfileData* mData;
bool mIsMapped = false;
+ ProfileDataDescription mDescription;
};
} /* namespace uirenderer */
diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp
index 09e34bf..aad81df 100644
--- a/libs/hwui/Properties.cpp
+++ b/libs/hwui/Properties.cpp
@@ -211,12 +211,15 @@
return sRenderPipelineType;
}
char prop[PROPERTY_VALUE_MAX];
- property_get(PROPERTY_DEFAULT_RENDERER, prop, "opengl");
+ property_get(PROPERTY_RENDERER, prop, "opengl");
if (!strcmp(prop, "skiagl") ) {
+ ALOGD("Skia GL Pipeline");
sRenderPipelineType = RenderPipelineType::SkiaGL;
} else if (!strcmp(prop, "skiavk") ) {
+ ALOGD("Skia Vulkan Pipeline");
sRenderPipelineType = RenderPipelineType::SkiaVulkan;
} else { //"opengl"
+ ALOGD("HWUI GL Pipeline");
sRenderPipelineType = RenderPipelineType::OpenGL;
}
return sRenderPipelineType;
diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h
index 6dc0cb3..9db6449 100644
--- a/libs/hwui/Properties.h
+++ b/libs/hwui/Properties.h
@@ -156,7 +156,7 @@
* Allows to set rendering pipeline mode to OpenGL (default), Skia OpenGL
* or Vulkan.
*/
-#define PROPERTY_DEFAULT_RENDERER "debug.hwui.default_renderer"
+#define PROPERTY_RENDERER "debug.hwui.renderer"
///////////////////////////////////////////////////////////////////////////////
// Runtime configuration properties
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index c57b1b3..7cab11a 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -73,24 +73,6 @@
// Canvas state operations: Replace Bitmap
// ----------------------------------------------------------------------------
-class ClipCopier : public SkCanvas::ClipVisitor {
-public:
- explicit ClipCopier(SkCanvas* dstCanvas) : m_dstCanvas(dstCanvas) {}
-
- virtual void clipRect(const SkRect& rect, SkClipOp op, bool antialias) {
- m_dstCanvas->clipRect(rect, op, antialias);
- }
- virtual void clipRRect(const SkRRect& rrect, SkClipOp op, bool antialias) {
- m_dstCanvas->clipRRect(rrect, op, antialias);
- }
- virtual void clipPath(const SkPath& path, SkClipOp op, bool antialias) {
- m_dstCanvas->clipPath(path, op, antialias);
- }
-
-private:
- SkCanvas* m_dstCanvas;
-};
-
void SkiaCanvas::setBitmap(const SkBitmap& bitmap) {
SkCanvas* newCanvas = new SkCanvas(bitmap);
@@ -98,8 +80,9 @@
// Copy the canvas matrix & clip state.
newCanvas->setMatrix(mCanvas->getTotalMatrix());
- ClipCopier copier(newCanvas);
- mCanvas->replayClips(&copier);
+ SkRegion rgn;
+ mCanvas->temporary_internal_getRgnClip(&rgn);
+ newCanvas->clipRegion(rgn, SkClipOp::kIntersect);
}
// deletes the previously owned canvas (if any)
diff --git a/libs/hwui/SkiaShader.cpp b/libs/hwui/SkiaShader.cpp
index 9239986..760c10c 100644
--- a/libs/hwui/SkiaShader.cpp
+++ b/libs/hwui/SkiaShader.cpp
@@ -217,6 +217,7 @@
const float height = outData->bitmapTexture->height();
description->hasBitmap = true;
+ description->hasLinearTexture = outData->bitmapTexture->isLinear();
description->isShaderBitmapExternal = hwuiBitmap->isHardware();
// gralloc doesn't support non-clamp modes
if (hwuiBitmap->isHardware() || (!caches.extensions().hasNPot()
diff --git a/libs/hwui/hwui/Canvas.cpp b/libs/hwui/hwui/Canvas.cpp
index 2dc8ce8..c64a89d 100644
--- a/libs/hwui/hwui/Canvas.cpp
+++ b/libs/hwui/hwui/Canvas.cpp
@@ -45,7 +45,7 @@
} else {
flags = paint.getFlags();
}
- if (flags & (SkPaint::kUnderlineText_Flag | SkPaint::kStrikeThruText_Flag)) {
+ if (flags & (SkPaint::kUnderlineText_ReserveFlag | SkPaint::kStrikeThruText_ReserveFlag)) {
// Same values used by Skia
const float kStdStrikeThru_Offset = (-6.0f / 21.0f);
const float kStdUnderline_Offset = (1.0f / 9.0f);
@@ -55,12 +55,12 @@
SkScalar right = x + length;
float textSize = paint.getTextSize();
float strokeWidth = fmax(textSize * kStdUnderline_Thickness, 1.0f);
- if (flags & SkPaint::kUnderlineText_Flag) {
+ if (flags & SkPaint::kUnderlineText_ReserveFlag) {
SkScalar top = y + textSize * kStdUnderline_Offset - 0.5f * strokeWidth;
SkScalar bottom = y + textSize * kStdUnderline_Offset + 0.5f * strokeWidth;
drawRect(left, top, right, bottom, paint);
}
- if (flags & SkPaint::kStrikeThruText_Flag) {
+ if (flags & SkPaint::kStrikeThruText_ReserveFlag) {
SkScalar top = y + textSize * kStdStrikeThru_Offset - 0.5f * strokeWidth;
SkScalar bottom = y + textSize * kStdStrikeThru_Offset + 0.5f * strokeWidth;
drawRect(left, top, right, bottom, paint);
@@ -153,8 +153,8 @@
// minikin may modify the original paint
Paint paint(origPaint);
- minikin::Layout layout;
- MinikinUtils::doLayout(&layout, &paint, bidiFlags, typeface, text, start, count, contextCount);
+ minikin::Layout layout = MinikinUtils::doLayout(
+ &paint, bidiFlags, typeface, text, start, count, contextCount);
size_t nGlyphs = layout.nGlyphs();
std::unique_ptr<uint16_t[]> glyphs(new uint16_t[nGlyphs]);
@@ -205,8 +205,8 @@
void Canvas::drawTextOnPath(const uint16_t* text, int count, int bidiFlags, const SkPath& path,
float hOffset, float vOffset, const Paint& paint, Typeface* typeface) {
Paint paintCopy(paint);
- minikin::Layout layout;
- MinikinUtils::doLayout(&layout, &paintCopy, bidiFlags, typeface, text, 0, count, count);
+ minikin::Layout layout = MinikinUtils::doLayout(
+ &paintCopy, bidiFlags, typeface, text, 0, count, count);
hOffset += MinikinUtils::hOffsetForTextAlign(&paintCopy, layout, path);
// Set align to left for drawing, as we don't want individual
diff --git a/libs/hwui/hwui/MinikinSkia.cpp b/libs/hwui/hwui/MinikinSkia.cpp
index 6a00379..ba4e3a4 100644
--- a/libs/hwui/hwui/MinikinSkia.cpp
+++ b/libs/hwui/hwui/MinikinSkia.cpp
@@ -25,9 +25,9 @@
namespace android {
MinikinFontSkia::MinikinFontSkia(sk_sp<SkTypeface> typeface, const void* fontData, size_t fontSize,
- int ttcIndex) :
+ int ttcIndex, const std::vector<minikin::FontVariation>& axes) :
minikin::MinikinFont(typeface->uniqueID()), mTypeface(std::move(typeface)), mFontData(fontData),
- mFontSize(fontSize), mTtcIndex(ttcIndex) {
+ mFontSize(fontSize), mTtcIndex(ttcIndex), mAxes(axes) {
}
static void MinikinFontSkia_SetSkiaPaint(const minikin::MinikinFont* font, SkPaint* skPaint,
@@ -87,7 +87,11 @@
return mTtcIndex;
}
-minikin::MinikinFont* MinikinFontSkia::createFontWithVariation(
+const std::vector<minikin::FontVariation>& MinikinFontSkia::GetAxes() const {
+ return mAxes;
+}
+
+std::shared_ptr<minikin::MinikinFont> MinikinFontSkia::createFontWithVariation(
const std::vector<minikin::FontVariation>& variations) const {
SkFontMgr::FontParameters params;
@@ -106,7 +110,8 @@
sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault());
sk_sp<SkTypeface> face(fm->createFromStream(stream, params));
- return new MinikinFontSkia(std::move(face), mFontData, mFontSize, ttcIndex);
+ return std::make_shared<MinikinFontSkia>(std::move(face), mFontData, mFontSize, ttcIndex,
+ variations);
}
uint32_t MinikinFontSkia::packPaintFlags(const SkPaint* paint) {
diff --git a/libs/hwui/hwui/MinikinSkia.h b/libs/hwui/hwui/MinikinSkia.h
index 249b0cb..6c12485 100644
--- a/libs/hwui/hwui/MinikinSkia.h
+++ b/libs/hwui/hwui/MinikinSkia.h
@@ -29,7 +29,7 @@
class ANDROID_API MinikinFontSkia : public minikin::MinikinFont {
public:
explicit MinikinFontSkia(sk_sp<SkTypeface> typeface, const void* fontData, size_t fontSize,
- int ttcIndex);
+ int ttcIndex, const std::vector<minikin::FontVariation>& axes);
float GetHorizontalAdvance(uint32_t glyph_id,
const minikin::MinikinPaint &paint) const;
@@ -44,7 +44,8 @@
const void* GetFontData() const;
size_t GetFontSize() const;
int GetFontIndex() const;
- minikin::MinikinFont* createFontWithVariation(
+ const std::vector<minikin::FontVariation>& GetAxes() const;
+ std::shared_ptr<minikin::MinikinFont> createFontWithVariation(
const std::vector<minikin::FontVariation>&) const;
static uint32_t packPaintFlags(const SkPaint* paint);
@@ -61,6 +62,7 @@
const void* mFontData;
size_t mFontSize;
int mTtcIndex;
+ std::vector<minikin::FontVariation> mAxes;
};
} // namespace android
diff --git a/libs/hwui/hwui/MinikinUtils.cpp b/libs/hwui/hwui/MinikinUtils.cpp
index 713e509..d1871ff 100644
--- a/libs/hwui/hwui/MinikinUtils.cpp
+++ b/libs/hwui/hwui/MinikinUtils.cpp
@@ -27,9 +27,8 @@
namespace android {
minikin::FontStyle MinikinUtils::prepareMinikinPaint(minikin::MinikinPaint* minikinPaint,
- minikin::FontCollection** pFont, const Paint* paint, Typeface* typeface) {
+ const Paint* paint, Typeface* typeface) {
const Typeface* resolvedFace = Typeface::resolveDefault(typeface);
- *pFont = resolvedFace->fFontCollection;
minikin::FontStyle resolved = resolvedFace->fStyle;
/* Prepare minikin FontStyle */
@@ -54,23 +53,23 @@
return minikinStyle;
}
-void MinikinUtils::doLayout(minikin::Layout* layout, const Paint* paint, int bidiFlags,
+minikin::Layout MinikinUtils::doLayout(const Paint* paint, int bidiFlags,
Typeface* typeface, const uint16_t* buf, size_t start, size_t count,
size_t bufSize) {
- minikin::FontCollection *font;
minikin::MinikinPaint minikinPaint;
- minikin::FontStyle minikinStyle = prepareMinikinPaint(&minikinPaint, &font, paint, typeface);
- layout->setFontCollection(font);
- layout->doLayout(buf, start, count, bufSize, bidiFlags, minikinStyle, minikinPaint);
+ minikin::FontStyle minikinStyle = prepareMinikinPaint(&minikinPaint, paint, typeface);
+ minikin::Layout layout(Typeface::resolveDefault(typeface)->fFontCollection);
+ layout.doLayout(buf, start, count, bufSize, bidiFlags, minikinStyle, minikinPaint);
+ return layout;
}
float MinikinUtils::measureText(const Paint* paint, int bidiFlags, Typeface* typeface,
const uint16_t* buf, size_t start, size_t count, size_t bufSize, float *advances) {
- minikin::FontCollection *font;
minikin::MinikinPaint minikinPaint;
- minikin::FontStyle minikinStyle = prepareMinikinPaint(&minikinPaint, &font, paint, typeface);
+ minikin::FontStyle minikinStyle = prepareMinikinPaint(&minikinPaint, paint, typeface);
+ Typeface* resolvedTypeface = Typeface::resolveDefault(typeface);
return minikin::Layout::measureText(buf, start, count, bufSize, bidiFlags, minikinStyle,
- minikinPaint, font, advances);
+ minikinPaint, resolvedTypeface->fFontCollection, advances);
}
bool MinikinUtils::hasVariationSelector(Typeface* typeface, uint32_t codepoint, uint32_t vs) {
diff --git a/libs/hwui/hwui/MinikinUtils.h b/libs/hwui/hwui/MinikinUtils.h
index d6f64d2..0f22adc 100644
--- a/libs/hwui/hwui/MinikinUtils.h
+++ b/libs/hwui/hwui/MinikinUtils.h
@@ -35,9 +35,9 @@
class MinikinUtils {
public:
ANDROID_API static minikin::FontStyle prepareMinikinPaint(minikin::MinikinPaint* minikinPaint,
- minikin::FontCollection** pFont, const Paint* paint, Typeface* typeface);
+ const Paint* paint, Typeface* typeface);
- ANDROID_API static void doLayout(minikin::Layout* layout, const Paint* paint, int bidiFlags,
+ ANDROID_API static minikin::Layout doLayout(const Paint* paint, int bidiFlags,
Typeface* typeface, const uint16_t* buf, size_t start, size_t count,
size_t bufSize);
@@ -56,11 +56,11 @@
ANDROID_API static void forFontRun(const minikin::Layout& layout, Paint* paint, F& f) {
float saveSkewX = paint->getTextSkewX();
bool savefakeBold = paint->isFakeBoldText();
- minikin::MinikinFont* curFont = NULL;
+ const minikin::MinikinFont* curFont = nullptr;
size_t start = 0;
size_t nGlyphs = layout.nGlyphs();
for (size_t i = 0; i < nGlyphs; i++) {
- minikin::MinikinFont* nextFont = layout.getFont(i);
+ const minikin::MinikinFont* nextFont = layout.getFont(i);
if (i > 0 && nextFont != curFont) {
MinikinFontSkia::populateSkPaint(paint, curFont, layout.getFakery(start));
f(start, i);
diff --git a/libs/hwui/hwui/Typeface.cpp b/libs/hwui/hwui/Typeface.cpp
index b69b0cb..4b8575a 100644
--- a/libs/hwui/hwui/Typeface.cpp
+++ b/libs/hwui/hwui/Typeface.cpp
@@ -64,7 +64,6 @@
Typeface* result = new Typeface;
if (result != nullptr) {
result->fFontCollection = resolvedFace->fFontCollection;
- result->fFontCollection->Ref();
result->fSkiaStyle = style;
result->fBaseWeight = resolvedFace->fBaseWeight;
resolveStyle(result);
@@ -83,7 +82,6 @@
// None of passed axes are supported by this collection.
// So we will reuse the same collection with incrementing reference count.
result->fFontCollection = resolvedFace->fFontCollection;
- result->fFontCollection->Ref();
}
result->fSkiaStyle = resolvedFace->fSkiaStyle;
result->fBaseWeight = resolvedFace->fBaseWeight;
@@ -97,7 +95,6 @@
Typeface* result = new Typeface;
if (result != nullptr) {
result->fFontCollection = resolvedFace->fFontCollection;
- result->fFontCollection->Ref();
result->fSkiaStyle = resolvedFace->fSkiaStyle;
result->fBaseWeight = weight;
resolveStyle(result);
@@ -105,18 +102,19 @@
return result;
}
-Typeface* Typeface::createFromFamilies(const std::vector<minikin::FontFamily*>& families) {
+Typeface* Typeface::createFromFamilies(
+ std::vector<std::shared_ptr<minikin::FontFamily>>&& families) {
Typeface* result = new Typeface;
- result->fFontCollection = new minikin::FontCollection(families);
+ result->fFontCollection.reset(new minikin::FontCollection(families));
if (families.empty()) {
ALOGW("createFromFamilies creating empty collection");
result->fSkiaStyle = SkTypeface::kNormal;
} else {
const minikin::FontStyle defaultStyle;
- minikin::FontFamily* firstFamily = reinterpret_cast<minikin::FontFamily*>(families[0]);
- minikin::MinikinFont* mf = firstFamily->getClosestMatch(defaultStyle).font;
- if (mf != NULL) {
- SkTypeface* skTypeface = reinterpret_cast<MinikinFontSkia*>(mf)->GetSkTypeface();
+ const std::shared_ptr<minikin::FontFamily>& firstFamily = families[0];
+ const minikin::MinikinFont* mf = firstFamily->getClosestMatch(defaultStyle).font;
+ if (mf != nullptr) {
+ SkTypeface* skTypeface = reinterpret_cast<const MinikinFontSkia*>(mf)->GetSkTypeface();
// TODO: probably better to query more precise style from family, will be important
// when we open up API to access 100..900 weights
result->fSkiaStyle = skTypeface->style();
@@ -129,11 +127,6 @@
return result;
}
-void Typeface::unref() {
- fFontCollection->Unref();
- delete this;
-}
-
void Typeface::setDefault(Typeface* face) {
gDefaultTypeface = face;
}
@@ -150,14 +143,12 @@
sk_sp<SkTypeface> typeface = SkTypeface::MakeFromStream(fontData.release());
LOG_ALWAYS_FATAL_IF(typeface == nullptr, "Failed to make typeface from %s", kRobotoFont);
- minikin::MinikinFont* font = new MinikinFontSkia(std::move(typeface), data, st.st_size, 0);
- minikin::FontFamily* family = new minikin::FontFamily(
- std::vector<minikin::Font>({ minikin::Font(font, minikin::FontStyle()) }));
- font->Unref();
-
- std::vector<minikin::FontFamily*> typefaces = { family };
- minikin::FontCollection *collection = new minikin::FontCollection(typefaces);
- family->Unref();
+ std::shared_ptr<minikin::MinikinFont> font = std::make_shared<MinikinFontSkia>(
+ std::move(typeface), data, st.st_size, 0, std::vector<minikin::FontVariation>());
+ std::shared_ptr<minikin::FontFamily> family = std::make_shared<minikin::FontFamily>(
+ std::vector<minikin::Font>({ minikin::Font(std::move(font), minikin::FontStyle()) }));
+ std::shared_ptr<minikin::FontCollection> collection =
+ std::make_shared<minikin::FontCollection>(std::move(family));
Typeface* hwTypeface = new Typeface();
hwTypeface->fFontCollection = collection;
diff --git a/libs/hwui/hwui/Typeface.h b/libs/hwui/hwui/Typeface.h
index 4392ebc..19a4f6c5 100644
--- a/libs/hwui/hwui/Typeface.h
+++ b/libs/hwui/hwui/Typeface.h
@@ -23,11 +23,12 @@
#include <cutils/compiler.h>
#include <minikin/FontCollection.h>
#include <vector>
+#include <memory>
namespace android {
struct ANDROID_API Typeface {
- minikin::FontCollection *fFontCollection;
+ std::shared_ptr<minikin::FontCollection> fFontCollection;
// style used for constructing and querying Typeface objects
SkTypeface::Style fSkiaStyle;
@@ -37,8 +38,6 @@
// resolved style actually used for rendering
minikin::FontStyle fStyle;
- void unref();
-
static Typeface* resolveDefault(Typeface* src);
static Typeface* createFromTypeface(Typeface* src, SkTypeface::Style style);
@@ -48,7 +47,8 @@
static Typeface* createWeightAlias(Typeface* src, int baseweight);
- static Typeface* createFromFamilies(const std::vector<minikin::FontFamily*>& families);
+ static Typeface* createFromFamilies(
+ std::vector<std::shared_ptr<minikin::FontFamily>>&& families);
static void setDefault(Typeface* face);
diff --git a/libs/hwui/hwui_static_deps.mk b/libs/hwui/hwui_static_deps.mk
index a75fd6a..8826cfc 100644
--- a/libs/hwui/hwui_static_deps.mk
+++ b/libs/hwui/hwui_static_deps.mk
@@ -22,11 +22,12 @@
libskia \
libui \
libgui \
- libprotobuf-cpp-lite \
+ libprotobuf-cpp-full \
libharfbuzz_ng \
libft2 \
libminikin \
- libandroidfw
+ libandroidfw \
+ libRScpp
-# enable RENDERSCRIPT
-LOCAL_SHARED_LIBRARIES += libRScpp
+LOCAL_STATIC_LIBRARIES += \
+ libplatformprotos
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
index de80ee3..ae13131 100644
--- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
@@ -26,7 +26,6 @@
#include "SkiaProfileRenderer.h"
#include "utils/TraceUtils.h"
-#include <android/native_window.h>
#include <cutils/properties.h>
#include <strings.h>
@@ -128,6 +127,8 @@
return false;
}
+ // acquire most recent buffer for drawing
+ deferredLayer->updateTexImage();
deferredLayer->apply();
SkCanvas canvas(*bitmap);
diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
index c63dce1..d28e605 100644
--- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
@@ -31,7 +31,6 @@
#include <GrTypes.h>
#include <vk/GrVkTypes.h>
-#include <android/native_window.h>
#include <cutils/properties.h>
#include <strings.h>
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index a53e5e0..02a9ffa 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -590,6 +590,7 @@
}
void CanvasContext::dumpFrames(int fd) {
+ mJankTracker.dump(fd);
FILE* file = fdopen(fd, "a");
fprintf(file, "\n\n---PROFILEDATA---\n");
for (size_t i = 0; i < static_cast<size_t>(FrameInfoIndex::NumIndexes); i++) {
@@ -615,6 +616,10 @@
mRenderThread.jankTracker().reset();
}
+void CanvasContext::setName(const std::string&& name) {
+ mJankTracker.setDescription(JankTrackerType::Window, std::move(name));
+}
+
void CanvasContext::serializeDisplayListTree() {
#if ENABLE_RENDERNODE_SERIALIZATION
using namespace google::protobuf::io;
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index aa01caa..738c091 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -155,8 +155,7 @@
void dumpFrames(int fd);
void resetFrameStats();
- void setName(const std::string&& name) { mName = name; }
- const std::string& name() { return mName; }
+ void setName(const std::string&& name);
void serializeDisplayListTree();
diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp
index 7020be0..44af5fd 100644
--- a/libs/hwui/renderthread/EglManager.cpp
+++ b/libs/hwui/renderthread/EglManager.cpp
@@ -106,7 +106,10 @@
// Now that extensions are loaded, pick a swap behavior
if (Properties::enablePartialUpdates) {
- if (Properties::useBufferAge && EglExtensions.bufferAge) {
+ // An Adreno driver bug is causing rendering problems for SkiaGL with
+ // buffer age swap behavior (b/31957043). To temporarily workaround,
+ // we will use preserved swap behavior.
+ if (Properties::useBufferAge && EglExtensions.bufferAge && !Properties::isSkiaEnabled()) {
mSwapBehavior = SwapBehavior::BufferAge;
} else {
mSwapBehavior = SwapBehavior::Preserved;
@@ -130,7 +133,7 @@
LOG_ALWAYS_FATAL_IF(!glInterface.get());
GrContextOptions options;
- options.fDisableDistanceFieldPaths = true;
+ options.fGpuPathRenderers &= ~GrContextOptions::GpuPathRenderers::kDistanceField;
options.fAllowPathMaskCaching = true;
mRenderThread.setGrContext(GrContext::Create(GrBackend::kOpenGL_GrBackend,
(GrBackendContext)glInterface.get(), options));
diff --git a/libs/hwui/renderthread/OpenGLPipeline.cpp b/libs/hwui/renderthread/OpenGLPipeline.cpp
index 8a5d9cc..e1ae585 100644
--- a/libs/hwui/renderthread/OpenGLPipeline.cpp
+++ b/libs/hwui/renderthread/OpenGLPipeline.cpp
@@ -24,7 +24,6 @@
#include "renderstate/RenderState.h"
#include "OpenGLReadback.h"
-#include <android/native_window.h>
#include <cutils/properties.h>
#include <strings.h>
@@ -120,6 +119,8 @@
bool OpenGLPipeline::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) {
ATRACE_CALL();
+ // acquire most recent buffer for drawing
+ layer->updateTexImage();
layer->apply();
return OpenGLReadbackImpl::copyLayerInto(mRenderThread,
static_cast<GlLayer&>(*layer->backingLayer()), bitmap);
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index 11614fa..f4a4773 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -487,9 +487,22 @@
void RenderProxy::setProcessStatsBuffer(int fd) {
SETUP_TASK(setProcessStatsBuffer);
- args->thread = &mRenderThread;
+ auto& rt = RenderThread::getInstance();
+ args->thread = &rt;
args->fd = dup(fd);
- post(task);
+ rt.queue(task);
+}
+
+CREATE_BRIDGE1(rotateProcessStatsBuffer, RenderThread* thread) {
+ args->thread->jankTracker().rotateStorage();
+ return nullptr;
+}
+
+void RenderProxy::rotateProcessStatsBuffer() {
+ SETUP_TASK(rotateProcessStatsBuffer);
+ auto& rt = RenderThread::getInstance();
+ args->thread = &rt;
+ rt.queue(task);
}
int RenderProxy::getRenderThreadTid() {
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index 1629090..a60ed55 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -113,7 +113,8 @@
uint32_t frameTimePercentile(int p);
ANDROID_API static void dumpGraphicsMemory(int fd);
- ANDROID_API void setProcessStatsBuffer(int fd);
+ ANDROID_API static void rotateProcessStatsBuffer();
+ ANDROID_API static void setProcessStatsBuffer(int fd);
ANDROID_API int getRenderThreadTid();
ANDROID_API void serializeDisplayListTree();
diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h
index d121bcf..9bc5985 100644
--- a/libs/hwui/renderthread/RenderThread.h
+++ b/libs/hwui/renderthread/RenderThread.h
@@ -74,6 +74,7 @@
};
class ANDROID_API RenderThread : public Thread {
+ PREVENT_COPY_AND_ASSIGN(RenderThread);
public:
// RenderThread takes complete ownership of tasks that are queued
// and will delete them after they are run
diff --git a/libs/hwui/service/GraphicsStatsService.cpp b/libs/hwui/service/GraphicsStatsService.cpp
new file mode 100644
index 0000000..ab6420e
--- /dev/null
+++ b/libs/hwui/service/GraphicsStatsService.cpp
@@ -0,0 +1,287 @@
+/*
+ * 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 "GraphicsStatsService.h"
+
+#include "JankTracker.h"
+
+#include <frameworks/base/core/proto/android/service/graphicsstats.pb.h>
+#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include <log/log.h>
+
+#include <inttypes.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+namespace android {
+namespace uirenderer {
+
+using namespace google::protobuf;
+
+constexpr int32_t sCurrentFileVersion = 1;
+constexpr int32_t sHeaderSize = 4;
+static_assert(sizeof(sCurrentFileVersion) == sHeaderSize, "Header size is wrong");
+
+constexpr int sHistogramSize =
+ std::tuple_size<decltype(ProfileData::frameCounts)>::value +
+ std::tuple_size<decltype(ProfileData::slowFrameCounts)>::value;
+
+static void mergeProfileDataIntoProto(service::GraphicsStatsProto* proto,
+ const std::string& package, int versionCode, int64_t startTime, int64_t endTime,
+ const ProfileData* data);
+static void dumpAsTextToFd(service::GraphicsStatsProto* proto, int outFd);
+
+bool GraphicsStatsService::parseFromFile(const std::string& path, service::GraphicsStatsProto* output) {
+
+ int fd = open(path.c_str(), O_RDONLY);
+ if (fd == -1) {
+ int err = errno;
+ // The file not existing is normal for addToDump(), so only log if
+ // we get an unexpected error
+ if (err != ENOENT) {
+ ALOGW("Failed to open '%s', errno=%d (%s)", path.c_str(), err, strerror(err));
+ }
+ return false;
+ }
+ uint32_t file_version;
+ ssize_t bytesRead = read(fd, &file_version, sHeaderSize);
+ if (bytesRead != sHeaderSize || file_version != sCurrentFileVersion) {
+ ALOGW("Failed to read '%s', bytesRead=%zd file_version=%d", path.c_str(), bytesRead,
+ file_version);
+ close(fd);
+ return false;
+ }
+
+ io::FileInputStream input(fd);
+ bool success = output->ParseFromZeroCopyStream(&input);
+ if (input.GetErrno() != 0) {
+ ALOGW("Error reading from fd=%d, path='%s' err=%d (%s)",
+ fd, path.c_str(), input.GetErrno(), strerror(input.GetErrno()));
+ success = false;
+ } else if (!success) {
+ ALOGW("Parse failed on '%s' error='%s'",
+ path.c_str(), output->InitializationErrorString().c_str());
+ }
+ close(fd);
+ return success;
+}
+
+void mergeProfileDataIntoProto(service::GraphicsStatsProto* proto, const std::string& package,
+ int versionCode, int64_t startTime, int64_t endTime, const ProfileData* data) {
+ if (proto->stats_start() == 0 || proto->stats_start() > startTime) {
+ proto->set_stats_start(startTime);
+ }
+ if (proto->stats_end() == 0 || proto->stats_end() < endTime) {
+ proto->set_stats_end(endTime);
+ }
+ proto->set_package_name(package);
+ proto->set_version_code(versionCode);
+ auto summary = proto->mutable_summary();
+ summary->set_total_frames(summary->total_frames() + data->totalFrameCount);
+ summary->set_janky_frames(summary->janky_frames() + data->jankFrameCount);
+ summary->set_missed_vsync_count(
+ summary->missed_vsync_count() + data->jankTypeCounts[kMissedVsync]);
+ summary->set_high_input_latency_count(
+ summary->high_input_latency_count() + data->jankTypeCounts[kHighInputLatency]);
+ summary->set_slow_ui_thread_count(
+ summary->slow_ui_thread_count() + data->jankTypeCounts[kSlowUI]);
+ summary->set_slow_bitmap_upload_count(
+ summary->slow_bitmap_upload_count() + data->jankTypeCounts[kSlowSync]);
+ summary->set_slow_draw_count(
+ summary->slow_draw_count() + data->jankTypeCounts[kSlowRT]);
+
+ bool creatingHistogram = false;
+ if (proto->histogram_size() == 0) {
+ proto->mutable_histogram()->Reserve(sHistogramSize);
+ creatingHistogram = true;
+ } else if (proto->histogram_size() != sHistogramSize) {
+ LOG_ALWAYS_FATAL("Histogram size mismatch, proto is %d expected %d",
+ proto->histogram_size(), sHistogramSize);
+ }
+ for (size_t i = 0; i < data->frameCounts.size(); i++) {
+ service::GraphicsStatsHistogramBucketProto* bucket;
+ int32_t renderTime = JankTracker::frameTimeForFrameCountIndex(i);
+ if (creatingHistogram) {
+ bucket = proto->add_histogram();
+ bucket->set_render_millis(renderTime);
+ } else {
+ bucket = proto->mutable_histogram(i);
+ LOG_ALWAYS_FATAL_IF(bucket->render_millis() != renderTime,
+ "Frame time mistmatch %d vs. %d", bucket->render_millis(), renderTime);
+ }
+ bucket->set_frame_count(bucket->frame_count() + data->frameCounts[i]);
+ }
+ for (size_t i = 0; i < data->slowFrameCounts.size(); i++) {
+ service::GraphicsStatsHistogramBucketProto* bucket;
+ int32_t renderTime = JankTracker::frameTimeForSlowFrameCountIndex(i);
+ if (creatingHistogram) {
+ bucket = proto->add_histogram();
+ bucket->set_render_millis(renderTime);
+ } else {
+ constexpr int offset = std::tuple_size<decltype(ProfileData::frameCounts)>::value;
+ bucket = proto->mutable_histogram(offset + i);
+ LOG_ALWAYS_FATAL_IF(bucket->render_millis() != renderTime,
+ "Frame time mistmatch %d vs. %d", bucket->render_millis(), renderTime);
+ }
+ bucket->set_frame_count(bucket->frame_count() + data->slowFrameCounts[i]);
+ }
+}
+
+static int32_t findPercentile(service::GraphicsStatsProto* proto, int percentile) {
+ int32_t pos = percentile * proto->summary().total_frames() / 100;
+ int32_t remaining = proto->summary().total_frames() - pos;
+ for (auto it = proto->histogram().rbegin(); it != proto->histogram().rend(); ++it) {
+ remaining -= it->frame_count();
+ if (remaining <= 0) {
+ return it->render_millis();
+ }
+ }
+ return 0;
+}
+
+void dumpAsTextToFd(service::GraphicsStatsProto* proto, int fd) {
+ // This isn't a full validation, just enough that we can deref at will
+ LOG_ALWAYS_FATAL_IF(proto->package_name().empty()
+ || !proto->has_summary(), "package_name() '%s' summary %d",
+ proto->package_name().c_str(), proto->has_summary());
+ dprintf(fd, "\nPackage: %s", proto->package_name().c_str());
+ dprintf(fd, "\nVersion: %d", proto->version_code());
+ dprintf(fd, "\nStats since: %lldns", proto->stats_start());
+ dprintf(fd, "\nStats end: %lldns", proto->stats_end());
+ auto summary = proto->summary();
+ dprintf(fd, "\nTotal frames rendered: %d", summary.total_frames());
+ dprintf(fd, "\nJanky frames: %d (%.2f%%)", summary.janky_frames(),
+ (float) summary.janky_frames() / (float) summary.total_frames() * 100.0f);
+ dprintf(fd, "\n50th percentile: %dms", findPercentile(proto, 50));
+ dprintf(fd, "\n90th percentile: %dms", findPercentile(proto, 90));
+ dprintf(fd, "\n95th percentile: %dms", findPercentile(proto, 95));
+ dprintf(fd, "\n99th percentile: %dms", findPercentile(proto, 99));
+ dprintf(fd, "\nNumber Missed Vsync: %d", summary.missed_vsync_count());
+ dprintf(fd, "\nNumber High input latency: %d", summary.high_input_latency_count());
+ dprintf(fd, "\nNumber Slow UI thread: %d", summary.slow_ui_thread_count());
+ dprintf(fd, "\nNumber Slow bitmap uploads: %d", summary.slow_bitmap_upload_count());
+ dprintf(fd, "\nNumber Slow issue draw commands: %d", summary.slow_draw_count());
+ dprintf(fd, "\nHISTOGRAM:");
+ for (const auto& it : proto->histogram()) {
+ dprintf(fd, " %dms=%d", it.render_millis(), it.frame_count());
+ }
+ dprintf(fd, "\n");
+}
+
+void GraphicsStatsService::saveBuffer(const std::string& path, const std::string& package,
+ int versionCode, int64_t startTime, int64_t endTime, const ProfileData* data) {
+ service::GraphicsStatsProto statsProto;
+ if (!parseFromFile(path, &statsProto)) {
+ statsProto.Clear();
+ }
+ mergeProfileDataIntoProto(&statsProto, package, versionCode, startTime, endTime, data);
+ // Although we might not have read any data from the file, merging the existing data
+ // should always fully-initialize the proto
+ LOG_ALWAYS_FATAL_IF(!statsProto.IsInitialized(), "%s",
+ statsProto.InitializationErrorString().c_str());
+ LOG_ALWAYS_FATAL_IF(statsProto.package_name().empty()
+ || !statsProto.has_summary(), "package_name() '%s' summary %d",
+ statsProto.package_name().c_str(), statsProto.has_summary());
+ int outFd = open(path.c_str(), O_CREAT | O_RDWR | O_TRUNC, 0660);
+ if (outFd <= 0) {
+ int err = errno;
+ ALOGW("Failed to open '%s', error=%d (%s)", path.c_str(), err, strerror(err));
+ return;
+ }
+ int wrote = write(outFd, &sCurrentFileVersion, sHeaderSize);
+ if (wrote != sHeaderSize) {
+ int err = errno;
+ ALOGW("Failed to write header to '%s', returned=%d errno=%d (%s)",
+ path.c_str(), wrote, err, strerror(err));
+ close(outFd);
+ return;
+ }
+ {
+ io::FileOutputStream output(outFd);
+ bool success = statsProto.SerializeToZeroCopyStream(&output) && output.Flush();
+ if (output.GetErrno() != 0) {
+ ALOGW("Error writing to fd=%d, path='%s' err=%d (%s)",
+ outFd, path.c_str(), output.GetErrno(), strerror(output.GetErrno()));
+ success = false;
+ } else if (!success) {
+ ALOGW("Serialize failed on '%s' unknown error", path.c_str());
+ }
+ }
+ close(outFd);
+}
+
+class GraphicsStatsService::Dump {
+public:
+ Dump(int outFd, DumpType type) : mFd(outFd), mType(type) {}
+ int fd() { return mFd; }
+ DumpType type() { return mType; }
+ service::GraphicsStatsServiceDumpProto& proto() { return mProto; }
+private:
+ int mFd;
+ DumpType mType;
+ service::GraphicsStatsServiceDumpProto mProto;
+};
+
+GraphicsStatsService::Dump* GraphicsStatsService::createDump(int outFd, DumpType type) {
+ return new Dump(outFd, type);
+}
+
+void GraphicsStatsService::addToDump(Dump* dump, const std::string& path, const std::string& package,
+ int versionCode, int64_t startTime, int64_t endTime, const ProfileData* data) {
+ service::GraphicsStatsProto statsProto;
+ if (!path.empty() && !parseFromFile(path, &statsProto)) {
+ statsProto.Clear();
+ }
+ if (data) {
+ mergeProfileDataIntoProto(&statsProto, package, versionCode, startTime, endTime, data);
+ }
+ if (!statsProto.IsInitialized()) {
+ ALOGW("Failed to load profile data from path '%s' and data %p",
+ path.empty() ? "<empty>" : path.c_str(), data);
+ return;
+ }
+
+ if (dump->type() == DumpType::Protobuf) {
+ dump->proto().add_stats()->CopyFrom(statsProto);
+ } else {
+ dumpAsTextToFd(&statsProto, dump->fd());
+ }
+}
+
+void GraphicsStatsService::addToDump(Dump* dump, const std::string& path) {
+ service::GraphicsStatsProto statsProto;
+ if (!parseFromFile(path, &statsProto)) {
+ return;
+ }
+ if (dump->type() == DumpType::Protobuf) {
+ dump->proto().add_stats()->CopyFrom(statsProto);
+ } else {
+ dumpAsTextToFd(&statsProto, dump->fd());
+ }
+}
+
+void GraphicsStatsService::finishDump(Dump* dump) {
+ if (dump->type() == DumpType::Protobuf) {
+ io::FileOutputStream stream(dump->fd());
+ dump->proto().SerializeToZeroCopyStream(&stream);
+ }
+ delete dump;
+}
+
+} /* namespace uirenderer */
+} /* namespace android */
\ No newline at end of file
diff --git a/libs/hwui/service/GraphicsStatsService.h b/libs/hwui/service/GraphicsStatsService.h
new file mode 100644
index 0000000..d0fd60e
--- /dev/null
+++ b/libs/hwui/service/GraphicsStatsService.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <string>
+
+#include "JankTracker.h"
+#include "utils/Macros.h"
+
+namespace android {
+namespace service {
+class GraphicsStatsProto;
+}
+
+namespace uirenderer {
+
+/*
+ * The exported entry points used by GraphicsStatsService.java in f/b/services/core
+ *
+ * NOTE: Avoid exporting a requirement on the protobuf itself. Keep the usage
+ * of the generated protobuf classes internal to libhwui.so to minimize library
+ * bloat.
+ */
+class GraphicsStatsService {
+public:
+ class Dump;
+ enum class DumpType {
+ Text,
+ Protobuf,
+ };
+
+ ANDROID_API static void saveBuffer(const std::string& path, const std::string& package,
+ int versionCode, int64_t startTime, int64_t endTime, const ProfileData* data);
+
+ ANDROID_API static Dump* createDump(int outFd, DumpType type);
+ ANDROID_API static void addToDump(Dump* dump, const std::string& path, const std::string& package,
+ int versionCode, int64_t startTime, int64_t endTime, const ProfileData* data);
+ ANDROID_API static void addToDump(Dump* dump, const std::string& path);
+ ANDROID_API static void finishDump(Dump* dump);
+
+ // Visible for testing
+ static bool parseFromFile(const std::string& path, service::GraphicsStatsProto* output);
+};
+
+} /* namespace uirenderer */
+} /* namespace android */
\ No newline at end of file
diff --git a/libs/hwui/tests/common/TestUtils.cpp b/libs/hwui/tests/common/TestUtils.cpp
index 3e52c39..64ec58d 100644
--- a/libs/hwui/tests/common/TestUtils.cpp
+++ b/libs/hwui/tests/common/TestUtils.cpp
@@ -74,7 +74,11 @@
layerUpdater->setTransform(&transform);
// updateLayer so it's ready to draw
- layerUpdater->updateLayer(true, GL_TEXTURE_EXTERNAL_OES, Matrix4::identity().data);
+ layerUpdater->updateLayer(true, Matrix4::identity().data);
+ if (layerUpdater->backingLayer()->getApi() == Layer::Api::OpenGL) {
+ static_cast<GlLayer*>(layerUpdater->backingLayer())->setRenderTarget(
+ GL_TEXTURE_EXTERNAL_OES);
+ }
return layerUpdater;
}
diff --git a/libs/hwui/tests/unit/DeferredLayerUpdaterTests.cpp b/libs/hwui/tests/unit/DeferredLayerUpdaterTests.cpp
index 1ef9dba..87d897e 100644
--- a/libs/hwui/tests/unit/DeferredLayerUpdaterTests.cpp
+++ b/libs/hwui/tests/unit/DeferredLayerUpdaterTests.cpp
@@ -44,7 +44,12 @@
// push the deferred updates to the layer
Matrix4 scaledMatrix;
scaledMatrix.loadScale(0.5, 0.5, 0.0);
- layerUpdater->updateLayer(true, GL_TEXTURE_EXTERNAL_OES, scaledMatrix.data);
+ layerUpdater->updateLayer(true, scaledMatrix.data);
+ if (layerUpdater->backingLayer()->getApi() == Layer::Api::OpenGL) {
+ GlLayer* glLayer = static_cast<GlLayer*>(layerUpdater->backingLayer());
+ glLayer->setRenderTarget(GL_TEXTURE_EXTERNAL_OES);
+ }
+
// the backing layer should now have all the properties applied.
if (layerUpdater->backingLayer()->getApi() == Layer::Api::OpenGL) {
diff --git a/libs/hwui/tests/unit/FrameBuilderTests.cpp b/libs/hwui/tests/unit/FrameBuilderTests.cpp
index a391d1e..95d9459 100644
--- a/libs/hwui/tests/unit/FrameBuilderTests.cpp
+++ b/libs/hwui/tests/unit/FrameBuilderTests.cpp
@@ -579,7 +579,7 @@
SkPaint textPaint;
textPaint.setAntiAlias(true);
textPaint.setTextSize(20);
- textPaint.setStrikeThruText(true);
+ textPaint.setFlags(textPaint.getFlags() | SkPaint::kStrikeThruText_ReserveFlag);
textPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
for (int i = 0; i < LOOPS; i++) {
TestUtils::drawUtf8ToCanvas(&canvas, "test text", textPaint, 10, 100 * (i + 1));
diff --git a/libs/hwui/tests/unit/GraphicsStatsServiceTests.cpp b/libs/hwui/tests/unit/GraphicsStatsServiceTests.cpp
new file mode 100644
index 0000000..cfe1134
--- /dev/null
+++ b/libs/hwui/tests/unit/GraphicsStatsServiceTests.cpp
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+
+#include "service/GraphicsStatsService.h"
+
+#include <frameworks/base/core/proto/android/service/graphicsstats.pb.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+using namespace android;
+using namespace android::uirenderer;
+
+std::string findRootPath() {
+ char path[1024];
+ ssize_t r = readlink("/proc/self/exe", path, 1024);
+ // < 1023 because we need room for the null terminator
+ if (r <= 0 || r > 1023) {
+ int err = errno;
+ fprintf(stderr, "Failed to read from /proc/self/exe; r=%zd, err=%d (%s)\n",
+ r, err, strerror(err));
+ exit(EXIT_FAILURE);
+ }
+ while (--r > 0) {
+ if (path[r] == '/') {
+ path[r] = '\0';
+ return std::string(path);
+ }
+ }
+ return std::string();
+}
+
+// No code left untested
+TEST(GraphicsStats, findRootPath) {
+ std::string expected = "/data/nativetest/hwui_unit_tests";
+ EXPECT_EQ(expected, findRootPath());
+}
+
+TEST(GraphicsStats, saveLoad) {
+ std::string path = findRootPath() + "/test_saveLoad";
+ std::string packageName = "com.test.saveLoad";
+ ProfileData mockData;
+ mockData.jankFrameCount = 20;
+ mockData.totalFrameCount = 100;
+ mockData.statStartTime = 10000;
+ // Fill with patterned data we can recognize but which won't map to a
+ // memset or basic for iteration count
+ for (size_t i = 0; i < mockData.frameCounts.size(); i++) {
+ mockData.frameCounts[i] = ((i % 10) + 1) * 2;
+ }
+ for (size_t i = 0; i < mockData.slowFrameCounts.size(); i++) {
+ mockData.slowFrameCounts[i] = (i % 5) + 1;
+ }
+ GraphicsStatsService::saveBuffer(path, packageName, 5, 3000, 7000, &mockData);
+ service::GraphicsStatsProto loadedProto;
+ EXPECT_TRUE(GraphicsStatsService::parseFromFile(path, &loadedProto));
+ // Clean up the file
+ unlink(path.c_str());
+
+ EXPECT_EQ(packageName, loadedProto.package_name());
+ EXPECT_EQ(5, loadedProto.version_code());
+ EXPECT_EQ(3000, loadedProto.stats_start());
+ EXPECT_EQ(7000, loadedProto.stats_end());
+ // ASSERT here so we don't continue with a nullptr deref crash if this is false
+ ASSERT_TRUE(loadedProto.has_summary());
+ EXPECT_EQ(20, loadedProto.summary().janky_frames());
+ EXPECT_EQ(100, loadedProto.summary().total_frames());
+ EXPECT_EQ(mockData.frameCounts.size() + mockData.slowFrameCounts.size(),
+ (size_t) loadedProto.histogram_size());
+ for (size_t i = 0; i < (size_t) loadedProto.histogram_size(); i++) {
+ int expectedCount, expectedBucket;
+ if (i < mockData.frameCounts.size()) {
+ expectedCount = ((i % 10) + 1) * 2;
+ expectedBucket = JankTracker::frameTimeForFrameCountIndex(i);
+ } else {
+ int temp = i - mockData.frameCounts.size();
+ expectedCount = (temp % 5) + 1;
+ expectedBucket = JankTracker::frameTimeForSlowFrameCountIndex(temp);
+ }
+ EXPECT_EQ(expectedCount, loadedProto.histogram().Get(i).frame_count());
+ EXPECT_EQ(expectedBucket, loadedProto.histogram().Get(i).render_millis());
+ }
+}
+
+TEST(GraphicsStats, merge) {
+ std::string path = findRootPath() + "/test_merge";
+ std::string packageName = "com.test.merge";
+ ProfileData mockData;
+ mockData.jankFrameCount = 20;
+ mockData.totalFrameCount = 100;
+ mockData.statStartTime = 10000;
+ // Fill with patterned data we can recognize but which won't map to a
+ // memset or basic for iteration count
+ for (size_t i = 0; i < mockData.frameCounts.size(); i++) {
+ mockData.frameCounts[i] = ((i % 10) + 1) * 2;
+ }
+ for (size_t i = 0; i < mockData.slowFrameCounts.size(); i++) {
+ mockData.slowFrameCounts[i] = (i % 5) + 1;
+ }
+ GraphicsStatsService::saveBuffer(path, packageName, 5, 3000, 7000, &mockData);
+ mockData.jankFrameCount = 50;
+ mockData.totalFrameCount = 500;
+ for (size_t i = 0; i < mockData.frameCounts.size(); i++) {
+ mockData.frameCounts[i] = (i % 5) + 1;
+ }
+ for (size_t i = 0; i < mockData.slowFrameCounts.size(); i++) {
+ mockData.slowFrameCounts[i] = ((i % 10) + 1) * 2;
+ }
+ GraphicsStatsService::saveBuffer(path, packageName, 5, 7050, 10000, &mockData);
+
+ service::GraphicsStatsProto loadedProto;
+ EXPECT_TRUE(GraphicsStatsService::parseFromFile(path, &loadedProto));
+ // Clean up the file
+ unlink(path.c_str());
+
+ EXPECT_EQ(packageName, loadedProto.package_name());
+ EXPECT_EQ(5, loadedProto.version_code());
+ EXPECT_EQ(3000, loadedProto.stats_start());
+ EXPECT_EQ(10000, loadedProto.stats_end());
+ // ASSERT here so we don't continue with a nullptr deref crash if this is false
+ ASSERT_TRUE(loadedProto.has_summary());
+ EXPECT_EQ(20 + 50, loadedProto.summary().janky_frames());
+ EXPECT_EQ(100 + 500, loadedProto.summary().total_frames());
+ EXPECT_EQ(mockData.frameCounts.size() + mockData.slowFrameCounts.size(),
+ (size_t) loadedProto.histogram_size());
+ for (size_t i = 0; i < (size_t) loadedProto.histogram_size(); i++) {
+ int expectedCount, expectedBucket;
+ if (i < mockData.frameCounts.size()) {
+ expectedCount = ((i % 10) + 1) * 2;
+ expectedCount += (i % 5) + 1;
+ expectedBucket = JankTracker::frameTimeForFrameCountIndex(i);
+ } else {
+ int temp = i - mockData.frameCounts.size();
+ expectedCount = (temp % 5) + 1;
+ expectedCount += ((temp % 10) + 1) * 2;
+ expectedBucket = JankTracker::frameTimeForSlowFrameCountIndex(temp);
+ }
+ EXPECT_EQ(expectedCount, loadedProto.histogram().Get(i).frame_count());
+ EXPECT_EQ(expectedBucket, loadedProto.histogram().Get(i).render_millis());
+ }
+}
\ No newline at end of file
diff --git a/libs/hwui/tests/unit/RecordingCanvasTests.cpp b/libs/hwui/tests/unit/RecordingCanvasTests.cpp
index 669f03c..b2ea9ac 100644
--- a/libs/hwui/tests/unit/RecordingCanvasTests.cpp
+++ b/libs/hwui/tests/unit/RecordingCanvasTests.cpp
@@ -200,8 +200,18 @@
paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
- paint.setUnderlineText(i != 0);
- paint.setStrikeThruText(j != 0);
+ uint32_t flags = paint.getFlags();
+ if (i != 0) {
+ flags |= SkPaint::kUnderlineText_ReserveFlag;
+ } else {
+ flags &= ~SkPaint::kUnderlineText_ReserveFlag;
+ }
+ if (j != 0) {
+ flags |= SkPaint::kStrikeThruText_ReserveFlag;
+ } else {
+ flags &= ~SkPaint::kStrikeThruText_ReserveFlag;
+ }
+ paint.setFlags(flags);
TestUtils::drawUtf8ToCanvas(&canvas, "test text", paint, 25, 25);
}
}
diff --git a/libs/input/Android.mk b/libs/input/Android.mk
index 2bbfdcc..e824275 100644
--- a/libs/input/Android.mk
+++ b/libs/input/Android.mk
@@ -28,7 +28,8 @@
libgui \
libui \
libinput \
- libinputflinger
+ libinputflinger \
+ libnativewindow
LOCAL_C_INCLUDES := \
frameworks/native/services
diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl
index fc31f32..8f341a8 100644
--- a/location/java/android/location/ILocationManager.aidl
+++ b/location/java/android/location/ILocationManager.aidl
@@ -113,5 +113,6 @@
// for reporting callback completion
void locationCallbackFinished(ILocationListener listener);
-
+ // used by gts tests to verify throttling whitelist
+ String[] getBackgroundThrottlingWhitelist();
}
diff --git a/media/java/android/media/AudioFocusRequest.java b/media/java/android/media/AudioFocusRequest.java
new file mode 100644
index 0000000..1b75a78
--- /dev/null
+++ b/media/java/android/media/AudioFocusRequest.java
@@ -0,0 +1,321 @@
+/*
+ * 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.media;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.media.AudioManager.OnAudioFocusChangeListener;
+import android.os.Handler;
+import android.os.Looper;
+
+/**
+ * A class to encapsulate information about an audio focus request.
+ * An {@code AudioFocusRequest} instance is built by {@link Builder}, and is used to
+ * request and abandon audio focus, respectively
+ * with {@link AudioManager#requestAudioFocus(AudioFocusRequest)} and
+ * {@link AudioManager#abandonAudioFocusRequest(AudioFocusRequest)}.
+ * <p>In the context of describing audio focus, the term "ducking" is used. It describes a temporary
+ * lowering of the audio level of an application in response to another application playing audio
+ * concurrently. An example is during the playback of driving directions,
+ * a user listening to music expects the music to "duck" during the playback of the message
+ * announcing directions.
+ */
+// TODO use this class to provide more documentation about audio focus and the new behaviors
+// describe up to N, and after.
+public final class AudioFocusRequest {
+
+ // default attributes for the request when not specified
+ private final static AudioAttributes FOCUS_DEFAULT_ATTR = new AudioAttributes.Builder()
+ .setUsage(AudioAttributes.USAGE_MEDIA).build();
+
+ private final OnAudioFocusChangeListener mFocusListener; // may be null
+ private final Handler mListenerHandler; // may be null
+ private final AudioAttributes mAttr; // never null
+ private final int mFocusGain;
+ private final int mFlags;
+
+ //TODO implement use of optional handler
+ private AudioFocusRequest(OnAudioFocusChangeListener listener, Handler handler,
+ AudioAttributes attr, int focusGain, int flags) {
+ mFocusListener = listener;
+ mListenerHandler = handler;
+ mFocusGain = focusGain;
+ mAttr = attr;
+ mFlags = flags;
+ }
+
+ /**
+ * @hide
+ * Checks whether a focus gain constant is a valid value for an audio focus request.
+ * @param focusGain value to check
+ * @return true if focusGain is a valid value for an audio focus request.
+ */
+ final static boolean isValidFocusGain(int focusGain) {
+ switch (focusGain) {
+ case AudioManager.AUDIOFOCUS_GAIN:
+ case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:
+ case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:
+ case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Returns the focus change listener set for this {@code AudioFocusRequest}.
+ * @return null if no {@link AudioManager.OnAudioFocusChangeListener} was set.
+ */
+ public @Nullable OnAudioFocusChangeListener getOnAudioFocusChangeListener() {
+ return mFocusListener;
+ }
+
+ /**
+ * Returns the {@link Handler} to be used for the focus change listener.
+ * @return the same {@code Handler} set in.
+ * {@link Builder#setOnAudioFocusChangeListener(OnAudioFocusChangeListener, Handler)}, or null
+ * if no listener was set.
+ */
+ public @Nullable Handler getOnAudioFocusChangeListenerHandler() {
+ return mListenerHandler;
+ }
+
+ /**
+ * Returns the {@link AudioAttributes} set for this {@code AudioFocusRequest}, or the default
+ * attributes if none were set.
+ * @return non-null {@link AudioAttributes}.
+ */
+ public @NonNull AudioAttributes getAudioAttributes() {
+ return mAttr;
+ }
+
+ /**
+ * Returns the type of audio focus request configured for this {@code AudioFocusRequest}.
+ * @return one of {@link AudioManager#AUDIOFOCUS_GAIN},
+ * {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT},
+ * {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK}, and
+ * {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE}.
+ */
+ public int getFocusGain() {
+ return mFocusGain;
+ }
+
+ /**
+ * Returns whether the application that would use this {@code AudioFocusRequest} would pause
+ * when it is requested to duck.
+ * @return the duck/pause behavior.
+ */
+ public boolean willPauseWhenDucked() {
+ return (mFlags & AudioManager.AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS)
+ == AudioManager.AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS;
+ }
+
+ /**
+ * Returns whether the application that would use this {@code AudioFocusRequest} supports
+ * a focus gain granted after a temporary request failure.
+ * @return whether delayed focus gain is supported.
+ */
+ public boolean acceptsDelayedFocusGain() {
+ return (mFlags & AudioManager.AUDIOFOCUS_FLAG_DELAY_OK)
+ == AudioManager.AUDIOFOCUS_FLAG_DELAY_OK;
+ }
+
+ int getFlags() {
+ return mFlags;
+ }
+
+ /**
+ * Builder class for {@link AudioFocusRequest} objects.
+ * <p> Here is an example where {@code Builder} is used to define the
+ * {@link AudioFocusRequest} for requesting audio focus:
+ *
+ * <pre class="prettyprint">
+ * mAudioManager = (AudioManager) Context.getSystemService(Context.AUDIO_SERVICE);
+ * mPlaybackAttributes = new AudioAttributes.Builder()
+ * .setUsage(AudioAttributes.USAGE_GAME)
+ * .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
+ * .build();
+ * mFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
+ * .setAudioAttributes(mPlaybackAttributes)
+ * .setAcceptsDelayedFocusGain(true)
+ * .setOnAudioFocusChangeListener(mMyFocusListener, mMyHandler)
+ * .build();
+ * mMediaPlayer = new MediaPlayer();
+ * ...
+ * mMediaPlayer.setAudioAttributes(mPlaybackAttributes);
+ * ...
+ * mAudioManager.requestAudioFocus(mFocusRequest);
+ * ...
+ * mAudioManager.abandonAudioFocusRequest(mFocusRequest);
+ * </pre>
+ *
+ */
+ public static final class Builder {
+ private OnAudioFocusChangeListener mFocusListener;
+ private Handler mListenerHandler;
+ private AudioAttributes mAttr = FOCUS_DEFAULT_ATTR;
+ private int mFocusGain;
+ private boolean mPausesOnDuck = false;
+ private boolean mDelayedFocus = false;
+
+ /**
+ * Constructs a new {@code Builder}, and specifies how audio focus
+ * will be requested. Valid values for focus requests are
+ * {@link AudioManager#AUDIOFOCUS_GAIN}, {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT},
+ * {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK}, and
+ * {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE}.
+ * <p>By default there is no focus change listener, and the <code>AudioAttributes</code>
+ * have a usage of {@link AudioAttributes#USAGE_MEDIA}.
+ * @param focusGain the type of audio focus gain that will be requested
+ * @throws IllegalArgumentException thrown when an invalid focus gain type is used
+ */
+ public Builder(int focusGain) {
+ setFocusGain(focusGain);
+ }
+
+ /**
+ * Constructs a new {@code Builder} with all the properties of the {@code AudioFocusRequest}
+ * passed as parameter.
+ * Use this method when you want a new request to differ only by some properties.
+ * @param requestToCopy the non-null {@code AudioFocusRequest} to build a duplicate from.
+ * @throws IllegalArgumentException thrown when a null {@code AudioFocusRequest} is used.
+ */
+ public Builder(@NonNull AudioFocusRequest requestToCopy) {
+ if (requestToCopy == null) {
+ throw new IllegalArgumentException("Illegal null AudioFocusRequest");
+ }
+ mAttr = requestToCopy.mAttr;
+ mFocusListener = requestToCopy.mFocusListener;
+ mListenerHandler = requestToCopy.mListenerHandler;
+ mFocusGain = requestToCopy.mFocusGain;
+ mPausesOnDuck = requestToCopy.willPauseWhenDucked();
+ mDelayedFocus = requestToCopy.acceptsDelayedFocusGain();
+ }
+
+ /**
+ * Sets the type of focus gain that will be requested.
+ * Use this method to replace the focus gain when building a request by modifying an
+ * existing {@code AudioFocusRequest} instance.
+ * @param focusGain the type of audio focus gain that will be requested.
+ * @return this {@code Builder} instance
+ * @throws IllegalArgumentException thrown when an invalid focus gain type is used
+ */
+ public @NonNull Builder setFocusGain(int focusGain) {
+ if (!isValidFocusGain(focusGain)) {
+ throw new IllegalArgumentException("Illegal audio focus gain type " + focusGain);
+ }
+ mFocusGain = focusGain;
+ return this;
+ }
+
+ /**
+ * Sets the listener called when audio focus changes after being requested with
+ * {@link AudioManager#requestAudioFocus(AudioFocusRequest)}, and until being abandoned
+ * with {@link AudioManager#abandonAudioFocusRequest(AudioFocusRequest)}.
+ * Note that only focus changes (gains and losses) affecting the focus owner are reported,
+ * not gains and losses of other focus requesters in the system.
+ * @param listener the listener receiving the focus change notifications.
+ * @param handler the {@link Handler} for the thread on which to execute
+ * the notifications. If {@code null}, the {@code Handler} associated with the main
+ * {@link Looper} will be used.
+ * @return this {@code Builder} instance.
+ * @throws IllegalArgumentException thrown when a non-null handler is used with a null
+ * listener.
+ */
+ public @NonNull Builder setOnAudioFocusChangeListener(
+ @Nullable OnAudioFocusChangeListener listener, @Nullable Handler handler) {
+ if (listener == null && handler != null) {
+ throw new IllegalArgumentException(
+ "Illegal non-null handler without a focus listener");
+ }
+ mFocusListener = listener;
+ mListenerHandler = handler;
+ return this;
+ }
+
+ /**
+ * Sets the {@link AudioAttributes} to be associated with the focus request, and which
+ * describe the use case describing why focus is requested.
+ * As the focus requests typically precede audio playback, this information is used on
+ * certain platforms to declare the subsequent playback use case. It is therefore good
+ * practice to use in this method the same {@code AudioAttributes} as used for
+ * playback, see for example {@link MediaPlayer#setAudioAttributes(AudioAttributes)} in
+ * {@code MediaPlayer} or {@link AudioTrack.Builder#setAudioAttributes(AudioAttributes)}
+ * in {@code AudioTrack}.
+ * @param attributes the {@link AudioAttributes} for the focus request.
+ * @return this {@code Builder} instance.
+ * @throws IllegalArgumentException thrown when using null for the attributes.
+ */
+ public @NonNull Builder setAudioAttributes(@NonNull AudioAttributes attributes) {
+ if (attributes == null) {
+ throw new IllegalArgumentException("Illegal null AudioAttributes");
+ }
+ mAttr = attributes;
+ return this;
+ }
+
+ /**
+ * Declare the intended behavior of the application with regards to audio ducking.
+ * See more details in the {@link AudioFocusRequest} class documentation.
+ * @param pauseOnDuck use {@code true} if the application intends to pause audio playback
+ * when losing focus with {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK}.
+ * If {@code true}, note that you must also set a focus listener to receive such an
+ * event, with
+ * {@link #setOnAudioFocusChangeListener(OnAudioFocusChangeListener, Handler)}.
+ * @return this {@code Builder} instance.
+ */
+ public @NonNull Builder setWillPauseWhenDucked(boolean pauseOnDuck) {
+ mPausesOnDuck = pauseOnDuck;
+ return this;
+ }
+
+ /**
+ * Marks this focus request as compatible with delayed focus.
+ * See more details about delayed focus in the {@link AudioFocusRequest} class
+ * documentation.
+ * @param acceptsDelayedFocusGain use {@code true} if the application supports delayed
+ * focus. If {@code true}, note that you must also set a focus listener to be notified
+ * of delayed focus gain, with
+ * {@link #setOnAudioFocusChangeListener(OnAudioFocusChangeListener, Handler)}.
+ * @return this {@code Builder} instance
+ */
+ public @NonNull Builder setAcceptsDelayedFocusGain(boolean acceptsDelayedFocusGain) {
+ mDelayedFocus = acceptsDelayedFocusGain;
+ return this;
+ }
+
+ /**
+ * Builds a new {@code AudioFocusRequest} instance combining all the information gathered
+ * by this {@code Builder}'s configuration methods.
+ * @return the {@code AudioFocusRequest} instance qualified by all the properties set
+ * on this {@code Builder}.
+ * @throws IllegalArgumentException thrown when focus request is set to accept delayed
+ * focus, or to pause on duck, but no focus change listener was set.
+ */
+ public AudioFocusRequest build() {
+ if ((mDelayedFocus || mPausesOnDuck) && (mFocusListener == null)) {
+ throw new IllegalArgumentException(
+ "Can't use delayed focus or pause on duck without a listener");
+ }
+ final int flags = 0
+ | (mDelayedFocus ? AudioManager.AUDIOFOCUS_FLAG_DELAY_OK : 0)
+ | (mPausesOnDuck ? AudioManager.AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS : 0);
+ return new AudioFocusRequest(mFocusListener, mListenerHandler,
+ mAttr, mFocusGain, flags);
+ }
+ }
+}
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index a4f2a7e..dc69a69 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -1981,8 +1981,7 @@
}
/**
- * @hide
- * Used to indicate no audio focus has been gained or lost.
+ * Used to indicate no audio focus has been gained or lost, or requested.
*/
public static final int AUDIOFOCUS_NONE = 0;
@@ -2210,11 +2209,11 @@
*/
public static final int AUDIOFOCUS_REQUEST_GRANTED = 1;
/**
- * @hide
* A focus change request whose granting is delayed: the request was successful, but the
* requester will only be granted audio focus once the condition that prevented immediate
* granting has ended.
- * See {@link #requestAudioFocus(OnAudioFocusChangeListener, AudioAttributes, int, int)}
+ * See {@link #requestAudioFocus(AudioFocusRequest)} and
+ * {@link AudioFocusRequest.Builder#setAcceptsDelayedFocusGain(boolean)}
*/
public static final int AUDIOFOCUS_REQUEST_DELAYED = 2;
@@ -2294,6 +2293,44 @@
| AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS | AUDIOFOCUS_FLAG_LOCK;
/**
+ * Request audio focus.
+ * See the {@link AudioFocusRequest} for information about the options available to configure
+ * your request, and notification of focus gain and loss.
+ * @param focusRequest a {@link AudioFocusRequest} instance used to configure how focus is
+ * requested.
+ * @return {@link #AUDIOFOCUS_REQUEST_FAILED}, {@link #AUDIOFOCUS_REQUEST_GRANTED}
+ * or {@link #AUDIOFOCUS_REQUEST_DELAYED}.
+ * <br>Note that the return value is never {@link #AUDIOFOCUS_REQUEST_DELAYED} when focus
+ * is requested without building the {@link AudioFocusRequest} with
+ * {@link AudioFocusRequest.Builder#setAcceptsDelayedFocusGain(boolean)} set to
+ * {@code true}.
+ * @throws IllegalArgumentException if passed a null argument
+ */
+ public int requestAudioFocus(@NonNull AudioFocusRequest focusRequest) {
+ if (focusRequest == null) {
+ throw new IllegalArgumentException("Illegal null AudioFocusRequest");
+ }
+ return requestAudioFocus(focusRequest.getOnAudioFocusChangeListener(),
+ focusRequest.getAudioAttributes(),
+ focusRequest.getFocusGain(), focusRequest.getFlags(), null /* no AudioPolicy*/);
+ }
+
+ /**
+ * Abandon audio focus. Causes the previous focus owner, if any, to receive focus.
+ * @param focusRequest the {@link AudioFocusRequest} that was used when requesting focus
+ * with {@link #requestAudioFocus(AudioFocusRequest)}.
+ * @return {@link #AUDIOFOCUS_REQUEST_FAILED} or {@link #AUDIOFOCUS_REQUEST_GRANTED}
+ * @throws IllegalArgumentException if passed a null argument
+ */
+ public int abandonAudioFocusRequest(@NonNull AudioFocusRequest focusRequest) {
+ if (focusRequest == null) {
+ throw new IllegalArgumentException("Illegal null AudioFocusRequest");
+ }
+ return abandonAudioFocus(focusRequest.getOnAudioFocusChangeListener(),
+ focusRequest.getAudioAttributes());
+ }
+
+ /**
* @hide
* Request audio focus.
* Send a request to obtain the audio focus. This method differs from
@@ -2373,8 +2410,7 @@
if (requestAttributes == null) {
throw new IllegalArgumentException("Illegal null AudioAttributes argument");
}
- if ((durationHint < AUDIOFOCUS_GAIN) ||
- (durationHint > AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)) {
+ if (!AudioFocusRequest.isValidFocusGain(durationHint)) {
throw new IllegalArgumentException("Invalid duration hint");
}
if (flags != (flags & AUDIOFOCUS_FLAGS_SYSTEM)) {
diff --git a/media/java/android/media/AudioPlaybackConfiguration.java b/media/java/android/media/AudioPlaybackConfiguration.java
index dd9c6a7..6b8a279 100644
--- a/media/java/android/media/AudioPlaybackConfiguration.java
+++ b/media/java/android/media/AudioPlaybackConfiguration.java
@@ -366,11 +366,18 @@
* @param pw
*/
public void dump(PrintWriter pw) {
- pw.println(" ID:" + mPlayerIId
- + " -- type:" + toLogFriendlyPlayerType(mPlayerType)
- + " -- u/pid:" + mClientUid +"/" + mClientPid
- + " -- state:" + toLogFriendlyPlayerState(mPlayerState)
- + " -- attr:" + mPlayerAttr);
+ pw.println(" " + toLogFriendlyString(this));
+ }
+
+ /**
+ * @hide
+ */
+ public static String toLogFriendlyString(AudioPlaybackConfiguration apc) {
+ return new String("ID:" + apc.mPlayerIId
+ + " -- type:" + toLogFriendlyPlayerType(apc.mPlayerType)
+ + " -- u/pid:" + apc.mClientUid +"/" + apc.mClientPid
+ + " -- state:" + toLogFriendlyPlayerState(apc.mPlayerState)
+ + " -- attr:" + apc.mPlayerAttr);
}
public static final Parcelable.Creator<AudioPlaybackConfiguration> CREATOR
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index ddd8a65..7f5d3a0 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -79,6 +79,7 @@
*/
public class AudioTrack extends PlayerBase
implements AudioRouting
+ , VolumeAutomation
{
//---------------------------------------------------------
// Constants
@@ -1753,6 +1754,12 @@
return native_getVolumeShaperState(id);
}
+ @Override
+ public @NonNull VolumeShaper createVolumeShaper(
+ @NonNull VolumeShaper.Configuration configuration) {
+ return new VolumeShaper(configuration, this);
+ }
+
/**
* Sets the playback sample rate for this track. This sets the sampling rate at which
* the audio data will be consumed and played back
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index fa4796a..5855984 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -192,7 +192,7 @@
oneway void releasePlayer(in int piid);
- void disableRingtoneSync();
+ void disableRingtoneSync(in int userId);
int getFocusRampTimeMs(in int focusGain, in AudioAttributes attr);
diff --git a/media/java/android/media/MediaCas.java b/media/java/android/media/MediaCas.java
new file mode 100644
index 0000000..2e22132
--- /dev/null
+++ b/media/java/android/media/MediaCas.java
@@ -0,0 +1,656 @@
+/*
+ * 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.media;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.util.Log;
+import android.util.Singleton;
+
+/**
+ * MediaCas can be used to obtain keys for descrambling protected media streams, in
+ * conjunction with {@link android.media.MediaDescrambler}. The MediaCas APIs are
+ * designed to support conditional access such as those in the ISO/IEC13818-1.
+ * The CA system is identified by a 16-bit integer CA_system_id. The scrambling
+ * algorithms are usually proprietary and implemented by vendor-specific CA plugins
+ * installed on the device.
+ * <p>
+ * The app is responsible for constructing a MediaCas object for the CA system it
+ * intends to use. The app can query if a certain CA system is supported using static
+ * method {@link #isSystemIdSupported}. It can also obtain the entire list of supported
+ * CA systems using static method {@link #enumeratePlugins}.
+ * <p>
+ * Once the MediaCas object is constructed, the app should properly provision it by
+ * using method {@link #provision} and/or {@link #processEmm}. The EMMs (Entitlement
+ * management messages) can be distributed out-of-band, or in-band with the stream.
+ * <p>
+ * To descramble elementary streams, the app first calls {@link #openSession} to
+ * generate a sessionId that will uniquely identify a session. A session provides
+ * a context for subsequent key updates and descrambling activities. The ECMs
+ * (Entitlement control messages) are sent to the session via method {@link #processEcm}.
+ * <p>
+ * The app next constructs a MediaDescrambler object, and initializes it with the
+ * sessionId using {@link MediaDescrambler#setMediaCasSession}. This ties the
+ * descrambler to the session, and the descrambler can then be used to descramble
+ * content secured with the session's key, either during extraction, or during decoding
+ * with {@link android.media.MediaCodec}.
+ * <p>
+ * If the app handles sample extraction using its own extractor, it can use
+ * MediaDescrambler to descramble samples into clear buffers (if the session's license
+ * doesn't require secure decoders), or descramble a small amount of data to retrieve
+ * information necessary for the downstream pipeline to process the sample (if the
+ * session's license requires secure decoders).
+ * <p>
+ * If the session requires a secure decoder, a MediaDescrambler needs to be provided to
+ * MediaCodec to descramble samples queued by {@link MediaCodec#queueSecureInputBuffer}
+ * into protected buffers. The app should use {@link MediaCodec#configure(MediaFormat,
+ * android.view.Surface, int, MediaDescrambler)} instead of the normal {@link
+ * MediaCodec#configure(MediaFormat, android.view.Surface, MediaCrypto, int)} method
+ * to configure MediaCodec.
+ * <p>
+ * <h3>Using Android's MediaExtractor</h3>
+ * <p>
+ * If the app uses {@link MediaExtractor}, it can delegate the CAS session
+ * management to MediaExtractor by calling {@link MediaExtractor#setMediaCas}.
+ * MediaExtractor will take over and call {@link #openSession}, {@link #processEmm}
+ * and/or {@link #processEcm}, etc.. if necessary.
+ * <p>
+ * When using {@link MediaExtractor}, the app would still need a MediaDescrambler
+ * to use with {@link MediaCodec} if the licensing requires a secure decoder. The
+ * sessionId of the descrambler can be retrieved by {@link MediaExtractor#getDrmInitData}
+ * and used to initialize a MediaDescrambler object for MediaCodec.
+ * <p>
+ * TODO: determine exception handling schemes.
+ * <p>
+ * <h3>Listeners</h3>
+ * <p>The app may register a listener to receive events from the CA system using
+ * method {@link #setEventListener}. The exact format of the event is scheme-specific
+ * and is not specified by this API.
+ */
+public final class MediaCas {
+ private static final String TAG = "MediaCas";
+ private final ParcelableCasData mCasData = new ParcelableCasData();
+ private ICas mICas;
+ private EventListener mListener;
+ private HandlerThread mHandlerThread;
+ private EventHandler mEventHandler;
+
+ private static final Singleton<IMediaCasService> gDefault =
+ new Singleton<IMediaCasService>() {
+ @Override
+ protected IMediaCasService create() {
+ return IMediaCasService.Stub.asInterface(
+ ServiceManager.getService("media.cas"));
+ }
+ };
+
+ static IMediaCasService getService() {
+ return gDefault.get();
+ }
+
+ private void validateInternalStates() {
+ if (mICas == null) {
+ throw new IllegalStateException();
+ }
+ }
+
+ private void cleanupAndRethrowIllegalState() {
+ mICas = null;
+ throw new IllegalStateException();
+ }
+
+ private class EventHandler extends Handler
+ {
+ private static final int MSG_CAS_EVENT = 0;
+
+ public EventHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what == MSG_CAS_EVENT) {
+ mListener.onEvent(MediaCas.this, msg.arg1, msg.arg2, (byte[]) msg.obj);
+ }
+ }
+ }
+
+ private final ICasListener.Stub mBinder = new ICasListener.Stub() {
+ @Override
+ public void onEvent(int event, int arg, @Nullable byte[] data)
+ throws RemoteException {
+ mEventHandler.sendMessage(mEventHandler.obtainMessage(
+ EventHandler.MSG_CAS_EVENT, event, arg, data));
+ }
+ };
+
+ /**
+ * Class for parceling byte array data over ICas binder.
+ */
+ static class ParcelableCasData implements Parcelable {
+ private byte[] mData;
+ private int mOffset;
+ private int mLength;
+
+ ParcelableCasData() {
+ mData = null;
+ mOffset = mLength = 0;
+ }
+
+ private ParcelableCasData(Parcel in) {
+ this();
+ }
+
+ void set(@NonNull byte[] data, int offset, int length) {
+ mData = data;
+ mOffset = offset;
+ mLength = length;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeByteArray(mData, mOffset, mLength);
+ }
+
+ public static final Parcelable.Creator<ParcelableCasData> CREATOR
+ = new Parcelable.Creator<ParcelableCasData>() {
+ public ParcelableCasData createFromParcel(Parcel in) {
+ return new ParcelableCasData(in);
+ }
+
+ public ParcelableCasData[] newArray(int size) {
+ return new ParcelableCasData[size];
+ }
+ };
+ }
+
+ /**
+ * Describe a CAS plugin with its CA_system_ID and string name.
+ *
+ * Returned as results of {@link #enumeratePlugins}.
+ *
+ */
+ public static class PluginDescriptor {
+ private final int mCASystemId;
+ private final String mName;
+
+ private PluginDescriptor() {
+ mCASystemId = 0xffff;
+ mName = null;
+ }
+
+ PluginDescriptor(int CA_system_id, String name) {
+ mCASystemId = CA_system_id;
+ mName = name;
+ }
+
+ public int getSystemId() {
+ return mCASystemId;
+ }
+
+ @NonNull
+ public String getName() {
+ return mName;
+ }
+
+ @Override
+ public String toString() {
+ return "PluginDescriptor {" + mCASystemId + ", " + mName + "}";
+ }
+ }
+
+ /**
+ * Class for parceling CAS plugin descriptors over IMediaCasService binder.
+ */
+ static class ParcelableCasPluginDescriptor
+ extends PluginDescriptor implements Parcelable {
+
+ private ParcelableCasPluginDescriptor(int CA_system_id, String name) {
+ super(CA_system_id, name);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ Log.w(TAG, "ParcelableCasPluginDescriptor.writeToParcel shouldn't be called!");
+ }
+
+ public static final Parcelable.Creator<ParcelableCasPluginDescriptor> CREATOR
+ = new Parcelable.Creator<ParcelableCasPluginDescriptor>() {
+ public ParcelableCasPluginDescriptor createFromParcel(Parcel in) {
+ int CA_system_id = in.readInt();
+ String name = in.readString();
+ return new ParcelableCasPluginDescriptor(CA_system_id, name);
+ }
+
+ public ParcelableCasPluginDescriptor[] newArray(int size) {
+ return new ParcelableCasPluginDescriptor[size];
+ }
+ };
+ }
+
+ /**
+ * Query if a certain CA system is supported on this device.
+ *
+ * @param CA_system_id the id of the CA system.
+ *
+ * @return Whether the specified CA system is supported on this device.
+ */
+ public static boolean isSystemIdSupported(int CA_system_id) {
+ IMediaCasService service = getService();
+
+ if (service != null) {
+ try {
+ return service.isSystemIdSupported(CA_system_id);
+ } catch (RemoteException e) {
+ }
+ }
+ return false;
+ }
+
+ /**
+ * List all available CA plugins on the device.
+ *
+ * @return an array of descriptors for the available CA plugins.
+ */
+ public static PluginDescriptor[] enumeratePlugins() {
+ IMediaCasService service = getService();
+
+ if (service != null) {
+ try {
+ ParcelableCasPluginDescriptor[] descriptors = service.enumeratePlugins();
+ if (descriptors.length == 0) {
+ return null;
+ }
+ PluginDescriptor[] results = new PluginDescriptor[descriptors.length];
+ for (int i = 0; i < results.length; i++) {
+ results[i] = descriptors[i];
+ }
+ return results;
+ } catch (RemoteException e) {
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Instantiate a CA system of the specified system id.
+ *
+ * @param CA_system_id The system id of the CA system.
+ *
+ * @throws UnsupportedCasException if the device does not support the
+ * specified CA system.
+ */
+ public MediaCas(int CA_system_id) throws UnsupportedCasException {
+ try {
+ mICas = getService().createPlugin(CA_system_id, mBinder);
+ } catch(Exception e) {
+ Log.e(TAG, "Failed to create plugin: " + e);
+ mICas = null;
+ } finally {
+ if (mICas == null) {
+ throw new UnsupportedCasException(
+ "Unsupported CA_system_id " + CA_system_id);
+ }
+ }
+ }
+
+ IBinder getBinder() {
+ validateInternalStates();
+
+ return mICas.asBinder();
+ }
+
+ /**
+ * An interface registered by the caller to {@link #setEventListener}
+ * to receives scheme-specific notifications from a MediaCas instance.
+ */
+ public interface EventListener {
+ /**
+ * Notify the listener of a scheme-specific event from the CA system.
+ *
+ * @param MediaCas the MediaCas object to receive this event.
+ * @param event an integer whose meaning is scheme-specific.
+ * @param arg an integer whose meaning is scheme-specific.
+ * @param data a byte array of data whose format and meaning are
+ * scheme-specific.
+ */
+ void onEvent(MediaCas MediaCas, int event, int arg, @Nullable byte[] data);
+ }
+
+ /**
+ * Set an event listener to receive notifications from the MediaCas instance.
+ *
+ * @param listener the event listener to be set.
+ * @param handler the handler whose looper the event listener will be called on.
+ * If handler is null, we'll try to use current thread's looper, or the main
+ * looper. If neither are available, an internal thread will be created instead.
+ */
+ public void setEventListener(
+ @Nullable EventListener listener, @Nullable Handler handler) {
+ mListener = listener;
+
+ if (mListener == null) {
+ mEventHandler = null;
+ return;
+ }
+
+ Looper looper = (handler != null) ? handler.getLooper() : null;
+ if (looper == null
+ && (looper = Looper.myLooper()) == null
+ && (looper = Looper.getMainLooper()) == null) {
+ if (mHandlerThread == null || !mHandlerThread.isAlive()) {
+ mHandlerThread = new HandlerThread("MediaCasEventThread",
+ Process.THREAD_PRIORITY_FOREGROUND);
+ mHandlerThread.start();
+ }
+ looper = mHandlerThread.getLooper();
+ }
+ mEventHandler = new EventHandler(looper);
+ }
+
+ /*
+ * TODO: handle ServiceSpecificException from the IMediaCas
+ * All Drm-specific failures will be thrown by mICas as
+ * ServiceSpecificException exception with Drm error code.
+ * These need to be re-thrown as crypto exceptions.
+ */
+
+ /**
+ * Send the private data for the CA system.
+ *
+ * @param data byte array of the private data.
+ *
+ * @throws IllegalStateException if the MediaCas instance is not valid.
+ */
+ /*
+ * TODO: need to re-throw DRM-specific exceptions
+ */
+ public void setPrivateData(@NonNull byte[] data) {
+ validateInternalStates();
+
+ try {
+ mICas.setPrivateData(data);
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
+ }
+ }
+
+ /**
+ * Open a session for the specified program.
+ *
+ * @param programNumber program_number of the program (as in ISO/IEC13818-1).
+ *
+ * @return session id of the newly opened session.
+ *
+ * @throws IllegalStateException if the MediaCas instance is not valid,
+ * or IllegalArgumentException if a session for the program already exists.
+ */
+ public byte[] openSession(int programNumber) {
+ validateInternalStates();
+
+ try {
+ return mICas.openSession(programNumber);
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
+ }
+ return null;
+ }
+
+ /**
+ * Open a session for the specified stream.
+ *
+ * @param programNumber program_number of the stream (as in ISO/IEC13818-1).
+ * @param elementaryPID elementary_PID of the stream (as in ISO/IEC13818-1).
+ *
+ * @return session id of the newly opened session.
+ *
+ * @throws IllegalStateException if the MediaCas instance is not valid,
+ * or IllegalArgumentException if a session for the stream already exists.
+ */
+ public byte[] openSession(int programNumber, int elementaryPID) {
+ validateInternalStates();
+
+ try {
+ return mICas.openSessionForStream(programNumber, elementaryPID);
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
+ }
+ return null;
+ }
+
+ /**
+ * Close the specified session.
+ *
+ * @param sessionId the session to be closed.
+ *
+ * @throws IllegalStateException if the MediaCas instance is not valid,
+ * or IllegalArgumentException if the session is not valid.
+ */
+ public void closeSession(@NonNull byte[] sessionId) {
+ validateInternalStates();
+
+ try {
+ mICas.closeSession(sessionId);
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
+ }
+ }
+
+ /**
+ * Set the private data for a session.
+ *
+ * @param sessionId the session for which the private data is intended.
+ * @param data byte array of the private data.
+ *
+ * @throws IllegalStateException if the MediaCas instance is not valid,
+ * or IllegalArgumentException if the session is not valid.
+ */
+ /*
+ * TODO: need to re-throw DRM-specific exceptions
+ */
+ public void setSessionPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data) {
+ validateInternalStates();
+
+ try {
+ mICas.setSessionPrivateData(sessionId, data);
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
+ }
+ }
+
+ /**
+ * Send a received ECM packet to the specified session of the CA system.
+ *
+ * @param sessionId the session for which the ECM is intended.
+ * @param data byte array of the ECM data.
+ * @param offset position within data where the ECM data begins.
+ * @param length length of the data (starting from offset).
+ *
+ * @throws IllegalStateException if the MediaCas instance is not valid,
+ * or IllegalArgumentException if the session is not valid.
+ */
+ /*
+ * TODO: need to re-throw DRM-specific exceptions
+ */
+ public void processEcm(
+ @NonNull byte[] sessionId, @NonNull byte[] data, int offset, int length) {
+ validateInternalStates();
+
+ try {
+ mCasData.set(data, offset, length);
+ mICas.processEcm(sessionId, mCasData);
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
+ }
+ }
+
+ /**
+ * Send a received ECM packet to the specified session of the CA system.
+ * This is similar to {@link #processEcm(byte[], byte[], int, int)}
+ * except that the entire byte array is sent.
+ *
+ * @param sessionId the session for which the ECM is intended.
+ * @param data byte array of the ECM data.
+ *
+ * @throws IllegalStateException if the MediaCas instance is not valid,
+ * or IllegalArgumentException if the session is not valid.
+ */
+ /*
+ * TODO: need to re-throw DRM-specific exceptions
+ */
+ public void processEcm(@NonNull byte[] sessionId, @NonNull byte[] data) {
+ processEcm(sessionId, data, 0, data.length);
+ }
+
+ /**
+ * Send a received EMM packet to the CA system.
+ *
+ * @param data byte array of the EMM data.
+ * @param offset position within data where the EMM data begins.
+ * @param length length of the data (starting from offset).
+ *
+ * @throws IllegalStateException if the MediaCas instance is not valid.
+ */
+ /*
+ * TODO: need to re-throw DRM-specific exceptions
+ */
+ public void processEmm(@NonNull byte[] data, int offset, int length) {
+ validateInternalStates();
+
+ try {
+ mCasData.set(data, offset, length);
+ mICas.processEmm(mCasData);
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
+ }
+ }
+
+ /**
+ * Send a received EMM packet to the CA system. This is similar to
+ * {@link #processEmm(byte[], int, int)} except that the entire byte
+ * array is sent.
+ *
+ * @param data byte array of the EMM data.
+ *
+ * @throws IllegalStateException if the MediaCas instance is not valid.
+ */
+ /*
+ * TODO: need to re-throw DRM-specific exceptions
+ */
+ public void processEmm(@NonNull byte[] data) {
+ processEmm(data, 0, data.length);
+ }
+
+ /**
+ * Send an event to a CA system. The format of the event is scheme-specific
+ * and is opaque to the framework.
+ *
+ * @param event an integer denoting a scheme-specific event to be sent.
+ * @param arg a scheme-specific integer argument for the event.
+ * @param data a byte array containing scheme-specific data for the event.
+ *
+ * @throws IllegalStateException if the MediaCas instance is not valid.
+ */
+ public void sendEvent(int event, int arg, @Nullable byte[] data) {
+ validateInternalStates();
+
+ try {
+ mICas.sendEvent(event, arg, data);
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
+ }
+ }
+
+ /**
+ * Initiate a provisioning operation for a CA system.
+ *
+ * @param provisionString string containing information needed for the
+ * provisioning operation, the format of which is scheme and implementation
+ * specific.
+ *
+ * @throws IllegalStateException if the MediaCas instance is not valid.
+ */
+ public void provision(@NonNull String provisionString) {
+ validateInternalStates();
+
+ try {
+ mICas.provision(provisionString);
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
+ }
+ }
+
+ /**
+ * Notify the CA system to refresh entitlement keys.
+ *
+ * @param refreshType the type of the refreshment.
+ * @param refreshData private data associated with the refreshment.
+ *
+ * @throws IllegalStateException if the MediaCas instance is not valid.
+ */
+ /*
+ * TODO: define enums for refreshType
+ */
+ public void refreshEntitlements(int refreshType, @Nullable byte[] refreshData) {
+ validateInternalStates();
+
+ try {
+ mICas.refreshEntitlements(refreshType, refreshData);
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
+ }
+ }
+
+ /**
+ * Release the MediaCas instance.
+ */
+ public void release() {
+ if (mICas != null) {
+ try {
+ mICas.release();
+ } catch (RemoteException e) {
+ } finally {
+ mICas = null;
+ }
+ }
+ }
+
+ @Override
+ protected void finalize() {
+ release();
+ }
+}
\ No newline at end of file
diff --git a/core/java/android/companion/ICompanionDeviceManagerServiceCallback.aidl b/media/java/android/media/MediaCasException.java
similarity index 65%
copy from core/java/android/companion/ICompanionDeviceManagerServiceCallback.aidl
copy to media/java/android/media/MediaCasException.java
index c9dd345..1d5d3cd 100644
--- a/core/java/android/companion/ICompanionDeviceManagerServiceCallback.aidl
+++ b/media/java/android/media/MediaCasException.java
@@ -10,15 +10,17 @@
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing per missions and
+ * See the License for the specific language governing permissions and
* limitations under the License.
*/
-package android.companion;
+package android.media;
-import android.bluetooth.BluetoothDevice;
-
-/** @hide */
-interface ICompanionDeviceManagerServiceCallback {
- void onDeviceSelected(in BluetoothDevice device);
+/**
+ * Base class for MediaCas exceptions
+ */
+public class MediaCasException extends Exception {
+ public MediaCasException(String detailMessage) {
+ super(detailMessage);
+ }
}
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 75ccffe..1ca9658 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -25,6 +25,7 @@
import android.media.MediaCodecInfo.CodecCapabilities;
import android.os.Bundle;
import android.os.Handler;
+import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.view.Surface;
@@ -1567,6 +1568,13 @@
*/
public static final int BUFFER_FLAG_END_OF_STREAM = 4;
+ /**
+ * This indicates that the buffer only contains part of a frame,
+ * and the decoder should batch the data until a buffer without
+ * this flag appears before decoding the frame.
+ */
+ public static final int BUFFER_FLAG_PARTIAL_FRAME = 8;
+
/** @hide */
@IntDef(
flag = true,
@@ -1575,6 +1583,7 @@
BUFFER_FLAG_KEY_FRAME,
BUFFER_FLAG_CODEC_CONFIG,
BUFFER_FLAG_END_OF_STREAM,
+ BUFFER_FLAG_PARTIAL_FRAME,
})
@Retention(RetentionPolicy.SOURCE)
public @interface BufferFlag {}
@@ -1851,6 +1860,48 @@
@Nullable MediaFormat format,
@Nullable Surface surface, @Nullable MediaCrypto crypto,
@ConfigureFlag int flags) {
+ configure(format, surface, crypto, null, flags);
+ }
+
+ /**
+ * Configure a component to be used with a descrambler.
+ * @param format The format of the input data (decoder) or the desired
+ * format of the output data (encoder). Passing {@code null}
+ * as {@code format} is equivalent to passing an
+ * {@link MediaFormat#MediaFormat an empty mediaformat}.
+ * @param surface Specify a surface on which to render the output of this
+ * decoder. Pass {@code null} as {@code surface} if the
+ * codec does not generate raw video output (e.g. not a video
+ * decoder) and/or if you want to configure the codec for
+ * {@link ByteBuffer} output.
+ * @param flags Specify {@link #CONFIGURE_FLAG_ENCODE} to configure the
+ * component as an encoder.
+ * @param descrambler Specify a descrambler object to facilitate secure
+ * descrambling of the media data. descrambler must not be
+ * null if this method is used. For non-secure codecs, use
+ * {@link #configure} and with null crypto parameter.
+ * @throws IllegalArgumentException if the surface has been released (or is invalid),
+ * or the format is unacceptable (e.g. missing a mandatory key),
+ * or the flags are not set properly
+ * (e.g. missing {@link #CONFIGURE_FLAG_ENCODE} for an encoder).
+ * @throws IllegalStateException if not in the Uninitialized state.
+ * @throws CryptoException upon DRM error.
+ * @throws CodecException upon codec error.
+ */
+ public void configure(
+ @Nullable MediaFormat format, @Nullable Surface surface,
+ @ConfigureFlag int flags, @NonNull MediaDescrambler descrambler) {
+ configure(format, surface, null, descrambler.getBinder(), flags);
+ }
+
+ private void configure(
+ @Nullable MediaFormat format, @Nullable Surface surface,
+ @Nullable MediaCrypto crypto, @Nullable IBinder descramblerBinder,
+ @ConfigureFlag int flags) {
+ if (crypto != null && descramblerBinder != null) {
+ throw new IllegalArgumentException("Can't use crypto and descrambler together!");
+ }
+
String[] keys = null;
Object[] values = null;
@@ -1881,7 +1932,7 @@
mHasSurface = surface != null;
- native_configure(keys, values, surface, crypto, flags);
+ native_configure(keys, values, surface, crypto, descramblerBinder, flags);
}
/**
@@ -1959,7 +2010,8 @@
private native final void native_configure(
@Nullable String[] keys, @Nullable Object[] values,
- @Nullable Surface surface, @Nullable MediaCrypto crypto, @ConfigureFlag int flags);
+ @Nullable Surface surface, @Nullable MediaCrypto crypto,
+ @Nullable IBinder descramblerBinder, @ConfigureFlag int flags);
/**
* Requests a Surface to use as the input to an encoder, in place of input buffers. This
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index 8ada295f..3ac4c34 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -460,6 +460,11 @@
public static final String FEATURE_TunneledPlayback = "tunneled-playback";
/**
+ * <b>video decoder only</b>: codec supports queuing partial frames.
+ */
+ public static final String FEATURE_PartialFrame = "partial-frame";
+
+ /**
* <b>video encoder only</b>: codec supports intra refresh.
*/
public static final String FEATURE_IntraRefresh = "intra-refresh";
@@ -489,6 +494,7 @@
new Feature(FEATURE_AdaptivePlayback, (1 << 0), true),
new Feature(FEATURE_SecurePlayback, (1 << 1), false),
new Feature(FEATURE_TunneledPlayback, (1 << 2), false),
+ new Feature(FEATURE_PartialFrame, (1 << 3), false),
};
private static final Feature[] encoderFeatures = {
diff --git a/media/java/android/media/MediaDescrambler.java b/media/java/android/media/MediaDescrambler.java
new file mode 100644
index 0000000..f5eede8
--- /dev/null
+++ b/media/java/android/media/MediaDescrambler.java
@@ -0,0 +1,249 @@
+/*
+ * 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.media;
+
+import android.annotation.NonNull;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.RemoteException;
+import android.util.Log;
+
+import java.nio.ByteBuffer;
+
+/**
+ * MediaDescrambler class can be used in conjunction with {@link android.media.MediaCodec}
+ * and {@link android.media.MediaExtractor} to decode media data scrambled by conditional
+ * access (CA) systems such as those in the ISO/IEC13818-1.
+ *
+ * A MediaDescrambler object is initialized from a session opened by a MediaCas object,
+ * and can be used to descramble media streams scrambled with that session's keys.
+ *
+ * Scrambling schemes are identified by 16-bit unsigned integer as in CA_system_id.
+ *
+ */
+public final class MediaDescrambler {
+ private static final String TAG = "MediaDescrambler";
+ private IDescrambler mIDescrambler;
+
+ private final void validateInternalStates() {
+ if (mIDescrambler == null) {
+ throw new IllegalStateException();
+ }
+ }
+
+ private final void cleanupAndRethrowIllegalState() {
+ mIDescrambler = null;
+ throw new IllegalStateException();
+ }
+
+ /**
+ * Class for parceling descrambling parameters over IDescrambler binder.
+ */
+ static class DescrambleInfo implements Parcelable {
+ private DescrambleInfo() {
+ // TODO: implement
+ }
+
+ private DescrambleInfo(Parcel in) {
+ // TODO: disable
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ // TODO: implement
+ }
+
+ public static final Parcelable.Creator<DescrambleInfo> CREATOR
+ = new Parcelable.Creator<DescrambleInfo>() {
+ public DescrambleInfo createFromParcel(Parcel in) {
+ return new DescrambleInfo(in);
+ }
+
+ public DescrambleInfo[] newArray(int size) {
+ return new DescrambleInfo[size];
+ }
+ };
+ }
+
+ /**
+ * Instantiate a MediaDescrambler.
+ *
+ * @param CA_system_id The system id of the scrambling scheme.
+ *
+ * @throws UnsupportedCasException if the scrambling scheme is not supported.
+ */
+ public MediaDescrambler(int CA_system_id) throws UnsupportedCasException {
+ try {
+ mIDescrambler = MediaCas.getService().createDescrambler(CA_system_id);
+ } catch(Exception e) {
+ Log.e(TAG, "Failed to create descrambler: " + e);
+ mIDescrambler = null;
+ } finally {
+ if (mIDescrambler == null) {
+ throw new UnsupportedCasException("Unsupported CA_system_id " + CA_system_id);
+ }
+ }
+ native_setup(mIDescrambler.asBinder());
+ }
+
+ IBinder getBinder() {
+ validateInternalStates();
+
+ return mIDescrambler.asBinder();
+ }
+
+ /*
+ * TODO: handle ServiceSpecificException from the mIDescrambler
+ * All Drm-specific failures will be thrown by mIDescrambler as
+ * ServiceSpecificException exception with Drm error code.
+ * These need to be re-thrown as crypto exceptions.
+ */
+
+ /**
+ * Query if the scrambling scheme requires the use of a secure decoder
+ * to decode data of the given mime type.
+ *
+ * @param mime The mime type of the media data
+ *
+ * @throws IllegalStateException if the descrambler instance is not valid.
+ */
+ public final boolean requiresSecureDecoderComponent(@NonNull String mime) {
+ validateInternalStates();
+
+ try {
+ return mIDescrambler.requiresSecureDecoderComponent(mime);
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
+ }
+ return true;
+ }
+
+ /**
+ * Associate a MediaCas session with this MediaDescrambler instance.
+ * The MediaCas session is used to securely load decryption keys for
+ * the descrambler. The crypto keys loaded through the MediaCas session
+ * may be selected for use during the descrambling operation performed
+ * by {@link android.media.MediaExtractor or @link
+ * android.media.MediaCodec#queueSecureInputBuffer} by specifying even
+ * or odd key in the {@link android.media.MediaCodec.CryptoInfo#key} field.
+ *
+ * @param sessionId the MediaCas sessionId to associate with this
+ * MediaDescrambler instance.
+ *
+ * @throws IllegalStateException if the descrambler instance is not valid,
+ * or IllegalArgumentException if the sessionId is not valid.
+ */
+ public final void setMediaCasSession(@NonNull byte[] sessionId) {
+ validateInternalStates();
+
+ try {
+ mIDescrambler.setMediaCasSession(sessionId);
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
+ }
+ }
+
+ /**
+ * Descramble a ByteBuffer of data described by a
+ * {@link android.media.MediaCodec.CryptoInfo} structure.
+ *
+ * @param srcBuf ByteBuffer containing the scrambled data.
+ * @param srcPos position within src where the scrambled data starts.
+ * @param dstBuf ByteBuffer to descramble into. If null, descrambling will happen
+ * in-place and src will be used as dst.
+ * @param dstPos position within dst to put the descrambled data.
+ * @param cryptoInfo a {@link android.media.MediaCodec.CryptoInfo} structure
+ * describing the subsamples contained in src.
+ *
+ * @return number of bytes that have been successfully descrambled, with negative
+ * values indicating errors.
+ *
+ * @throws IllegalStateException if the descrambler instance is not valid.
+ */
+ /*
+ * TODO: throw DRM-specific exception if decrambling is failing.
+ */
+ public final int descramble(
+ @NonNull ByteBuffer srcBuf, int srcPos, ByteBuffer dstBuf, int dstPos,
+ @NonNull MediaCodec.CryptoInfo cryptoInfo) {
+ validateInternalStates();
+
+ if (cryptoInfo.numSubSamples <= 0) {
+ throw new IllegalArgumentException(
+ "Invalid CryptoInfo: invalid numSubSamples=" + cryptoInfo.numSubSamples);
+ } else if (cryptoInfo.numBytesOfClearData == null
+ && cryptoInfo.numBytesOfEncryptedData == null) {
+ throw new IllegalArgumentException(
+ "Invalid CryptoInfo: clearData and encryptedData size arrays are both null!");
+ } else if (cryptoInfo.numBytesOfClearData != null
+ && cryptoInfo.numBytesOfClearData.length < cryptoInfo.numSubSamples) {
+ throw new IllegalArgumentException(
+ "Invalid CryptoInfo: numBytesOfClearData is too small!");
+ } else if (cryptoInfo.numBytesOfEncryptedData != null
+ && cryptoInfo.numBytesOfEncryptedData.length < cryptoInfo.numSubSamples) {
+ throw new IllegalArgumentException(
+ "Invalid CryptoInfo: numBytesOfEncryptedData is too small!");
+ } else if (cryptoInfo.key == null || cryptoInfo.key.length != 16) {
+ throw new IllegalArgumentException(
+ "Invalid CryptoInfo: key array is invalid!");
+ }
+
+ return native_descramble(
+ cryptoInfo.key[0],
+ cryptoInfo.numSubSamples,
+ cryptoInfo.numBytesOfClearData,
+ cryptoInfo.numBytesOfEncryptedData,
+ srcBuf, srcPos, dstBuf, dstPos);
+ }
+
+ public final void release() {
+ if (mIDescrambler != null) {
+ try {
+ mIDescrambler.release();
+ } catch (RemoteException e) {
+ } finally {
+ mIDescrambler = null;
+ }
+ }
+ native_release();
+ }
+
+ @Override
+ protected void finalize() {
+ release();
+ }
+
+ private static native final void native_init();
+ private native final void native_setup(@NonNull IBinder decramblerBinder);
+ private native final void native_release();
+ private native final int native_descramble(
+ byte key, int numSubSamples, int[] numBytesOfClearData, int[] numBytesOfEncryptedData,
+ @NonNull ByteBuffer srcBuf, int srcOffset, ByteBuffer dstBuf, int dstOffset);
+
+ static {
+ System.loadLibrary("media_jni");
+ native_init();
+ }
+
+ private long mNativeContext;
+}
\ No newline at end of file
diff --git a/media/java/android/media/MediaExtractor.java b/media/java/android/media/MediaExtractor.java
index 2ca36ea..01ae36f 100644
--- a/media/java/android/media/MediaExtractor.java
+++ b/media/java/android/media/MediaExtractor.java
@@ -247,6 +247,22 @@
public native final void setDataSource(
@NonNull FileDescriptor fd, long offset, long length) throws IOException;
+ /**
+ * Sets the MediaCas instance to use. This should be called after a
+ * successful setDataSource() if at least one track reports mime type
+ * of {@link android.media.MediaFormat#MIMETYPE_AUDIO_SCRAMBLED}
+ * or {@link android.media.MediaFormat#MIMETYPE_VIDEO_SCRAMBLED}.
+ * Stream parsing will not proceed until a valid MediaCas object
+ * is provided.
+ *
+ * @param mediaCas the MediaCas object to use.
+ */
+ public final void setMediaCas(@NonNull MediaCas mediaCas) {
+ nativeSetMediaCas(mediaCas.getBinder());
+ }
+
+ private native final void nativeSetMediaCas(@NonNull IBinder casBinder);
+
@Override
protected void finalize() {
native_finalize();
@@ -290,6 +306,31 @@
return initDataMap.get(schemeUuid);
}
};
+ } else if (formatMap.containsKey("mime")
+ && "video/mp2ts".equals(formatMap.get("mime"))) {
+ final Map<UUID, DrmInitData.SchemeInitData> initDataMap =
+ new HashMap<UUID, DrmInitData.SchemeInitData>();
+
+ int numTracks = getTrackCount();
+ for (int i = 0; i < numTracks; ++i) {
+ Map<String, Object> trackFormatMap = getTrackFormatNative(i);
+ if (!trackFormatMap.containsKey("cas")) {
+ continue;
+ }
+ ByteBuffer buf = (ByteBuffer) trackFormatMap.get("cas");
+ buf.rewind();
+ final byte[] data = new byte[buf.remaining()];
+ buf.get(data);
+ initDataMap.put(new UUID(0, i), new DrmInitData.SchemeInitData("cas", data));
+ }
+ if (initDataMap.isEmpty()) {
+ return null;
+ }
+ return new DrmInitData() {
+ public SchemeInitData get(UUID schemeUuid) {
+ return initDataMap.get(schemeUuid);
+ }
+ };
} else {
int numTracks = getTrackCount();
for (int i = 0; i < numTracks; ++i) {
@@ -307,8 +348,8 @@
}
};
}
+ return null;
}
- return null;
}
/**
@@ -557,12 +598,22 @@
*/
public static final int SAMPLE_FLAG_ENCRYPTED = 2;
+ /**
+ * This indicates that the buffer only contains part of a frame,
+ * and the decoder should batch the data until a buffer without
+ * this flag appears before decoding the frame.
+ *
+ * @see MediaCodec#BUFFER_FLAG_PARTIAL_FRAME
+ */
+ public static final int SAMPLE_FLAG_PARTIAL_FRAME = 4;
+
/** @hide */
@IntDef(
flag = true,
value = {
SAMPLE_FLAG_SYNC,
SAMPLE_FLAG_ENCRYPTED,
+ SAMPLE_FLAG_PARTIAL_FRAME,
})
@Retention(RetentionPolicy.SOURCE)
public @interface SampleFlag {}
diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java
index d74aa81..e77c00b 100644
--- a/media/java/android/media/MediaFormat.java
+++ b/media/java/android/media/MediaFormat.java
@@ -53,6 +53,7 @@
* time-interval between key frames.
* Float support added in {@link android.os.Build.VERSION_CODES#N_MR1}</td></tr>
* <tr><td>{@link #KEY_INTRA_REFRESH_PERIOD}</td><td>Integer</td><td><b>encoder-only</b>, optional</td></tr>
+ * <tr><td>{@link #KEY_LATENCY}</td><td>Integer</td><td><b>encoder-only</b>, optional</td></tr>
* <tr><td>{@link #KEY_MAX_WIDTH}</td><td>Integer</td><td><b>decoder-only</b>, optional, max-resolution width</td></tr>
* <tr><td>{@link #KEY_MAX_HEIGHT}</td><td>Integer</td><td><b>decoder-only</b>, optional, max-resolution height</td></tr>
* <tr><td>{@link #KEY_REPEAT_PREVIOUS_FRAME_AFTER}</td><td>Long</td><td><b>encoder in surface-mode
@@ -105,6 +106,8 @@
public static final String MIMETYPE_VIDEO_H263 = "video/3gpp";
public static final String MIMETYPE_VIDEO_MPEG2 = "video/mpeg2";
public static final String MIMETYPE_VIDEO_RAW = "video/raw";
+ public static final String MIMETYPE_VIDEO_DOLBY_VISION = "video/dolby-vision";
+ public static final String MIMETYPE_VIDEO_SCRAMBLED = "video/scrambled";
public static final String MIMETYPE_AUDIO_AMR_NB = "audio/3gpp";
public static final String MIMETYPE_AUDIO_AMR_WB = "audio/amr-wb";
@@ -120,7 +123,7 @@
public static final String MIMETYPE_AUDIO_MSGSM = "audio/gsm";
public static final String MIMETYPE_AUDIO_AC3 = "audio/ac3";
public static final String MIMETYPE_AUDIO_EAC3 = "audio/eac3";
- public static final String MIMETYPE_VIDEO_DOLBY_VISION = "video/dolby-vision";
+ public static final String MIMETYPE_AUDIO_SCRAMBLED = "audio/scrambled";
/**
* MIME type for WebVTT subtitle data.
@@ -575,6 +578,18 @@
public static final String KEY_LEVEL = "level";
/**
+ * An optional key describing the desired encoder latency in frames. This is an optional
+ * parameter that applies only to video encoders. If encoder supports it, it should ouput
+ * at least one output frame after being queued the specified number of frames. This key
+ * is ignored if the video encoder does not support the latency feature. Use the output
+ * format to verify that this feature was enabled and the actual value used by the encoder.
+ * <p>
+ * If the key is not specified, the default latency will be implenmentation specific.
+ * The associated value is an integer.
+ */
+ public static final String KEY_LATENCY = "latency";
+
+ /**
* A key describing the desired clockwise rotation on an output surface.
* This key is only used when the codec is configured using an output surface.
* The associated value is an integer, representing degrees. Supported values
diff --git a/media/java/android/media/MediaHTTPConnection.java b/media/java/android/media/MediaHTTPConnection.java
index d6bf421..228a6de 100644
--- a/media/java/android/media/MediaHTTPConnection.java
+++ b/media/java/android/media/MediaHTTPConnection.java
@@ -61,8 +61,9 @@
private final static int MAX_REDIRECTS = 20;
public MediaHTTPConnection() {
- if (CookieHandler.getDefault() == null) {
- CookieHandler.setDefault(new CookieManager());
+ CookieManager cookieManager = (CookieManager)CookieHandler.getDefault();
+ if (cookieManager == null) {
+ Log.w(TAG, "MediaHTTPConnection: Unexpected. No CookieManager found.");
}
native_setup();
diff --git a/media/java/android/media/MediaHTTPService.java b/media/java/android/media/MediaHTTPService.java
index 52a68bf..b678630 100644
--- a/media/java/android/media/MediaHTTPService.java
+++ b/media/java/android/media/MediaHTTPService.java
@@ -19,25 +19,78 @@
import android.os.IBinder;
import android.util.Log;
+import java.net.CookieHandler;
+import java.net.CookieManager;
+import java.net.CookieStore;
+import java.net.HttpCookie;
+import java.util.List;
+
/** @hide */
public class MediaHTTPService extends IMediaHTTPService.Stub {
private static final String TAG = "MediaHTTPService";
+ private List<HttpCookie> mCookies;
+ private Boolean mCookieStoreInitialized = new Boolean(false);
- public MediaHTTPService() {
+ public MediaHTTPService(List<HttpCookie> cookies) {
+ mCookies = cookies;
+ Log.v(TAG, "MediaHTTPService(" + this + "): Cookies: " + cookies);
}
public IMediaHTTPConnection makeHTTPConnection() {
+
+ synchronized (mCookieStoreInitialized) {
+ // Only need to do it once for all connections
+ if ( !mCookieStoreInitialized ) {
+ CookieManager cookieManager = (CookieManager)CookieHandler.getDefault();
+ if (cookieManager == null) {
+ cookieManager = new CookieManager();
+ CookieHandler.setDefault(cookieManager);
+ Log.v(TAG, "makeHTTPConnection: CookieManager created: " + cookieManager);
+ }
+ else {
+ Log.v(TAG, "makeHTTPConnection: CookieManager(" + cookieManager + ") exists.");
+ }
+
+ // Applying the bootstrapping cookies
+ if ( mCookies != null ) {
+ CookieStore store = cookieManager.getCookieStore();
+ for ( HttpCookie cookie : mCookies ) {
+ try {
+ store.add(null, cookie);
+ } catch ( Exception e ) {
+ Log.v(TAG, "makeHTTPConnection: CookieStore.add" + e);
+ }
+ //for extended debugging when needed
+ //Log.v(TAG, "MediaHTTPConnection adding Cookie[" + cookie.getName() +
+ // "]: " + cookie);
+ }
+ } // mCookies
+
+ mCookieStoreInitialized = true;
+
+ Log.v(TAG, "makeHTTPConnection(" + this + "): cookieManager: " + cookieManager +
+ " Cookies: " + mCookies);
+ } // mCookieStoreInitialized
+ } // synchronized
+
return new MediaHTTPConnection();
}
/* package private */static IBinder createHttpServiceBinderIfNecessary(
String path) {
+ return createHttpServiceBinderIfNecessary(path, null);
+ }
+
+ // when cookies are provided
+ static IBinder createHttpServiceBinderIfNecessary(
+ String path, List<HttpCookie> cookies) {
if (path.startsWith("http://") || path.startsWith("https://")) {
- return (new MediaHTTPService()).asBinder();
+ return (new MediaHTTPService(cookies)).asBinder();
} else if (path.startsWith("widevine://")) {
Log.d(TAG, "Widevine classic is no longer supported");
}
return null;
}
+
}
diff --git a/media/java/android/media/MediaMuxer.java b/media/java/android/media/MediaMuxer.java
index 80832f8..832b297 100644
--- a/media/java/android/media/MediaMuxer.java
+++ b/media/java/android/media/MediaMuxer.java
@@ -32,9 +32,8 @@
import java.util.Map;
/**
- * MediaMuxer facilitates muxing elementary streams. Currently supports mp4 or
- * webm file as the output and at most one audio and/or one video elementary
- * stream. MediaMuxer does not support muxing B-frames.
+ * MediaMuxer facilitates muxing elementary streams. Currently MediaMuxer supports MP4, Webm
+ * and 3GP file as the output. It also supports muxing B-frames in MP4 since Android Nougat.
* <p>
* It is generally used like this:
*
@@ -65,6 +64,184 @@
* muxer.stop();
* muxer.release();
* </pre>
+ *
+
+ <h4>Metadata Track</h4>
+ <p>
+ Per-frame metadata is useful in carrying extra information that correlated with video or audio to
+ facilitate offline processing, e.g. gyro signals from the sensor could help video stabilization when
+ doing offline processing. Metaadata track is only supported in MP4 container. When adding a new
+ metadata track, track's mime format must start with prefix "application/", e.g. "applicaton/gyro".
+ Metadata's format/layout will be defined by the application. Writing metadata is nearly the same as
+ writing video/audio data except that the data will not be from mediacodec. Application just needs
+ to pass the bytebuffer that contains the metadata and also the associated timestamp to the
+ {@link #writeSampleData} api. The timestamp must be in the same time base as video and audio. The
+ generated MP4 file uses TextMetaDataSampleEntry defined in section 12.3.3.2 of the ISOBMFF to signal
+ the metadata's mime format. When using{@link android.media.MediaExtractor} to extract the file with
+ metadata track, the mime format of the metadata will be extracted into {@link android.media.MediaFormat}.
+
+ <pre class=prettyprint>
+ MediaMuxer muxer = new MediaMuxer("temp.mp4", OutputFormat.MUXER_OUTPUT_MPEG_4);
+ // SetUp Video/Audio Tracks.
+ MediaFormat audioFormat = new MediaFormat(...);
+ MediaFormat videoFormat = new MediaFormat(...);
+ int audioTrackIndex = muxer.addTrack(audioFormat);
+ int videoTrackIndex = muxer.addTrack(videoFormat);
+
+ // Setup Metadata Track
+ MediaFormat metadataFormat = new MediaFormat(...);
+ metadataFormat.setString(KEY_MIME, "application/gyro");
+ int metadataTrackIndex = muxer.addTrack(metadataFormat);
+
+ muxer.start();
+ while(..) {
+ // Allocate bytebuffer and write gyro data(x,y,z) into it.
+ ByteBuffer metaData = ByteBuffer.allocate(bufferSize);
+ metaData.putFloat(x);
+ metaData.putFloat(y);
+ metaData.putFloat(z);
+ BufferInfo metaInfo = new BufferInfo();
+ // Associate this metadata with the video frame by setting
+ // the same timestamp as the video frame.
+ metaInfo.presentationTimeUs = currentVideoTrackTimeUs;
+ metaInfo.offset = 0;
+ metaInfo.flags = 0;
+ metaInfo.size = bufferSize;
+ muxer.writeSampleData(metadataTrackIndex, metaData, metaInfo);
+ };
+ muxer.stop();
+ muxer.release();
+ }</pre>
+
+ <h2 id=History><a name="History"></a>Features and API History</h2>
+ <p>
+ The following table summarizes the feature support in different API version and containers.
+ For API version numbers, see {@link android.os.Build.VERSION_CODES}.
+
+ <style>
+ .api > tr > th, .api > tr > td { text-align: center; padding: 4px 4px; }
+ .api > tr > th { vertical-align: bottom; }
+ .api > tr > td { vertical-align: middle; }
+ .sml > tr > th, .sml > tr > td { text-align: center; padding: 2px 4px; }
+ .fn { text-align: center; }
+ </style>
+
+ <table align="right" style="width: 0%">
+ <thead>
+ <tbody class=api>
+ <tr><th>Symbol</th>
+ <th>Meaning</th></tr>
+ </tbody>
+ </thead>
+ <tbody class=sml>
+ <tr><td>●</td><td>Supported</td></tr>
+ <tr><td>○</td><td>Not supported</td></tr>
+ <tr><td>▧</td><td>Supported in MP4/WebM/3GP</td></tr>
+ <tr><td>⁕</td><td>Only Supported in MP4</td></tr>
+ </tbody>
+ </table>
+<table align="center" style="width: 100%;">
+ <thead class=api>
+ <tr>
+ <th rowspan=2>Feature</th>
+ <th colspan="24">SDK Version</th>
+ </tr>
+ <tr>
+ <th>18</th>
+ <th>19</th>
+ <th>20</th>
+ <th>21</th>
+ <th>22</th>
+ <th>23</th>
+ <th>24</th>
+ <th>25</th>
+ <th>26+</th>
+ </tr>
+ </thead>
+ <tbody class=api>
+ <tr>
+ <td align="center">MP4 container</td>
+ <td>●</td>
+ <td>●</td>
+ <td>●</td>
+ <td>●</td>
+ <td>●</td>
+ <td>●</td>
+ <td>●</td>
+ <td>●</td>
+ <td>●</td>
+ </tr>
+ <td align="center">WebM container</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>●</td>
+ <td>●</td>
+ <td>●</td>
+ <td>●</td>
+ <td>●</td>
+ <td>●</td>
+ </tr>
+ <td align="center">3GP container</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>●</td>
+ </tr>
+ <td align="center">Muxing B-Frames(bi-directional predicted frames)</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>⁕</td>
+ <td>⁕</td>
+ <td>⁕</td>
+ </tr>
+ </tr>
+ <td align="center">Muxing Single Video/Audio Track</td>
+ <td>▧</td>
+ <td>▧</td>
+ <td>▧</td>
+ <td>▧</td>
+ <td>▧</td>
+ <td>▧</td>
+ <td>▧</td>
+ <td>▧</td>
+ <td>▧</td>
+ </tr>
+ </tr>
+ <td align="center">Muxing Multiple Video/Audio Tracks</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>⁕</td>
+ </tr>
+ </tr>
+ <td align="center">Muxing Metadata Tracks</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>○</td>
+ <td>⁕</td>
+ </tr>
+ </tbody>
+ </table>
*/
final public class MediaMuxer {
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index c5a47ec..1ebbe85 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -73,6 +73,7 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
+import java.net.HttpCookie;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.URL;
@@ -80,6 +81,7 @@
import java.util.Arrays;
import java.util.BitSet;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
@@ -577,6 +579,7 @@
*/
public class MediaPlayer extends PlayerBase
implements SubtitleController.Listener
+ , VolumeAutomation
{
/**
Constant to retrieve only the new metadata since the last
@@ -638,6 +641,8 @@
private UUID mDrmUUID;
private final Object mDrmLock = new Object();
private DrmInfo mDrmInfo;
+ private MediaDrm mDrmObj;
+ private byte[] mDrmSessionId;
private boolean mDrmInfoResolved;
private boolean mActiveDrmScheme;
private boolean mDrmConfigAllowed;
@@ -998,7 +1003,7 @@
*/
public void setDataSource(@NonNull Context context, @NonNull Uri uri)
throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {
- setDataSource(context, uri, null);
+ setDataSource(context, uri, null, null);
}
/**
@@ -1011,11 +1016,13 @@
* changed with key/value pairs through the headers parameter with
* "android-allow-cross-domain-redirect" as the key and "0" or "1" as the value
* to disallow or allow cross domain redirection.
+ * The headers must not include cookies. Instead, use the cookies param.
+ * @param cookies the cookies to be sent together with the request
* @throws IllegalStateException if it is called in an invalid state
*/
public void setDataSource(@NonNull Context context, @NonNull Uri uri,
- @Nullable Map<String, String> headers) throws IOException, IllegalArgumentException,
- SecurityException, IllegalStateException {
+ @Nullable Map<String, String> headers, @Nullable List<HttpCookie> cookies)
+ throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {
// The context and URI usually belong to the calling user. Get a resolver for that user
// and strip out the userId from the URI if present.
final ContentResolver resolver = context.getContentResolver();
@@ -1036,18 +1043,36 @@
} else if (attemptDataSource(resolver, actualUri)) {
return;
} else {
- setDataSource(uri.toString(), headers);
+ setDataSource(uri.toString(), headers, cookies);
}
} else {
// Try requested Uri locally first, or fallback to media server
if (attemptDataSource(resolver, uri)) {
return;
} else {
- setDataSource(uri.toString(), headers);
+ setDataSource(uri.toString(), headers, cookies);
}
}
}
+ /**
+ * Sets the data source as a content Uri.
+ *
+ * @param context the Context to use when resolving the Uri
+ * @param uri the Content URI of the data you want to play
+ * @param headers the headers to be sent together with the request for the data
+ * Note that the cross domain redirection is allowed by default, but that can be
+ * changed with key/value pairs through the headers parameter with
+ * "android-allow-cross-domain-redirect" as the key and "0" or "1" as the value
+ * to disallow or allow cross domain redirection.
+ * @throws IllegalStateException if it is called in an invalid state
+ */
+ public void setDataSource(@NonNull Context context, @NonNull Uri uri,
+ @Nullable Map<String, String> headers)
+ throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {
+ setDataSource(context, uri, headers, null);
+ }
+
private boolean attemptDataSource(ContentResolver resolver, Uri uri) {
try (AssetFileDescriptor afd = resolver.openAssetFileDescriptor(uri, "r")) {
setDataSource(afd);
@@ -1085,6 +1110,11 @@
* @hide pending API council
*/
public void setDataSource(String path, Map<String, String> headers)
+ throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {
+ setDataSource(path, headers, null);
+ }
+
+ private void setDataSource(String path, Map<String, String> headers, List<HttpCookie> cookies)
throws IOException, IllegalArgumentException, SecurityException, IllegalStateException
{
String[] keys = null;
@@ -1101,10 +1131,11 @@
++i;
}
}
- setDataSource(path, keys, values);
+ setDataSource(path, keys, values, cookies);
}
- private void setDataSource(String path, String[] keys, String[] values)
+ private void setDataSource(String path, String[] keys, String[] values,
+ List<HttpCookie> cookies)
throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {
final Uri uri = Uri.parse(path);
final String scheme = uri.getScheme();
@@ -1113,7 +1144,7 @@
} else if (scheme != null) {
// handle non-file sources
nativeSetDataSource(
- MediaHTTPService.createHttpServiceBinderIfNecessary(path),
+ MediaHTTPService.createHttpServiceBinderIfNecessary(path, cookies),
path,
keys,
values);
@@ -1343,6 +1374,12 @@
return native_getVolumeShaperState(id);
}
+ @Override
+ public @NonNull VolumeShaper createVolumeShaper(
+ @NonNull VolumeShaper.Configuration configuration) {
+ return new VolumeShaper(configuration, this);
+ }
+
private native int native_applyVolumeShaper(
@NonNull VolumeShaper.Configuration configuration,
@NonNull VolumeShaper.Operation operation);
@@ -1932,6 +1969,7 @@
mOnSubtitleDataListener = null;
// Modular DRM clean up
+ mOnDrmConfigListener = null;
mOnDrmInfoHandlerDelegate = null;
mOnDrmPreparedHandlerDelegate = null;
resetDrmState();
@@ -3143,7 +3181,7 @@
onDrmInfoHandlerDelegate.notifyClient(drmInfo);
}
} else {
- Log.w(TAG, "MEDIA_DRM_INFO msg.obj NONE; UNEXPECTED" + msg.obj);
+ Log.w(TAG, "MEDIA_DRM_INFO msg.obj of unexpected type " + msg.obj);
}
return;
@@ -3818,17 +3856,34 @@
* and setDrmPropertyString.
*
*/
- public static abstract class OnDrmConfigCallback
+ public interface OnDrmConfigListener
{
/**
* Called to give the app the opportunity to configure DRM before the session is created
*
* @param mp the {@code MediaPlayer} associated with this callback
*/
- public void onDrmConfig(MediaPlayer mp) {}
+ public void onDrmConfig(MediaPlayer mp);
}
/**
+ * Register a callback to be invoked for configuration of the DRM object before
+ * the session is created.
+ * The callback will be invoked synchronously half-way into the execution
+ * of {@link #prepareDrm(UUID uuid)}.
+ *
+ * @param listener the callback that will be run
+ */
+ public void setOnDrmConfigListener(OnDrmConfigListener listener)
+ {
+ synchronized (mDrmLock) {
+ mOnDrmConfigListener = listener;
+ } // synchronized
+ }
+
+ private OnDrmConfigListener mOnDrmConfigListener;
+
+ /**
* Interface definition of a callback to be invoked when the
* DRM info becomes available
*/
@@ -4025,13 +4080,11 @@
return drmInfo;
}
- private native void _prepareDrm(@NonNull byte[] uuid, int mode)
- throws UnsupportedSchemeException, ResourceBusyException, NotProvisionedException;
/**
* Prepares the DRM for the current source
* <p>
- * If {@code OnDrmConfigCallback} is registered, it will be called half-way into
+ * If {@code OnDrmConfigListener} is registered, it will be called half-way into
* preparation to allow configuration of the DRM properties before opening the
* DRM session. Note that the callback is called synchronously in the thread that called
* {@code prepareDrm}. It should be used only for a series of {@code getDrmPropertyString}
@@ -4059,10 +4112,12 @@
* @throws ResourceBusyException if required DRM resources are in use
* @throws ProvisioningErrorException if provisioning is required but an attempt failed
*/
- public void prepareDrm(@NonNull UUID uuid, OnDrmConfigCallback configCallback)
+ public void prepareDrm(@NonNull UUID uuid)
throws UnsupportedSchemeException,
ResourceBusyException, ProvisioningErrorException
{
+ Log.v(TAG, "prepareDrm: uuid: " + uuid + " mOnDrmConfigListener: " + mOnDrmConfigListener);
+
boolean allDoneWithoutProvisioning = false;
// get a snapshot as we'll use them outside the lock
OnDrmPreparedHandlerDelegate onDrmPreparedHandlerDelegate = null;
@@ -4071,58 +4126,46 @@
// only allowing if tied to a protected source; might releax for releasing offline keys
if (mDrmInfo == null) {
- final String msg = String.format("prepareDrm(%s): Wrong usage: " +
- "The player must be prepared and DRM " +
- "info be retrieved before this call.", uuid);
+ final String msg = "prepareDrm(): Wrong usage: The player must be prepared and " +
+ "DRM info be retrieved before this call.";
Log.e(TAG, msg);
throw new IllegalStateException(msg);
}
if (mActiveDrmScheme) {
- final String msg = String.format("prepareDrm(%s): Wrong usage: There is already " +
- "an active DRM scheme with %s.", uuid, mDrmUUID);
+ final String msg = "prepareDrm(): Wrong usage: There is already " +
+ "an active DRM scheme with " + mDrmUUID;
Log.e(TAG, msg);
throw new IllegalStateException(msg);
}
if (mPrepareDrmInProgress) {
- final String msg = String.format("prepareDrm(%s): Wrong usage: There is already " +
- "a pending prepareDrm call.", uuid);
+ final String msg = "prepareDrm(): Wrong usage: There is already " +
+ "a pending prepareDrm call.";
Log.e(TAG, msg);
throw new IllegalStateException(msg);
}
if (mDrmProvisioningInProgress) {
- final String msg = String.format("prepareDrm(%s): Unexpectd: Provisioning is " +
- "already in progress.", uuid);
+ final String msg = "prepareDrm(): Unexpectd: Provisioning is already in progress.";
Log.e(TAG, msg);
throw new IllegalStateException(msg);
}
+ // shouldn't need this; just for safeguard
+ cleanDrmObj();
+
mPrepareDrmInProgress = true;
// local copy while the lock is held
onDrmPreparedHandlerDelegate = mOnDrmPreparedHandlerDelegate;
- if (configCallback != null) {
- try {
- boolean allowOpenSession = false; // just pre-openSession
- _prepareDrm(getByteArrayFromUUID(uuid), allowOpenSession ? 1 : 0);
- } catch (IllegalStateException e) {
- final String msg = String.format("prepareDrm(): Wrong usage: The player must " +
- "be in prepared state to call prepareDrm().");
- Log.e(TAG, msg);
- throw new IllegalStateException(msg);
- } catch (NotProvisionedException e) { // the pre-config step won't raise this
- final String msg = String.format("prepareDrm: Unexpected " +
- "NotProvisionedException here.");
- Log.e(TAG, msg);
- throw new ProvisioningErrorException(msg);
- } catch (Exception e) {
- Log.w(TAG, String.format("prepareDrm: Exception %s", e));
- throw e;
- } finally {
- mPrepareDrmInProgress = false;
- }
+ try {
+ // only creating the DRM object to allow pre-openSession configuration
+ prepareDrm_createDrmStep(uuid);
+ } catch (Exception e) {
+ Log.w(TAG, "prepareDrm(): Exception ", e);
+ mPrepareDrmInProgress = false;
+ throw e;
}
mDrmConfigAllowed = true;
@@ -4130,51 +4173,55 @@
// call the callback outside the lock
- if (configCallback != null) {
- configCallback.onDrmConfig(this);
+ if (mOnDrmConfigListener != null) {
+ mOnDrmConfigListener.onDrmConfig(this);
}
synchronized (mDrmLock) {
mDrmConfigAllowed = false;
+ boolean earlyExit = false;
try {
- boolean allowOpenSession = true; // all in
- _prepareDrm(getByteArrayFromUUID(uuid), allowOpenSession ? 1 : 0);
+ prepareDrm_openSessionStep(uuid);
mDrmUUID = uuid;
mActiveDrmScheme = true;
- mPrepareDrmInProgress = false;
-
allDoneWithoutProvisioning = true;
} catch (IllegalStateException e) {
- final String msg = String.format("prepareDrm(%s): Wrong usage: The player must be" +
- " in prepared state to call prepareDrm().", uuid);
+ final String msg = "prepareDrm(): Wrong usage: The player must be " +
+ "in the prepared state to call prepareDrm().";
Log.e(TAG, msg);
+ earlyExit = true;
throw new IllegalStateException(msg);
} catch (NotProvisionedException e) {
- Log.w(TAG, String.format("prepareDrm: NotProvisionedException"));
+ Log.w(TAG, "prepareDrm: NotProvisionedException");
- // handle provisioning internally
+ // handle provisioning internally; it'll reset mPrepareDrmInProgress
boolean result = HandleProvisioninig(uuid);
// if blocking mode, we're already done;
// if non-blocking mode, we attempted to launch background provisioning
if (result == false) {
- final String msg =
- String.format("prepareDrm: Provisioning was required but failed.");
+ final String msg = "prepareDrm: Provisioning was required but failed.";
Log.e(TAG, msg);
+ earlyExit = true;
throw new ProvisioningErrorException(msg);
}
-
// nothing else to do;
// if blocking or non-blocking, HandleProvisioninig does the re-attempt & cleanup
} catch (Exception e) {
- Log.w(TAG, String.format("prepareDrm: Exception %s", e));
+ Log.e(TAG, "prepareDrm: Exception " + e);
+ earlyExit = true;
throw e;
} finally {
- mPrepareDrmInProgress = false;
- }
+ if (!mDrmProvisioningInProgress) {// if early exit other than provisioning exception
+ mPrepareDrmInProgress = false;
+ }
+ if (earlyExit) { // cleaning up object if didn't succeed
+ cleanDrmObj();
+ }
+ } // finally
} // synchronized
@@ -4197,25 +4244,33 @@
public void releaseDrm()
throws NoDrmSchemeException
{
+ Log.v(TAG, "releaseDrm:");
+
synchronized (mDrmLock) {
if (!mActiveDrmScheme) {
- Log.e(TAG, String.format("releaseDrm(%s): No active DRM scheme to release."));
+ Log.e(TAG, "releaseDrm(): No active DRM scheme to release.");
throw new NoDrmSchemeException("releaseDrm: No active DRM scheme to release.");
- } else {
+ }
+
+ try {
+ // we don't have the player's state in this layer. The below call raises
+ // exception if we're in a non-stopped/idle state.
+
+ // for cleaning native/mediaserver crypto object
_releaseDrm();
+ // for cleaning client-side MediaDrm object; only called if above has succeeded
+ cleanDrmObj();
+
mActiveDrmScheme = false;
+ } catch (Exception e) {
+ Log.w(TAG, "releaseDrm: Exception ", e);
+ throw e;
}
} // synchronized
}
- @NonNull
- private native MediaDrm.KeyRequest _getKeyRequest(@NonNull byte[] scope,
- @Nullable String mimeType, @MediaDrm.KeyType int keyType,
- @Nullable Map<String, String> optionalParameters)
- throws NotProvisionedException;
-
/**
* A key request/response exchange occurs between the app and a license server
* to obtain or release keys used to decrypt encrypted content.
@@ -4256,20 +4311,42 @@
@MediaDrm.KeyType int keyType, @Nullable Map<String, String> optionalParameters)
throws NoDrmSchemeException
{
+ Log.v(TAG, "getKeyRequest: " +
+ " scope: " + scope + " mimeType: " + mimeType +
+ " keyType: " + keyType + " optionalParameters: " + optionalParameters);
+
synchronized (mDrmLock) {
if (!mActiveDrmScheme) {
- Log.e(TAG, String.format("getKeyRequest NoDrmSchemeException"));
+ Log.e(TAG, "getKeyRequest NoDrmSchemeException");
throw new NoDrmSchemeException("getKeyRequest: Has to set a DRM scheme first.");
}
try {
- return _getKeyRequest(scope, mimeType, keyType, optionalParameters);
+ byte[] scopeOut = (keyType != MediaDrm.KEY_TYPE_RELEASE) ?
+ mDrmSessionId : // sessionId for KEY_TYPE_STREAMING/OFFLINE
+ scope; // keySetId for KEY_TYPE_RELEASE
+
+ byte[] initData = (keyType != MediaDrm.KEY_TYPE_RELEASE) ?
+ scope : // initData for KEY_TYPE_STREAMING/OFFLINE
+ null; // not used for KEY_TYPE_RELEASE
+
+ HashMap<String, String> hmapOptionalParameters =
+ (optionalParameters != null) ?
+ new HashMap<String, String>(optionalParameters) :
+ null;
+
+ MediaDrm.KeyRequest request = mDrmObj.getKeyRequest(scopeOut, initData, mimeType,
+ keyType, hmapOptionalParameters);
+ Log.v(TAG, "getKeyRequest: --> request: " + request);
+
+ return request;
+
} catch (NotProvisionedException e) {
- Log.w(TAG, String.format("getKeyRequest NotProvisionedException: " +
- "Unexpected. Shouldn't have reached here."));
+ Log.w(TAG, "getKeyRequest NotProvisionedException: " +
+ "Unexpected. Shouldn't have reached here.");
throw new IllegalStateException("getKeyRequest: Unexpected provisioning error.");
} catch (Exception e) {
- Log.w(TAG, String.format("getKeyRequest Exception %s", e));
+ Log.w(TAG, "getKeyRequest Exception " + e);
throw e;
}
@@ -4277,10 +4354,6 @@
}
- @Nullable
- private native byte[] _provideKeyResponse(@Nullable byte[] keySetId, @NonNull byte[] response)
- throws DeniedByServerException;
-
/**
* A key response is received from the license server by the app, then it is
* provided to the DRM engine plugin using provideKeyResponse. When the
@@ -4303,25 +4376,41 @@
public byte[] provideKeyResponse(@Nullable byte[] keySetId, @NonNull byte[] response)
throws NoDrmSchemeException, DeniedByServerException
{
+ Log.v(TAG, "provideKeyResponse: keySetId: " + keySetId + " response: " + response);
+
synchronized (mDrmLock) {
if (!mActiveDrmScheme) {
- Log.e(TAG, String.format("getKeyRequest NoDrmSchemeException"));
+ Log.e(TAG, "getKeyRequest NoDrmSchemeException");
throw new NoDrmSchemeException("getKeyRequest: Has to set a DRM scheme first.");
}
try {
- return _provideKeyResponse(keySetId, response);
+ byte[] scope = (keySetId == null) ?
+ mDrmSessionId : // sessionId for KEY_TYPE_STREAMING/OFFLINE
+ keySetId; // keySetId for KEY_TYPE_RELEASE
+
+ byte[] keySetResult = mDrmObj.provideKeyResponse(scope, response);
+
+ Log.v(TAG, "provideKeyResponse: keySetId: " + keySetId + " response: " + response +
+ " --> " + keySetResult);
+
+
+ return keySetResult;
+
+ } catch (NotProvisionedException e) {
+ Log.w(TAG, "provideKeyResponse NotProvisionedException: " +
+ "Unexpected. Shouldn't have reached here.");
+ throw new IllegalStateException("provideKeyResponse: " +
+ "Unexpected provisioning error.");
} catch (Exception e) {
- Log.w(TAG, String.format("provideKeyResponse Exception %s", e));
+ Log.w(TAG, "provideKeyResponse Exception " + e);
throw e;
}
} // synchronized
}
- private native void _restoreKeys(@NonNull byte[] keySetId);
-
/**
* Restore persisted offline keys into a new session. keySetId identifies the
* keys to load, obtained from a prior call to {@link #provideKeyResponse}.
@@ -4331,17 +4420,19 @@
public void restoreKeys(@NonNull byte[] keySetId)
throws NoDrmSchemeException
{
+ Log.v(TAG, "restoreKeys: keySetId: " + keySetId);
+
synchronized (mDrmLock) {
if (!mActiveDrmScheme) {
- Log.w(TAG, String.format("restoreKeys NoDrmSchemeException"));
+ Log.w(TAG, "restoreKeys NoDrmSchemeException");
throw new NoDrmSchemeException("restoreKeys: Has to set a DRM scheme first.");
}
try {
- _restoreKeys(keySetId);
+ mDrmObj.restoreKeys(mDrmSessionId, keySetId);
} catch (Exception e) {
- Log.w(TAG, String.format("restoreKeys Exception %s", e));
+ Log.w(TAG, "restoreKeys Exception " + e);
throw e;
}
@@ -4349,9 +4440,6 @@
}
- @NonNull
- private native String _getDrmPropertyString(@NonNull String propertyName);
-
/**
* Read a DRM engine plugin String property value, given the property name string.
* <p>
@@ -4365,26 +4453,29 @@
public String getDrmPropertyString(@NonNull @MediaDrm.StringProperty String propertyName)
throws NoDrmSchemeException
{
+ Log.v(TAG, "getDrmPropertyString: propertyName: " + propertyName);
+
String value;
synchronized (mDrmLock) {
if (!mActiveDrmScheme && !mDrmConfigAllowed) {
- Log.w(TAG, String.format("getDrmPropertyString NoDrmSchemeException"));
+ Log.w(TAG, "getDrmPropertyString NoDrmSchemeException");
throw new NoDrmSchemeException("getDrmPropertyString: Has to prepareDrm() first.");
}
try {
- value = _getDrmPropertyString(propertyName);
+ value = mDrmObj.getPropertyString(propertyName);
} catch (Exception e) {
- Log.w(TAG, String.format("getDrmPropertyString Exception %s", e));
+ Log.w(TAG, "getDrmPropertyString Exception " + e);
throw e;
}
} // synchronized
+ Log.v(TAG, "getDrmPropertyString: propertyName: " + propertyName + " --> value: " + value);
+
return value;
}
- private native void _setDrmPropertyString(@NonNull String propertyName, @NonNull String value);
/**
* Set a DRM engine plugin String property value.
@@ -4400,17 +4491,19 @@
@NonNull String value)
throws NoDrmSchemeException
{
+ Log.v(TAG, "setDrmPropertyString: propertyName: " + propertyName + " value: " + value);
+
synchronized (mDrmLock) {
if ( !mActiveDrmScheme && !mDrmConfigAllowed ) {
- Log.w(TAG, String.format("setDrmPropertyString NoDrmSchemeException"));
+ Log.w(TAG, "setDrmPropertyString NoDrmSchemeException");
throw new NoDrmSchemeException("setDrmPropertyString: Has to prepareDrm() first.");
}
try {
- _setDrmPropertyString(propertyName, value);
+ mDrmObj.setPropertyString(propertyName, value);
} catch ( Exception e ) {
- Log.w(TAG, String.format("setDrmPropertyString Exception %s", e));
+ Log.w(TAG, "setDrmPropertyString Exception " + e);
throw e;
}
} // synchronized
@@ -4577,8 +4670,47 @@
}
}
+
+ private native void _prepareDrm(@NonNull byte[] uuid, @NonNull byte[] drmSessionId);
+
// Modular DRM helpers
+ private void prepareDrm_createDrmStep(@NonNull UUID uuid)
+ throws UnsupportedSchemeException {
+ Log.v(TAG, "prepareDrm_createDrmStep: UUID: " + uuid);
+
+ try {
+ mDrmObj = new MediaDrm(uuid);
+ Log.v(TAG, "prepareDrm_createDrmStep: Created mDrmObj=" + mDrmObj);
+ } catch (Exception e) { // UnsupportedSchemeException
+ Log.e(TAG, "prepareDrm_createDrmStep: MediaDrm failed with " + e);
+ throw e;
+ }
+ }
+
+ private void prepareDrm_openSessionStep(@NonNull UUID uuid)
+ throws NotProvisionedException, ResourceBusyException {
+ Log.v(TAG, "prepareDrm_openSessionStep: uuid: " + uuid);
+
+ // TODO: don't need an open session for a future specialKeyReleaseDrm mode but we should do
+ // it anyway so it raises provisioning error if needed. We'd rather handle provisioning
+ // at prepareDrm/openSession rather than getKeyRequest/provideKeyResponse
+ try {
+ mDrmSessionId = mDrmObj.openSession();
+ Log.v(TAG, "prepareDrm_openSessionStep: mDrmSessionId=" + mDrmSessionId);
+
+ // Sending it down to native/mediaserver to create the crypto object
+ // This call could simply fail due to bad player state, e.g., after start().
+ _prepareDrm(getByteArrayFromUUID(uuid), mDrmSessionId);
+ Log.v(TAG, "prepareDrm_openSessionStep: _prepareDrm/Crypto succeeded");
+
+ } catch (Exception e) { //ResourceBusyException, NotProvisionedException
+ Log.e(TAG, "prepareDrm_openSessionStep: open/crypto failed with " + e);
+ throw e;
+ }
+
+ }
+
private class ProvisioningThread extends Thread
{
public static final int TIMEOUT_MS = 60000;
@@ -4605,7 +4737,7 @@
urlStr = request.getDefaultUrl() + "&signedRequest=" + new String(request.getData());
this.uuid = uuid;
- Log.v(TAG, String.format("HandleProvisioninig: Thread is initialised url: %s", urlStr));
+ Log.v(TAG, "HandleProvisioninig: Thread is initialised url: " + urlStr);
return this;
}
@@ -4625,30 +4757,27 @@
connection.connect();
response = Streams.readFully(connection.getInputStream());
- Log.v(TAG, String.format("HandleProvisioninig: Thread run response %d %s",
- response.length, response));
+ Log.v(TAG, "HandleProvisioninig: Thread run: response " +
+ response.length + " " + response);
} catch (Exception e) {
- Log.w(TAG, String.format("HandleProvisioninig: Thread run connect %s url: %s",
- e, url));
+ Log.w(TAG, "HandleProvisioninig: Thread run: connect " + e + " url: " + url);
} finally {
connection.disconnect();
}
} catch (Exception e) {
- Log.w(TAG, String.format("HandleProvisioninig: Thread run openConnection %s", e));
+ Log.w(TAG, "HandleProvisioninig: Thread run: openConnection " + e);
}
if (response != null) {
try {
- MediaDrm drm = new MediaDrm(uuid);
- drm.provideProvisionResponse(response);
- drm.release();
- Log.v(TAG, String.format("HandleProvisioninig: Thread run " +
- "newDrm+provideProvisionResponse SUCCEEDED!"));
+ mDrmObj.provideProvisionResponse(response);
+ Log.v(TAG, "HandleProvisioninig: Thread run: " +
+ "provideProvisionResponse SUCCEEDED!");
provisioningSucceeded = true;
} catch (Exception e) {
- Log.w(TAG, String.format("HandleProvisioninig: Thread run " +
- "newDrm+provideProvisionResponse %s", e));
+ Log.w(TAG, "HandleProvisioninig: Thread run: " +
+ "provideProvisionResponse " + e);
}
}
@@ -4662,7 +4791,10 @@
}
mediaPlayer.mDrmProvisioningInProgress = false;
mediaPlayer.mPrepareDrmInProgress = false;
- }
+ if (!succeeded) {
+ cleanDrmObj(); // cleaning up if it hasn't gone through while in the lock
+ }
+ } // synchronized
// calling the callback outside the lock
onDrmPreparedHandlerDelegate.notifyClient(succeeded);
@@ -4674,6 +4806,9 @@
}
mediaPlayer.mDrmProvisioningInProgress = false;
mediaPlayer.mPrepareDrmInProgress = false;
+ if (!succeeded) {
+ cleanDrmObj(); // cleaning up if it hasn't gone through
+ }
}
finished = true;
@@ -4686,24 +4821,18 @@
// the lock is already held by the caller
if (mDrmProvisioningInProgress) {
- Log.e(TAG, String.format("HandleProvisioninig: Unexpected mDrmProvisioningInProgress"));
+ Log.e(TAG, "HandleProvisioninig: Unexpected mDrmProvisioningInProgress");
return false;
}
- MediaDrm.ProvisionRequest provReq = null;
- try {
- MediaDrm drm = new MediaDrm(uuid);
- provReq = drm.getProvisionRequest();
- drm.release();
- } catch (Exception e) {
- Log.e(TAG, String.format("HandleProvisioninig: getProvisionRequest failed with %s", e));
+ MediaDrm.ProvisionRequest provReq = mDrmObj.getProvisionRequest();
+ if (provReq == null) {
+ Log.e(TAG, "HandleProvisioninig: getProvisionRequest returned null.");
return false;
}
- Log.v(TAG, String.format("HandleProvisioninig provReq: data %s url %s",
- (provReq != null) ? provReq.getData() : "-",
- (provReq != null) ? provReq.getDefaultUrl() : "://")
- );
+ Log.v(TAG, "HandleProvisioninig provReq " +
+ " data: " + provReq.getData() + " url: " + provReq.getDefaultUrl());
// networking in a background thread
mDrmProvisioningInProgress = true;
@@ -4721,7 +4850,7 @@
try {
mDrmProvisioningThread.join();
} catch (Exception e) {
- Log.w(TAG, String.format("HandleProvisioninig: Thread.join Exception %s", e));
+ Log.w(TAG, "HandleProvisioninig: Thread.join Exception " + e);
}
result = mDrmProvisioningThread.succeeded();
// no longer need the thread
@@ -4733,19 +4862,21 @@
private boolean resumePrepareDrm(UUID uuid)
{
+ Log.v(TAG, "resumePrepareDrm: uuid: " + uuid);
+
// mDrmLock is guaranteed to be held
boolean success = false;
try {
- boolean allowOpenSession = true; // resuming
- _prepareDrm(getByteArrayFromUUID(uuid), allowOpenSession ? 1 : 0);
+ // resuming
+ prepareDrm_openSessionStep(uuid);
mDrmUUID = uuid;
mActiveDrmScheme = true;
success = true;
} catch (Exception e) {
- Log.w(TAG, String.format("HandleProvisioninig: " +
- "Thread run _prepareDrm resume failed with %s", e));
+ Log.w(TAG, "HandleProvisioninig: Thread run _prepareDrm resume failed with " + e);
+ // mDrmObj clean up is done by the caller
}
return success;
@@ -4754,6 +4885,12 @@
private void resetDrmState()
{
synchronized (mDrmLock) {
+ Log.v(TAG, "resetDrmState: " +
+ " mDrmInfo=" + mDrmInfo +
+ " mDrmProvisioningThread=" + mDrmProvisioningThread +
+ " mPrepareDrmInProgress=" + mPrepareDrmInProgress +
+ " mActiveDrmScheme=" + mActiveDrmScheme);
+
mDrmInfoResolved = false;
mDrmInfo = null;
@@ -4763,15 +4900,33 @@
mDrmProvisioningThread.join();
}
catch (InterruptedException e) {
- Log.w(TAG, String.format("resetDrmState: ProvThread.join Exception %s", e));
+ Log.w(TAG, "resetDrmState: ProvThread.join Exception " + e);
}
mDrmProvisioningThread = null;
}
mPrepareDrmInProgress = false;
+ mActiveDrmScheme = false;
+
+ cleanDrmObj();
} // synchronized
}
+ private void cleanDrmObj()
+ {
+ // the caller holds mDrmLock
+ Log.v(TAG, "cleanDrmObj: mDrmObj=" + mDrmObj + " mDrmSessionId=" + mDrmSessionId);
+
+ if (mDrmSessionId != null) {
+ mDrmObj.closeSession(mDrmSessionId);
+ mDrmSessionId = null;
+ }
+ if (mDrmObj != null) {
+ mDrmObj.release();
+ mDrmObj = null;
+ }
+ }
+
private static final byte[] getByteArrayFromUUID(@NonNull UUID uuid) {
long msb = uuid.getMostSignificantBits();
long lsb = uuid.getLeastSignificantBits();
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 7a6499d..075a84f 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -20,6 +20,7 @@
import android.annotation.SystemApi;
import android.app.ActivityThread;
import android.hardware.Camera;
+import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
@@ -1257,6 +1258,93 @@
private native void setParameter(String nameValuePair);
+ /**
+ * Returns Metrics data about the current media container.
+ *
+ * @return the set of keys and values available for the media being
+ * handled by this instance of MediaExtractor. The keys, data types,
+ * and meaning are described in the following table.
+ *
+ * <table style="width: 0%">
+ * <thead>
+ * <tr>
+ * <th>Key</th>
+ * <th>Type</th>
+ * <th>Description</th>
+ * </tr>
+ * </thead>
+ * <tbody>
+ * <tr>
+ * <td>{@code "ht"}</td>
+ * <td>Integer</td>
+ * <td>Height of the recorded video (pixels)</td>
+ * </tr><tr>
+ * <td>{@code "wid"}</td>
+ * <td>Integer</td>
+ * <td>Width of the recorded video (pixels)</td>
+ * </tr><tr>
+ * <td>{@code "frame-rate"}</td>
+ * <td>Integer</td>
+ * <td>Framerate of captured Video (frames per second)</td>
+ * </tr><tr>
+ * <td>{@code "video-bitrate"}</td>
+ * <td>Integer</td>
+ * <td>Bit rate of encoded video (bits per second)</td>
+ * </tr><tr>
+ * <td>{@code "video-iframe-interval"}</td>
+ * <td>Integer</td>
+ * <td>Interval between encoded IFrames (seconds)</td>
+ * </tr><tr>
+ * <td>{@code "video-timescale"}</td>
+ * <td>Integer</td>
+ * <td></td>
+ * </tr><tr>
+ * <td>{@code "video-encoder-profile"}</td>
+ * <td>Integer</td>
+ * <td>Video Encoder Profile, as defined in OpenMAX IL</td>
+ * </tr><tr>
+ * <td>{@code "video-encoder-level"}</td>
+ * <td>Integer</td>
+ * <td>Video Encoder Level, as defined in OpenMAX IL</td>
+ * </tr><tr>
+ * <td>{@code "audio-bitrate"}</td>
+ * <td>Integer</td>
+ * <td>Bitrate of encoded audio (bits per second)</td>
+ * </tr><tr>
+ * <td>{@code "audio-samplerate"}</td>
+ * <td>Integer</td>
+ * <td></td>
+ * </tr><tr>
+ * <td>{@code "audio-channels"}</td>
+ * <td>Integer</td>
+ * <td>Number of Audio Channels Captured</td>
+ * </tr><tr>
+ * <td>{@code "audio-timescale"}</td>
+ * <td>Integer</td>
+ * <td></td>
+ * </tr><tr>
+ * <td>{@code "movie-timescale"}</td>
+ * <td>Integer</td>
+ * <td></td>
+ * </tr><tr>
+ * <td>{@code "movie-timescale"}</td>
+ * <td>Integer</td>
+ * <td></td>
+ * </tr><tr>
+ * <td>{@code "capture-fps"}</td>
+ * <td>Integer</td>
+ * <td></td>
+ * </tr><tr>
+ * <td>{@code "rotation"}</td>
+ * <td>Integer</td>
+ * <td>Orientation of the Video (degrees)</td>
+ * </tr>
+ * </tbody>
+ * </table>
+ */
+
+ public native Bundle getMetrics();
+
@Override
protected void finalize() { native_finalize(); }
}
diff --git a/media/java/android/media/PlayerBase.java b/media/java/android/media/PlayerBase.java
index b397b45..1f5986f 100644
--- a/media/java/android/media/PlayerBase.java
+++ b/media/java/android/media/PlayerBase.java
@@ -58,7 +58,7 @@
protected float mAuxEffectSendLevel = 0.0f;
// for AppOps
- private IAppOpsService mAppOps;
+ private IAppOpsService mAppOps; // may be null
private IAppOpsCallback mAppOpsCallback;
private boolean mHasAppOpsPlayAudio = true; // sync'd on mLock
private final Object mLock = new Object();
@@ -251,7 +251,9 @@
Log.e(TAG, "Error talking to audio service, the player will still be tracked", e);
}
try {
- mAppOps.stopWatchingMode(mAppOpsCallback);
+ if (mAppOps != null) {
+ mAppOps.stopWatchingMode(mAppOpsCallback);
+ }
} catch (RemoteException e) {
// nothing to do here, the object is supposed to be released anyway
}
@@ -264,9 +266,12 @@
void updateAppOpsPlayAudio_sync() {
boolean oldHasAppOpsPlayAudio = mHasAppOpsPlayAudio;
try {
- final int mode = mAppOps.checkAudioOperation(AppOpsManager.OP_PLAY_AUDIO,
+ int mode = AppOpsManager.MODE_IGNORED;
+ if (mAppOps != null) {
+ mode = mAppOps.checkAudioOperation(AppOpsManager.OP_PLAY_AUDIO,
mAttributes.getUsage(),
Process.myUid(), ActivityThread.currentPackageName());
+ }
mHasAppOpsPlayAudio = (mode == AppOpsManager.MODE_ALLOWED);
} catch (RemoteException e) {
mHasAppOpsPlayAudio = false;
diff --git a/media/java/android/media/RingtoneManager.java b/media/java/android/media/RingtoneManager.java
index 8a1027b..e774c71 100644
--- a/media/java/android/media/RingtoneManager.java
+++ b/media/java/android/media/RingtoneManager.java
@@ -103,10 +103,6 @@
*/
public static final int TYPE_ALL = TYPE_RINGTONE | TYPE_NOTIFICATION | TYPE_ALARM;
- private static final int[] RINGTONE_TYPES = {
- TYPE_RINGTONE, TYPE_NOTIFICATION, TYPE_ALARM
- };
-
// </attr>
/**
@@ -773,30 +769,17 @@
}
/**
- * Disables Settings.System.SYNC_PARENT_SOUNDS, copying the parent's ringtones to the current
- * profile
+ * Disables Settings.System.SYNC_PARENT_SOUNDS.
*
* @hide
*/
- @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS)
public static void disableSyncFromParent(Context userContext) {
- // Must disable sync first so that ringtone copy below doesn't get redirected to parent
- Settings.Secure.putIntForUser(userContext.getContentResolver(),
- Settings.Secure.SYNC_PARENT_SOUNDS, 0 /* false */, userContext.getUserId());
-
- // Copy ringtones from parent profile
- UserManager um = UserManager.get(userContext);
- UserInfo parentInfo = um.getProfileParent(userContext.getUserId());
- if (parentInfo != null) {
- final Context targetContext = createPackageContextAsUser(userContext, parentInfo.id);
- if (targetContext != null) {
- for (int ringtoneType : RINGTONE_TYPES) {
- Uri ringtoneUri = getActualDefaultRingtoneUri(targetContext, ringtoneType);
- // Add user id of parent so that custom ringtones can be read and played
- RingtoneManager.setActualDefaultRingtoneUri(userContext, ringtoneType,
- maybeAddUserId(ringtoneUri, parentInfo.id));
- }
- }
+ IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
+ IAudioService audioService = IAudioService.Stub.asInterface(b);
+ try {
+ audioService.disableRingtoneSync(userContext.getUserId());
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to disable ringtone sync.");
}
}
@@ -851,22 +834,15 @@
* @see #getActualDefaultRingtoneUri(Context, int)
*/
public static void setActualDefaultRingtoneUri(Context context, int type, Uri ringtoneUri) {
- final ContentResolver resolver = context.getContentResolver();
-
- if (Settings.Secure.getString(resolver, Settings.Secure.SYNC_PARENT_SOUNDS).equals("1")) {
- // Sync is enabled, so we need to disable it
- IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
- IAudioService audioService = IAudioService.Stub.asInterface(b);
- try {
- audioService.disableRingtoneSync();
- } catch (RemoteException e) {
- Log.e(TAG, "Unable to disable ringtone sync.");
- return;
- }
- }
-
String setting = getSettingForType(type);
if (setting == null) return;
+
+ final ContentResolver resolver = context.getContentResolver();
+ if (Settings.Secure.getIntForUser(resolver, Settings.Secure.SYNC_PARENT_SOUNDS, 0,
+ context.getUserId()) == 1) {
+ // Parent sound override is enabled. Disable it using the audio service.
+ disableSyncFromParent(context);
+ }
if(!isInternalRingtoneUri(ringtoneUri)) {
ringtoneUri = ContentProvider.maybeAddUserId(ringtoneUri, context.getUserId());
}
diff --git a/core/java/android/companion/ICompanionDeviceManagerService.aidl b/media/java/android/media/UnsupportedCasException.java
similarity index 64%
copy from core/java/android/companion/ICompanionDeviceManagerService.aidl
copy to media/java/android/media/UnsupportedCasException.java
index ff2a7eb..3167637 100644
--- a/core/java/android/companion/ICompanionDeviceManagerService.aidl
+++ b/media/java/android/media/UnsupportedCasException.java
@@ -14,16 +14,14 @@
* limitations under the License.
*/
-package android.companion;
+package android.media;
-import android.companion.AssociationRequest;
-import android.companion.IOnAssociateCallback;
-
-
-/** @hide */
-interface ICompanionDeviceManagerService {
- void startDiscovery(
- in AssociationRequest request,
- in IOnAssociateCallback callback,
- in String callingPackage);
+/**
+ * Exception thrown when an attempt is made to construct a MediaCas object
+ * using a CA_system_id that is not supported by the device
+ */
+public final class UnsupportedCasException extends MediaCasException {
+ public UnsupportedCasException(String detailMessage) {
+ super(detailMessage);
+ }
}
diff --git a/media/java/android/media/VolumeAutomation.java b/media/java/android/media/VolumeAutomation.java
new file mode 100644
index 0000000..dff8801
--- /dev/null
+++ b/media/java/android/media/VolumeAutomation.java
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ */
+
+package android.media;
+
+import android.annotation.NonNull;
+import android.media.VolumeShaper.Configuration;
+
+/**
+ * {@code VolumeAutomation} defines an interface for automatic volume control
+ * of {@link AudioTrack} and {@link MediaPlayer} objects.
+ */
+public interface VolumeAutomation {
+ /**
+ * Returns a {@link VolumeShaper} object that can be used modify the volume envelope
+ * of the player or track.
+ *
+ * @param configuration the {@link VolumeShaper.Configuration configuration}
+ * that specifies the curve and duration to use.
+ * @return a {@code VolumeShaper} object
+ * @throws IllegalArgumentException if the configuration is not allowed by the player.
+ * @throws IllegalStateException if too many VolumeShapers are requested or the state of
+ * the player does not permit its creation (e.g. player is released).
+ */
+ public @NonNull VolumeShaper createVolumeShaper(
+ @NonNull VolumeShaper.Configuration configuration);
+}
diff --git a/media/java/android/media/VolumeShaper.java b/media/java/android/media/VolumeShaper.java
index 77af359..cb27d10 100644
--- a/media/java/android/media/VolumeShaper.java
+++ b/media/java/android/media/VolumeShaper.java
@@ -23,69 +23,25 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.lang.AutoCloseable;
import java.lang.ref.WeakReference;
import java.util.Objects;
/**
- * TODO: remove @hide
* The {@code VolumeShaper} class is used to automatically control audio volume during media
- * playback, allowing for simple implementation of transition effects and ducking.
+ * playback, allowing simple implementation of transition effects and ducking.
*
* The {@link VolumeShaper} appears as an additional scaling on the audio output,
- * and can be used independently of track or stream volume controls.
+ * and adjusts independently of track or stream volume controls.
*/
-public final class VolumeShaper {
+public final class VolumeShaper implements AutoCloseable {
/* member variables */
private int mId;
- private final WeakReference<PlayerBase> mPlayerBase;
- private final WeakReference<PlayerProxy> mPlayerProxy;
-
- /**
- * Constructs a {@code VolumeShaper} from a {@link VolumeShaper.Configuration} and an
- * {@link AudioTrack}.
- *
- * @param configuration
- * @param audioTrack
- */
- public VolumeShaper(@NonNull Configuration configuration, @NonNull AudioTrack audioTrack) {
- this(configuration, (PlayerBase)audioTrack);
- }
-
- /**
- * Constructs a {@code VolumeShaper} from a {@link VolumeShaper.Configuration} and a
- * {@link MediaPlayer}.
- *
- * @param configuration
- * @param mediaPlayer
- */
- public VolumeShaper(@NonNull Configuration configuration, @NonNull MediaPlayer mediaPlayer) {
- this(configuration, (PlayerBase)mediaPlayer);
- }
+ private final WeakReference<PlayerBase> mWeakPlayerBase;
/* package */ VolumeShaper(
@NonNull Configuration configuration, @NonNull PlayerBase playerBase) {
- mPlayerBase = new WeakReference<PlayerBase>(playerBase);
- mPlayerProxy = null;
- mId = applyPlayer(configuration, new Operation.Builder().defer().build());
- }
-
- /**
- * @hide
- * TODO SystemApi
- * Constructs a {@code VolumeShaper} from a {@link VolumeShaper.Configuration} and a
- * {@code PlayerProxy} object. The PlayerProxy object requires that the configuration
- * be set with a system VolumeShaper id (this is a reserved value).
- *
- * @param configuration
- * @param playerProxy
- */
- public VolumeShaper(
- @NonNull Configuration configuration, @NonNull PlayerProxy playerProxy) {
- if (configuration.getId() < 0) {
- throw new IllegalArgumentException("playerProxy configuration id must be specified");
- }
- mPlayerProxy = new WeakReference<PlayerProxy>(playerProxy);
- mPlayerBase = null;
+ mWeakPlayerBase = new WeakReference<PlayerBase>(playerBase);
mId = applyPlayer(configuration, new Operation.Builder().defer().build());
}
@@ -95,7 +51,7 @@
/**
* Applies the {@link VolumeShaper.Operation} to the {@code VolumeShaper}.
- * @param operation
+ * @param operation the {@code operation} to apply.
*/
public void apply(@NonNull Operation operation) {
/* void */ applyPlayer(new VolumeShaper.Configuration(mId), operation);
@@ -103,17 +59,16 @@
/**
* Replaces the current {@code VolumeShaper}
- * configuration with a new configuration.
+ * {@code configuration} with a new {@code configuration}.
*
- * This can be used to dynamically change the {@code VolumeShaper}
- * configuration by joining several
- * {@code VolumeShaper} configurations together.
- * This is useful if the user changes the volume while the
- * {@code VolumeShaper} is in effect.
+ * This allows the user to change the volume shape
+ * while the existing {@code VolumeShaper} is in effect.
*
- * @param configuration
- * @param operation
- * @param join
+ * @param configuration the new {@code configuration} to use.
+ * @param operation the operation to apply to the {@code VolumeShaper}
+ * @param join if true, match the start volume of the
+ * new {@code configuration} to the current volume of the existing
+ * {@code VolumeShaper}, to avoid discontinuity.
*/
public void replace(
@NonNull Configuration configuration, @NonNull Operation operation, boolean join) {
@@ -132,10 +87,11 @@
}
/**
- * Releases the {@code VolumeShaper}. Any volume scale due to the
+ * Releases the {@code VolumeShaper} object; any volume scale due to the
* {@code VolumeShaper} is removed.
*/
- public void release() {
+ @Override
+ public void close() {
try {
/* void */ applyPlayer(
new VolumeShaper.Configuration(mId),
@@ -143,17 +99,14 @@
} catch (IllegalStateException ise) {
; // ok
}
- if (mPlayerBase != null) {
- mPlayerBase.clear();
- }
- if (mPlayerProxy != null) {
- mPlayerProxy.clear();
+ if (mWeakPlayerBase != null) {
+ mWeakPlayerBase.clear();
}
}
@Override
protected void finalize() {
- release(); // ensure we remove the native volume shaper
+ close(); // ensure we remove the native volume shaper
}
/**
@@ -167,21 +120,8 @@
@NonNull VolumeShaper.Configuration configuration,
@NonNull VolumeShaper.Operation operation) {
final int id;
- if (mPlayerProxy != null) {
- // The PlayerProxy accepts only one way transactions so
- // the Configuration must have an id set to one of the system
- // ids (a positive value less than 16).
- PlayerProxy player = mPlayerProxy.get();
- if (player == null) {
- throw new IllegalStateException("player deallocated");
- }
- id = configuration.getId();
- if (id < 0) {
- throw new IllegalArgumentException("proxy requires configuration with id");
- }
- player.applyVolumeShaper(configuration, operation);
- } else if (mPlayerBase != null) {
- PlayerBase player = mPlayerBase.get();
+ if (mWeakPlayerBase != null) {
+ PlayerBase player = mWeakPlayerBase.get();
if (player == null) {
throw new IllegalStateException("player deallocated");
}
@@ -210,14 +150,8 @@
*/
private @NonNull VolumeShaper.State getStatePlayer(int id) {
final VolumeShaper.State state;
- if (mPlayerProxy != null) {
- PlayerProxy player = mPlayerProxy.get();
- if (player == null) {
- throw new IllegalStateException("player deallocated");
- }
- throw new IllegalStateException("getStatePlayer not permitted through proxy");
- } else if (mPlayerBase != null) {
- PlayerBase player = mPlayerBase.get();
+ if (mWeakPlayerBase != null) {
+ PlayerBase player = mWeakPlayerBase.get();
if (player == null) {
throw new IllegalStateException("player deallocated");
}
@@ -232,11 +166,17 @@
}
/**
- * The {@code VolumeShaper.Configuration} class contains curve shape
- * and parameter information for constructing a {@code VolumeShaper}.
- * This curve shape and parameter information is specified
- * on {@code VolumeShaper} creation
- * and may be replaced through {@link VolumeShaper#replace}.
+ * The {@code VolumeShaper.Configuration} class contains curve
+ * and duration information.
+ * It is constructed by the {@link VolumeShaper.Configuration.Builder}.
+ * <p>
+ * A {@code VolumeShaper.Configuration} is used by
+ * {@link VolumeAutomation#createVolumeShaper(Configuration)
+ * VolumeAutomation#createVolumeShaper(Configuration)} to create
+ * a {@code VolumeShaper} and
+ * by {@link VolumeShaper#replace(Configuration, Operation, boolean)
+ * VolumeShaper#replace(Configuration, Operation, boolean)}
+ * to replace an existing {@code configuration}.
*/
public static final class Configuration implements Parcelable {
private static final int MAXIMUM_CURVE_POINTS = 16;
@@ -304,9 +244,9 @@
/**
* Cubic interpolated volume curve
- * with local monotonicity preservation.
+ * that preserves local monotonicity.
* So long as the control points are locally monotonic,
- * the curve interpolation will also be locally monotonic.
+ * the curve interpolation between those points are monotonic.
* This is useful for cubic spline interpolated
* volume ramps and ducks.
*/
@@ -322,6 +262,7 @@
public @interface OptionFlag {}
/**
+ * @hide
* Use a dB full scale volume range for the volume curve.
*<p>
* The volume scale is typically from 0.f to 1.f on a linear scale;
@@ -331,6 +272,7 @@
public static final int OPTION_FLAG_VOLUME_IN_DBFS = (1 << 0);
/**
+ * @hide
* Use clock time instead of media time.
*<p>
* The default implementation of {@code VolumeShaper} is to apply
@@ -348,7 +290,8 @@
/**
* A one second linear ramp from silence to full volume.
- * Use {@link VolumeShaper.Builder#reflectTimes()} to generate
+ * Use {@link VolumeShaper.Builder#reflectTimes()}
+ * or {@link VolumeShaper.Builder#invertVolumes()} to generate
* the matching linear duck.
*/
public static final Configuration LINEAR_RAMP = new VolumeShaper.Configuration.Builder()
@@ -360,7 +303,8 @@
/**
* A one second cubic ramp from silence to full volume.
- * Use {@link VolumeShaper.Builder#reflectTimes()} to generate
+ * Use {@link VolumeShaper.Builder#reflectTimes()}
+ * or {@link VolumeShaper.Builder#invertVolumes()} to generate
* the matching cubic duck.
*/
public static final Configuration CUBIC_RAMP = new VolumeShaper.Configuration.Builder()
@@ -371,17 +315,19 @@
.build();
/**
- * A one second sine curve for energy preserving cross fades.
+ * A one second sine curve
+ * from silence to full volume for energy preserving cross fades.
* Use {@link VolumeShaper.Builder#reflectTimes()} to generate
* the matching cosine duck.
*/
public static final Configuration SINE_RAMP;
/**
- * A one second sine-squared s-curve ramp.
+ * A one second sine-squared s-curve ramp
+ * from silence to full volume.
* Use {@link VolumeShaper.Builder#reflectTimes()}
* or {@link VolumeShaper.Builder#invertVolumes()} to generate
- * the matching s-curve duck.
+ * the matching sine-squared s-curve duck.
*/
public static final Configuration SCURVE_RAMP;
@@ -504,6 +450,7 @@
};
/**
+ * @hide
* Constructs a volume shaper from an id.
*
* This is an opaque handle for controlling a {@code VolumeShaper} that has
@@ -516,7 +463,7 @@
* @param id
* @throws IllegalArgumentException if id is negative.
*/
- private Configuration(int id) {
+ public Configuration(int id) {
if (id < 0) {
throw new IllegalArgumentException("negative id " + id);
}
@@ -551,6 +498,7 @@
}
/**
+ * @hide
* Returns the {@code VolumeShaper} type.
*/
public @Type int getType() {
@@ -573,6 +521,7 @@
}
/**
+ * @hide
* Returns the option flags
*/
public @OptionFlag int getOptionFlags() {
@@ -584,7 +533,7 @@
}
/**
- * Returns the duration of the effect in milliseconds.
+ * Returns the duration of the volume shape in milliseconds.
*/
public double getDurationMs() {
return mDurationMs;
@@ -706,21 +655,22 @@
private int mType = TYPE_SCALE;
private int mId = -1; // invalid
private int mInterpolatorType = INTERPOLATOR_TYPE_CUBIC;
- private int mOptionFlags = 0;
+ private int mOptionFlags = OPTION_FLAG_CLOCK_TIME;
private double mDurationMs = 1000.;
private float[] mTimes = null;
private float[] mVolumes = null;
/**
- * Constructs a new Builder with the defaults.
+ * Constructs a new {@code Builder} with the defaults.
*/
public Builder() {
}
/**
- * Constructs a new Builder from a given {@code VolumeShaper.Configuration}
+ * Constructs a new {@code Builder} with settings
+ * copied from a given {@code VolumeShaper.Configuration}.
* @param configuration prototypical configuration
- * which will be reused in the new Builder.
+ * which will be reused in the new {@code Builder}.
*/
public Builder(@NonNull Configuration configuration) {
mType = configuration.getType();
@@ -734,8 +684,6 @@
/**
* @hide
- * TODO make SystemApi
- *
* Set the id for system defined shapers.
* @param id
* @return
@@ -751,7 +699,11 @@
* If omitted the interplator type is {@link #INTERPOLATOR_TYPE_CUBIC}.
*
* @param interpolatorType method of interpolation used for the volume curve.
- * @return the same Builder instance.
+ * One of {@link #INTERPOLATOR_TYPE_STEP},
+ * {@link #INTERPOLATOR_TYPE_LINEAR},
+ * {@link #INTERPOLATOR_TYPE_CUBIC},
+ * {@link #INTERPOLATOR_TYPE_CUBIC_MONOTONIC}.
+ * @return the same {@code Builder} instance.
* @throws IllegalArgumentException if {@code interpolatorType} is not valid.
*/
public @NonNull Builder setInterpolatorType(@InterpolatorType int interpolatorType) {
@@ -770,6 +722,7 @@
}
/**
+ * @hide
* Sets the optional flags
*
* If omitted, flags are 0. If {@link #OPTION_FLAG_VOLUME_IN_DBFS} has
@@ -777,7 +730,7 @@
* volume domain has changed.
*
* @param optionFlags new value to replace the old {@code optionFlags}.
- * @return the same Builder instance.
+ * @return the same {@code Builder} instance.
* @throws IllegalArgumentException if flag is not recognized.
*/
public @NonNull Builder setOptionFlags(@OptionFlag int optionFlags) {
@@ -794,8 +747,9 @@
* If omitted, the default duration is 1 second.
*
* @param durationMs
- * @return the same Builder instance.
- * @throws IllegalArgumentException if duration is not positive.
+ * @return the same {@code Builder} instance.
+ * @throws IllegalArgumentException if {@code durationMs}
+ * is not strictly positive.
*/
public @NonNull Builder setDurationMs(double durationMs) {
if (durationMs <= 0.) {
@@ -817,19 +771,23 @@
* and no greater than {@link VolumeShaper.Configuration#getMaximumCurvePoints()}.
* <p>
* The volume curve is normalized as follows:
- * (1) time (x) coordinates should be monotonically increasing, from 0.f to 1.f;
- * (2) volume (y) coordinates must be within 0.f to 1.f for linear and be non-positive
- * for log scaling.
+ * time (x) coordinates should be monotonically increasing, from 0.f to 1.f;
+ * volume (y) coordinates must be within 0.f to 1.f.
* <p>
- * The time scale is set by {@link #setDurationMs} in seconds.
+ * The time scale is set by {@link #setDurationMs}.
* <p>
* @param times an array of float values representing
* the time line of the volume curve.
* @param volumes an array of float values representing
* the amplitude of the volume curve.
- * @return the same Builder instance.
+ * @return the same {@code Builder} instance.
* @throws IllegalArgumentException if {@code times} or {@code volumes} is invalid.
*/
+
+ /* Note: volume (y) coordinates must be non-positive for log scaling,
+ * if {@link VolumeShaper.Configuration#OPTION_FLAG_VOLUME_IN_DBFS} is set.
+ */
+
public @NonNull Builder setCurve(@NonNull float[] times, @NonNull float[] volumes) {
String error = checkCurveForErrors(
times, volumes, (mOptionFlags & OPTION_FLAG_VOLUME_IN_DBFS) != 0);
@@ -846,7 +804,7 @@
* the shaper changes volume from the end
* to the start.
*
- * @return the same Builder instance.
+ * @return the same {@code Builder} instance.
*/
public @NonNull Builder reflectTimes() {
int i;
@@ -865,7 +823,7 @@
* Inverts the volume curve so that the max volume
* becomes the min volume and vice versa.
*
- * @return the same Builder instance.
+ * @return the same {@code Builder} instance.
*/
public @NonNull Builder invertVolumes() {
if (mVolumes.length >= 2) {
@@ -893,8 +851,9 @@
* Keeps the start volume the same.
* This works best if the volume curve is monotonic.
*
- * @return the same Builder instance.
- * @throws IllegalArgumentException if volume is not valid.
+ * @param volume the target end volume to use.
+ * @return the same {@code Builder} instance.
+ * @throws IllegalArgumentException if {@code volume} is not valid.
*/
public @NonNull Builder scaleToEndVolume(float volume) {
final boolean log = (mOptionFlags & OPTION_FLAG_VOLUME_IN_DBFS) != 0;
@@ -924,8 +883,9 @@
* Keeps the end volume the same.
* This works best if the volume curve is monotonic.
*
- * @return the same Builder instance.
- * @throws IllegalArgumentException if volume is not valid.
+ * @param volume the target start volume to use.
+ * @return the same {@code Builder} instance.
+ * @throws IllegalArgumentException if {@code volume} is not valid.
*/
public @NonNull Builder scaleToStartVolume(float volume) {
final boolean log = (mOptionFlags & OPTION_FLAG_VOLUME_IN_DBFS) != 0;
@@ -972,6 +932,8 @@
public static final class Operation implements Parcelable {
/**
* Forward playback from current volume time position.
+ * At the end of the {@code VolumeShaper} curve,
+ * the last volume value persists.
*/
public static final Operation PLAY =
new VolumeShaper.Operation.Builder()
@@ -979,6 +941,8 @@
/**
* Reverse playback from current volume time position.
+ * When the position reaches the start of the {@code VolumeShaper} curve,
+ * the first volume value persists.
*/
public static final Operation REVERSE =
new VolumeShaper.Operation.Builder()
@@ -1033,6 +997,13 @@
*/
private static final int FLAG_DEFER = 1 << 3;
+ /**
+ * Use the id specified in the configuration, creating
+ * VolumeShaper as needed; the configuration should be
+ * TYPE_SCALE.
+ */
+ private static final int FLAG_CREATE_IF_NEEDED = 1 << 4;
+
private static final int FLAG_PUBLIC_ALL = FLAG_REVERSE | FLAG_TERMINATE;
private final int mFlags;
@@ -1120,15 +1091,13 @@
}
/**
- * Replaces the previous {@code VolumeShaper}.
+ * Replaces the previous {@code VolumeShaper} specified by id.
* It has no other effect if the {@code VolumeShaper} is
- * already expired. If the replaceId is the same as the id associated with
- * the {@code VolumeShaper} in a {@code setVolumeShaper()} call,
- * an error is returned.
- * @param handle is a previous volumeShaper {@code VolumeShaper}.
- * @param join the start to match the current volume of the previous
- * shaper.
- * @return the same Builder instance.
+ * already expired.
+ * @param id the id of the previous {@code VolumeShaper}.
+ * @param join if true, match the volume of the previous
+ * shaper to the start volume of the new {@code VolumeShaper}.
+ * @return the same {@code Builder} instance.
*/
public @NonNull Builder replace(int id, boolean join) {
mReplaceId = id;
@@ -1142,7 +1111,7 @@
/**
* Defers all operations.
- * @return the same Builder instance.
+ * @return the same {@code Builder} instance.
*/
public @NonNull Builder defer() {
mFlags |= FLAG_DEFER;
@@ -1152,7 +1121,7 @@
/**
* Terminates the VolumeShaper.
* Do not call directly, use {@link VolumeShaper#release()}.
- * @return the same Builder instance.
+ * @return the same {@code Builder} instance.
*/
public @NonNull Builder terminate() {
mFlags |= FLAG_TERMINATE;
@@ -1161,7 +1130,7 @@
/**
* Reverses direction.
- * @return the same Builder instance.
+ * @return the same {@code Builder} instance.
*/
public @NonNull Builder reverse() {
mFlags ^= FLAG_REVERSE;
@@ -1169,11 +1138,22 @@
}
/**
+ * Use the id specified in the configuration, creating
+ * VolumeShaper as needed; the configuration should be
+ * TYPE_SCALE.
+ * @return the same {@code Builder} instance.
+ */
+ public @NonNull Builder createIfNeeded() {
+ mFlags |= FLAG_CREATE_IF_NEEDED;
+ return this;
+ }
+
+ /**
* Sets the operation flag. Do not call this directly but one of the
* other builder methods.
*
* @param flags new value for {@code flags}, consisting of ORed flags.
- * @return the same Builder instance.
+ * @return the same {@code Builder} instance.
*/
private @NonNull Builder setFlags(@Flag int flags) {
if ((flags & ~FLAG_PUBLIC_ALL) != 0) {
diff --git a/media/java/android/media/session/ICallback.aidl b/media/java/android/media/session/ICallback.aidl
new file mode 100644
index 0000000..322bffa
--- /dev/null
+++ b/media/java/android/media/session/ICallback.aidl
@@ -0,0 +1,35 @@
+/* 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.
+ */
+
+package android.media.session;
+
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.media.session.MediaSession;
+import android.view.KeyEvent;
+
+/**
+ * @hide
+ */
+oneway interface ICallback {
+ void onMediaKeyEventDispatchedToMediaSession(in KeyEvent event,
+ in MediaSession.Token sessionToken);
+ void onMediaKeyEventDispatchedToMediaButtonReceiver(in KeyEvent event,
+ in ComponentName mediaButtonReceiver);
+
+ void onAddressedPlayerChangedToMediaSession(in MediaSession.Token sessionToken);
+ void onAddressedPlayerChangedToMediaButtonReceiver(in ComponentName mediaButtonReceiver);
+}
+
diff --git a/media/java/android/media/session/ISessionManager.aidl b/media/java/android/media/session/ISessionManager.aidl
index 8a98773..5fcb430 100644
--- a/media/java/android/media/session/ISessionManager.aidl
+++ b/media/java/android/media/session/ISessionManager.aidl
@@ -18,8 +18,9 @@
import android.content.ComponentName;
import android.media.IRemoteVolumeController;
import android.media.session.IActiveSessionsListener;
-import android.media.session.IOnVolumeKeyLongPressListener;
+import android.media.session.ICallback;
import android.media.session.IOnMediaKeyListener;
+import android.media.session.IOnVolumeKeyLongPressListener;
import android.media.session.ISession;
import android.media.session.ISessionCallback;
import android.os.Bundle;
@@ -45,7 +46,7 @@
// For PhoneWindowManager to precheck media keys
boolean isGlobalPriorityActive();
+ void setCallback(in ICallback callback);
void setOnVolumeKeyLongPressListener(in IOnVolumeKeyLongPressListener listener);
void setOnMediaKeyListener(in IOnMediaKeyListener listener);
}
-
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index 80d2a0c..83793ae 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -71,6 +71,7 @@
private Context mContext;
+ private CallbackImpl mCallback;
private OnVolumeKeyLongPressListenerImpl mOnVolumeKeyLongPressListener;
private OnMediaKeyListenerImpl mOnMediaKeyListener;
@@ -411,6 +412,36 @@
}
/**
+ * Set a {@link Callback}.
+ *
+ * <p>System can only have a single callback, and the callback can only be set by
+ * Bluetooth service process.
+ *
+ * @param callback A {@link Callback}. {@code null} to reset.
+ * @param handler The handler on which the callback should be invoked, or {@code null}
+ * if the callback should be invoked on the calling thread's looper.
+ * @hide
+ */
+ public void setCallback(@Nullable Callback callback, @Nullable Handler handler) {
+ synchronized (mLock) {
+ try {
+ if (callback == null) {
+ mCallback = null;
+ mService.setCallback(null);
+ } else {
+ if (handler == null) {
+ handler = new Handler();
+ }
+ mCallback = new CallbackImpl(callback, handler);
+ mService.setCallback(mCallback);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to set media key callback", e);
+ }
+ }
+ }
+
+ /**
* Listens for changes to the list of active sessions. This can be added
* using {@link #addOnActiveSessionsChangedListener}.
*/
@@ -439,12 +470,65 @@
public interface OnMediaKeyListener {
/**
* Called when the media key is pressed.
+ * <p>If the listener consumes the initial down event (i.e. ACTION_DOWN with
+ * repeat count zero), it must also comsume all following key events.
+ * (i.e. ACTION_DOWN with repeat count more than zero, and ACTION_UP).
* <p>If it takes more than 1s to return, the key event will be sent to
* other media sessions.
*/
boolean onMediaKey(KeyEvent event);
}
+ /**
+ * Callbacks for the media session service.
+ *
+ * <p>Called when a media key event is dispatched or the addressed player is changed.
+ * The addressed player is either the media session or the media button receiver that will
+ * receive media key events.
+ * @hide
+ */
+ public static abstract class Callback {
+ /**
+ * Called when a media key event is dispatched to the media session
+ * through the media session service.
+ *
+ * @param event Dispatched media key event.
+ * @param sessionToken The media session's token.
+ */
+ public abstract void onMediaKeyEventDispatched(KeyEvent event,
+ MediaSession.Token sessionToken);
+
+ /**
+ * Called when a media key event is dispatched to the media button receiver
+ * through the media session service.
+ * <p>MediaSessionService may broadcast key events to the media button receiver
+ * when reviving playback after the media session is released.
+ *
+ * @param event Dispatched media key event.
+ * @param mediaButtonReceiver The media button receiver.
+ */
+ public abstract void onMediaKeyEventDispatched(KeyEvent event,
+ ComponentName mediaButtonReceiver);
+
+ /**
+ * Called when the addressed player is changed to a media session.
+ * <p>One of the {@ #onAddressedPlayerChanged} will be also called immediately after
+ * {@link #setCallback} if the addressed player exists.
+ *
+ * @param sessionToken The media session's token.
+ */
+ public abstract void onAddressedPlayerChanged(MediaSession.Token sessionToken);
+
+ /**
+ * Called when the addressed player is changed to the media button receiver.
+ * <p>One of the {@ #onAddressedPlayerChanged} will be also called immediately after
+ * {@link #setCallback} if the addressed player exists.
+ *
+ * @param mediaButtonReceiver The media button receiver.
+ */
+ public abstract void onAddressedPlayerChanged(ComponentName mediaButtonReceiver);
+ }
+
private static final class SessionsChangedWrapper {
private Context mContext;
private OnActiveSessionsChangedListener mListener;
@@ -534,9 +618,64 @@
public void run() {
boolean handled = mListener.onMediaKey(event);
Log.d(TAG, "The media key listener is returned " + handled);
- result.send(
- handled ? RESULT_MEDIA_KEY_HANDLED : RESULT_MEDIA_KEY_NOT_HANDLED,
- null);
+ if (result != null) {
+ result.send(
+ handled ? RESULT_MEDIA_KEY_HANDLED : RESULT_MEDIA_KEY_NOT_HANDLED,
+ null);
+ }
+ }
+ });
+ }
+ }
+
+ private static final class CallbackImpl extends ICallback.Stub {
+ private final Callback mCallback;
+ private final Handler mHandler;
+
+ public CallbackImpl(@NonNull Callback callback, @NonNull Handler handler) {
+ mCallback = callback;
+ mHandler = handler;
+ }
+
+ @Override
+ public void onMediaKeyEventDispatchedToMediaSession(KeyEvent event,
+ MediaSession.Token sessionToken) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCallback.onMediaKeyEventDispatched(event, sessionToken);
+ }
+ });
+ }
+
+ @Override
+ public void onMediaKeyEventDispatchedToMediaButtonReceiver(KeyEvent event,
+ ComponentName mediaButtonReceiver) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCallback.onMediaKeyEventDispatched(event, mediaButtonReceiver);
+ }
+ });
+ }
+
+ @Override
+ public void onAddressedPlayerChangedToMediaSession(MediaSession.Token sessionToken) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCallback.onAddressedPlayerChanged(sessionToken);
+ }
+ });
+ }
+
+ @Override
+ public void onAddressedPlayerChangedToMediaButtonReceiver(
+ ComponentName mediaButtonReceiver) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCallback.onAddressedPlayerChanged(mediaButtonReceiver);
}
});
}
diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java
index ddbd542e..1b53d72 100644
--- a/media/java/android/media/tv/TvContract.java
+++ b/media/java/android/media/tv/TvContract.java
@@ -25,6 +25,7 @@
import android.content.ContentUris;
import android.content.Intent;
import android.net.Uri;
+import android.os.Bundle;
import android.os.IBinder;
import android.provider.BaseColumns;
import android.text.TextUtils;
@@ -68,9 +69,102 @@
private static final String PATH_CHANNEL = "channel";
private static final String PATH_PROGRAM = "program";
private static final String PATH_RECORDED_PROGRAM = "recorded_program";
+ private static final String PATH_PREVIEW_PROGRAM = "preview_program";
private static final String PATH_PASSTHROUGH = "passthrough";
/**
+ * The method name to get existing columns in the given table of the specified content provider.
+ *
+ * <p>The method caller must provide the following parameter:
+ * <ul>
+ * <li>{@code arg}: The content URI of the target table as a {@link String}.</li>
+ * </ul>
+
+ * <p>On success, the returned {@link android.os.Bundle} will include existing column names
+ * with the key {@link #EXTRA_EXISTING_COLUMN_NAMES}. Otherwise, the return value will be {@code null}.
+ *
+ * @see ContentResolver#call(Uri, String, String, Bundle)
+ * @see #EXTRA_EXISTING_COLUMN_NAMES
+ * @hide
+ */
+ @SystemApi
+ public static final String METHOD_GET_COLUMNS = "get_columns";
+
+ /**
+ * The method name to add a new column in the given table of the specified content provider.
+ *
+ * <p>The method caller must provide the following parameter:
+ * <ul>
+ * <li>{@code arg}: The content URI of the target table as a {@link String}.</li>
+ * <li>{@code extra}: Name, data type, and default value of the new column in a Bundle:
+ * <ul>
+ * <li>{@link #EXTRA_COLUMN_NAME} the column name as a {@link String}.</li>
+ * <li>{@link #EXTRA_DATA_TYPE} the data type as a {@link String}.</li>
+ * <li>{@link #EXTRA_DEFAULT_VALUE} the default value as a {@link String}.
+ * (optional)</li>
+ * </ul>
+ * </li>
+ * </ul>
+ *
+ * <p>On success, the returned {@link android.os.Bundle} will include current colum names after
+ * the addition operation with the key {@link #EXTRA_EXISTING_COLUMN_NAMES}. Otherwise, the
+ * return value will be {@code null}.
+ *
+ * @see ContentResolver#call(Uri, String, String, Bundle)
+ * @see #EXTRA_COLUMN_NAME
+ * @see #EXTRA_DATA_TYPE
+ * @see #EXTRA_DEFAULT_VALUE
+ * @see #EXTRA_EXISTING_COLUMN_NAMES
+ * @hide
+ */
+ @SystemApi
+ public static final String METHOD_ADD_COLUMN = "add_column";
+
+ /**
+ * The key for a returned {@link Bundle} value containing existing column names in the given
+ * table as an {@link ArrayList} of {@link String}.
+ *
+ * @see #METHOD_GET_COLUMNS
+ * @see #METHOD_ADD_COLUMN
+ * @hide
+ */
+ @SystemApi
+ public static final String EXTRA_EXISTING_COLUMN_NAMES =
+ "android.media.tv.extra.EXISTING_COLUMN_NAMES";
+
+ /**
+ * The key for a {@link Bundle} parameter containing the new column name to be added in the
+ * given table as a non-empty {@link CharSequence}.
+ *
+ * @see #METHOD_ADD_COLUMN
+ * @hide
+ */
+ @SystemApi
+ public static final String EXTRA_COLUMN_NAME = "android.media.tv.extra.COLUMN_NAME";
+
+ /**
+ * The key for a {@link Bundle} parameter containing the data type of the new column to be added
+ * in the given table as a non-empty {@link CharSequence}, which should be one of the following
+ * values: {@code "TEXT"}, {@code "INTEGER"}, {@code "REAL"}, or {@code "BLOB"}.
+ *
+ * @see #METHOD_ADD_COLUMN
+ * @hide
+ */
+ @SystemApi
+ public static final String EXTRA_DATA_TYPE = "android.media.tv.extra.DATA_TYPE";
+
+ /**
+ * The key for a {@link Bundle} parameter containing the default value of the new column to be
+ * added in the given table as a {@link CharSequence}, which represents a valid default value
+ * according to the data type provided with {@link #EXTRA_DATA_TYPE}.
+ *
+ * @see #METHOD_ADD_COLUMN
+ * @hide
+ */
+ @SystemApi
+ public static final String EXTRA_DEFAULT_VALUE = "android.media.tv.extra.DEFAULT_VALUE";
+
+ /**
* An optional query, update or delete URI parameter that allows the caller to specify TV input
* ID to filter channels.
* @hide
@@ -296,6 +390,37 @@
}
/**
+ * Builds a URI that points to a specific preview program.
+ *
+ * @param previewProgramId The ID of the preview program to point to.
+ */
+ public static final Uri buildPreviewProgramUri(long previewProgramId) {
+ return ContentUris.withAppendedId(PreviewPrograms.CONTENT_URI, previewProgramId);
+ }
+
+ /**
+ * Builds a URI that points to all preview programs on a given channel.
+ *
+ * @param channelId The ID of the channel to return preview programs for.
+ */
+ public static final Uri buildPreviewProgramsUriForChannel(long channelId) {
+ return PreviewPrograms.CONTENT_URI.buildUpon()
+ .appendQueryParameter(PARAM_CHANNEL, String.valueOf(channelId)).build();
+ }
+
+ /**
+ * Builds a URI that points to all preview programs on a given channel.
+ *
+ * @param channelUri The URI of the channel to return preview programs for.
+ */
+ public static final Uri buildPreviewProgramsUriForChannel(Uri channelUri) {
+ if (!isChannelUriForTunerInput(channelUri)) {
+ throw new IllegalArgumentException("Not a channel: " + channelUri);
+ }
+ return buildPreviewProgramsUriForChannel(ContentUris.parseId(channelUri));
+ }
+
+ /**
* Builds a URI that points to a specific program the user watched.
*
* @param watchedProgramId The ID of the watched program to point to.
@@ -1300,6 +1425,18 @@
public static final String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri";
/**
+ * The internal ID used by individual TV input services.
+ *
+ * <p>This is internal to the provider that inserted it, and should not be decoded by other
+ * apps.
+ *
+ * <p>Can be empty.
+ *
+ * <p>Type: TEXT
+ */
+ public static final String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+
+ /**
* Internal data used by individual TV input services.
*
* <p>This is internal to the provider that inserted it, and should not be decoded by other
@@ -1449,6 +1586,420 @@
/** The MIME type of a single TV program. */
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/program";
+ /**
+ * The season number of this TV program for episodic TV shows.
+ *
+ * <p>Can be empty.
+ *
+ * <p>Type: INTEGER
+ *
+ * @deprecated Use {@link #COLUMN_SEASON_DISPLAY_NUMBER} instead.
+ */
+ @Deprecated
+ public static final String COLUMN_SEASON_NUMBER = "season_number";
+
+ /**
+ * The episode number of this TV program for episodic TV shows.
+ *
+ * <p>Can be empty.
+ *
+ * <p>Type: INTEGER
+ *
+ * @deprecated Use {@link #COLUMN_EPISODE_DISPLAY_NUMBER} instead.
+ */
+ @Deprecated
+ public static final String COLUMN_EPISODE_NUMBER = "episode_number";
+
+ /**
+ * The start time of this TV program, in milliseconds since the epoch.
+ *
+ * <p>The value should be equal to or larger than {@link #COLUMN_END_TIME_UTC_MILLIS} of the
+ * previous program in the same channel. In practice, start time will usually be the end
+ * time of the previous program.
+ *
+ * <p>Can be empty if this program belongs to a {@link Channels#TYPE_PREVIEW} channel.
+ *
+ * <p>Type: INTEGER (long)
+ */
+ public static final String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+
+ /**
+ * The end time of this TV program, in milliseconds since the epoch.
+ *
+ * <p>The value should be equal to or less than {@link #COLUMN_START_TIME_UTC_MILLIS} of the
+ * next program in the same channel. In practice, end time will usually be the start time of
+ * the next program.
+ *
+ * <p>Can be empty if this program belongs to a {@link Channels#TYPE_PREVIEW} channel.
+ *
+ * <p>Type: INTEGER (long)
+ */
+ public static final String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+
+ /**
+ * The comma-separated genre string of this TV program.
+ *
+ * <p>Use the same language appeared in the underlying broadcast standard, if applicable.
+ * (For example, one can refer to the genre strings used in Genre Descriptor of ATSC A/65 or
+ * Content Descriptor of ETSI EN 300 468, if appropriate.) Otherwise, leave empty. Use
+ * {@link Genres#encode} to create a text that can be stored in this column. Use
+ * {@link Genres#decode} to get the broadcast genre strings from the text stored in the
+ * column.
+ *
+ * <p>Type: TEXT
+ * @see Genres#encode
+ * @see Genres#decode
+ */
+ public static final String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+
+ /**
+ * The flag indicating whether recording of this program is prohibited.
+ *
+ * <p>A value of 1 indicates that recording of this program is prohibited and application
+ * will not schedule any recording for this program. A value of 0 indicates that the
+ * recording is not prohibited. If not specified, this value is set to 0 (not prohibited) by
+ * default.
+ *
+ * <p>Type: INTEGER (boolean)
+ */
+ public static final String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
+
+ private Programs() {}
+
+ /** Canonical genres for TV programs. */
+ public static final class Genres {
+ /** @hide */
+ @StringDef({
+ FAMILY_KIDS,
+ SPORTS,
+ SHOPPING,
+ MOVIES,
+ COMEDY,
+ TRAVEL,
+ DRAMA,
+ EDUCATION,
+ ANIMAL_WILDLIFE,
+ NEWS,
+ GAMING,
+ ARTS,
+ ENTERTAINMENT,
+ LIFE_STYLE,
+ MUSIC,
+ PREMIER,
+ TECH_SCIENCE,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Genre {}
+
+ /** The genre for Family/Kids. */
+ public static final String FAMILY_KIDS = "FAMILY_KIDS";
+
+ /** The genre for Sports. */
+ public static final String SPORTS = "SPORTS";
+
+ /** The genre for Shopping. */
+ public static final String SHOPPING = "SHOPPING";
+
+ /** The genre for Movies. */
+ public static final String MOVIES = "MOVIES";
+
+ /** The genre for Comedy. */
+ public static final String COMEDY = "COMEDY";
+
+ /** The genre for Travel. */
+ public static final String TRAVEL = "TRAVEL";
+
+ /** The genre for Drama. */
+ public static final String DRAMA = "DRAMA";
+
+ /** The genre for Education. */
+ public static final String EDUCATION = "EDUCATION";
+
+ /** The genre for Animal/Wildlife. */
+ public static final String ANIMAL_WILDLIFE = "ANIMAL_WILDLIFE";
+
+ /** The genre for News. */
+ public static final String NEWS = "NEWS";
+
+ /** The genre for Gaming. */
+ public static final String GAMING = "GAMING";
+
+ /** The genre for Arts. */
+ public static final String ARTS = "ARTS";
+
+ /** The genre for Entertainment. */
+ public static final String ENTERTAINMENT = "ENTERTAINMENT";
+
+ /** The genre for Life Style. */
+ public static final String LIFE_STYLE = "LIFE_STYLE";
+
+ /** The genre for Music. */
+ public static final String MUSIC = "MUSIC";
+
+ /** The genre for Premier. */
+ public static final String PREMIER = "PREMIER";
+
+ /** The genre for Tech/Science. */
+ public static final String TECH_SCIENCE = "TECH_SCIENCE";
+
+ private static final ArraySet<String> CANONICAL_GENRES = new ArraySet<>();
+ static {
+ CANONICAL_GENRES.add(FAMILY_KIDS);
+ CANONICAL_GENRES.add(SPORTS);
+ CANONICAL_GENRES.add(SHOPPING);
+ CANONICAL_GENRES.add(MOVIES);
+ CANONICAL_GENRES.add(COMEDY);
+ CANONICAL_GENRES.add(TRAVEL);
+ CANONICAL_GENRES.add(DRAMA);
+ CANONICAL_GENRES.add(EDUCATION);
+ CANONICAL_GENRES.add(ANIMAL_WILDLIFE);
+ CANONICAL_GENRES.add(NEWS);
+ CANONICAL_GENRES.add(GAMING);
+ CANONICAL_GENRES.add(ARTS);
+ CANONICAL_GENRES.add(ENTERTAINMENT);
+ CANONICAL_GENRES.add(LIFE_STYLE);
+ CANONICAL_GENRES.add(MUSIC);
+ CANONICAL_GENRES.add(PREMIER);
+ CANONICAL_GENRES.add(TECH_SCIENCE);
+ }
+
+ private static final char DOUBLE_QUOTE = '"';
+ private static final char COMMA = ',';
+ private static final String DELIMITER = ",";
+
+ private static final String[] EMPTY_STRING_ARRAY = new String[0];
+
+ private Genres() {}
+
+ /**
+ * Encodes genre strings to a text that can be put into the database.
+ *
+ * @param genres Genre strings.
+ * @return an encoded genre string that can be inserted into the
+ * {@link #COLUMN_BROADCAST_GENRE} or {@link #COLUMN_CANONICAL_GENRE} column.
+ */
+ public static String encode(@NonNull @Genre String... genres) {
+ if (genres == null) {
+ // MNC and before will throw a NPE.
+ return null;
+ }
+ StringBuilder sb = new StringBuilder();
+ String separator = "";
+ for (String genre : genres) {
+ sb.append(separator).append(encodeToCsv(genre));
+ separator = DELIMITER;
+ }
+ return sb.toString();
+ }
+
+ private static String encodeToCsv(String genre) {
+ StringBuilder sb = new StringBuilder();
+ int length = genre.length();
+ for (int i = 0; i < length; ++i) {
+ char c = genre.charAt(i);
+ switch (c) {
+ case DOUBLE_QUOTE:
+ sb.append(DOUBLE_QUOTE);
+ break;
+ case COMMA:
+ sb.append(DOUBLE_QUOTE);
+ break;
+ }
+ sb.append(c);
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Decodes the genre strings from the text stored in the database.
+ *
+ * @param genres The encoded genre string retrieved from the
+ * {@link #COLUMN_BROADCAST_GENRE} or {@link #COLUMN_CANONICAL_GENRE} column.
+ * @return genre strings.
+ */
+ public static @Genre String[] decode(@NonNull String genres) {
+ if (TextUtils.isEmpty(genres)) {
+ // MNC and before will throw a NPE for {@code null} genres.
+ return EMPTY_STRING_ARRAY;
+ }
+ if (genres.indexOf(COMMA) == -1 && genres.indexOf(DOUBLE_QUOTE) == -1) {
+ return new String[] {genres.trim()};
+ }
+ StringBuilder sb = new StringBuilder();
+ List<String> results = new ArrayList<>();
+ int length = genres.length();
+ boolean escape = false;
+ for (int i = 0; i < length; ++i) {
+ char c = genres.charAt(i);
+ switch (c) {
+ case DOUBLE_QUOTE:
+ if (!escape) {
+ escape = true;
+ continue;
+ }
+ break;
+ case COMMA:
+ if (!escape) {
+ String string = sb.toString().trim();
+ if (string.length() > 0) {
+ results.add(string);
+ }
+ sb = new StringBuilder();
+ continue;
+ }
+ break;
+ }
+ sb.append(c);
+ escape = false;
+ }
+ String string = sb.toString().trim();
+ if (string.length() > 0) {
+ results.add(string);
+ }
+ return results.toArray(new String[results.size()]);
+ }
+
+ /**
+ * Returns whether a given text is a canonical genre defined in {@link Genres}.
+ *
+ * @param genre The name of genre to be checked.
+ * @return {@code true} if the genre is canonical, otherwise {@code false}.
+ */
+ public static boolean isCanonical(String genre) {
+ return CANONICAL_GENRES.contains(genre);
+ }
+ }
+ }
+
+ /**
+ * Column definitions for the recorded TV programs table.
+ *
+ * <p>By default, the query results will be sorted by {@link #COLUMN_START_TIME_UTC_MILLIS} in
+ * ascending order.
+ */
+ public static final class RecordedPrograms implements BaseProgramColumns {
+
+ /** The content:// style URI for this table. */
+ public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/"
+ + PATH_RECORDED_PROGRAM);
+
+ /** The MIME type of a directory of recorded TV programs. */
+ public static final String CONTENT_TYPE = "vnd.android.cursor.dir/recorded_program";
+
+ /** The MIME type of a single recorded TV program. */
+ public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/recorded_program";
+
+ /**
+ * The ID of the TV input service that is associated with this recorded program.
+ *
+ * <p>Use {@link #buildInputId} to build the ID.
+ *
+ * <p>This is a required field.
+ *
+ * <p>Type: TEXT
+ */
+ public static final String COLUMN_INPUT_ID = "input_id";
+
+ /**
+ * The start time of the original TV program, in milliseconds since the epoch.
+ *
+ * <p>Type: INTEGER (long)
+ * @see Programs#COLUMN_START_TIME_UTC_MILLIS
+ */
+ public static final String COLUMN_START_TIME_UTC_MILLIS =
+ Programs.COLUMN_START_TIME_UTC_MILLIS;
+
+ /**
+ * The end time of the original TV program, in milliseconds since the epoch.
+ *
+ * <p>Type: INTEGER (long)
+ * @see Programs#COLUMN_END_TIME_UTC_MILLIS
+ */
+ public static final String COLUMN_END_TIME_UTC_MILLIS = Programs.COLUMN_END_TIME_UTC_MILLIS;
+
+ /**
+ * The comma-separated genre string of this recorded TV program.
+ *
+ * <p>Use the same language appeared in the underlying broadcast standard, if applicable.
+ * (For example, one can refer to the genre strings used in Genre Descriptor of ATSC A/65 or
+ * Content Descriptor of ETSI EN 300 468, if appropriate.) Otherwise, leave empty. Use
+ * {@link Genres#encode Genres.encode()} to create a text that can be stored in this column.
+ * Use {@link Genres#decode Genres.decode()} to get the broadcast genre strings from the
+ * text stored in the column.
+ *
+ * <p>Type: TEXT
+ * @see Programs#COLUMN_BROADCAST_GENRE
+ */
+ public static final String COLUMN_BROADCAST_GENRE = Programs.COLUMN_BROADCAST_GENRE;
+
+ /**
+ * The URI of the recording data for this recorded program.
+ *
+ * <p>Together with {@link #COLUMN_RECORDING_DATA_BYTES}, applications can use this
+ * information to manage recording storage. The URI should indicate a file or directory with
+ * the scheme {@link android.content.ContentResolver#SCHEME_FILE}.
+ *
+ * <p>Type: TEXT
+ * @see #COLUMN_RECORDING_DATA_BYTES
+ */
+ public static final String COLUMN_RECORDING_DATA_URI = "recording_data_uri";
+
+ /**
+ * The data size (in bytes) for this recorded program.
+ *
+ * <p>Together with {@link #COLUMN_RECORDING_DATA_URI}, applications can use this
+ * information to manage recording storage.
+ *
+ * <p>Type: INTEGER (long)
+ * @see #COLUMN_RECORDING_DATA_URI
+ */
+ public static final String COLUMN_RECORDING_DATA_BYTES = "recording_data_bytes";
+
+ /**
+ * The duration (in milliseconds) of this recorded program.
+ *
+ * <p>The actual duration of the recorded program can differ from the one calculated by
+ * {@link #COLUMN_END_TIME_UTC_MILLIS} - {@link #COLUMN_START_TIME_UTC_MILLIS} as program
+ * recording can be interrupted in the middle for some reason, resulting in a partially
+ * recorded program, which is still playable.
+ *
+ * <p>Type: INTEGER
+ */
+ public static final String COLUMN_RECORDING_DURATION_MILLIS = "recording_duration_millis";
+
+ /**
+ * The expiration time for this recorded program, in milliseconds since the epoch.
+ *
+ * <p>Recorded TV programs do not expire by default unless explicitly requested by the user
+ * or the user allows applications to delete them in order to free up disk space for future
+ * recording. However, some TV content can have expiration date set by the content provider
+ * when recorded. This field is used to indicate such a restriction.
+ *
+ * <p>Can be empty.
+ *
+ * <p>Type: INTEGER (long)
+ */
+ public static final String COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS =
+ "recording_expire_time_utc_millis";
+
+ private RecordedPrograms() {}
+ }
+
+ /**
+ * Column definitions for the preview TV programs table.
+ */
+ public static final class PreviewPrograms implements BaseProgramColumns {
+
+ /** The content:// style URI for this table. */
+ public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/"
+ + PATH_PREVIEW_PROGRAM);
+
+ /** The MIME type of a directory of preview TV programs. */
+ public static final String CONTENT_TYPE = "vnd.android.cursor.dir/preview_program";
+
+ /** The MIME type of a single preview TV program. */
+ public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/preview_program";
+
/** @hide */
@StringDef({
TYPE_MOVIE,
@@ -1788,72 +2339,6 @@
public static final String COLUMN_WATCH_NEXT_TYPE = "watch_next_type";
/**
- * The season number of this TV program for episodic TV shows.
- *
- * <p>Can be empty.
- *
- * <p>Type: INTEGER
- *
- * @deprecated Use {@link #COLUMN_SEASON_DISPLAY_NUMBER} instead.
- */
- @Deprecated
- public static final String COLUMN_SEASON_NUMBER = "season_number";
-
- /**
- * The episode number of this TV program for episodic TV shows.
- *
- * <p>Can be empty.
- *
- * <p>Type: INTEGER
- *
- * @deprecated Use {@link #COLUMN_EPISODE_DISPLAY_NUMBER} instead.
- */
- @Deprecated
- public static final String COLUMN_EPISODE_NUMBER = "episode_number";
-
- /**
- * The start time of this TV program, in milliseconds since the epoch.
- *
- * <p>The value should be equal to or larger than {@link #COLUMN_END_TIME_UTC_MILLIS} of the
- * previous program in the same channel. In practice, start time will usually be the end
- * time of the previous program.
- *
- * <p>Can be empty if this program belongs to a {@link Channels#TYPE_PREVIEW} channel.
- *
- * <p>Type: INTEGER (long)
- */
- public static final String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
-
- /**
- * The end time of this TV program, in milliseconds since the epoch.
- *
- * <p>The value should be equal to or less than {@link #COLUMN_START_TIME_UTC_MILLIS} of the
- * next program in the same channel. In practice, end time will usually be the start time of
- * the next program.
- *
- * <p>Can be empty if this program belongs to a {@link Channels#TYPE_PREVIEW} channel.
- *
- * <p>Type: INTEGER (long)
- */
- public static final String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
-
- /**
- * The comma-separated genre string of this TV program.
- *
- * <p>Use the same language appeared in the underlying broadcast standard, if applicable.
- * (For example, one can refer to the genre strings used in Genre Descriptor of ATSC A/65 or
- * Content Descriptor of ETSI EN 300 468, if appropriate.) Otherwise, leave empty. Use
- * {@link Genres#encode} to create a text that can be stored in this column. Use
- * {@link Genres#decode} to get the broadcast genre strings from the text stored in the
- * column.
- *
- * <p>Type: TEXT
- * @see Genres#encode
- * @see Genres#decode
- */
- public static final String COLUMN_BROADCAST_GENRE = "broadcast_genre";
-
- /**
* The aspect ratio of the poster art for this TV program.
*
* <p>The value should match one of the followings:
@@ -1965,18 +2450,6 @@
public static final String COLUMN_LIVE = "live";
/**
- * The flag indicating whether recording of this program is prohibited.
- *
- * <p>A value of 1 indicates that recording of this program is prohibited and application
- * will not schedule any recording for this program. A value of 0 indicates that the
- * recording is not prohibited. If not specified, this value is set to 0 (not prohibited) by
- * default.
- *
- * <p>Type: INTEGER (boolean)
- */
- public static final String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
-
- /**
* The internal ID used by individual TV input services.
*
* <p>This is internal to the provider that inserted it, and should not be decoded by other
@@ -2094,7 +2567,7 @@
*
* <p>This indicates the number of times interaction has happened.
*
- * <p>Type: INTEGER
+ * <p>Type: INTEGER (long)
* @see #COLUMN_INTERACTION_TYPE
*/
public static final String COLUMN_INTERACTION_COUNT = "interaction_count";
@@ -2133,325 +2606,25 @@
*/
public static final String COLUMN_REVIEW_RATING = "review_rating";
- private Programs() {}
-
- /** Canonical genres for TV programs. */
- public static final class Genres {
- /** @hide */
- @StringDef({
- FAMILY_KIDS,
- SPORTS,
- SHOPPING,
- MOVIES,
- COMEDY,
- TRAVEL,
- DRAMA,
- EDUCATION,
- ANIMAL_WILDLIFE,
- NEWS,
- GAMING,
- ARTS,
- ENTERTAINMENT,
- LIFE_STYLE,
- MUSIC,
- PREMIER,
- TECH_SCIENCE,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface Genre {}
-
- /** The genre for Family/Kids. */
- public static final String FAMILY_KIDS = "FAMILY_KIDS";
-
- /** The genre for Sports. */
- public static final String SPORTS = "SPORTS";
-
- /** The genre for Shopping. */
- public static final String SHOPPING = "SHOPPING";
-
- /** The genre for Movies. */
- public static final String MOVIES = "MOVIES";
-
- /** The genre for Comedy. */
- public static final String COMEDY = "COMEDY";
-
- /** The genre for Travel. */
- public static final String TRAVEL = "TRAVEL";
-
- /** The genre for Drama. */
- public static final String DRAMA = "DRAMA";
-
- /** The genre for Education. */
- public static final String EDUCATION = "EDUCATION";
-
- /** The genre for Animal/Wildlife. */
- public static final String ANIMAL_WILDLIFE = "ANIMAL_WILDLIFE";
-
- /** The genre for News. */
- public static final String NEWS = "NEWS";
-
- /** The genre for Gaming. */
- public static final String GAMING = "GAMING";
-
- /** The genre for Arts. */
- public static final String ARTS = "ARTS";
-
- /** The genre for Entertainment. */
- public static final String ENTERTAINMENT = "ENTERTAINMENT";
-
- /** The genre for Life Style. */
- public static final String LIFE_STYLE = "LIFE_STYLE";
-
- /** The genre for Music. */
- public static final String MUSIC = "MUSIC";
-
- /** The genre for Premier. */
- public static final String PREMIER = "PREMIER";
-
- /** The genre for Tech/Science. */
- public static final String TECH_SCIENCE = "TECH_SCIENCE";
-
- private static final ArraySet<String> CANONICAL_GENRES = new ArraySet<>();
- static {
- CANONICAL_GENRES.add(FAMILY_KIDS);
- CANONICAL_GENRES.add(SPORTS);
- CANONICAL_GENRES.add(SHOPPING);
- CANONICAL_GENRES.add(MOVIES);
- CANONICAL_GENRES.add(COMEDY);
- CANONICAL_GENRES.add(TRAVEL);
- CANONICAL_GENRES.add(DRAMA);
- CANONICAL_GENRES.add(EDUCATION);
- CANONICAL_GENRES.add(ANIMAL_WILDLIFE);
- CANONICAL_GENRES.add(NEWS);
- CANONICAL_GENRES.add(GAMING);
- CANONICAL_GENRES.add(ARTS);
- CANONICAL_GENRES.add(ENTERTAINMENT);
- CANONICAL_GENRES.add(LIFE_STYLE);
- CANONICAL_GENRES.add(MUSIC);
- CANONICAL_GENRES.add(PREMIER);
- CANONICAL_GENRES.add(TECH_SCIENCE);
- }
-
- private static final char DOUBLE_QUOTE = '"';
- private static final char COMMA = ',';
- private static final String DELIMITER = ",";
-
- private static final String[] EMPTY_STRING_ARRAY = new String[0];
-
- private Genres() {}
-
- /**
- * Encodes genre strings to a text that can be put into the database.
- *
- * @param genres Genre strings.
- * @return an encoded genre string that can be inserted into the
- * {@link #COLUMN_BROADCAST_GENRE} or {@link #COLUMN_CANONICAL_GENRE} column.
- */
- public static String encode(@NonNull @Genre String... genres) {
- if (genres == null) {
- // MNC and before will throw a NPE.
- return null;
- }
- StringBuilder sb = new StringBuilder();
- String separator = "";
- for (String genre : genres) {
- sb.append(separator).append(encodeToCsv(genre));
- separator = DELIMITER;
- }
- return sb.toString();
- }
-
- private static String encodeToCsv(String genre) {
- StringBuilder sb = new StringBuilder();
- int length = genre.length();
- for (int i = 0; i < length; ++i) {
- char c = genre.charAt(i);
- switch (c) {
- case DOUBLE_QUOTE:
- sb.append(DOUBLE_QUOTE);
- break;
- case COMMA:
- sb.append(DOUBLE_QUOTE);
- break;
- }
- sb.append(c);
- }
- return sb.toString();
- }
-
- /**
- * Decodes the genre strings from the text stored in the database.
- *
- * @param genres The encoded genre string retrieved from the
- * {@link #COLUMN_BROADCAST_GENRE} or {@link #COLUMN_CANONICAL_GENRE} column.
- * @return genre strings.
- */
- public static @Genre String[] decode(@NonNull String genres) {
- if (TextUtils.isEmpty(genres)) {
- // MNC and before will throw a NPE for {@code null} genres.
- return EMPTY_STRING_ARRAY;
- }
- if (genres.indexOf(COMMA) == -1 && genres.indexOf(DOUBLE_QUOTE) == -1) {
- return new String[] {genres.trim()};
- }
- StringBuilder sb = new StringBuilder();
- List<String> results = new ArrayList<>();
- int length = genres.length();
- boolean escape = false;
- for (int i = 0; i < length; ++i) {
- char c = genres.charAt(i);
- switch (c) {
- case DOUBLE_QUOTE:
- if (!escape) {
- escape = true;
- continue;
- }
- break;
- case COMMA:
- if (!escape) {
- String string = sb.toString().trim();
- if (string.length() > 0) {
- results.add(string);
- }
- sb = new StringBuilder();
- continue;
- }
- break;
- }
- sb.append(c);
- escape = false;
- }
- String string = sb.toString().trim();
- if (string.length() > 0) {
- results.add(string);
- }
- return results.toArray(new String[results.size()]);
- }
-
- /**
- * Returns whether a given text is a canonical genre defined in {@link Genres}.
- *
- * @param genre The name of genre to be checked.
- * @return {@code true} if the genre is canonical, otherwise {@code false}.
- */
- public static boolean isCanonical(String genre) {
- return CANONICAL_GENRES.contains(genre);
- }
- }
- }
-
- /**
- * Column definitions for the recorded TV programs table.
- *
- * <p>By default, the query results will be sorted by {@link #COLUMN_START_TIME_UTC_MILLIS} in
- * ascending order.
- */
- public static final class RecordedPrograms implements BaseProgramColumns {
-
- /** The content:// style URI for this table. */
- public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/"
- + PATH_RECORDED_PROGRAM);
-
- /** The MIME type of a directory of recorded TV programs. */
- public static final String CONTENT_TYPE = "vnd.android.cursor.dir/recorded_program";
-
- /** The MIME type of a single recorded TV program. */
- public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/recorded_program";
-
/**
- * The ID of the TV input service that is associated with this recorded program.
+ * The flag indicating whether this TV program is browsable or not.
*
- * <p>Use {@link #buildInputId} to build the ID.
+ * <p>This column can only be set by system apps. For other applications, it is a read-only
+ * column. Trying to modify it may cause {@link SecurityException}.
*
- * <p>This is a required field.
+ * <p>A value of 1 indicates that the program is browsable and can be shown to users in
+ * the UI. A value of 0 indicates that the program should be hidden from users and the
+ * application who changes this value to 0 should send
+ * {@link TvInputManager#ACTION_PROGRAM_BROWSABLE_DISABLED} to the owner of the program
+ * to notify this change.
*
- * <p>Type: TEXT
+ * <p>This value is set to 1 (browsable) by default.
+ *
+ * <p>Type: INTEGER (boolean)
*/
- public static final String COLUMN_INPUT_ID = "input_id";
+ public static final String COLUMN_BROWSABLE = "browsable";
- /**
- * The start time of the original TV program, in milliseconds since the epoch.
- *
- * <p>Type: INTEGER (long)
- * @see Programs#COLUMN_START_TIME_UTC_MILLIS
- */
- public static final String COLUMN_START_TIME_UTC_MILLIS =
- Programs.COLUMN_START_TIME_UTC_MILLIS;
-
- /**
- * The end time of the original TV program, in milliseconds since the epoch.
- *
- * <p>Type: INTEGER (long)
- * @see Programs#COLUMN_END_TIME_UTC_MILLIS
- */
- public static final String COLUMN_END_TIME_UTC_MILLIS = Programs.COLUMN_END_TIME_UTC_MILLIS;
-
- /**
- * The comma-separated genre string of this recorded TV program.
- *
- * <p>Use the same language appeared in the underlying broadcast standard, if applicable.
- * (For example, one can refer to the genre strings used in Genre Descriptor of ATSC A/65 or
- * Content Descriptor of ETSI EN 300 468, if appropriate.) Otherwise, leave empty. Use
- * {@link Genres#encode Genres.encode()} to create a text that can be stored in this column.
- * Use {@link Genres#decode Genres.decode()} to get the broadcast genre strings from the
- * text stored in the column.
- *
- * <p>Type: TEXT
- * @see Programs#COLUMN_BROADCAST_GENRE
- */
- public static final String COLUMN_BROADCAST_GENRE = Programs.COLUMN_BROADCAST_GENRE;
-
- /**
- * The URI of the recording data for this recorded program.
- *
- * <p>Together with {@link #COLUMN_RECORDING_DATA_BYTES}, applications can use this
- * information to manage recording storage. The URI should indicate a file or directory with
- * the scheme {@link android.content.ContentResolver#SCHEME_FILE}.
- *
- * <p>Type: TEXT
- * @see #COLUMN_RECORDING_DATA_BYTES
- */
- public static final String COLUMN_RECORDING_DATA_URI = "recording_data_uri";
-
- /**
- * The data size (in bytes) for this recorded program.
- *
- * <p>Together with {@link #COLUMN_RECORDING_DATA_URI}, applications can use this
- * information to manage recording storage.
- *
- * <p>Type: INTEGER (long)
- * @see #COLUMN_RECORDING_DATA_URI
- */
- public static final String COLUMN_RECORDING_DATA_BYTES = "recording_data_bytes";
-
- /**
- * The duration (in milliseconds) of this recorded program.
- *
- * <p>The actual duration of the recorded program can differ from the one calculated by
- * {@link #COLUMN_END_TIME_UTC_MILLIS} - {@link #COLUMN_START_TIME_UTC_MILLIS} as program
- * recording can be interrupted in the middle for some reason, resulting in a partially
- * recorded program, which is still playable.
- *
- * <p>Type: INTEGER
- */
- public static final String COLUMN_RECORDING_DURATION_MILLIS = "recording_duration_millis";
-
- /**
- * The expiration time for this recorded program, in milliseconds since the epoch.
- *
- * <p>Recorded TV programs do not expire by default unless explicitly requested by the user
- * or the user allows applications to delete them in order to free up disk space for future
- * recording. However, some TV content can have expiration date set by the content provider
- * when recorded. This field is used to indicate such a restriction.
- *
- * <p>Can be empty.
- *
- * <p>Type: INTEGER (long)
- */
- public static final String COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS =
- "recording_expire_time_utc_millis";
-
- private RecordedPrograms() {}
+ private PreviewPrograms() {}
}
/**
diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java
index 3b74ee7..35988d4 100644
--- a/media/java/android/media/tv/TvInputInfo.java
+++ b/media/java/android/media/tv/TvInputInfo.java
@@ -694,10 +694,16 @@
* {@link TvInputService}.
*/
public Builder(Context context, ComponentName component) {
- mContext = context;
+ if (context == null) {
+ throw new IllegalArgumentException("context cannot be null.");
+ }
Intent intent = new Intent(TvInputService.SERVICE_INTERFACE).setComponent(component);
mResolveInfo = context.getPackageManager().resolveService(intent,
PackageManager.GET_SERVICES | PackageManager.GET_META_DATA);
+ if (mResolveInfo == null) {
+ throw new IllegalArgumentException("Invalid component. Can't find the service.");
+ }
+ mContext = context;
}
/**
diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java
index b630270..4c2b031 100644
--- a/media/java/android/media/tv/TvInputManager.java
+++ b/media/java/android/media/tv/TvInputManager.java
@@ -325,23 +325,39 @@
"android.media.tv.action.VIEW_RECORDING_SCHEDULES";
/**
+ * Action sent by the system to tell the target TV input that one of its program's browsable
+ * state is disabled, i.e., it will no longer be shown to users, which, for example, might
+ * be a result of users' interaction with UI.
+ *
+ * <p>The intent must contain the following bundle parameter:
+ * <ul>
+ * <li>{@link #EXTRA_PROGRAM_ID} the program ID as a long integer.
+ * </ul>
+ */
+ public static final String ACTION_PROGRAM_BROWSABLE_DISABLED =
+ "android.media.tv.action.PROGRAM_BROWSABLE_DISABLED";
+
+ /**
* Action sent by an application telling the system to set the given channel as browsable.
*
* <p>The intent must contain the following bundle parameters:
* <ul>
- * <li>{@link #EXTRA_CHANNEL_ID} then channel ID as an integer.
+ * <li>{@link #EXTRA_CHANNEL_ID} the channel ID as a long integer.
* <li>{@link #EXTRA_PACKAGE_NAME} the package name of the requesting application.
* </ul>
*/
public static final String ACTION_MAKE_CHANNEL_BROWSABLE
= "android.media.tv.action.MAKE_CHANNEL_BROWSABLE";
- /** The key for a bundle parameter containing a channel ID as an integer */
+ /** The key for a bundle parameter containing a channel ID as a long integer */
public static final String EXTRA_CHANNEL_ID = "android.media.tv.extra.CHANNEL_ID";
/** The key for a bundle parameter containing a package name as a string. */
public static final String EXTRA_PACKAGE_NAME = "android.media.tv.extra.PACKAGE_NAME";
+ /** The key for a bundle parameter containing a program ID as a long integer */
+ public static final String EXTRA_PROGRAM_ID = "android.media.tv.extra.PROGRAM_ID";
+
private final ITvInputManager mService;
private final Object mLock = new Object();
diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java
index ce4a453..6f44e6d 100644
--- a/media/java/android/media/tv/TvInputService.java
+++ b/media/java/android/media/tv/TvInputService.java
@@ -284,8 +284,8 @@
private boolean mOverlayViewEnabled;
private IBinder mWindowToken;
private Rect mOverlayFrame;
- private long mStartPositionMs;
- private long mCurrentPositionMs;
+ private long mStartPositionMs = TvInputManager.TIME_SHIFT_INVALID_TIME;
+ private long mCurrentPositionMs = TvInputManager.TIME_SHIFT_INVALID_TIME;
private final TimeShiftPositionTrackingRunnable
mTimeShiftPositionTrackingRunnable = new TimeShiftPositionTrackingRunnable();
@@ -304,7 +304,6 @@
mContext = context;
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mHandler = new Handler(context.getMainLooper());
- mCurrentPositionMs = TvInputManager.TIME_SHIFT_INVALID_TIME;
}
/**
@@ -631,6 +630,8 @@
@MainThread
@Override
public void run() {
+ timeShiftEnablePositionTracking(
+ status == TvInputManager.TIME_SHIFT_STATUS_AVAILABLE);
try {
if (DEBUG) Log.d(TAG, "notifyTimeShiftStatusChanged");
if (mSessionCallback != null) {
@@ -1465,7 +1466,8 @@
@Override
public void run() {
long startPositionMs = onTimeShiftGetStartPosition();
- if (mStartPositionMs != startPositionMs) {
+ if (mStartPositionMs == TvInputManager.TIME_SHIFT_INVALID_TIME
+ || mStartPositionMs != startPositionMs) {
mStartPositionMs = startPositionMs;
notifyTimeShiftStartPositionChanged(startPositionMs);
}
@@ -1476,7 +1478,8 @@
+ "position.");
currentPositionMs = mStartPositionMs;
}
- if (mCurrentPositionMs != currentPositionMs) {
+ if (mCurrentPositionMs == TvInputManager.TIME_SHIFT_INVALID_TIME
+ || mCurrentPositionMs != currentPositionMs) {
mCurrentPositionMs = currentPositionMs;
notifyTimeShiftCurrentPositionChanged(currentPositionMs);
}
diff --git a/media/jni/Android.mk b/media/jni/Android.mk
index f69313c..861ed0a 100644
--- a/media/jni/Android.mk
+++ b/media/jni/Android.mk
@@ -8,6 +8,7 @@
android_media_MediaCodec.cpp \
android_media_MediaCodecList.cpp \
android_media_MediaDataSource.cpp \
+ android_media_MediaDescrambler.cpp \
android_media_MediaDrm.cpp \
android_media_MediaExtractor.cpp \
android_media_MediaHTTPConnection.cpp \
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index 6f9883c..293e5dd 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -25,9 +25,12 @@
#include "android_media_Utils.h"
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/android_view_Surface.h"
+#include "android_util_Binder.h"
#include "jni.h"
#include "JNIHelp.h"
+#include <android/media/IDescrambler.h>
+
#include <cutils/compiler.h>
#include <gui/Surface.h>
@@ -269,6 +272,7 @@
const sp<AMessage> &format,
const sp<IGraphicBufferProducer> &bufferProducer,
const sp<ICrypto> &crypto,
+ const sp<IDescrambler> &descrambler,
int flags) {
sp<Surface> client;
if (bufferProducer != NULL) {
@@ -278,7 +282,8 @@
mSurfaceTextureClient.clear();
}
- return mCodec->configure(format, mSurfaceTextureClient, crypto, flags);
+ return mCodec->configure(
+ format, mSurfaceTextureClient, crypto, descrambler, flags);
}
status_t JMediaCodec::setSurface(
@@ -967,6 +972,7 @@
jobjectArray keys, jobjectArray values,
jobject jsurface,
jobject jcrypto,
+ jobject descramblerBinderObj,
jint flags) {
sp<JMediaCodec> codec = getMediaCodec(env, thiz);
@@ -1002,7 +1008,13 @@
crypto = JCrypto::GetCrypto(env, jcrypto);
}
- err = codec->configure(format, bufferProducer, crypto, flags);
+ sp<IDescrambler> descrambler;
+ if (descramblerBinderObj != NULL) {
+ sp<IBinder> binder = ibinderForJavaObject(env, descramblerBinderObj);
+ descrambler = interface_cast<IDescrambler>(binder);
+ }
+
+ err = codec->configure(format, bufferProducer, crypto, descrambler, flags);
throwExceptionAsNecessary(env, err);
}
@@ -1942,7 +1954,7 @@
{ "native_configure",
"([Ljava/lang/String;[Ljava/lang/Object;Landroid/view/Surface;"
- "Landroid/media/MediaCrypto;I)V",
+ "Landroid/media/MediaCrypto;Landroid/os/IBinder;I)V",
(void *)android_media_MediaCodec_native_configure },
{ "native_setSurface",
diff --git a/media/jni/android_media_MediaCodec.h b/media/jni/android_media_MediaCodec.h
index b3b1b3a..a8c76c5 100644
--- a/media/jni/android_media_MediaCodec.h
+++ b/media/jni/android_media_MediaCodec.h
@@ -35,6 +35,10 @@
struct MediaCodec;
struct PersistentSurface;
class Surface;
+namespace media {
+class IDescrambler;
+};
+using namespace media;
struct JMediaCodec : public AHandler {
JMediaCodec(
@@ -54,6 +58,7 @@
const sp<AMessage> &format,
const sp<IGraphicBufferProducer> &bufferProducer,
const sp<ICrypto> &crypto,
+ const sp<IDescrambler> &descrambler,
int flags);
status_t setSurface(
diff --git a/media/jni/android_media_MediaDescrambler.cpp b/media/jni/android_media_MediaDescrambler.cpp
new file mode 100644
index 0000000..7585664
--- /dev/null
+++ b/media/jni/android_media_MediaDescrambler.cpp
@@ -0,0 +1,325 @@
+/*
+ * 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "MediaDescrambler-JNI"
+#include <utils/Log.h>
+
+#include "android_media_MediaDescrambler.h"
+#include "android_runtime/AndroidRuntime.h"
+#include "android_util_Binder.h"
+#include "JNIHelp.h"
+
+#include <android/media/IDescrambler.h>
+#include <binder/MemoryDealer.h>
+#include <media/stagefright/foundation/ADebug.h>
+#include <nativehelper/ScopedLocalRef.h>
+
+namespace android {
+using media::MediaDescrambler::DescrambleInfo;
+
+struct fields_t {
+ jfieldID context;
+};
+
+static fields_t gFields;
+
+static sp<JDescrambler> getDescrambler(JNIEnv *env, jobject thiz) {
+ return (JDescrambler *)env->GetLongField(thiz, gFields.context);
+}
+
+static void setDescrambler(
+ JNIEnv *env, jobject thiz, const sp<JDescrambler> &descrambler) {
+ sp<JDescrambler> old = (JDescrambler *)env->GetLongField(thiz, gFields.context);
+ if (descrambler != NULL) {
+ descrambler->incStrong(thiz);
+ }
+ if (old != NULL) {
+ old->decStrong(thiz);
+ }
+ env->SetLongField(thiz, gFields.context, (jlong)descrambler.get());
+}
+
+static status_t getBufferAndSize(
+ JNIEnv *env, jobject byteBuf, jint offset, size_t length,
+ void **outPtr, jbyteArray *outByteArray) {
+ void *ptr = env->GetDirectBufferAddress(byteBuf);
+
+ size_t bufSize;
+ jbyteArray byteArray = NULL;
+
+ ScopedLocalRef<jclass> byteBufClass(env, env->FindClass("java/nio/ByteBuffer"));
+ CHECK(byteBufClass.get() != NULL);
+
+ if (ptr == NULL) {
+ jmethodID arrayID =
+ env->GetMethodID(byteBufClass.get(), "array", "()[B");
+ CHECK(arrayID != NULL);
+
+ byteArray =
+ (jbyteArray)env->CallObjectMethod(byteBuf, arrayID);
+
+ if (byteArray == NULL) {
+ return INVALID_OPERATION;
+ }
+
+ jboolean isCopy;
+ ptr = env->GetByteArrayElements(byteArray, &isCopy);
+
+ bufSize = (size_t) env->GetArrayLength(byteArray);
+ } else {
+ bufSize = (size_t) env->GetDirectBufferCapacity(byteBuf);
+ }
+
+ if (length + offset > bufSize) {
+ if (byteArray != NULL) {
+ env->ReleaseByteArrayElements(byteArray, (jbyte *)ptr, 0);
+ }
+
+ return -ERANGE;
+ }
+
+ *outPtr = ptr;
+ *outByteArray = byteArray;
+
+ return OK;
+}
+
+JDescrambler::JDescrambler(JNIEnv *env, jobject descramblerBinderObj) {
+ sp<IDescrambler> cas;
+ if (descramblerBinderObj != NULL) {
+ sp<IBinder> binder = ibinderForJavaObject(env, descramblerBinderObj);
+ mDescrambler = interface_cast<IDescrambler>(binder);
+ }
+}
+
+JDescrambler::~JDescrambler() {
+ // Don't call release() here, it's called by Java class
+ mDescrambler.clear();
+ mMem.clear();
+ mDealer.clear();
+}
+
+void JDescrambler::ensureBufferCapacity(size_t neededSize) {
+ if (mMem != NULL && mMem->size() >= neededSize) {
+ return;
+ }
+
+ ALOGV("ensureBufferCapacity: current size %zu, new size %zu",
+ mMem == NULL ? 0 : mMem->size(), neededSize);
+
+ size_t alignment = MemoryDealer::getAllocationAlignment();
+ neededSize = (neededSize + (alignment - 1)) & ~(alignment - 1);
+ // Align to multiples of 64K.
+ neededSize = (neededSize + 65535) & ~65535;
+ mDealer = new MemoryDealer(neededSize, "JDescrambler");
+ mMem = mDealer->allocate(neededSize);
+}
+
+ssize_t JDescrambler::descramble(
+ jbyte key,
+ size_t numSubSamples,
+ ssize_t totalLength,
+ DescramblerPlugin::SubSample *subSamples,
+ const void *srcPtr,
+ jint srcOffset,
+ void *dstPtr,
+ jint dstOffset) {
+ // TODO: IDescrambler::descramble() is re-entrant, however because we
+ // only have 1 shared mem buffer, we can only do 1 descramble at a time.
+ // Concurrency might be improved by allowing on-demand allocation of up
+ // to 2 shared mem buffers.
+ Mutex::Autolock autolock(mSharedMemLock);
+
+ ensureBufferCapacity(totalLength);
+
+ memcpy(mMem->pointer(),
+ (const void*)((const uint8_t*)srcPtr + srcOffset), totalLength);
+
+ DescrambleInfo info;
+ info.dstType = DescrambleInfo::kDestinationTypeVmPointer;
+ info.numSubSamples = numSubSamples;
+ info.scramblingControl = (DescramblerPlugin::ScramblingControl) key;
+ info.subSamples = subSamples;
+ info.srcMem = mMem;
+ info.srcOffset = 0;
+ info.dstPtr = NULL;
+ info.dstOffset = 0;
+
+ int32_t result;
+ binder::Status status = mDescrambler->descramble(info, &result);
+
+ if (!status.isOk() || result > totalLength) {
+ return -1;
+ }
+ if (result > 0) {
+ memcpy((void*)((uint8_t*)dstPtr + dstOffset), mMem->pointer(), result);
+ }
+ return result;
+}
+
+} // namespace android
+
+using namespace android;
+
+static void android_media_MediaDescrambler_native_release(JNIEnv *env, jobject thiz) {
+ setDescrambler(env, thiz, NULL);
+}
+
+static void android_media_MediaDescrambler_native_init(JNIEnv *env) {
+ ScopedLocalRef<jclass> clazz(
+ env, env->FindClass("android/media/MediaDescrambler"));
+ CHECK(clazz.get() != NULL);
+
+ gFields.context = env->GetFieldID(clazz.get(), "mNativeContext", "J");
+ CHECK(gFields.context != NULL);
+}
+
+static void android_media_MediaDescrambler_native_setup(
+ JNIEnv *env, jobject thiz, jobject descramblerBinderObj) {
+ setDescrambler(env, thiz, new JDescrambler(env, descramblerBinderObj));
+}
+
+static ssize_t getSubSampleInfo(JNIEnv *env, jint numSubSamples,
+ jintArray numBytesOfClearDataObj, jintArray numBytesOfEncryptedDataObj,
+ DescramblerPlugin::SubSample **outSubSamples) {
+
+ if (numSubSamples <= 0 || numSubSamples >=
+ (signed)(INT32_MAX / sizeof(DescramblerPlugin::SubSample)) ) {
+ // subSamples array may silently overflow if number of samples are
+ // too large. Use INT32_MAX as maximum allocation size may be less
+ // than SIZE_MAX on some platforms.
+ ALOGE("numSubSamples is invalid!");
+ return -1;
+ }
+
+ jboolean isCopy;
+ ssize_t totalSize = 0;
+
+ jint *numBytesOfClearData =
+ (numBytesOfClearDataObj == NULL)
+ ? NULL
+ : env->GetIntArrayElements(numBytesOfClearDataObj, &isCopy);
+
+ jint *numBytesOfEncryptedData =
+ (numBytesOfEncryptedDataObj == NULL)
+ ? NULL
+ : env->GetIntArrayElements(numBytesOfEncryptedDataObj, &isCopy);
+
+ DescramblerPlugin::SubSample *subSamples =
+ new(std::nothrow) DescramblerPlugin::SubSample[numSubSamples];
+
+ if (subSamples == NULL) {
+ ALOGE("Failed to allocate SubSample array!");
+ return -1;
+ }
+
+ for (jint i = 0; i < numSubSamples; ++i) {
+ subSamples[i].mNumBytesOfClearData =
+ (numBytesOfClearData == NULL) ? 0 : numBytesOfClearData[i];
+
+ subSamples[i].mNumBytesOfEncryptedData =
+ (numBytesOfEncryptedData == NULL)
+ ? 0 : numBytesOfEncryptedData[i];
+
+ totalSize += subSamples[i].mNumBytesOfClearData +
+ subSamples[i].mNumBytesOfEncryptedData;
+ }
+
+ if (numBytesOfEncryptedData != NULL) {
+ env->ReleaseIntArrayElements(
+ numBytesOfEncryptedDataObj, numBytesOfEncryptedData, 0);
+ numBytesOfEncryptedData = NULL;
+ }
+
+ if (numBytesOfClearData != NULL) {
+ env->ReleaseIntArrayElements(
+ numBytesOfClearDataObj, numBytesOfClearData, 0);
+ numBytesOfClearData = NULL;
+ }
+
+ *outSubSamples = subSamples;
+
+ return totalSize;
+}
+
+static jint android_media_MediaDescrambler_native_descramble(
+ JNIEnv *env, jobject thiz, jbyte key, jint numSubSamples,
+ jintArray numBytesOfClearDataObj, jintArray numBytesOfEncryptedDataObj,
+ jobject srcBuf, jint srcOffset, jobject dstBuf, jint dstOffset) {
+ sp<JDescrambler> descrambler = getDescrambler(env, thiz);
+ if (descrambler == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return -1;
+ }
+
+ DescramblerPlugin::SubSample *subSamples = NULL;
+ ssize_t totalLength = getSubSampleInfo(
+ env, numSubSamples, numBytesOfClearDataObj,
+ numBytesOfEncryptedDataObj, &subSamples);
+ if (totalLength < 0) {
+ jniThrowException(env, "java/lang/IllegalArgumentException",
+ "Invalid sub sample info!");
+ return -1;
+ }
+
+ ssize_t result = -1;
+ void *srcPtr = NULL, *dstPtr = NULL;
+ jbyteArray srcArray = NULL, dstArray = NULL;
+ status_t err = getBufferAndSize(
+ env, srcBuf, srcOffset, totalLength, &srcPtr, &srcArray);
+
+ if (err == OK) {
+ if (dstBuf == NULL) {
+ dstPtr = srcPtr;
+ } else {
+ err = getBufferAndSize(
+ env, dstBuf, dstOffset, totalLength, &dstPtr, &dstArray);
+ }
+ }
+
+ if (err == OK) {
+ result = descrambler->descramble(
+ key, numSubSamples, totalLength, subSamples,
+ srcPtr, srcOffset, dstPtr, dstOffset);
+ }
+
+ delete[] subSamples;
+ if (srcArray != NULL) {
+ env->ReleaseByteArrayElements(srcArray, (jbyte *)srcPtr, 0);
+ }
+ if (dstArray != NULL) {
+ env->ReleaseByteArrayElements(dstArray, (jbyte *)dstPtr, 0);
+ }
+ return result;
+}
+
+static const JNINativeMethod gMethods[] = {
+ { "native_release", "()V",
+ (void *)android_media_MediaDescrambler_native_release },
+ { "native_init", "()V",
+ (void *)android_media_MediaDescrambler_native_init },
+ { "native_setup", "(Landroid/os/IBinder;)V",
+ (void *)android_media_MediaDescrambler_native_setup },
+ { "native_descramble", "(BI[I[ILjava/nio/ByteBuffer;ILjava/nio/ByteBuffer;I)I",
+ (void *)android_media_MediaDescrambler_native_descramble },
+};
+
+int register_android_media_Descrambler(JNIEnv *env) {
+ return AndroidRuntime::registerNativeMethods(env,
+ "android/media/MediaDescrambler", gMethods, NELEM(gMethods));
+}
+
diff --git a/media/jni/android_media_MediaDescrambler.h b/media/jni/android_media_MediaDescrambler.h
new file mode 100644
index 0000000..e944a90
--- /dev/null
+++ b/media/jni/android_media_MediaDescrambler.h
@@ -0,0 +1,64 @@
+/*
+ * 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.
+ */
+
+#ifndef _ANDROID_MEDIA_DESCRAMBLER_H_
+#define _ANDROID_MEDIA_DESCRAMBLER_H_
+
+#include "jni.h"
+
+#include <media/cas/DescramblerAPI.h>
+#include <media/stagefright/foundation/ABase.h>
+#include <utils/Mutex.h>
+#include <utils/RefBase.h>
+
+namespace android {
+class IMemory;
+class MemoryDealer;
+namespace media {
+class IDescrambler;
+};
+using namespace media;
+
+struct JDescrambler : public RefBase {
+ JDescrambler(JNIEnv *env, jobject descramberBinderObj);
+
+ ssize_t descramble(
+ jbyte key,
+ size_t numSubSamples,
+ ssize_t totalLength,
+ DescramblerPlugin::SubSample *subSamples,
+ const void *srcPtr,
+ jint srcOffset,
+ void *dstPtr,
+ jint dstOffset);
+
+protected:
+ virtual ~JDescrambler();
+
+private:
+ sp<IDescrambler> mDescrambler;
+ sp<IMemory> mMem;
+ sp<MemoryDealer> mDealer;
+ Mutex mSharedMemLock;
+
+ void ensureBufferCapacity(size_t neededSize);
+
+ DISALLOW_EVIL_CONSTRUCTORS(JDescrambler);
+};
+
+} // namespace android
+
+#endif // _ANDROID_MEDIA_DESCRAMBLER_H_
diff --git a/media/jni/android_media_MediaExtractor.cpp b/media/jni/android_media_MediaExtractor.cpp
index 2008f8d..3c33493 100644
--- a/media/jni/android_media_MediaExtractor.cpp
+++ b/media/jni/android_media_MediaExtractor.cpp
@@ -37,6 +37,7 @@
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MetaData.h>
#include <media/stagefright/NuMediaExtractor.h>
+#include <android/media/ICas.h>
#include <nativehelper/ScopedLocalRef.h>
@@ -88,6 +89,10 @@
return mImpl->setDataSource(datasource);
}
+status_t JMediaExtractor::setMediaCas(const sp<ICas> &cas) {
+ return mImpl->setMediaCas(cas);
+}
+
size_t JMediaExtractor::countTracks() const {
return mImpl->countTracks();
}
@@ -734,6 +739,36 @@
}
}
+static void android_media_MediaExtractor_setMediaCas(
+ JNIEnv *env, jobject thiz, jobject casBinderObj) {
+ sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
+
+ if (extractor == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return;
+ }
+
+ if (casBinderObj == NULL) {
+ jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+ return;
+ }
+
+ sp<ICas> cas;
+ if (casBinderObj != NULL) {
+ sp<IBinder> binder = ibinderForJavaObject(env, casBinderObj);
+ cas = interface_cast<ICas>(binder);
+ }
+ status_t err = extractor->setMediaCas(cas);
+
+ if (err != OK) {
+ cas.clear();
+ jniThrowException(
+ env,
+ "java/io/IllegalArgumentException",
+ "Failed to set MediaCas on extractor.");
+ }
+}
+
static jlong android_media_MediaExtractor_getCachedDurationUs(
JNIEnv *env, jobject thiz) {
sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
@@ -861,6 +896,9 @@
{ "setDataSource", "(Landroid/media/MediaDataSource;)V",
(void *)android_media_MediaExtractor_setDataSourceCallback },
+ { "nativeSetMediaCas", "(Landroid/os/IBinder;)V",
+ (void *)android_media_MediaExtractor_setMediaCas },
+
{ "getCachedDuration", "()J",
(void *)android_media_MediaExtractor_getCachedDurationUs },
diff --git a/media/jni/android_media_MediaExtractor.h b/media/jni/android_media_MediaExtractor.h
index c747ef5..3d8c50b 100644
--- a/media/jni/android_media_MediaExtractor.h
+++ b/media/jni/android_media_MediaExtractor.h
@@ -28,6 +28,10 @@
#include "jni.h"
namespace android {
+namespace media {
+class ICas;
+};
+using namespace media;
struct IMediaHTTPService;
class MetaData;
@@ -44,6 +48,8 @@
status_t setDataSource(int fd, off64_t offset, off64_t size);
status_t setDataSource(const sp<DataSource> &source);
+ status_t setMediaCas(const sp<ICas> &cas);
+
size_t countTracks() const;
status_t getTrackFormat(size_t index, jobject *format) const;
diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp
index c941766..27724a1 100644
--- a/media/jni/android_media_MediaPlayer.cpp
+++ b/media/jni/android_media_MediaPlayer.cpp
@@ -58,86 +58,20 @@
#include "android_util_Binder.h"
// Modular DRM begin
-#include <media/drm/DrmAPI.h>
-
#define FIND_CLASS(var, className) \
var = env->FindClass(className); \
LOG_FATAL_IF(! (var), "Unable to find class " className);
-#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \
-var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \
-LOG_FATAL_IF(! (var), "Unable to find field " fieldName);
-
#define GET_METHOD_ID(var, clazz, fieldName, fieldDescriptor) \
var = env->GetMethodID(clazz, fieldName, fieldDescriptor); \
LOG_FATAL_IF(! (var), "Unable to find method " fieldName);
-#define GET_STATIC_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \
-var = env->GetStaticFieldID(clazz, fieldName, fieldDescriptor); \
-LOG_FATAL_IF(! (var), "Unable to find field " fieldName);
-
-
-// TODO: investigate if these can be shared with their MediaDrm counterparts
-struct RequestFields {
- jfieldID data;
- jfieldID defaultUrl;
- jfieldID requestType;
-};
-
-struct HashmapFields {
- jmethodID init;
- jmethodID get;
- jmethodID put;
- jmethodID entrySet;
-};
-
-struct SetFields {
- jmethodID iterator;
-};
-
-struct IteratorFields {
- jmethodID next;
- jmethodID hasNext;
-};
-
-struct EntryFields {
- jmethodID getKey;
- jmethodID getValue;
-};
-
-struct KeyTypes {
- jint kKeyTypeStreaming;
- jint kKeyTypeOffline;
- jint kKeyTypeRelease;
-};
-
-static KeyTypes gKeyTypes;
-
-struct KeyRequestTypes {
- jint kKeyRequestTypeInitial;
- jint kKeyRequestTypeRenewal;
- jint kKeyRequestTypeRelease;
-};
-
-static KeyRequestTypes gKeyRequestTypes;
-
struct StateExceptionFields {
jmethodID init;
jclass classId;
};
-struct drm_fields_t {
- RequestFields keyRequest;
- HashmapFields hashmap;
- SetFields set;
- IteratorFields iterator;
- EntryFields entry;
- StateExceptionFields stateException;
- jclass stringClassId;
-};
-
-static drm_fields_t gFields;
-
+static StateExceptionFields gStateExceptionFields;
// Modular DRM end
// ----------------------------------------------------------------------------
@@ -1041,50 +975,14 @@
gBufferingParamsFields.init(env);
// Modular DRM
- FIND_CLASS(clazz, "android/media/MediaDrm");
- if (clazz) {
- jfieldID field;
- GET_STATIC_FIELD_ID(field, clazz, "KEY_TYPE_STREAMING", "I");
- gKeyTypes.kKeyTypeStreaming = env->GetStaticIntField(clazz, field);
- GET_STATIC_FIELD_ID(field, clazz, "KEY_TYPE_OFFLINE", "I");
- gKeyTypes.kKeyTypeOffline = env->GetStaticIntField(clazz, field);
- GET_STATIC_FIELD_ID(field, clazz, "KEY_TYPE_RELEASE", "I");
- gKeyTypes.kKeyTypeRelease = env->GetStaticIntField(clazz, field);
-
- env->DeleteLocalRef(clazz);
- } else {
- ALOGE("JNI getKeyRequest android_media_MediaPlayer_native_init couldn't "
- "get clazz android/media/MediaDrm");
- }
-
- FIND_CLASS(clazz, "android/media/MediaDrm$KeyRequest");
- if (clazz) {
- GET_FIELD_ID(gFields.keyRequest.data, clazz, "mData", "[B");
- GET_FIELD_ID(gFields.keyRequest.defaultUrl, clazz, "mDefaultUrl", "Ljava/lang/String;");
- GET_FIELD_ID(gFields.keyRequest.requestType, clazz, "mRequestType", "I");
-
- jfieldID field;
- GET_STATIC_FIELD_ID(field, clazz, "REQUEST_TYPE_INITIAL", "I");
- gKeyRequestTypes.kKeyRequestTypeInitial = env->GetStaticIntField(clazz, field);
- GET_STATIC_FIELD_ID(field, clazz, "REQUEST_TYPE_RENEWAL", "I");
- gKeyRequestTypes.kKeyRequestTypeRenewal = env->GetStaticIntField(clazz, field);
- GET_STATIC_FIELD_ID(field, clazz, "REQUEST_TYPE_RELEASE", "I");
- gKeyRequestTypes.kKeyRequestTypeRelease = env->GetStaticIntField(clazz, field);
-
- env->DeleteLocalRef(clazz);
- } else {
- ALOGE("JNI getKeyRequest android_media_MediaPlayer_native_init couldn't "
- "get clazz android/media/MediaDrm$KeyRequest");
- }
-
FIND_CLASS(clazz, "android/media/MediaDrm$MediaDrmStateException");
if (clazz) {
- GET_METHOD_ID(gFields.stateException.init, clazz, "<init>", "(ILjava/lang/String;)V");
- gFields.stateException.classId = static_cast<jclass>(env->NewGlobalRef(clazz));
+ GET_METHOD_ID(gStateExceptionFields.init, clazz, "<init>", "(ILjava/lang/String;)V");
+ gStateExceptionFields.classId = static_cast<jclass>(env->NewGlobalRef(clazz));
env->DeleteLocalRef(clazz);
} else {
- ALOGE("JNI getKeyRequest android_media_MediaPlayer_native_init couldn't "
+ ALOGE("JNI android_media_MediaPlayer_native_init couldn't "
"get clazz android/media/MediaDrm$MediaDrmStateException");
}
@@ -1315,8 +1213,8 @@
{
ALOGE("Illegal DRM state exception: %s (%d)", msg, err);
- jobject exception = env->NewObject(gFields.stateException.classId,
- gFields.stateException.init, static_cast<int>(err),
+ jobject exception = env->NewObject(gStateExceptionFields.classId,
+ gStateExceptionFields.init, static_cast<int>(err),
env->NewStringUTF(msg));
env->Throw(static_cast<jthrowable>(exception));
}
@@ -1393,18 +1291,6 @@
return false;
}
-// TODO: investigate if these can be shared with their MediaDrm counterparts
-static jbyteArray VectorToJByteArray(JNIEnv *env, Vector<uint8_t> const &vector)
-{
- size_t length = vector.size();
- jbyteArray result = env->NewByteArray(length);
- if (result != NULL) {
- env->SetByteArrayRegion(result, 0, length, (jbyte *)vector.array());
- }
- return result;
-}
-
-// TODO: investigate if these can be shared with their MediaDrm counterparts
static Vector<uint8_t> JByteArrayToVector(JNIEnv *env, jbyteArray const &byteArray)
{
Vector<uint8_t> vector;
@@ -1414,74 +1300,8 @@
return vector;
}
-// TODO: investigate if these can be shared with their MediaDrm counterparts
-static String8 JStringToString8(JNIEnv *env, jstring const &jstr)
-{
- String8 result;
-
- const char *s = env->GetStringUTFChars(jstr, NULL);
- if (s) {
- result = s;
- env->ReleaseStringUTFChars(jstr, s);
- }
- return result;
-}
-
-// TODO: investigate if these can be shared with their MediaDrm counterparts
-static KeyedVector<String8, String8> HashMapToKeyedVector(JNIEnv *env,
- jobject &hashMap, bool* pIsOK)
-{
- jclass clazz = gFields.stringClassId;
- KeyedVector<String8, String8> keyedVector;
- *pIsOK = true;
-
- jobject entrySet = env->CallObjectMethod(hashMap, gFields.hashmap.entrySet);
- if (entrySet) {
- jobject iterator = env->CallObjectMethod(entrySet, gFields.set.iterator);
- if (iterator) {
- jboolean hasNext = env->CallBooleanMethod(iterator, gFields.iterator.hasNext);
- while (hasNext) {
- jobject entry = env->CallObjectMethod(iterator, gFields.iterator.next);
- if (entry) {
- jobject obj = env->CallObjectMethod(entry, gFields.entry.getKey);
- if (obj == NULL || !env->IsInstanceOf(obj, clazz)) {
- jniThrowException(env, "java/lang/IllegalArgumentException",
- "HashMap key is not a String");
- env->DeleteLocalRef(entry);
- *pIsOK = false;
- break;
- }
- jstring jkey = static_cast<jstring>(obj);
-
- obj = env->CallObjectMethod(entry, gFields.entry.getValue);
- if (obj == NULL || !env->IsInstanceOf(obj, clazz)) {
- jniThrowException(env, "java/lang/IllegalArgumentException",
- "HashMap value is not a String");
- env->DeleteLocalRef(entry);
- *pIsOK = false;
- break;
- }
- jstring jvalue = static_cast<jstring>(obj);
-
- String8 key = JStringToString8(env, jkey);
- String8 value = JStringToString8(env, jvalue);
- keyedVector.add(key, value);
-
- env->DeleteLocalRef(jkey);
- env->DeleteLocalRef(jvalue);
- hasNext = env->CallBooleanMethod(iterator, gFields.iterator.hasNext);
- }
- env->DeleteLocalRef(entry);
- }
- env->DeleteLocalRef(iterator);
- }
- env->DeleteLocalRef(entrySet);
- }
- return keyedVector;
-}
-
static void android_media_MediaPlayer_prepareDrm(JNIEnv *env, jobject thiz,
- jbyteArray uuidObj, jint mode)
+ jbyteArray uuidObj, jbyteArray drmSessionIdObj)
{
sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
if (mp == NULL) {
@@ -1504,13 +1324,23 @@
return;
}
- status_t err = mp->prepareDrm(uuid.array(), mode);
+ Vector<uint8_t> drmSessionId = JByteArrayToVector(env, drmSessionIdObj);
+
+ if (drmSessionId.size() == 0) {
+ jniThrowException(
+ env,
+ "java/lang/IllegalArgumentException",
+ "empty drmSessionId");
+ return;
+ }
+
+ status_t err = mp->prepareDrm(uuid.array(), drmSessionId);
if (err != OK) {
if (err == INVALID_OPERATION) {
jniThrowException(
env,
"java/lang/IllegalStateException",
- "The player is not prepared yet.");
+ "The player must be in prepared state.");
} else if (err == ERROR_DRM_CANNOT_HANDLE) {
jniThrowException(
env,
@@ -1536,211 +1366,10 @@
jniThrowException(
env,
"java/lang/IllegalStateException",
- "The player is not prepared yet.");
+ "Can not release DRM in an active player state.");
}
}
}
-
-static jobject android_media_MediaPlayer_getKeyRequest(JNIEnv *env, jobject thiz, jbyteArray jscope,
- jstring jmimeType, jint jkeyType, jobject joptParams)
-{
- sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
- if (mp == NULL) {
- jniThrowException(env, "java/lang/IllegalStateException", NULL);
- return NULL;
- }
-
- Vector<uint8_t> scope;
- if (jscope != NULL) {
- scope = JByteArrayToVector(env, jscope);
- }
-
- String8 mimeType;
- if (jmimeType != NULL) {
- mimeType = JStringToString8(env, jmimeType);
- }
-
- DrmPlugin::KeyType keyType;
- if (jkeyType == gKeyTypes.kKeyTypeStreaming) {
- keyType = DrmPlugin::kKeyType_Streaming;
- } else if (jkeyType == gKeyTypes.kKeyTypeOffline) {
- keyType = DrmPlugin::kKeyType_Offline;
- } else if (jkeyType == gKeyTypes.kKeyTypeRelease) {
- keyType = DrmPlugin::kKeyType_Release;
- } else {
- jniThrowException(env, "java/lang/IllegalArgumentException", "invalid keyType");
- return NULL;
- }
-
- KeyedVector<String8, String8> optParams;
- if (joptParams != NULL) {
- bool isOK;
- optParams = HashMapToKeyedVector(env, joptParams, &isOK);
- if (!isOK) {
- return NULL;
- }
- }
-
- Vector<uint8_t> request;
- String8 defaultUrl;
- DrmPlugin::KeyRequestType keyRequestType;
- status_t err = mp->getKeyRequest(scope, mimeType, keyType, optParams, request, defaultUrl,
- keyRequestType);
-
- if (throwDrmExceptionAsNecessary(env, err, "Failed to get key request")) {
- return NULL;
- }
-
- ALOGV("JNI getKeyRequest err %d request %d url %s keyReqType %d",
- err, (int)request.size(), defaultUrl.string(), (int)keyRequestType);
-
- // Fill out return obj
- jclass clazz;
- FIND_CLASS(clazz, "android/media/MediaDrm$KeyRequest");
-
- jobject keyObj = NULL;
-
- if (clazz) {
- keyObj = env->AllocObject(clazz);
- jbyteArray jrequest = VectorToJByteArray(env, request);
- env->SetObjectField(keyObj, gFields.keyRequest.data, jrequest);
-
- jstring jdefaultUrl = env->NewStringUTF(defaultUrl.string());
- env->SetObjectField(keyObj, gFields.keyRequest.defaultUrl, jdefaultUrl);
-
- switch (keyRequestType) {
- case DrmPlugin::kKeyRequestType_Initial:
- env->SetIntField(keyObj, gFields.keyRequest.requestType,
- gKeyRequestTypes.kKeyRequestTypeInitial);
- break;
- case DrmPlugin::kKeyRequestType_Renewal:
- env->SetIntField(keyObj, gFields.keyRequest.requestType,
- gKeyRequestTypes.kKeyRequestTypeRenewal);
- break;
- case DrmPlugin::kKeyRequestType_Release:
- env->SetIntField(keyObj, gFields.keyRequest.requestType,
- gKeyRequestTypes.kKeyRequestTypeRelease);
- break;
- default:
- throwDrmStateException(env, "MediaPlayer/DRM plugin failure: unknown "
- "key request type", ERROR_DRM_UNKNOWN);
- break;
- }
- }
-
- return keyObj;
-}
-
-static jbyteArray android_media_MediaPlayer_provideKeyResponse(JNIEnv *env, jobject thiz,
- jbyteArray jreleaseKeySetId, jbyteArray jresponse)
-{
- sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
- if (mp == NULL ) {
- jniThrowException(env, "java/lang/IllegalStateException", NULL);
- return NULL;
- }
-
- if (jresponse == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", "key response is null");
- return NULL;
- }
-
- Vector<uint8_t> releaseKeySetId;
- if (jreleaseKeySetId != NULL) {
- releaseKeySetId = JByteArrayToVector(env, jreleaseKeySetId);
- }
-
- Vector<uint8_t> response(JByteArrayToVector(env, jresponse));
- Vector<uint8_t> keySetId;
-
- status_t err = mp->provideKeyResponse(releaseKeySetId, response, keySetId);
-
- if (throwDrmExceptionAsNecessary(env, err, "Failed to handle key response")) {
- return NULL;
- }
- return VectorToJByteArray(env, keySetId);
-}
-
-static void android_media_MediaPlayer_restoreKeys(JNIEnv *env, jobject thiz, jbyteArray jkeySetId)
-{
- sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
- if (mp == NULL) {
- jniThrowException(env, "java/lang/IllegalStateException", NULL);
- return;
- }
-
- if (jkeySetId == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", "invalid keyType");
- return;
- }
-
- Vector<uint8_t> keySetId;
- keySetId = JByteArrayToVector(env, jkeySetId);
-
- status_t err = mp->restoreKeys(keySetId);
-
- ALOGV("JNI restoreKeys err %d ", err);
- throwDrmExceptionAsNecessary(env, err, "Failed to restore keys");
-}
-
-static jstring android_media_MediaPlayer_getDrmPropertyString(JNIEnv *env, jobject thiz,
- jstring jname)
-{
- sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
- if (mp == NULL) {
- jniThrowException(env, "java/lang/IllegalStateException", NULL);
- return NULL;
- }
-
- if (jname == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException",
- "property name String is null");
- return NULL;
- }
-
- String8 name = JStringToString8(env, jname);
- String8 value;
-
- status_t err = mp->getDrmPropertyString(name, value);
-
- ALOGV("JNI getPropertyString err %d", err);
-
- if (throwDrmExceptionAsNecessary(env, err, "Failed to get property")) {
- return NULL;
- }
-
- return env->NewStringUTF(value.string());
-}
-
-static void android_media_MediaPlayer_setDrmPropertyString(JNIEnv *env, jobject thiz,
- jstring jname, jstring jvalue)
-{
- sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
- if (mp == NULL) {
- jniThrowException(env, "java/lang/IllegalStateException", NULL);
- return;
- }
-
- if (jname == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException",
- "property name String is null");
- return;
- }
-
- if (jvalue == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException",
- "property value String is null");
- return;
- }
-
- String8 name = JStringToString8(env, jname);
- String8 value = JStringToString8(env, jvalue);
-
- status_t err = mp->setDrmPropertyString(name, value);
-
- ALOGV("JNI setPropertyString err %d", err);
- throwDrmExceptionAsNecessary(env, err, "Failed to set property");
-}
// Modular DRM end
// ----------------------------------------------------------------------------
@@ -1802,14 +1431,8 @@
"(I)Landroid/media/VolumeShaper$State;",
(void *)android_media_MediaPlayer_getVolumeShaperState},
// Modular DRM
- { "_prepareDrm", "([BI)V", (void *)android_media_MediaPlayer_prepareDrm },
+ { "_prepareDrm", "([B[B)V", (void *)android_media_MediaPlayer_prepareDrm },
{ "_releaseDrm", "()V", (void *)android_media_MediaPlayer_releaseDrm },
- { "_getKeyRequest", "([BLjava/lang/String;ILjava/util/Map;)" "Landroid/media/MediaDrm$KeyRequest;",
- (void *)android_media_MediaPlayer_getKeyRequest },
- { "_provideKeyResponse", "([B[B)[B", (void *)android_media_MediaPlayer_provideKeyResponse },
- { "_getDrmPropertyString", "(Ljava/lang/String;)Ljava/lang/String;", (void *)android_media_MediaPlayer_getDrmPropertyString },
- { "_setDrmPropertyString", "(Ljava/lang/String;Ljava/lang/String;)V",(void *)android_media_MediaPlayer_setDrmPropertyString },
- { "_restoreKeys", "([B)V", (void *)android_media_MediaPlayer_restoreKeys },
};
// This function only registers the native methods
@@ -1822,6 +1445,7 @@
extern int register_android_media_ImageWriter(JNIEnv *env);
extern int register_android_media_Crypto(JNIEnv *env);
extern int register_android_media_Drm(JNIEnv *env);
+extern int register_android_media_Descrambler(JNIEnv *env);
extern int register_android_media_MediaCodec(JNIEnv *env);
extern int register_android_media_MediaExtractor(JNIEnv *env);
extern int register_android_media_MediaCodecList(JNIEnv *env);
@@ -1938,6 +1562,11 @@
goto bail;
}
+ if (register_android_media_Descrambler(env) < 0) {
+ ALOGE("ERROR: MediaDescrambler native registration failed");
+ goto bail;
+ }
+
if (register_android_media_MediaHTTPConnection(env) < 0) {
ALOGE("ERROR: MediaHTTPConnection native registration failed");
goto bail;
diff --git a/media/jni/android_media_MediaRecorder.cpp b/media/jni/android_media_MediaRecorder.cpp
index 7c509d2..77544eb 100644
--- a/media/jni/android_media_MediaRecorder.cpp
+++ b/media/jni/android_media_MediaRecorder.cpp
@@ -28,6 +28,7 @@
#include <gui/Surface.h>
#include <camera/Camera.h>
#include <media/mediarecorder.h>
+#include <media/MediaAnalyticsItem.h>
#include <media/stagefright/PersistentSurface.h>
#include <utils/threads.h>
@@ -35,6 +36,7 @@
#include "jni.h"
#include "JNIHelp.h"
+#include "android_media_MediaMetricsJNI.h"
#include "android_runtime/AndroidRuntime.h"
#include <system/audio.h>
@@ -625,6 +627,36 @@
"java/lang/IllegalArgumentException", "native_setInputSurface failed.");
}
+static jobject
+android_media_MediaRecorder_getMetrics(JNIEnv *env, jobject thiz)
+{
+ ALOGV("android_media_MediaRecorder_getMetrics");
+
+ sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
+ if (mr == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return NULL;
+ }
+
+ // get what we have for the metrics from the codec
+ Parcel reply;
+ status_t err = mr->getMetrics(&reply);
+ if (err != OK) {
+ ALOGE("getMetrics failed");
+ return (jobject) NULL;
+ }
+
+ // build and return the Bundle
+ MediaAnalyticsItem *item = new MediaAnalyticsItem;
+ item->readFromParcel(reply);
+ jobject mybundle = MediaMetricsJNI::writeMetricsToBundle(env, item, NULL);
+
+ // housekeeping
+ delete item;
+ item = NULL;
+ return mybundle;
+
+}
// ----------------------------------------------------------------------------
static const JNINativeMethod gMethods[] = {
@@ -655,6 +687,8 @@
(void *)android_media_MediaRecorder_native_setup},
{"native_finalize", "()V", (void *)android_media_MediaRecorder_native_finalize},
{"native_setInputSurface", "(Landroid/view/Surface;)V", (void *)android_media_MediaRecorder_setInputSurface },
+
+ {"getMetrics", "()Landroid/os/Bundle;", (void *)android_media_MediaRecorder_getMetrics},
};
// This function only registers the native methods, and is called from
diff --git a/media/mca/filterfw/jni/Android.mk b/media/mca/filterfw/jni/Android.mk
index 40576a0..9842e70 100644
--- a/media/mca/filterfw/jni/Android.mk
+++ b/media/mca/filterfw/jni/Android.mk
@@ -43,6 +43,6 @@
LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code -Wno-unused-parameter
-LOCAL_SHARED_LIBRARIES := libmedia
+LOCAL_SHARED_LIBRARIES := libmedia libgui libandroid
include $(BUILD_STATIC_LIBRARY)
diff --git a/media/mca/filterfw/native/Android.mk b/media/mca/filterfw/native/Android.mk
index 7c4703f..2e900fe 100644
--- a/media/mca/filterfw/native/Android.mk
+++ b/media/mca/filterfw/native/Android.mk
@@ -41,6 +41,8 @@
LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
+LOCAL_STATIC_LIBRARIES := libarect
+
# TODO: Build a shared library as well?
include $(BUILD_STATIC_LIBRARY)
diff --git a/media/mca/filterfw/native/core/gl_env.cpp b/media/mca/filterfw/native/core/gl_env.cpp
index c9d33da..1bb82f8 100644
--- a/media/mca/filterfw/native/core/gl_env.cpp
+++ b/media/mca/filterfw/native/core/gl_env.cpp
@@ -26,7 +26,10 @@
#include <string>
#include <EGL/eglext.h>
+#include <gui/BufferQueue.h>
+#include <gui/Surface.h>
#include <gui/GLConsumer.h>
+#include <gui/IGraphicBufferProducer.h>
namespace android {
namespace filterfw {
diff --git a/media/mca/filterfw/native/core/gl_env.h b/media/mca/filterfw/native/core/gl_env.h
index a709638..0445301 100644
--- a/media/mca/filterfw/native/core/gl_env.h
+++ b/media/mca/filterfw/native/core/gl_env.h
@@ -27,8 +27,9 @@
#include <GLES2/gl2.h>
#include <EGL/egl.h>
-#include <gui/IGraphicBufferProducer.h>
-#include <gui/Surface.h>
+#include <utils/StrongPointer.h>
+
+struct ANativeWindow;
namespace android {
diff --git a/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothPacketEncoder.java b/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothPacketEncoder.java
index 5fb162c..8ac6b56 100644
--- a/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothPacketEncoder.java
+++ b/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothPacketEncoder.java
@@ -48,7 +48,7 @@
private boolean mWritePending;
- private final Object mLock = new Object();
+ private final Object mLock = new Object();
// This receives normalized data from mMidiFramer and accumulates it into a packet buffer
private final MidiReceiver mFramedDataReceiver = new MidiReceiver() {
@@ -60,6 +60,8 @@
int milliTimestamp = (int)(timestamp / MILLISECOND_NANOS) & MILLISECOND_MASK;
byte status = msg[offset];
boolean isSysExStart = (status == MidiConstants.STATUS_SYSTEM_EXCLUSIVE);
+ // Because of the MidiFramer, if it is not a status byte then it
+ // must be a continuation.
boolean isSysExContinuation = ((status & 0x80) == 0);
int bytesNeeded;
@@ -70,7 +72,9 @@
bytesNeeded = count;
}
- boolean needsTimestamp = (milliTimestamp != mPacketTimestamp);
+ // Status bytes must be preceded by a timestamp
+ boolean needsTimestamp = (status != mRunningStatus)
+ || (milliTimestamp != mPacketTimestamp);
if (isSysExStart) {
// SysEx start byte must be preceded by a timestamp
needsTimestamp = true;
@@ -78,6 +82,7 @@
// SysEx continuation packets must not have timestamp byte
needsTimestamp = false;
}
+
if (needsTimestamp) bytesNeeded++; // add one for timestamp byte
if (status == mRunningStatus) bytesNeeded--; // subtract one for status byte
diff --git a/native/android/Android.mk b/native/android/Android.mk
index f8405ef..57f996c 100644
--- a/native/android/Android.mk
+++ b/native/android/Android.mk
@@ -11,16 +11,15 @@
asset_manager.cpp \
choreographer.cpp \
configuration.cpp \
- hardware_buffer.cpp \
hardware_buffer_jni.cpp \
input.cpp \
looper.cpp \
native_activity.cpp \
- native_window.cpp \
native_window_jni.cpp \
net.c \
obb.cpp \
sensor.cpp \
+ sharedmem.cpp \
storage_manager.cpp \
trace.cpp \
@@ -37,7 +36,11 @@
libnetd_client \
LOCAL_STATIC_LIBRARIES := \
- libstorage
+ libstorage \
+ libarect \
+
+LOCAL_WHOLE_STATIC_LIBRARIES := \
+ libnativewindow
LOCAL_C_INCLUDES += \
frameworks/base/native/include \
@@ -45,6 +48,10 @@
bionic/libc/dns/include \
system/netd/include \
+LOCAL_EXPORT_STATIC_LIBRARY_HEADERS := \
+ libarect \
+ libnativewindow \
+
LOCAL_MODULE := libandroid
LOCAL_CFLAGS += $(common_cflags)
diff --git a/native/android/hardware_buffer.cpp b/native/android/hardware_buffer.cpp
deleted file mode 100644
index 77ebd52..0000000
--- a/native/android/hardware_buffer.cpp
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "AHardwareBuffer"
-
-#include <android/hardware_buffer.h>
-
-#include <errno.h>
-#include <sys/socket.h>
-
-#include <memory>
-
-#include <cutils/native_handle.h>
-
-#include <utils/Log.h>
-
-#include <ui/GraphicBuffer.h>
-
-#include <binder/IServiceManager.h>
-#include <gui/ISurfaceComposer.h>
-#include <gui/IGraphicBufferAlloc.h>
-
-#include <android_runtime/android_hardware_HardwareBuffer.h>
-
-
-static constexpr int kDataBufferSize = 64 * sizeof(int); // 64 ints
-
-using namespace android;
-
-static inline const GraphicBuffer* AHardwareBuffer_to_GraphicBuffer(
- const AHardwareBuffer* buffer) {
- return reinterpret_cast<const GraphicBuffer*>(buffer);
-}
-
-static inline GraphicBuffer* AHardwareBuffer_to_GraphicBuffer(
- AHardwareBuffer* buffer) {
- return reinterpret_cast<GraphicBuffer*>(buffer);
-}
-
-static inline AHardwareBuffer* GraphicBuffer_to_AHardwareBuffer(
- GraphicBuffer* buffer) {
- return reinterpret_cast<AHardwareBuffer*>(buffer);
-}
-
-// ----------------------------------------------------------------------------
-// Public functions
-// ----------------------------------------------------------------------------
-
-int AHardwareBuffer_allocate(const AHardwareBuffer_Desc* desc,
- AHardwareBuffer** outBuffer) {
- if (!outBuffer || !desc) return BAD_VALUE;
-
- // The holder is used to destroy the buffer if an error occurs.
- sp<IServiceManager> sm = defaultServiceManager();
- if (sm == nullptr) {
- ALOGE("Unable to connect to ServiceManager");
- return PERMISSION_DENIED;
- }
-
- // Get the SurfaceFlingerService.
- sp<ISurfaceComposer> composer = interface_cast<ISurfaceComposer>(
- sm->getService(String16("SurfaceFlinger")));
- if (composer == nullptr) {
- ALOGE("Unable to connect to surface composer");
- return PERMISSION_DENIED;
- }
- // Get an IGraphicBufferAlloc to create the buffer.
- sp<IGraphicBufferAlloc> allocator = composer->createGraphicBufferAlloc();
- if (allocator == nullptr) {
- ALOGE("Unable to obtain a buffer allocator");
- return PERMISSION_DENIED;
- }
-
- int format = android_hardware_HardwareBuffer_convertToPixelFormat(
- desc->format);
- if (format == 0) {
- ALOGE("Invalid pixel format");
- return BAD_VALUE;
- }
-
- if (desc->format == AHARDWAREBUFFER_FORMAT_BLOB && desc->height != 1) {
- ALOGE("Height must be 1 when using the AHARDWAREBUFFER_FORMAT_BLOB "
- "format");
- return BAD_VALUE;
- }
-
- status_t err;
- uint64_t producerUsage = 0;
- uint64_t consumerUsage = 0;
- android_hardware_HardwareBuffer_convertToGrallocUsageBits(desc->usage0,
- desc->usage1, &producerUsage, &consumerUsage);
- sp<GraphicBuffer> gbuffer = allocator->createGraphicBuffer(desc->width,
- desc->height, format, desc->layers, producerUsage, consumerUsage,
- std::string("AHardwareBuffer pid [") + std::to_string(getpid()) +
- "]", &err);
- if (err != NO_ERROR) {
- return err;
- }
-
- *outBuffer = GraphicBuffer_to_AHardwareBuffer(gbuffer.get());
- // Ensure the buffer doesn't get destroyed with the sp<> goes away.
- AHardwareBuffer_acquire(*outBuffer);
- return NO_ERROR;
-}
-
-void AHardwareBuffer_acquire(AHardwareBuffer* buffer) {
- AHardwareBuffer_to_GraphicBuffer(buffer)->incStrong(
- (void*)AHardwareBuffer_acquire);
-}
-
-void AHardwareBuffer_release(AHardwareBuffer* buffer) {
- AHardwareBuffer_to_GraphicBuffer(buffer)->decStrong(
- (void*)AHardwareBuffer_acquire);
-}
-
-void AHardwareBuffer_describe(const AHardwareBuffer* buffer,
- AHardwareBuffer_Desc* outDesc) {
- if (!buffer || !outDesc) return;
-
- const GraphicBuffer* gbuffer = AHardwareBuffer_to_GraphicBuffer(buffer);
-
- outDesc->width = gbuffer->getWidth();
- outDesc->height = gbuffer->getHeight();
- outDesc->layers = gbuffer->getLayerCount();
- outDesc->usage0 =
- android_hardware_HardwareBuffer_convertFromGrallocUsageBits(
- gbuffer->getUsage(), gbuffer->getUsage());
- outDesc->usage1 = 0;
- outDesc->format = android_hardware_HardwareBuffer_convertFromPixelFormat(
- static_cast<uint32_t>(gbuffer->getPixelFormat()));
-}
-
-int AHardwareBuffer_lock(AHardwareBuffer* buffer, uint64_t usage0,
- int32_t fence, const ARect* rect, void** outVirtualAddress) {
- if (!buffer) return BAD_VALUE;
-
- if (usage0 & ~(AHARDWAREBUFFER_USAGE0_CPU_READ_OFTEN |
- AHARDWAREBUFFER_USAGE0_CPU_WRITE_OFTEN)) {
- ALOGE("Invalid usage flags passed to AHardwareBuffer_lock; only "
- " AHARDWAREBUFFER_USAGE0_CPU_* flags are allowed");
- return BAD_VALUE;
- }
-
- uint64_t producerUsage = 0;
- uint64_t consumerUsage = 0;
- android_hardware_HardwareBuffer_convertToGrallocUsageBits(usage0, 0,
- &producerUsage, &consumerUsage);
- GraphicBuffer* gBuffer = AHardwareBuffer_to_GraphicBuffer(buffer);
- Rect bounds;
- if (!rect) {
- bounds.set(Rect(gBuffer->getWidth(), gBuffer->getHeight()));
- } else {
- bounds.set(Rect(rect->left, rect->top, rect->right, rect->bottom));
- }
- return gBuffer->lockAsync(producerUsage, consumerUsage, bounds,
- outVirtualAddress, fence);
-}
-
-int AHardwareBuffer_unlock(AHardwareBuffer* buffer, int32_t* fence) {
- if (!buffer) return BAD_VALUE;
-
- GraphicBuffer* gBuffer = AHardwareBuffer_to_GraphicBuffer(buffer);
- return gBuffer->unlockAsync(fence);
-}
-
-int AHardwareBuffer_sendHandleToUnixSocket(const AHardwareBuffer* buffer,
- int socketFd) {
- if (!buffer) return BAD_VALUE;
- const GraphicBuffer* gBuffer = AHardwareBuffer_to_GraphicBuffer(buffer);
-
- size_t flattenedSize = gBuffer->getFlattenedSize();
- size_t fdCount = gBuffer->getFdCount();
-
- std::unique_ptr<uint8_t[]> data(new uint8_t[flattenedSize]);
- std::unique_ptr<int[]> fds(new int[fdCount]);
-
- // Make copies of needed items since flatten modifies them, and we don't
- // want to send anything if there's an error during flatten.
- size_t flattenedSizeCopy = flattenedSize;
- size_t fdCountCopy = fdCount;
- void* dataStart = data.get();
- int* fdsStart = fds.get();
- status_t err = gBuffer->flatten(dataStart, flattenedSizeCopy, fdsStart,
- fdCountCopy);
- if (err != NO_ERROR) {
- return err;
- }
-
- struct iovec iov[1];
- iov[0].iov_base = data.get();
- iov[0].iov_len = flattenedSize;
-
- char buf[CMSG_SPACE(kDataBufferSize)];
- struct msghdr msg = {
- .msg_control = buf,
- .msg_controllen = sizeof(buf),
- .msg_iov = &iov[0],
- .msg_iovlen = 1,
- };
-
- struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);
- cmsg->cmsg_level = SOL_SOCKET;
- cmsg->cmsg_type = SCM_RIGHTS;
- cmsg->cmsg_len = CMSG_LEN(sizeof(int) * fdCount);
- int* fdData = reinterpret_cast<int*>(CMSG_DATA(cmsg));
- memcpy(fdData, fds.get(), sizeof(int) * fdCount);
- msg.msg_controllen = cmsg->cmsg_len;
-
- int result = sendmsg(socketFd, &msg, 0);
- if (result <= 0) {
- ALOGE("Error writing AHardwareBuffer to socket: error %#x (%s)",
- result, strerror(errno));
- return result;
- }
- return NO_ERROR;
-}
-
-int AHardwareBuffer_recvHandleFromUnixSocket(int socketFd,
- AHardwareBuffer** outBuffer) {
- if (!outBuffer) return BAD_VALUE;
-
- char dataBuf[CMSG_SPACE(kDataBufferSize)];
- char fdBuf[CMSG_SPACE(kDataBufferSize)];
- struct iovec iov[1];
- iov[0].iov_base = dataBuf;
- iov[0].iov_len = sizeof(dataBuf);
-
- struct msghdr msg = {
- .msg_control = fdBuf,
- .msg_controllen = sizeof(fdBuf),
- .msg_iov = &iov[0],
- .msg_iovlen = 1,
- };
-
- int result = recvmsg(socketFd, &msg, 0);
- if (result <= 0) {
- ALOGE("Error reading AHardwareBuffer from socket: error %#x (%s)",
- result, strerror(errno));
- return result;
- }
-
- if (msg.msg_iovlen != 1) {
- ALOGE("Error reading AHardwareBuffer from socket: bad data length");
- return INVALID_OPERATION;
- }
-
- if (msg.msg_controllen % sizeof(int) != 0) {
- ALOGE("Error reading AHardwareBuffer from socket: bad fd length");
- return INVALID_OPERATION;
- }
-
- size_t dataLen = msg.msg_iov[0].iov_len;
- const void* data = static_cast<const void*>(msg.msg_iov[0].iov_base);
- if (!data) {
- ALOGE("Error reading AHardwareBuffer from socket: no buffer data");
- return INVALID_OPERATION;
- }
-
- struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);
- if (!cmsg) {
- ALOGE("Error reading AHardwareBuffer from socket: no fd header");
- return INVALID_OPERATION;
- }
-
- size_t fdCount = msg.msg_controllen >> 2;
- const int* fdData = reinterpret_cast<const int*>(CMSG_DATA(cmsg));
- if (!fdData) {
- ALOGE("Error reading AHardwareBuffer from socket: no fd data");
- return INVALID_OPERATION;
- }
-
- GraphicBuffer* gBuffer = new GraphicBuffer();
- status_t err = gBuffer->unflatten(data, dataLen, fdData, fdCount);
- if (err != NO_ERROR) {
- return err;
- }
- *outBuffer = GraphicBuffer_to_AHardwareBuffer(gBuffer);
- // Ensure the buffer has a positive ref-count.
- AHardwareBuffer_acquire(*outBuffer);
-
- return NO_ERROR;
-}
-
-const struct native_handle* AHardwareBuffer_getNativeHandle(
- const AHardwareBuffer* buffer) {
- if (!buffer) return nullptr;
- const GraphicBuffer* gbuffer = AHardwareBuffer_to_GraphicBuffer(buffer);
- return gbuffer->handle;
-}
diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt
index f9e8fda..e2623d4 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -186,6 +186,9 @@
ASensor_getType;
ASensor_getVendor;
ASensor_isWakeUpSensor; # introduced=21
+ ASharedMemory_create; # introduced=26
+ ASharedMemory_getSize; # introduced=26
+ ASharedMemory_setProt; # introduced=26
AStorageManager_delete;
AStorageManager_getMountedObbPath;
AStorageManager_isObbMounted;
diff --git a/native/android/native_window.cpp b/native/android/native_window.cpp
deleted file mode 100644
index 8c080d7..0000000
--- a/native/android/native_window.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 "Surface"
-
-#include <android/native_window.h>
-#include <system/window.h>
-
-void ANativeWindow_acquire(ANativeWindow* window) {
- window->incStrong((void*)ANativeWindow_acquire);
-}
-
-void ANativeWindow_release(ANativeWindow* window) {
- window->decStrong((void*)ANativeWindow_acquire);
-}
-
-static int32_t getWindowProp(ANativeWindow* window, int what) {
- int value;
- int res = window->query(window, what, &value);
- return res < 0 ? res : value;
-}
-
-int32_t ANativeWindow_getWidth(ANativeWindow* window) {
- return getWindowProp(window, NATIVE_WINDOW_WIDTH);
-}
-
-int32_t ANativeWindow_getHeight(ANativeWindow* window) {
- return getWindowProp(window, NATIVE_WINDOW_HEIGHT);
-}
-
-int32_t ANativeWindow_getFormat(ANativeWindow* window) {
- return getWindowProp(window, NATIVE_WINDOW_FORMAT);
-}
-
-int32_t ANativeWindow_setBuffersGeometry(ANativeWindow* window, int32_t width,
- int32_t height, int32_t format) {
- int32_t err = native_window_set_buffers_format(window, format);
- if (!err) {
- err = native_window_set_buffers_user_dimensions(window, width, height);
- if (!err) {
- int mode = NATIVE_WINDOW_SCALING_MODE_FREEZE;
- if (width && height) {
- mode = NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW;
- }
- err = native_window_set_scaling_mode(window, mode);
- }
- }
- return err;
-}
-
-int32_t ANativeWindow_lock(ANativeWindow* window, ANativeWindow_Buffer* outBuffer,
- ARect* inOutDirtyBounds) {
- return window->perform(window, NATIVE_WINDOW_LOCK, outBuffer, inOutDirtyBounds);
-}
-
-int32_t ANativeWindow_unlockAndPost(ANativeWindow* window) {
- return window->perform(window, NATIVE_WINDOW_UNLOCK_AND_POST);
-}
diff --git a/native/android/sharedmem.cpp b/native/android/sharedmem.cpp
new file mode 100644
index 0000000..9d029df
--- /dev/null
+++ b/native/android/sharedmem.cpp
@@ -0,0 +1,34 @@
+/*
+ * 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 <android/sharedmem.h>
+#include <cutils/ashmem.h>
+#include <utils/Errors.h>
+
+int ASharedMemory_create(const char *name, size_t size) {
+ if (size == 0) {
+ return android::BAD_VALUE;
+ }
+ return ashmem_create_region(name, size);
+}
+
+size_t ASharedMemory_getSize(int fd) {
+ return ashmem_valid(fd) ? ashmem_get_size_region(fd) : 0;
+}
+
+int ASharedMemory_setProt(int fd, int prot) {
+ return ashmem_set_prot_region(fd, prot);
+}
diff --git a/native/graphics/jni/Android.mk b/native/graphics/jni/Android.mk
index 4c8a9db..ec4b35a 100644
--- a/native/graphics/jni/Android.mk
+++ b/native/graphics/jni/Android.mk
@@ -21,6 +21,7 @@
LOCAL_SHARED_LIBRARIES := \
libandroid_runtime \
libskia \
+ libui \
libandroidfw
LOCAL_C_INCLUDES += \
diff --git a/obex/javax/obex/ServerSession.java b/obex/javax/obex/ServerSession.java
index acee5dd..3831cf7 100644
--- a/obex/javax/obex/ServerSession.java
+++ b/obex/javax/obex/ServerSession.java
@@ -658,6 +658,11 @@
*/
byte[] sendData = new byte[totalLength];
int maxRxLength = ObexHelper.getMaxRxPacketSize(mTransport);
+ if (maxRxLength > mMaxPacketLength) {
+ if(V) Log.v(TAG,"Set maxRxLength to min of maxRxServrLen:" + maxRxLength +
+ " and MaxNegotiated from Client: " + mMaxPacketLength);
+ maxRxLength = mMaxPacketLength;
+ }
sendData[0] = (byte)code;
sendData[1] = length[2];
sendData[2] = length[3];
diff --git a/packages/BackupRestoreConfirmation/res/values-ne/strings.xml b/packages/BackupRestoreConfirmation/res/values-ne/strings.xml
index 66d340c..d01ad50 100644
--- a/packages/BackupRestoreConfirmation/res/values-ne/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-ne/strings.xml
@@ -18,17 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="backup_confirm_title" msgid="827563724209303345">"पूर्ण ब्याकअप"</string>
<string name="restore_confirm_title" msgid="5469365809567486602">"पूर्ण पुनःप्राप्ति"</string>
- <string name="backup_confirm_text" msgid="1878021282758896593">"एउटा जोडिएको डेस्कटप कम्प्युटरमा सबै डेटाको एउटा पूर्ण जगेडाको अनुरोध गरिएको छ। के तपाईँ यो हुन दिन चाहनुहुन्छ? \n\nयदि तपाईँले जगेडाको लागि आफैँ अनुरोध गर्नु भएन भने प्रक्रियालाई अगाडि बढ्न अनुमति नदिनुहोस्।"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"एउटा जोडिएको डेस्कटप कम्प्युटरमा सबै डेटाको एउटा पूर्ण जगेडाको अनुरोध गरिएको छ। के तपाईं यो हुन दिन चाहनुहुन्छ? \n\nयदि तपाईंले जगेडाको लागि आफैँ अनुरोध गर्नु भएन भने प्रक्रियालाई अगाडि बढ्न अनुमति नदिनुहोस्।"</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"मेरो डेटा ब्याकअप गर्नुहोस्"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"जगेडा नगर्नुहोस्"</string>
- <string name="restore_confirm_text" msgid="7499866728030461776">"एउटा जडित डेस्कटप कम्प्युटरबाट सबै डेटाको पूर्ण पुनःबहाली अनुरोध गरियो। के तपाईँ यो हुन अनुमति दिनुहुन्छ?\n\nयदि तपाईँ आफैं पुनःबहाली अनुरोध गर्नुहुन्न भने अपरेसनलाई अघि बढाउन अनुमति नदिनुहोस्। यसले उपकरणमा भएको कुनै पनि डेटालाई बदल्ने छ!"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"एउटा जडित डेस्कटप कम्प्युटरबाट सबै डेटाको पूर्ण पुनःबहाली अनुरोध गरियो। के तपाईं यो हुन अनुमति दिनुहुन्छ?\n\nयदि तपाईं आफैं पुनःबहाली अनुरोध गर्नुहुन्न भने अपरेसनलाई अघि बढाउन अनुमति नदिनुहोस्। यसले उपकरणमा भएको कुनै पनि डेटालाई बदल्ने छ!"</string>
<string name="allow_restore_button_label" msgid="3081286752277127827">"मेरो डेटा पुनःबहाली गर्नुहोस्"</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"पुन:स्थापना नगर्नुहोस्"</string>
<string name="current_password_text" msgid="8268189555578298067">"कृपया तल तपाईंको हालको ब्याकअप पासवर्ड प्रविष्टि गर्नुहोस्:"</string>
<string name="device_encryption_restore_text" msgid="1570864916855208992">"कृपया तल तपाईंको उपकरण एन्क्रिप्सन पासवर्ड प्रविष्टि गर्नुहोस्:"</string>
<string name="device_encryption_backup_text" msgid="5866590762672844664">"कृपया तल तपाईंको उपकरण एन्क्रिप्सन पासवर्ड प्रविष्टि गर्नुहोस्: यो ब्याकप सँग्रह एन्क्रिप्ट गर्न पनि प्रयोग हुने छ।"</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"ब्याकप डेटालाई encrypt गर्न पासवर्ड प्रविष्टि गर्नुहोस्, यदि यो खालि छोडिएको खण्डमा तपाईको पुरानै पासवर्ड प्रयोग हुने छ।"</string>
- <string name="backup_enc_password_optional" msgid="1350137345907579306">"यदि तपाईँ पूर्ण ब्याकअप डेटा इन्क्रिप्ट गर्न चाहनु हुन्छ भने तल पासवर्ड प्रविष्टि गर्नुहोस्।"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"यदि तपाईं पूर्ण ब्याकअप डेटा इन्क्रिप्ट गर्न चाहनु हुन्छ भने तल पासवर्ड प्रविष्टि गर्नुहोस्।"</string>
<string name="backup_enc_password_required" msgid="7889652203371654149">"तपाईँको उपकरण गुप्तिकरण गरिए देखि, तपाईंले आफ्नो जगेडा गुप्तिकरण गर्न आवश्यक छ। कृपया तल पासवर्ड प्रविष्ट गर्नुहोस्:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"यदि पुनःबहाली डेटा इन्क्रिप्ट छ भने कृपया तल पासवर्ड प्रविष्टि गर्नुहोस्:"</string>
<string name="toast_backup_started" msgid="550354281452756121">"जगेडा राख्न सुरु हुँदै..."</string>
diff --git a/packages/CarrierDefaultApp/AndroidManifest.xml b/packages/CarrierDefaultApp/AndroidManifest.xml
index e2080b0..d910920 100644
--- a/packages/CarrierDefaultApp/AndroidManifest.xml
+++ b/packages/CarrierDefaultApp/AndroidManifest.xml
@@ -31,7 +31,7 @@
<application android:label="@string/app_name" >
<receiver android:name="com.android.carrierdefaultapp.CarrierDefaultBroadcastReceiver">
<intent-filter>
- <action android:name="android.intent.action.CARRIER_SIGNAL_REDIRECTED" />
+ <action android:name="com.android.internal.telephony.CARRIER_SIGNAL_REDIRECTED" />
</intent-filter>
</receiver>
<activity android:name="com.android.carrierdefaultapp.CaptivePortalLaunchActivity"
diff --git a/packages/CarrierDefaultApp/res/values-bn/strings.xml b/packages/CarrierDefaultApp/res/values-bn/strings.xml
index 138a2b3..7afa1c9 100644
--- a/packages/CarrierDefaultApp/res/values-bn/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-bn/strings.xml
@@ -7,7 +7,7 @@
<string name="portal_notification_detail" msgid="2860620550281695686">"আপনার পরিষেবা সক্রিয় করতে আলতো চাপুন"</string>
<string name="no_data_notification_detail" msgid="1757413358517680719">"পরিষেবা উপলব্ধ নয়, অনুগ্রহ করে আপনার পরিষেবা প্রদানকারীর সঙ্গে যোগাযোগ করুন"</string>
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"অন্তরীণ পোর্টালের সঙ্গে সংযুক্ত করা হচ্ছে..."</string>
- <string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"নেটওয়ার্কের সময় সমাপ্ত হয়েছে, আপনি কি পুনরায় চেষ্টা করতে চান?"</string>
+ <string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"নেটওয়ার্কের সময় সমাপ্ত হয়েছে, আপনি কি আবার চেষ্টা করতে চান?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"নেটওয়ার্ক অনুপলব্ধ"</string>
<string name="quit" msgid="4392968039488794590">"প্রস্থান করুন"</string>
<string name="wait" msgid="7902715035629500128">"অপেক্ষা করুন"</string>
diff --git a/packages/CarrierDefaultApp/res/values-ne/strings.xml b/packages/CarrierDefaultApp/res/values-ne/strings.xml
index aa5766b..4807d6d 100644
--- a/packages/CarrierDefaultApp/res/values-ne/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ne/strings.xml
@@ -7,7 +7,7 @@
<string name="portal_notification_detail" msgid="2860620550281695686">"आफ्नो सेवालाई सक्रिय पार्न ट्याप गर्नुहोस्"</string>
<string name="no_data_notification_detail" msgid="1757413358517680719">"सेवा उपलब्ध छैन,कृपया आफ्नो सेवा प्रदायकलाई सम्पर्क गर्नुहोस्"</string>
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"क्याप्टिभ पोर्टलमा जडान हुँदैछ..."</string>
- <string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"नेटवर्कमा जडान हुने समय समाप्त भयो, के तपाईँ पुनः प्रयास गर्न चाहानुहुन्छ?"</string>
+ <string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"नेटवर्कमा जडान हुने समय समाप्त भयो, के तपाईं पुनः प्रयास गर्न चाहानुहुन्छ?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"नेटवर्क उपलब्ध छैन"</string>
<string name="quit" msgid="4392968039488794590">"बाहिरिनुहोस्"</string>
<string name="wait" msgid="7902715035629500128">"पर्खनुहोस्"</string>
diff --git a/packages/CarrierDefaultApp/res/values-zh-rTW/strings.xml b/packages/CarrierDefaultApp/res/values-zh-rTW/strings.xml
index ad0ea6b..cbe677d 100644
--- a/packages/CarrierDefaultApp/res/values-zh-rTW/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-zh-rTW/strings.xml
@@ -1,7 +1,7 @@
<?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">"行動通訊業者預設應用程式"</string>
+ <string name="app_name" msgid="5247871339820894594">"電信業者預設應用程式"</string>
<string name="portal_notification_id" msgid="267536768510843288">"啟用服務"</string>
<string name="no_data_notification_id" msgid="5216950045164991172">"沒有數據服務"</string>
<string name="portal_notification_detail" msgid="2860620550281695686">"輕觸即可啟用服務"</string>
diff --git a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLaunchActivity.java b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLaunchActivity.java
index b7fde12..28251cb 100644
--- a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLaunchActivity.java
+++ b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLaunchActivity.java
@@ -79,7 +79,7 @@
private void showConnectingProgressDialog() {
mProgressDialog = new ProgressDialog(getApplicationContext());
mProgressDialog.setMessage(getString(R.string.progress_dialogue_network_connection));
- mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
+ mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
mProgressDialog.show();
}
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java
index 8a970da..25127ef 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java
@@ -33,7 +33,6 @@
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
-import android.widget.Toast;
public class DeviceChooserActivity extends Activity {
@@ -129,12 +128,9 @@
}
protected void onPairTapped(BluetoothDevice selectedDevice) {
+ getService().onDeviceSelected();
setResult(RESULT_OK,
new Intent().putExtra(CompanionDeviceManager.EXTRA_DEVICE, selectedDevice));
finish();
}
-
- private void toast(String msg) {
- Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
- }
}
\ No newline at end of file
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java
index ccbee2a..11c722d 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java
@@ -32,16 +32,15 @@
import android.bluetooth.le.ScanResult;
import android.bluetooth.le.ScanSettings;
import android.companion.AssociationRequest;
-import android.companion.BluetoothDeviceFilterUtils;
import android.companion.BluetoothLEDeviceFilter;
-import android.companion.ICompanionDeviceManagerService;
-import android.companion.IOnAssociateCallback;
+import android.companion.ICompanionDeviceDiscoveryService;
+import android.companion.ICompanionDeviceDiscoveryServiceCallback;
+import android.companion.IFindDeviceCallback;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
-import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.IBinder;
import android.os.RemoteException;
@@ -70,21 +69,25 @@
List<BluetoothDevice> mDevicesFound;
BluetoothDevice mSelectedDevice;
DevicesAdapter mDevicesAdapter;
- IOnAssociateCallback mCallback;
+ IFindDeviceCallback mFindCallback;
+ ICompanionDeviceDiscoveryServiceCallback mServiceCallback;
String mCallingPackage;
- private final ICompanionDeviceManagerService mBinder =
- new ICompanionDeviceManagerService.Stub() {
+ private final ICompanionDeviceDiscoveryService mBinder =
+ new ICompanionDeviceDiscoveryService.Stub() {
@Override
public void startDiscovery(AssociationRequest request,
- IOnAssociateCallback callback,
- String callingPackage) throws RemoteException {
+ String callingPackage,
+ IFindDeviceCallback findCallback,
+ ICompanionDeviceDiscoveryServiceCallback serviceCallback) {
if (DEBUG) {
Log.i(LOG_TAG,
- "startDiscovery() called with: filter = [" + request + "], callback = ["
- + callback + "]");
+ "startDiscovery() called with: filter = [" + request
+ + "], findCallback = [" + findCallback + "]"
+ + "], serviceCallback = [" + serviceCallback + "]");
}
- mCallback = callback;
+ mFindCallback = findCallback;
+ mServiceCallback = serviceCallback;
mCallingPackage = callingPackage;
DeviceDiscoveryService.this.startDiscovery(request);
}
@@ -171,6 +174,14 @@
return super.onUnbind(intent);
}
+ public void onDeviceSelected() {
+ try {
+ mServiceCallback.onDeviceSelected(mCallingPackage, getUserId());
+ } catch (RemoteException e) {
+ Log.e(LOG_TAG, "Error reporting selected device");
+ }
+ }
+
private void stopScan() {
if (DEBUG) Log.i(LOG_TAG, "stopScan() called");
mBluetoothAdapter.cancelDiscovery();
@@ -205,7 +216,7 @@
//TODO also, on timeout -> call onFailure
private void onReadyToShowUI() {
try {
- mCallback.onSuccess(PendingIntent.getActivity(
+ mFindCallback.onSuccess(PendingIntent.getActivity(
this, 0,
new Intent(this, DeviceChooserActivity.class),
PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_CANCEL_CURRENT
diff --git a/packages/ExtServices/Android.mk b/packages/ExtServices/Android.mk
index e8a4007..d0c2b9f 100644
--- a/packages/ExtServices/Android.mk
+++ b/packages/ExtServices/Android.mk
@@ -34,7 +34,8 @@
include $(BUILD_PACKAGE)
-
-
-
+# Use the following include to make our test apk.
+ifeq ($(strip $(LOCAL_PACKAGE_OVERRIDES)),)
+include $(call all-makefiles-under, $(LOCAL_PATH))
+endif
diff --git a/packages/ExtServices/AndroidManifest.xml b/packages/ExtServices/AndroidManifest.xml
index f442219..f3d8983 100644
--- a/packages/ExtServices/AndroidManifest.xml
+++ b/packages/ExtServices/AndroidManifest.xml
@@ -25,6 +25,13 @@
android:defaultToDeviceProtectedStorage="true"
android:directBootAware="true">
+ <service android:name=".storage.CacheQuotaServiceImpl"
+ android:permission="android.permission.BIND_CACHE_QUOTA_SERVICE">
+ <intent-filter>
+ <action android:name="android.app.usage.CacheQuotaService" />
+ </intent-filter>
+ </service>
+
<library android:name="android.ext.services"/>
</application>
diff --git a/packages/ExtServices/src/android/ext/services/storage/CacheQuotaServiceImpl.java b/packages/ExtServices/src/android/ext/services/storage/CacheQuotaServiceImpl.java
new file mode 100644
index 0000000..18863ca
--- /dev/null
+++ b/packages/ExtServices/src/android/ext/services/storage/CacheQuotaServiceImpl.java
@@ -0,0 +1,144 @@
+
+/*
+ * 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.ext.services.storage;
+
+import android.app.usage.CacheQuotaHint;
+import android.app.usage.CacheQuotaService;
+import android.os.Environment;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+import android.util.ArrayMap;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * CacheQuotaServiceImpl implements the CacheQuotaService with a strategy for populating the quota
+ * of {@link CacheQuotaHint}.
+ */
+public class CacheQuotaServiceImpl extends CacheQuotaService {
+ private static final double CACHE_RESERVE_RATIO = 0.15;
+
+ @Override
+ public List<CacheQuotaHint> onComputeCacheQuotaHints(List<CacheQuotaHint> requests) {
+ ArrayMap<String, List<CacheQuotaHint>> byUuid = new ArrayMap<>();
+ final int requestCount = requests.size();
+ for (int i = 0; i < requestCount; i++) {
+ CacheQuotaHint request = requests.get(i);
+ String uuid = request.getVolumeUuid();
+ List<CacheQuotaHint> listForUuid = byUuid.get(uuid);
+ if (listForUuid == null) {
+ listForUuid = new ArrayList<>();
+ byUuid.put(uuid, listForUuid);
+ }
+ listForUuid.add(request);
+ }
+
+ List<CacheQuotaHint> processed = new ArrayList<>();
+ byUuid.entrySet().forEach(
+ requestListEntry -> {
+ // Collapse all usage stats to the same uid.
+ Map<Integer, List<CacheQuotaHint>> byUid = requestListEntry.getValue()
+ .stream()
+ .collect(Collectors.groupingBy(CacheQuotaHint::getUid));
+ byUid.values().forEach(uidGroupedList -> {
+ int size = uidGroupedList.size();
+ if (size < 2) {
+ return;
+ }
+ CacheQuotaHint first = uidGroupedList.get(0);
+ for (int i = 1; i < size; i++) {
+ /* Note: We can't use the UsageStats built-in addition function because
+ UIDs may span multiple packages and usage stats adding has
+ matching package names as a precondition. */
+ first.getUsageStats().mTotalTimeInForeground +=
+ uidGroupedList.get(i).getUsageStats().mTotalTimeInForeground;
+ }
+ });
+
+ // Because the foreground stats have been added to the first element, we need
+ // a list of only the first values (which contain the merged foreground time).
+ List<CacheQuotaHint> flattenedRequests =
+ byUid.values()
+ .stream()
+ .map(entryList -> entryList.get(0))
+ .filter(entry -> entry.getUsageStats().mTotalTimeInForeground != 0)
+ .sorted(sCacheQuotaRequestComparator)
+ .collect(Collectors.toList());
+
+ // Because the elements are sorted, we can use the index to also be the sorted
+ // index for cache quota calculation.
+ double sum = getSumOfFairShares(flattenedRequests.size());
+ String uuid = requestListEntry.getKey();
+ long reservedSize = getReservedCacheSize(uuid);
+ for (int count = 0; count < flattenedRequests.size(); count++) {
+ double share = getFairShareForPosition(count) / sum;
+ CacheQuotaHint entry = flattenedRequests.get(count);
+ CacheQuotaHint.Builder builder = new CacheQuotaHint.Builder(entry);
+ builder.setQuota(Math.round(share * reservedSize));
+ processed.add(builder.build());
+ }
+ }
+ );
+
+ return processed.stream()
+ .filter(request -> request.getQuota() > 0).collect(Collectors.toList());
+ }
+
+ private double getFairShareForPosition(int position) {
+ double value = 1.0 / Math.log(position + 3) - 0.285;
+ return (value > 0.01) ? value : 0.01;
+ }
+
+ private double getSumOfFairShares(int size) {
+ double sum = 0;
+ for (int i = 0; i < size; i++) {
+ sum += getFairShareForPosition(i);
+ }
+ return sum;
+ }
+
+ private long getReservedCacheSize(String uuid) {
+ // TODO: Revisit the cache size after running more storage tests.
+ // TODO: Figure out how to ensure ExtServices has the permissions to call
+ // StorageStatsManager, because this is ignoring the cache...
+ StorageManager storageManager = getSystemService(StorageManager.class);
+ long freeBytes = 0;
+ if (uuid == StorageManager.UUID_PRIVATE_INTERNAL) { // regular equals because of null
+ freeBytes = Environment.getDataDirectory().getFreeSpace();
+ } else {
+ final VolumeInfo vol = storageManager.findVolumeByUuid(uuid);
+ freeBytes = vol.getPath().getFreeSpace();
+ }
+ return Math.round(freeBytes * CACHE_RESERVE_RATIO);
+ }
+
+ // Compares based upon foreground time.
+ private static Comparator<CacheQuotaHint> sCacheQuotaRequestComparator =
+ new Comparator<CacheQuotaHint>() {
+ @Override
+ public int compare(CacheQuotaHint o, CacheQuotaHint t1) {
+ long x = t1.getUsageStats().getTotalTimeInForeground();
+ long y = o.getUsageStats().getTotalTimeInForeground();
+ return (x < y) ? -1 : ((x == y) ? 0 : 1);
+ }
+ };
+}
diff --git a/packages/ExtServices/tests/Android.mk b/packages/ExtServices/tests/Android.mk
new file mode 100644
index 0000000..cb3c352
--- /dev/null
+++ b/packages/ExtServices/tests/Android.mk
@@ -0,0 +1,24 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# We only want this apk build for tests.
+LOCAL_MODULE_TAGS := tests
+LOCAL_CERTIFICATE := platform
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ android-support-test \
+ mockito-target-minus-junit4 \
+ espresso-core \
+ truth-prebuilt \
+ legacy-android-test
+
+# Include all test java files.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := ExtServicesUnitTests
+
+LOCAL_INSTRUMENTATION_FOR := ExtServices
+
+include $(BUILD_PACKAGE)
diff --git a/packages/ExtServices/tests/AndroidManifest.xml b/packages/ExtServices/tests/AndroidManifest.xml
new file mode 100644
index 0000000..e6c7b97
--- /dev/null
+++ b/packages/ExtServices/tests/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.ext.services.tests.unit">
+
+ <application>
+ <uses-library android:name="android.test.runner" />
+ </application>
+
+ <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:targetPackage="android.ext.services"
+ android:label="ExtServices Test Cases">
+ </instrumentation>
+
+</manifest>
\ No newline at end of file
diff --git a/packages/ExtServices/tests/src/android/ext/services/storage/CacheQuotaServiceImplTest.java b/packages/ExtServices/tests/src/android/ext/services/storage/CacheQuotaServiceImplTest.java
new file mode 100644
index 0000000..cc1699a
--- /dev/null
+++ b/packages/ExtServices/tests/src/android/ext/services/storage/CacheQuotaServiceImplTest.java
@@ -0,0 +1,150 @@
+/*
+ * 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.ext.services.storage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.app.usage.CacheQuotaHint;
+import android.app.usage.UsageStats;
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.Intent;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+import android.test.ServiceTestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class CacheQuotaServiceImplTest extends ServiceTestCase<CacheQuotaServiceImpl> {
+ private static final String sTestVolUuid = "uuid";
+ private static final String sSecondTestVolUuid = "otherUuid";
+
+ @Mock private Context mContext;
+ @Mock private File mFile;
+ @Mock private VolumeInfo mVolume;
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS) private StorageManager mStorageManager;
+
+ public CacheQuotaServiceImplTest() {
+ super(CacheQuotaServiceImpl.class);
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+ mContext = Mockito.spy(new ContextWrapper(getSystemContext()));
+ setContext(mContext);
+ when(mContext.getSystemService(Context.STORAGE_SERVICE)).thenReturn(mStorageManager);
+
+ when(mFile.getFreeSpace()).thenReturn(10000L);
+ when(mVolume.getPath()).thenReturn(mFile);
+ when(mStorageManager.findVolumeByUuid(sTestVolUuid)).thenReturn(mVolume);
+ when(mStorageManager.findVolumeByUuid(sSecondTestVolUuid)).thenReturn(mVolume);
+
+ Intent intent = new Intent(getContext(), CacheQuotaServiceImpl.class);
+ startService(intent);
+ }
+
+ @Test
+ public void testNoApps() {
+ CacheQuotaServiceImpl service = getService();
+ assertEquals(service.onComputeCacheQuotaHints(new ArrayList()).size(), 0);
+ }
+
+ @Test
+ public void testOneApp() throws Exception {
+ ArrayList<CacheQuotaHint> requests = new ArrayList<>();
+ CacheQuotaHint request = makeNewRequest("com.test", sTestVolUuid, 1001, 100L);
+ requests.add(request);
+
+ List<CacheQuotaHint> output = getService().onComputeCacheQuotaHints(requests);
+
+ assertThat(output).hasSize(1);
+ assertThat(output.get(0).getQuota()).isEqualTo(1500L);
+ }
+
+ @Test
+ public void testTwoAppsOneVolume() throws Exception {
+ ArrayList<CacheQuotaHint> requests = new ArrayList<>();
+ requests.add(makeNewRequest("com.test", sTestVolUuid, 1001, 100L));
+ requests.add(makeNewRequest("com.test2", sTestVolUuid, 1002, 99L));
+
+ List<CacheQuotaHint> output = getService().onComputeCacheQuotaHints(requests);
+
+ // Note that the sizes are just the cache area split up.
+ assertThat(output).hasSize(2);
+ assertThat(output.get(0).getQuota()).isEqualTo(883);
+ assertThat(output.get(1).getQuota()).isEqualTo(1500 - 883);
+ }
+
+ @Test
+ public void testTwoAppsTwoVolumes() throws Exception {
+ ArrayList<CacheQuotaHint> requests = new ArrayList<>();
+ requests.add(makeNewRequest("com.test", sTestVolUuid, 1001, 100L));
+ requests.add(makeNewRequest("com.test2", sSecondTestVolUuid, 1002, 99L));
+
+ List<CacheQuotaHint> output = getService().onComputeCacheQuotaHints(requests);
+
+ assertThat(output).hasSize(2);
+ assertThat(output.get(0).getQuota()).isEqualTo(1500);
+ assertThat(output.get(1).getQuota()).isEqualTo(1500);
+ }
+
+ @Test
+ public void testMultipleAppsPerUidIsCollated() throws Exception {
+ ArrayList<CacheQuotaHint> requests = new ArrayList<>();
+ requests.add(makeNewRequest("com.test", sTestVolUuid, 1001, 100L));
+ requests.add(makeNewRequest("com.test2", sTestVolUuid, 1001, 99L));
+
+ List<CacheQuotaHint> output = getService().onComputeCacheQuotaHints(requests);
+
+ assertThat(output).hasSize(1);
+ assertThat(output.get(0).getQuota()).isEqualTo(1500);
+ }
+
+ @Test
+ public void testTwoAppsTwoVolumesTwoUuidsShouldBESeparate() throws Exception {
+ ArrayList<CacheQuotaHint> requests = new ArrayList<>();
+ requests.add(makeNewRequest("com.test", sTestVolUuid, 1001, 100L));
+ requests.add(makeNewRequest("com.test2", sSecondTestVolUuid, 1001, 99L));
+
+ List<CacheQuotaHint> output = getService().onComputeCacheQuotaHints(requests);
+
+ assertThat(output).hasSize(2);
+ assertThat(output.get(0).getQuota()).isEqualTo(1500);
+ assertThat(output.get(1).getQuota()).isEqualTo(1500);
+ }
+
+ private CacheQuotaHint makeNewRequest(String packageName, String uuid, int uid, long foregroundTime) {
+ UsageStats stats = new UsageStats();
+ stats.mPackageName = packageName;
+ stats.mTotalTimeInForeground = foregroundTime;
+ return new CacheQuotaHint.Builder()
+ .setVolumeUuid(uuid).setUid(uid).setUsageStats(stats).setQuota(-1).build();
+ }
+}
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
index 22a5b7f..3cc9f65e 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
@@ -56,6 +56,7 @@
import android.webkit.MimeTypeMap;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.content.FileSystemProvider;
import com.android.internal.util.IndentingPrintWriter;
import java.io.File;
@@ -63,15 +64,15 @@
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
+import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
-public class ExternalStorageProvider extends DocumentsProvider {
+public class ExternalStorageProvider extends FileSystemProvider {
private static final String TAG = "ExternalStorage";
private static final boolean DEBUG = false;
- private static final boolean LOG_INOTIFY = false;
public static final String AUTHORITY = "com.android.externalstorage.documents";
@@ -105,20 +106,17 @@
private static final String ROOT_ID_HOME = "home";
private StorageManager mStorageManager;
- private Handler mHandler;
private final Object mRootsLock = new Object();
@GuardedBy("mRootsLock")
private ArrayMap<String, RootInfo> mRoots = new ArrayMap<>();
- @GuardedBy("mObservers")
- private ArrayMap<File, DirectoryObserver> mObservers = new ArrayMap<>();
-
@Override
public boolean onCreate() {
+ super.onCreate(DEFAULT_DOCUMENT_PROJECTION);
+
mStorageManager = (StorageManager) getContext().getSystemService(Context.STORAGE_SERVICE);
- mHandler = new Handler();
updateVolumes();
return true;
@@ -274,11 +272,8 @@
return projection != null ? projection : DEFAULT_ROOT_PROJECTION;
}
- private static String[] resolveDocumentProjection(String[] projection) {
- return projection != null ? projection : DEFAULT_DOCUMENT_PROJECTION;
- }
-
- private String getDocIdForFile(File file) throws FileNotFoundException {
+ @Override
+ protected String getDocIdForFile(File file) throws FileNotFoundException {
return getDocIdForFileMaybeCreate(file, false);
}
@@ -344,11 +339,8 @@
return mostSpecificRoot;
}
- private File getFileForDocId(String docId) throws FileNotFoundException {
- return getFileForDocId(docId, false);
- }
-
- private File getFileForDocId(String docId, boolean visible) throws FileNotFoundException {
+ @Override
+ protected File getFileForDocId(String docId, boolean visible) throws FileNotFoundException {
RootInfo root = getRootFromDocId(docId);
return buildFile(root, docId, visible);
}
@@ -393,48 +385,9 @@
return target;
}
- private void includeFile(MatrixCursor result, String docId, File file)
- throws FileNotFoundException {
- if (docId == null) {
- docId = getDocIdForFile(file);
- } else {
- file = getFileForDocId(docId);
- }
-
- int flags = 0;
-
- if (file.canWrite()) {
- if (file.isDirectory()) {
- flags |= Document.FLAG_DIR_SUPPORTS_CREATE;
- flags |= Document.FLAG_SUPPORTS_DELETE;
- flags |= Document.FLAG_SUPPORTS_RENAME;
- flags |= Document.FLAG_SUPPORTS_MOVE;
- } else {
- flags |= Document.FLAG_SUPPORTS_WRITE;
- flags |= Document.FLAG_SUPPORTS_DELETE;
- flags |= Document.FLAG_SUPPORTS_RENAME;
- flags |= Document.FLAG_SUPPORTS_MOVE;
- }
- }
-
- final String mimeType = getTypeForFile(file);
- final String displayName = file.getName();
- if (mimeType.startsWith("image/")) {
- flags |= Document.FLAG_SUPPORTS_THUMBNAIL;
- }
-
- final RowBuilder row = result.newRow();
- row.add(Document.COLUMN_DOCUMENT_ID, docId);
- row.add(Document.COLUMN_DISPLAY_NAME, displayName);
- row.add(Document.COLUMN_SIZE, file.length());
- row.add(Document.COLUMN_MIME_TYPE, mimeType);
- row.add(Document.COLUMN_FLAGS, flags);
-
- // Only publish dates reasonably after epoch
- long lastModified = file.lastModified();
- if (lastModified > 31536000000L) {
- row.add(Document.COLUMN_LAST_MODIFIED, lastModified);
- }
+ @Override
+ protected Uri buildNotificationUri(String docId) {
+ return DocumentsContract.buildChildDocumentsUri(AUTHORITY, docId);
}
@Override
@@ -455,22 +408,8 @@
}
@Override
- public boolean isChildDocument(String parentDocId, String docId) {
- try {
- final File parent = getFileForDocId(parentDocId).getCanonicalFile();
- final File doc = getFileForDocId(docId).getCanonicalFile();
- return FileUtils.contains(parent, doc);
- } catch (IOException e) {
- throw new IllegalArgumentException(
- "Failed to determine if " + docId + " is child of " + parentDocId + ": " + e);
- }
- }
-
- @Override
public Path findDocumentPath(String childDocId, @Nullable String parentDocId)
throws FileNotFoundException {
- LinkedList<String> path = new LinkedList<>();
-
final Pair<RootInfo, File> resolvedDocId = resolveDocId(childDocId, false);
final RootInfo root = resolvedDocId.first;
File child = resolvedDocId.second;
@@ -479,49 +418,7 @@
? root.path
: getFileForDocId(parentDocId);
- if (!child.exists()) {
- throw new FileNotFoundException(childDocId + " is not found.");
- }
-
- if (!child.getAbsolutePath().startsWith(parent.getAbsolutePath())) {
- throw new FileNotFoundException(childDocId + " is not found under " + parentDocId);
- }
-
- while (child != null && child.getAbsolutePath().startsWith(parent.getAbsolutePath())) {
- path.addFirst(getDocIdForFile(child));
-
- child = child.getParentFile();
- }
-
- return new Path(parentDocId == null ? root.rootId : null, path);
- }
-
- @Override
- public String createDocument(String docId, String mimeType, String displayName)
- throws FileNotFoundException {
- displayName = FileUtils.buildValidFatFilename(displayName);
-
- final File parent = getFileForDocId(docId);
- if (!parent.isDirectory()) {
- throw new IllegalArgumentException("Parent document isn't a directory");
- }
-
- final File file = FileUtils.buildUniqueFile(parent, mimeType, displayName);
- if (Document.MIME_TYPE_DIR.equals(mimeType)) {
- if (!file.mkdir()) {
- throw new IllegalStateException("Failed to mkdir " + file);
- }
- } else {
- try {
- if (!file.createNewFile()) {
- throw new IllegalStateException("Failed to touch " + file);
- }
- } catch (IOException e) {
- throw new IllegalStateException("Failed to touch " + file + ": " + e);
- }
- }
-
- return getDocIdForFile(file);
+ return new Path(parentDocId == null ? root.rootId : null, findDocumentPath(parent, child));
}
private Uri getDocumentUri(String path, List<UriPermission> accessUriPermissions)
@@ -587,120 +484,14 @@
}
@Override
- public String renameDocument(String docId, String displayName) throws FileNotFoundException {
- // Since this provider treats renames as generating a completely new
- // docId, we're okay with letting the MIME type change.
- displayName = FileUtils.buildValidFatFilename(displayName);
-
- final File before = getFileForDocId(docId);
- final File after = FileUtils.buildUniqueFile(before.getParentFile(), displayName);
- if (!before.renameTo(after)) {
- throw new IllegalStateException("Failed to rename to " + after);
- }
- final String afterDocId = getDocIdForFile(after);
- if (!TextUtils.equals(docId, afterDocId)) {
- return afterDocId;
- } else {
- return null;
- }
- }
-
- @Override
- public void deleteDocument(String docId) throws FileNotFoundException {
- final File file = getFileForDocId(docId);
- final File visibleFile = getFileForDocId(docId, true);
-
- final boolean isDirectory = file.isDirectory();
- if (isDirectory) {
- FileUtils.deleteContents(file);
- }
- if (!file.delete()) {
- throw new IllegalStateException("Failed to delete " + file);
- }
-
- if (visibleFile != null) {
- final ContentResolver resolver = getContext().getContentResolver();
- final Uri externalUri = MediaStore.Files.getContentUri("external");
-
- // Remove media store entries for any files inside this directory, using
- // path prefix match. Logic borrowed from MtpDatabase.
- if (isDirectory) {
- final String path = visibleFile.getAbsolutePath() + "/";
- resolver.delete(externalUri,
- "_data LIKE ?1 AND lower(substr(_data,1,?2))=lower(?3)",
- new String[] { path + "%", Integer.toString(path.length()), path });
- }
-
- // Remove media store entry for this exact file.
- final String path = visibleFile.getAbsolutePath();
- resolver.delete(externalUri,
- "_data LIKE ?1 AND lower(_data)=lower(?2)",
- new String[] { path, path });
- }
- }
-
- @Override
- public String moveDocument(String sourceDocumentId, String sourceParentDocumentId,
- String targetParentDocumentId)
- throws FileNotFoundException {
- final File before = getFileForDocId(sourceDocumentId);
- final File after = new File(getFileForDocId(targetParentDocumentId), before.getName());
-
- if (after.exists()) {
- throw new IllegalStateException("Already exists " + after);
- }
- if (!before.renameTo(after)) {
- throw new IllegalStateException("Failed to move to " + after);
- }
- return getDocIdForFile(after);
- }
-
- @Override
- public Cursor queryDocument(String documentId, String[] projection)
- throws FileNotFoundException {
- final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
- includeFile(result, documentId, null);
- return result;
- }
-
- @Override
- public Cursor queryChildDocuments(
- String parentDocumentId, String[] projection, String sortOrder)
- throws FileNotFoundException {
- final File parent = getFileForDocId(parentDocumentId);
- final MatrixCursor result = new DirectoryCursor(
- resolveDocumentProjection(projection), parentDocumentId, parent);
- for (File file : parent.listFiles()) {
- includeFile(result, null, file);
- }
- return result;
- }
-
- @Override
public Cursor querySearchDocuments(String rootId, String query, String[] projection)
throws FileNotFoundException {
- final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
-
- query = query.toLowerCase();
final File parent;
synchronized (mRootsLock) {
parent = mRoots.get(rootId).path;
}
- final LinkedList<File> pending = new LinkedList<>();
- pending.add(parent);
- while (!pending.isEmpty() && result.getCount() < 24) {
- final File file = pending.removeFirst();
- if (file.isDirectory()) {
- for (File child : file.listFiles()) {
- pending.add(child);
- }
- }
- if (file.getName().toLowerCase().contains(query)) {
- includeFile(result, null, file);
- }
- }
- return result;
+ return querySearchDocuments(parent, query, projection, Collections.emptySet());
}
@Override
@@ -722,48 +513,6 @@
}
@Override
- public String getDocumentType(String documentId) throws FileNotFoundException {
- final File file = getFileForDocId(documentId);
- return getTypeForFile(file);
- }
-
- @Override
- public ParcelFileDescriptor openDocument(
- String documentId, String mode, CancellationSignal signal)
- throws FileNotFoundException {
- final File file = getFileForDocId(documentId);
- final File visibleFile = getFileForDocId(documentId, true);
-
- final int pfdMode = ParcelFileDescriptor.parseMode(mode);
- if (pfdMode == ParcelFileDescriptor.MODE_READ_ONLY || visibleFile == null) {
- return ParcelFileDescriptor.open(file, pfdMode);
- } else {
- try {
- // When finished writing, kick off media scanner
- return ParcelFileDescriptor.open(file, pfdMode, mHandler, new OnCloseListener() {
- @Override
- public void onClose(IOException e) {
- final Intent intent = new Intent(
- Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
- intent.setData(Uri.fromFile(visibleFile));
- getContext().sendBroadcast(intent);
- }
- });
- } catch (IOException e) {
- throw new FileNotFoundException("Failed to open for writing: " + e);
- }
- }
- }
-
- @Override
- public AssetFileDescriptor openDocumentThumbnail(
- String documentId, Point sizeHint, CancellationSignal signal)
- throws FileNotFoundException {
- final File file = getFileForDocId(documentId);
- return DocumentsContract.openImageThumbnail(file);
- }
-
- @Override
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ", 160);
synchronized (mRootsLock) {
@@ -826,107 +575,4 @@
}
return bundle;
}
-
- private static String getTypeForFile(File file) {
- if (file.isDirectory()) {
- return Document.MIME_TYPE_DIR;
- } else {
- return getTypeForName(file.getName());
- }
- }
-
- private static String getTypeForName(String name) {
- final int lastDot = name.lastIndexOf('.');
- if (lastDot >= 0) {
- final String extension = name.substring(lastDot + 1).toLowerCase();
- final String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
- if (mime != null) {
- return mime;
- }
- }
-
- return "application/octet-stream";
- }
-
- private void startObserving(File file, Uri notifyUri) {
- synchronized (mObservers) {
- DirectoryObserver observer = mObservers.get(file);
- if (observer == null) {
- observer = new DirectoryObserver(
- file, getContext().getContentResolver(), notifyUri);
- observer.startWatching();
- mObservers.put(file, observer);
- }
- observer.mRefCount++;
-
- if (LOG_INOTIFY) Log.d(TAG, "after start: " + observer);
- }
- }
-
- private void stopObserving(File file) {
- synchronized (mObservers) {
- DirectoryObserver observer = mObservers.get(file);
- if (observer == null) return;
-
- observer.mRefCount--;
- if (observer.mRefCount == 0) {
- mObservers.remove(file);
- observer.stopWatching();
- }
-
- if (LOG_INOTIFY) Log.d(TAG, "after stop: " + observer);
- }
- }
-
- private static class DirectoryObserver extends FileObserver {
- private static final int NOTIFY_EVENTS = ATTRIB | CLOSE_WRITE | MOVED_FROM | MOVED_TO
- | CREATE | DELETE | DELETE_SELF | MOVE_SELF;
-
- private final File mFile;
- private final ContentResolver mResolver;
- private final Uri mNotifyUri;
-
- private int mRefCount = 0;
-
- public DirectoryObserver(File file, ContentResolver resolver, Uri notifyUri) {
- super(file.getAbsolutePath(), NOTIFY_EVENTS);
- mFile = file;
- mResolver = resolver;
- mNotifyUri = notifyUri;
- }
-
- @Override
- public void onEvent(int event, String path) {
- if ((event & NOTIFY_EVENTS) != 0) {
- if (LOG_INOTIFY) Log.d(TAG, "onEvent() " + event + " at " + path);
- mResolver.notifyChange(mNotifyUri, null, false);
- }
- }
-
- @Override
- public String toString() {
- return "DirectoryObserver{file=" + mFile.getAbsolutePath() + ", ref=" + mRefCount + "}";
- }
- }
-
- private class DirectoryCursor extends MatrixCursor {
- private final File mFile;
-
- public DirectoryCursor(String[] columnNames, String docId, File file) {
- super(columnNames);
-
- final Uri notifyUri = DocumentsContract.buildChildDocumentsUri(
- AUTHORITY, docId);
- setNotificationUri(getContext().getContentResolver(), notifyUri);
-
- mFile = file;
- startObserving(mFile, notifyUri);
- }
-
- @Override
- public void close() {
- super.close();
- stopObserving(mFile);
- }
- }
}
diff --git a/packages/FakeOemFeatures/src/com/android/fakeoemfeatures/FakeApp.java b/packages/FakeOemFeatures/src/com/android/fakeoemfeatures/FakeApp.java
index 36ce7ce..c9e0d0a 100644
--- a/packages/FakeOemFeatures/src/com/android/fakeoemfeatures/FakeApp.java
+++ b/packages/FakeOemFeatures/src/com/android/fakeoemfeatures/FakeApp.java
@@ -108,14 +108,14 @@
builder.setCancelable(false);
builder.setPositiveButton("I understand", null);
Dialog dialog = builder.create();
- dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
+ dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
dialog.show();
}
// Make a fake window that is always around eating graphics resources.
FakeView view = new FakeView(this);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
- WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
+ WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
diff --git a/packages/FakeOemFeatures/src/com/android/fakeoemfeatures/FakeBackgroundService.java b/packages/FakeOemFeatures/src/com/android/fakeoemfeatures/FakeBackgroundService.java
index 5d1a398..ff09000 100644
--- a/packages/FakeOemFeatures/src/com/android/fakeoemfeatures/FakeBackgroundService.java
+++ b/packages/FakeOemFeatures/src/com/android/fakeoemfeatures/FakeBackgroundService.java
@@ -74,7 +74,7 @@
// Make a fake window that is always around eating graphics resources.
FakeView view = new FakeView(this);
Dialog dialog = new Dialog(this, android.R.style.Theme_Holo_Dialog);
- dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
+ dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
dialog.getWindow().setFlags(
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
diff --git a/packages/MtpDocumentsProvider/res/values-ne/strings.xml b/packages/MtpDocumentsProvider/res/values-ne/strings.xml
index 9a059e2..53c0954 100644
--- a/packages/MtpDocumentsProvider/res/values-ne/strings.xml
+++ b/packages/MtpDocumentsProvider/res/values-ne/strings.xml
@@ -20,6 +20,6 @@
<string name="downloads_app_label" msgid="7120690641874849726">"डाउनलोडहरू"</string>
<string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
<string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> बाट फाइलहरूमाथि पहुँच राख्दै"</string>
- <string name="error_busy_device" msgid="3997316850357386589">"अर्को यन्त्र व्यस्त छ। त्यो यन्त्र उपलब्ध नभएसम्म तपाईँ फाइल स्थानान्तरण गर्न सक्नुहुन्न।"</string>
+ <string name="error_busy_device" msgid="3997316850357386589">"अर्को यन्त्र व्यस्त छ। त्यो यन्त्र उपलब्ध नभएसम्म तपाईं फाइल स्थानान्तरण गर्न सक्नुहुन्न।"</string>
<string name="error_locked_device" msgid="7557872102188356147">"कुनै फाइल भेट्टिएन। अर्को यन्त्र लक गरिएको हुन सक्छ। यदि त्यसो हो भने त्यसलाई अनलक गरेर फेरि प्रयास गर्नुहोस्।"</string>
</resources>
diff --git a/packages/PrintSpooler/res/layout/no_print_services_message.xml b/packages/PrintSpooler/res/layout/no_print_services_message.xml
new file mode 100644
index 0000000..7872658
--- /dev/null
+++ b/packages/PrintSpooler/res/layout/no_print_services_message.xml
@@ -0,0 +1,42 @@
+<?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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="?android:attr/listPreferredItemHeightSmall"
+ android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+ android:orientation="horizontal"
+ android:gravity="start|center_vertical">
+
+ <RelativeLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="32dip">
+ <HorizontalScrollView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceListItem"
+ android:text="@string/print_no_print_services"
+ android:scrollHorizontally="true"
+ android:singleLine="true" />
+ </HorizontalScrollView>
+ </RelativeLayout>
+
+</LinearLayout>
diff --git a/packages/PrintSpooler/res/values-bn/strings.xml b/packages/PrintSpooler/res/values-bn/strings.xml
index 6f8ae0d..a1fba66 100644
--- a/packages/PrintSpooler/res/values-bn/strings.xml
+++ b/packages/PrintSpooler/res/values-bn/strings.xml
@@ -102,7 +102,7 @@
</string-array>
<string name="print_write_error_message" msgid="5787642615179572543">"ফাইলে লেখা যায়নি"</string>
<string name="print_error_default_message" msgid="8602678405502922346">"দুঃখিত, এটি কাজ করেনি৷ আবার চেষ্টা করুন৷"</string>
- <string name="print_error_retry" msgid="1426421728784259538">"পুনরায় চেষ্টা করুন"</string>
+ <string name="print_error_retry" msgid="1426421728784259538">"আবার চেষ্টা করুন"</string>
<string name="print_error_printer_unavailable" msgid="8985614415253203381">"এই মূহুর্তে প্রিন্টার উপলব্ধ নয়।"</string>
<string name="print_cannot_load_page" msgid="6179560924492912009">"পূর্বরূপ প্রদর্শন করা যাবে না"</string>
<string name="print_preparing_preview" msgid="3939930735671364712">"পূর্বরূপ প্রস্তুত করছে..."</string>
diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml
index f36167e..36465a1 100644
--- a/packages/PrintSpooler/res/values-hi/strings.xml
+++ b/packages/PrintSpooler/res/values-hi/strings.xml
@@ -79,7 +79,7 @@
</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>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"प्रिंटर गड़बड़ी <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
<string name="blocked_notification_title_template" msgid="1175435827331588646">"प्रिंटर अवरोधित <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
<string name="cancel" msgid="4373674107267141885">"अभी नहीं"</string>
<string name="restart" msgid="2472034227037808749">"पुन: आरंभ करें"</string>
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/AddPrinterActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/AddPrinterActivity.java
index 7b0a291..696376e 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/AddPrinterActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/AddPrinterActivity.java
@@ -26,6 +26,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.Loader;
+import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.DataSetObserver;
import android.net.Uri;
@@ -97,20 +98,39 @@
*/
private RecommendedServicesAdapter mRecommendedServicesAdapter;
+ private static final String PKG_NAME_VENDING = "com.android.vending";
+ private boolean mHasVending;
+ private NoPrintServiceMessageAdapter mNoPrintServiceMessageAdapter;
+
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_printer_activity);
+ try {
+ getPackageManager().getPackageInfo(PKG_NAME_VENDING, 0);
+ mHasVending = true;
+ } catch (PackageManager.NameNotFoundException e) {
+ mHasVending = false;
+ }
mEnabledServicesAdapter = new EnabledServicesAdapter();
mDisabledServicesAdapter = new DisabledServicesAdapter();
- mRecommendedServicesAdapter = new RecommendedServicesAdapter();
+ if (mHasVending) {
+ mRecommendedServicesAdapter = new RecommendedServicesAdapter();
+ } else {
+ mNoPrintServiceMessageAdapter = new NoPrintServiceMessageAdapter();
+ }
ArrayList<ActionAdapter> adapterList = new ArrayList<>(3);
adapterList.add(mEnabledServicesAdapter);
- adapterList.add(mRecommendedServicesAdapter);
+ if (mHasVending) {
+ adapterList.add(mRecommendedServicesAdapter);
+ }
adapterList.add(mDisabledServicesAdapter);
+ if (!mHasVending) {
+ adapterList.add(mNoPrintServiceMessageAdapter);
+ }
setListAdapter(new CombinedAdapter(adapterList));
@@ -121,8 +141,10 @@
getLoaderManager().initLoader(LOADER_ID_ENABLED_SERVICES, null, printServiceLoaderCallbacks);
getLoaderManager().initLoader(LOADER_ID_DISABLED_SERVICES, null, printServiceLoaderCallbacks);
- getLoaderManager().initLoader(LOADER_ID_RECOMMENDED_SERVICES, null,
- new PrintServicePrintServiceRecommendationLoaderCallbacks());
+ if (mHasVending) {
+ getLoaderManager().initLoader(LOADER_ID_RECOMMENDED_SERVICES, null,
+ new PrintServicePrintServiceRecommendationLoaderCallbacks());
+ }
getLoaderManager().initLoader(LOADER_ID_ALL_SERVICES, null, printServiceLoaderCallbacks);
}
@@ -174,7 +196,11 @@
mDisabledServicesAdapter.updateData(data);
break;
case LOADER_ID_ALL_SERVICES:
- mRecommendedServicesAdapter.updateInstalledServices(data);
+ if (mHasVending) {
+ mRecommendedServicesAdapter.updateInstalledServices(data);
+ } else {
+ mNoPrintServiceMessageAdapter.updateInstalledServices(data);
+ }
default:
// not reached
}
@@ -191,7 +217,11 @@
mDisabledServicesAdapter.updateData(null);
break;
case LOADER_ID_ALL_SERVICES:
- mRecommendedServicesAdapter.updateInstalledServices(null);
+ if (mHasVending) {
+ mRecommendedServicesAdapter.updateInstalledServices(null);
+ } else {
+ mNoPrintServiceMessageAdapter.updateInstalledServices(null);
+ }
break;
default:
// not reached
@@ -804,4 +834,61 @@
filterRecommendations();
}
}
+
+ private class NoPrintServiceMessageAdapter extends ActionAdapter {
+ private boolean mHasPrintService;
+
+ void updateInstalledServices(@Nullable List<PrintServiceInfo> services) {
+ if (services == null || services.isEmpty()) {
+ mHasPrintService = false;
+ } else {
+ mHasPrintService = true;
+ }
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public int getCount() {
+ return mHasPrintService ? 0 : 1;
+ }
+
+ @Override
+ public int getViewTypeCount() {
+ return 1;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return 0;
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return null;
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ if (convertView == null) {
+ convertView = getLayoutInflater().inflate(R.layout.no_print_services_message,
+ parent, false);
+ }
+ return convertView;
+ }
+
+ @Override
+ public boolean isEnabled(int position) {
+ return position != 0;
+ }
+
+ @Override
+ public void performAction(@IntRange(from = 0) int position) {
+ return;
+ }
+ }
}
diff --git a/packages/SettingsLib/common.mk b/packages/SettingsLib/common.mk
index cf0ba6c..0815534 100644
--- a/packages/SettingsLib/common.mk
+++ b/packages/SettingsLib/common.mk
@@ -24,5 +24,9 @@
LOCAL_STATIC_JAVA_LIBRARIES += \
android-support-annotations \
android-support-v4 \
+ android-support-v7-appcompat \
+ android-support-v7-preference \
+ android-support-v7-recyclerview \
+ android-support-v14-preference \
SettingsLib
endif
diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml
index dbfc565..5a9ae79 100644
--- a/packages/SettingsLib/res/values-af/arrays.xml
+++ b/packages/SettingsLib/res/values-af/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Wys oortrekareas"</item>
<item msgid="2290859360633824369">"Wys areas vir Deuteranomaly"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standaardlimiet"</item>
<item msgid="4071574792028999443">"Geen agtergrondprosesse"</item>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index c103b0b..5f41d19 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Gestoor"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Gedeaktiveer"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP-opstelling het misluk"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi-verbinding het misluk"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Stawingsprobleem"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Nie binne ontvangs nie"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Wys hardewarelae se opdaterings"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Laat hardewarelae groen flits wanneer hulle opgedateer word"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Ontfout GPU-oortrek"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Deaktiveer HW-oorleggers"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Gebruik altyd GPU vir skermsamestelling"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simuleer kleurruimte"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Voer wagwoord in om fabriekterugstelling in demonstrasiemodus uit te voer"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Volgende"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Wagwoord word benodig"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktiewe invoermetodes"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Gebruik stelseltale"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-am/arrays.xml b/packages/SettingsLib/res/values-am/arrays.xml
index 7fdc06a..cbc46b1 100644
--- a/packages/SettingsLib/res/values-am/arrays.xml
+++ b/packages/SettingsLib/res/values-am/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"ስዕሉ አልፎ የፈሰሰባቸው አካባቢዎችን አሳይ"</item>
<item msgid="2290859360633824369">"ቀይ እና አረንጓዴ የማይለይባቸው ቦታዎች አሳይ"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"መደበኛ ወሰኖች"</item>
<item msgid="4071574792028999443">"ምንም የዳራ ሂደቶች የሉም"</item>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 7725827..d41b1e9 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"ተቀምጧል"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"ተሰናክሏል"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"የአይ.ፒ. ውቅረት መሰናከል"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"የWiFi ግንኙነት መሰናከል"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"የማረጋገጫ ችግር"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"በክልል ውስጥ የለም"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"የሃርድዌር ንብርብሮች ዝማኔዎችን አሳይ"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"የሃርድዌር ንብርብሮች ሲዘምኑ አረንጓዴ አብራ"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"የጂፒዩ አልፎ መሳል አርም"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"የHW ተደራቢዎችን አሰናክል"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"ለማያ ገጽ ማቀናበሪያ ሁልጊዜ GPU ተጠቀም"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"የቀለም ህዋ አስመስል"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"የፋብሪካ ዳግም ማስጀመር በማሳያ ሁነታ ውስጥ ለማከናወን የይለፍ ቃል ያስገቡ"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ቀጣይ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"የይለፍ ቃል ያስፈልጋል"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"የገባሪ ግቤት ዘዴ"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"የሥርዓት ቋንቋዎችን ይጠቀሙ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml
index a8976ad..3c6c5b1 100644
--- a/packages/SettingsLib/res/values-ar/arrays.xml
+++ b/packages/SettingsLib/res/values-ar/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"عرض مناطق تجاوز الحد"</item>
<item msgid="2290859360633824369">"عرض مناطق العرض المسرحي Deuteranomaly"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"الحد القياسي"</item>
<item msgid="4071574792028999443">"ليست هناك عمليات بالخلفية"</item>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index fa7e253..aef7102 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"تم الحفظ"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"معطلة"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"أخفقت تهيئة عنوان IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"أخفق اتصال WiFi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"حدثت مشكلة في المصادقة"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"ليست في النطاق"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"عرض تحديثات طبقات الأجهزة"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"تشغيل وميض بالأخضر لطبقات الأجهزة عند تحديثها"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"تصحيح تجاوز حد وحدة معالجة الرسومات"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"تعطيل تراكبات الأجهزة"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"استخدام وحدة معالجة الرسومات دائمًا لتركيب الشاشة"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"محاكاة مسافة اللون"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"إدخال كلمة المرور لإعادة الضبط بحسب بيانات المصنع في الوضع التجريبي"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"التالي"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"يلزم توفر كلمة مرور"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"طرق الإدخال النشطة"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"استخدام لغات النظام"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-az/arrays.xml b/packages/SettingsLib/res/values-az/arrays.xml
index 7a147d5..67340d3 100644
--- a/packages/SettingsLib/res/values-az/arrays.xml
+++ b/packages/SettingsLib/res/values-az/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Böyütmə sahələrini göstər"</item>
<item msgid="2290859360633824369">"Daltonizm üçün sahələri göstərin"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standart limit"</item>
<item msgid="4071574792028999443">"Fon proses yoxdur"</item>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 70a8c49..4529c63 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Yadda saxlanılan"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Deaktiv"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP Konfiqurasiya Uğursuzluğu"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi Bağlantı Uğursuzluğu"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Autentifikasiya problemi"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Diapazonda deyil"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Avadanlıq düzənlərinin güncəlləşməsini göstərin"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Onlar güncəllənəndən sonra avadanlıq qatlarında işartı olsun"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU böyütməsini sazlayın"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW overlay deaktiv edin"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Həmişə ekran kompozisiyası üçün GPU istifadə edin"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Rəng sahəsini simulyasiya edin"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Demo rejimində sıfırlamaq üçün parol daxil edin"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Növbəti"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Parol tələb olunur"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktiv daxiletmə üsulları"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Sistem dillərini istifadə edin"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
index 4498939..3e85c0c 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Prikaži oblasti preklapanja"</item>
<item msgid="2290859360633824369">"Prikaži oblasti za deuteranomaliju"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standardno ograničenje"</item>
<item msgid="4071574792028999443">"Bez pozadinskih procesa"</item>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 0aa9524..5f370e9 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Sačuvano"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Onemogućeno"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP konfiguracija je otkazala"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi veza je otkazala"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problem sa potvrdom autentičnosti"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Nije u opsegu"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Prikaži ažuriranja hardverskih slojeva"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardverski slojevi trepere zeleno kada se ažuriraju"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Otkloni greške GPU preklapanja"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Onemog. HW post. elemente"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Uvek koristi GPU za komponovanje ekrana"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simuliraj prostor boje"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Unesite lozinku da biste obavili resetovanje na fabrička podešavanja u režimu demonstracije"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Dalje"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Potrebna je lozinka"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Metode aktivnog unosa"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Koristi jezike sistema"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-be/arrays.xml b/packages/SettingsLib/res/values-be/arrays.xml
index b2031cb..dae74b2 100644
--- a/packages/SettingsLib/res/values-be/arrays.xml
+++ b/packages/SettingsLib/res/values-be/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Паказаць вобласці з перабольшваннем"</item>
<item msgid="2290859360633824369">"Паказаць вобласці для дэйтэранамаліі"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Стандартны ліміт"</item>
<item msgid="4071574792028999443">"Няма фонавых працэсаў"</item>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 876f125..b0bc57c 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Захавана"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Адключана"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Збой канфігурацыі IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Збой падлучэння Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Праблема аўтэнтыфікацыі"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Не ў зоне дасягальнасці"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Паказаць абнаўленнi апаратнага пласта"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Апаратныя пласты набываюць зялёны колер, калi абнаўляюцца"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Адладка перамалёўкі GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Адкл. апаратн. накладання"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Заўсёды выкарыстоўваць GPU для экраннай кампаноўкі"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Сімуляцыя каляр. прасторы"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Каб выканаць скід да заводскіх налад у дэманстрацыйным рэжыме, увядзіце пароль"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Далей"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Патрабуецца пароль"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Актыўныя метады ўводу"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Выкарыстоўваць мовы сістэмы"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml
index 9bc32a3..177776d 100644
--- a/packages/SettingsLib/res/values-bg/arrays.xml
+++ b/packages/SettingsLib/res/values-bg/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Области за преизчертаване: Показв."</item>
<item msgid="2290859360633824369">"Показване на областите за деутеранопия"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Стандартно ограничение"</item>
<item msgid="4071574792028999443">"Няма процеси на заден план"</item>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 351b489..8d520f3 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Запазено"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Деактивирани"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Неуспешно конфигуриране на IP адреса"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Неуспешна връзка с Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Проблем при удостоверяването"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Извън обхват"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Актуал. на слоевете на хардуера"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Примигв. на слоевете на хардуера в зелено при актуал."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Отстран. на проблеми с преизчертаване от GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Хардуерни наслагв.: Деактив."</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Винаги да се използва GPU за изграждане на екрана"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Цвет. простр.: Симулиране"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Въведете парола за възст. на фабр. настройки в демонстр. режим"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Напред"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Изисква се парола"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Активни методи за въвеждане"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Използване на системните езици"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bn/arrays.xml b/packages/SettingsLib/res/values-bn/arrays.xml
index b40bfd4..eed0f42 100644
--- a/packages/SettingsLib/res/values-bn/arrays.xml
+++ b/packages/SettingsLib/res/values-bn/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"অতিবর্ণনা এলাকা দেখান"</item>
<item msgid="2290859360633824369">"বর্ণান্ধতার জন্য এলাকা দেখান"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"মানক সীমা"</item>
<item msgid="4071574792028999443">"কোন ব্যাকগ্রাউন্ড প্রক্রিয়া নেই"</item>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 08f7227..534ea2d 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"সংরক্ষিত"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"অক্ষম হয়েছে"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP কনফিগারেশনের ব্যর্থতা"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi সংযোগের ব্যর্থতা"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"প্রমাণীকরণ সমস্যা"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"পরিসরের মধ্যে নয়"</string>
@@ -124,8 +126,8 @@
<string name="tts_engine_settings_button" msgid="1030512042040722285">"ইঞ্জিন সেটিংস লঞ্চ করুন"</string>
<string name="tts_engine_preference_section_title" msgid="448294500990971413">"পছন্দের ইঞ্জিন"</string>
<string name="tts_general_section_title" msgid="4402572014604490502">"সাধারণ"</string>
- <string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"ভাষ্য়ের শব্দ মাত্রাকে পুনরায় সেট করুন"</string>
- <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"ডিফল্ট হিসাবে যে মাত্রায় পাঠ্য উচ্চারিত হয়, সেই শব্দ মাত্রাকে পুনরায় সেট করুন৷"</string>
+ <string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"ভাষ্য়ের শব্দ মাত্রাকে আবার সেট করুন"</string>
+ <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"ডিফল্ট হিসাবে যে মাত্রায় পাঠ্য উচ্চারিত হয়, সেই শব্দ মাত্রাকে আবার সেট করুন৷"</string>
<string-array name="tts_rate_entries">
<item msgid="6695494874362656215">"অত্যন্ত ধীরে"</item>
<item msgid="4795095314303559268">"ধীর"</item>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"হার্ডওয়্যার স্তর আপডেটগুলি প্রদর্শন করুন"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"যখন হার্ডওয়্যার স্তরগুলি আপডেট হয় তখন সেগুলিকে সবুজ রঙে ফ্ল্যাশ করুন"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"ডিবাগ GPU ওভারড্র"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW আচ্ছাদনগুলি অক্ষম করুন"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"সর্বদা স্ক্রীন কম্পোসিটিংয়ের জন্য GPU ব্যবহার করুন"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"রঙ স্থান নকল করুন"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"ডেমো মোডে ফ্যাক্টরি রিসেট করতে পাসওয়ার্ড দিন"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"পরবর্তী"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"পাসওয়ার্ড আবশ্যক"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"সক্রিয় ইনপুট পদ্ধতিগুলি"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"সিস্টেমের ভাষাগুলি ব্যবহার করুন"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bs/arrays.xml b/packages/SettingsLib/res/values-bs/arrays.xml
index 1c3d3bf..99c4034 100644
--- a/packages/SettingsLib/res/values-bs/arrays.xml
+++ b/packages/SettingsLib/res/values-bs/arrays.xml
@@ -144,7 +144,7 @@
</string-array>
<string-array name="select_logpersist_titles">
<item msgid="1744840221860799971">"Isključeno"</item>
- <item msgid="3054662377365844197">"Svi"</item>
+ <item msgid="3054662377365844197">"Sve"</item>
<item msgid="688870735111627832">"Svi osim radija"</item>
<item msgid="2850427388488887328">"samo kernel"</item>
</string-array>
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Prikaži overdraw područja"</item>
<item msgid="2290859360633824369">"Prikaži područja za Deuteranomaly"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standardno ograničenje"</item>
<item msgid="4071574792028999443">"Nema pozadinskih procesa"</item>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index aaf9713..c4c558e 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Sačuvano"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Onemogućeno"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Greška u konfiguraciji IP-a"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Greška pri povezivanju na Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problem pri provjeri vjerodostojnosti."</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Nije u dometu"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Prikaži dodatne informacije za ažuriranja za hardver"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Trepći hardverske slojeve zeleno kada se ažuriraju"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Otkl. GPU overdraw greške"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Onemog. HW preklapanja"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Uvijek koristi GPU za kompoziciju ekrana"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simuliraj prostor boje"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Unesite lozinku da izvršite vraćanje na fabričke postavke u načinu demonstracije"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Naprijed"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Potrebna je lozinka"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktivne metode unosa"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Koristi jezik sistema"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml
index 1627ea6..d3d1056 100644
--- a/packages/SettingsLib/res/values-ca/arrays.xml
+++ b/packages/SettingsLib/res/values-ca/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Mostra les àrees superposades"</item>
<item msgid="2290859360633824369">"Mostra les àrees amb deuteranomalia"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Límit estàndard"</item>
<item msgid="4071574792028999443">"Sense processos en segon pla"</item>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 391782b..a3547cc 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Desat"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Desactivat"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Error de configuració d\'IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Error de connexió Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problema d\'autenticació"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Fora de l\'abast"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Mostra actualitzacions capes"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Il·lumina capes de maquinari en verd en actualitzar-se"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depura superposició de GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Desactiva superposicions HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Utilitza sempre GPU per combinar pantalles"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simula l\'espai de color"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Introdueix la contrasenya per restablir les dades de fàbrica en mode de demostració"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Següent"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Contrasenya obligatòria"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Mètodes d\'introducció actius"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Utilitza els idiomes del sistema"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml
index b56fadc..9d62c8f 100644
--- a/packages/SettingsLib/res/values-cs/arrays.xml
+++ b/packages/SettingsLib/res/values-cs/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Zobrazit překreslované oblasti"</item>
<item msgid="2290859360633824369">"Zobrazit oblasti pro deuteranomálii"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standardní limit"</item>
<item msgid="4071574792028999443">"Procesy na pozadí deaktivovány"</item>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index dc5b36a..bfa551b 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Uloženo"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Vypnuto"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Selhání konfigurace protokolu IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Selhání připojení Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problém s ověřením"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Mimo dosah"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Zobrazit aktual. HW vrstev"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Rozblikat zeleně hardwarové vrstvy při aktualizaci"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Ladit překreslování GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Zakázat hardwarové vrstvy"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Vždy použít GPU ke skládání obrazovky"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simulovat barevný prostor"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Chcete-li v ukázkovém režimu obnovit zařízení do továrního nastavení, zadejte heslo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Další"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Je třeba zadat heslo"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktivní metody zadávání"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Použít systémové jazyky"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml
index a35f1bb..23ebdc9 100644
--- a/packages/SettingsLib/res/values-da/arrays.xml
+++ b/packages/SettingsLib/res/values-da/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Vis områder med overlap"</item>
<item msgid="2290859360633824369">"Vis områder for deuteranomali"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standardgrænse"</item>
<item msgid="4071574792028999443">"Ingen baggrundsprocesser"</item>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 8071c83..48dfeee 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Gemt"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Deaktiveret"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP-konfigurationsfejl"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi-forbindelsesfejl"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problem med godkendelse"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Ikke inden for rækkevidde"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Se opdat. af hardwarelag"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardwarelag blinker grønt, når de opdateres"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Ret GPU-overlapsfejl"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Deaktiver HW-overlejring"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Brug altid GPU til skærmsammensætning"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simuler farverum"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Angiv adgangskode for at gendanne fabriksdata i demotilstand"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Næste"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Angiv en adgangskode"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktive inputmetoder"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Brug systemsprogene"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml
index 6e580d2..2727874 100644
--- a/packages/SettingsLib/res/values-de/arrays.xml
+++ b/packages/SettingsLib/res/values-de/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Überschneidungsbereiche anzeigen"</item>
<item msgid="2290859360633824369">"Bereiche für Deuteranomalie anzeigen"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standardlimit"</item>
<item msgid="4071574792028999443">"Keine Hintergrundprozesse"</item>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 8dd4c1db..97a1cda 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Gespeichert"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Deaktiviert"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP-Konfigurationsfehler"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WLAN-Verbindungsfehler"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Authentifizierungsproblem"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Nicht in Reichweite"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Hardwareebenen-Updates"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardwareebenen blinken beim Aktualisieren grün"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debugging – GPU-Überschneidung"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW-Overlays deaktivieren"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"GPU immer für Bildschirmaufbau verwenden"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Farbraum simulieren"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Passwort eingeben, um Gerät im Demomodus auf Werkseinstellungen zurückzusetzen"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Weiter"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Passwort erforderlich"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktive Eingabemethoden"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Systemsprache verwenden"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml
index 2b69f12..7cfdbed 100644
--- a/packages/SettingsLib/res/values-el/arrays.xml
+++ b/packages/SettingsLib/res/values-el/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Εμφάνιση περιοχών υπέρβασης"</item>
<item msgid="2290859360633824369">"Εμφάνιση περιοχών για Deuteranomaly"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Τυπικό όριο"</item>
<item msgid="4071574792028999443">"Δεν υπάρχουν διεργασίες παρασκηνίου"</item>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 1ee6db8..fb595b9 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Αποθηκευμένο"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Απενεργοποιημένο"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Αποτυχία διαμόρφωσης διεύθυνσης IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Αποτυχία σύνδεσης Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Πρόβλημα ελέγχου ταυτότητας"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Εκτός εμβέλειας"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Εμφ. ενημ. επιπ. υλικού"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Επισήμ. επιπέδων υλικού με πράσινο κατά την ενημ."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Κατάρ.σφαλμ.υπέρβ.GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Απενεργ. επικαλύψεων HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Να γίνεται πάντα χρήση του GPU για σύνθεση οθόνης"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Προσομοίωση χρωματικού χώρου"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Εισαγάγετε κωδικό πρόσβασης για επαναφορά εργοστασιακών ρυθμίσεων στη λειτουργία επίδειξης"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Επόμενο"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Απαιτείται κωδικός πρόσβασης"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Ενεργές μέθοδοι εισαγωγής"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Χρήση γλωσσών συστήματος"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rAU/arrays.xml b/packages/SettingsLib/res/values-en-rAU/arrays.xml
index ef4975c..3b1dec7 100644
--- a/packages/SettingsLib/res/values-en-rAU/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rAU/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Show overdraw areas"</item>
<item msgid="2290859360633824369">"Show areas for Deuteranomaly"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standard limit"</item>
<item msgid="4071574792028999443">"No background processes"</item>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 1f641d5..95ae803 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Saved"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Disabled"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP Configuration Failure"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi Connection Failure"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Authentication problem"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Not in range"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Show hardware layers updates"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Flash hardware layers green when they update"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debug GPU overdraw"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Disable HW overlays"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Always use GPU for screen compositing"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simulate colour space"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Enter password to perform factory reset in demo mode"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Next"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Password required"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Active input methods"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Use system languages"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rGB/arrays.xml b/packages/SettingsLib/res/values-en-rGB/arrays.xml
index ef4975c..3b1dec7 100644
--- a/packages/SettingsLib/res/values-en-rGB/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rGB/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Show overdraw areas"</item>
<item msgid="2290859360633824369">"Show areas for Deuteranomaly"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standard limit"</item>
<item msgid="4071574792028999443">"No background processes"</item>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 1f641d5..95ae803 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Saved"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Disabled"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP Configuration Failure"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi Connection Failure"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Authentication problem"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Not in range"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Show hardware layers updates"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Flash hardware layers green when they update"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debug GPU overdraw"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Disable HW overlays"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Always use GPU for screen compositing"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simulate colour space"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Enter password to perform factory reset in demo mode"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Next"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Password required"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Active input methods"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Use system languages"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rIN/arrays.xml b/packages/SettingsLib/res/values-en-rIN/arrays.xml
index ef4975c..3b1dec7 100644
--- a/packages/SettingsLib/res/values-en-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rIN/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Show overdraw areas"</item>
<item msgid="2290859360633824369">"Show areas for Deuteranomaly"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standard limit"</item>
<item msgid="4071574792028999443">"No background processes"</item>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 1f641d5..95ae803 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Saved"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Disabled"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP Configuration Failure"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi Connection Failure"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Authentication problem"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Not in range"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Show hardware layers updates"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Flash hardware layers green when they update"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debug GPU overdraw"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Disable HW overlays"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Always use GPU for screen compositing"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simulate colour space"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Enter password to perform factory reset in demo mode"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Next"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Password required"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Active input methods"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Use system languages"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml
index f5f67fb..e3b54a6 100644
--- a/packages/SettingsLib/res/values-es-rUS/arrays.xml
+++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Mostrar áreas superpuestas"</item>
<item msgid="2290859360633824369">"Mostrar áreas para deuteranomalía"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Límite estándar"</item>
<item msgid="4071574792028999443">"Sin procesos en 2.º plano"</item>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 25ee5a8..5ede3d2 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Guardada"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Inhabilitada"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Error de configuración IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Error de conexión Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problema de autenticación"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Fuera de alcance"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ver actualiz. de capas de hardware"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Luz verde en capas de hardware al actualizarse"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depurar superpos. de GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Desactivar superpos. HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Usar GPU para combinar pantallas"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simular espacio de color"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Ingresa contraseña y restablece en demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Siguiente"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Contraseña obligatoria"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Métodos de entrada activos"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Usar idiomas del sistema"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml
index d5155c9..8323e27 100644
--- a/packages/SettingsLib/res/values-es/arrays.xml
+++ b/packages/SettingsLib/res/values-es/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Mostrar áreas sobredibujadas"</item>
<item msgid="2290859360633824369">"Mostrar áreas para deuteranomalía"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Límite estándar"</item>
<item msgid="4071574792028999443">"Sin procesos en segundo plano"</item>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 9d98096..ce44123 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Guardado"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Inhabilitado"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Error de configuración de IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Error de conexión Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Error de autenticación"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Fuera de rango"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ver actualizaciones capas HW"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Iluminar capas de hardware en verde al actualizarse"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depurar sobredibujos de GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Inhabilitar superposiciones HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Usar siempre la GPU para combinar pantallas"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simular espacio de color"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Escribe una contraseña para restablecer datos de fábrica en modo demostración"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Siguiente"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Contraseña obligatoria"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Métodos de introducción activos"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Usar idiomas del sistema"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-et/arrays.xml b/packages/SettingsLib/res/values-et/arrays.xml
index 07fe687..408c4b8 100644
--- a/packages/SettingsLib/res/values-et/arrays.xml
+++ b/packages/SettingsLib/res/values-et/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Kuva ülejoonistatud alad"</item>
<item msgid="2290859360633824369">"Deuteranomaly jaoks alade kuvamine"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standardpiir"</item>
<item msgid="4071574792028999443">"Taustaprotsessideta"</item>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 507bd20..13d5d61 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Salvestatud"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Keelatud"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP seadistamise ebaõnnestumine"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi-ühenduse viga"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Autentimise probleem"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Pole vahemikus"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Kuva riistv. kiht. värsk."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Riistvara kihid vilguvad värskendamisel roheliselt"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Silu GPU ülejoonistust"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Keela HW ülekatted"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Kasuta alati GPU-d kuva koostamisel"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Modelleeri värviruumi"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Sisestage parool, et demorežiimis tehaseseadetele lähtestada"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Järgmine"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Parool on kohustuslik"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktiivsed sisestusmeetodid"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Süsteemi keelte kasutamine"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml
index e4bcf482..1d7e2b2 100644
--- a/packages/SettingsLib/res/values-eu/arrays.xml
+++ b/packages/SettingsLib/res/values-eu/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Erakutsi gainidatzi diren eremuak"</item>
<item msgid="2290859360633824369">"Erakutsi daltonismorako eremuak"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Muga estandarra"</item>
<item msgid="4071574792028999443">"Ez dago atzeko planoko prozesurik"</item>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index d8b2496..9f592a7 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Gordeta"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Desgaituta"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Ezin izan da konfiguratu IP helbidea"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Ezin izan da konektatu Wi-Fi sarera"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Autentifikazio-arazoa"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Urrunegi"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Hardware-geruzen eguneratzeak"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Eguneratu bitartean, hardware-geruzak berdez"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Araztu GPU gainidazketa"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Desgaitu HW gainjartzeak"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Erabili beti GPU pantaila-muntaietarako"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simulatu kolore-espazioa"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Idatzi pasahitza jatorrizko ezarpenak demo moduan berrezartzeko"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Hurrengoa"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Pasahitza behar da"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Idazketa-metodo aktiboak"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Erabili sistemaren hizkuntzak"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml
index 3c08671..ac511a0 100644
--- a/packages/SettingsLib/res/values-fa/arrays.xml
+++ b/packages/SettingsLib/res/values-fa/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"نمایش نواحی بازنویسی"</item>
<item msgid="2290859360633824369">"نمایش مناطق برای مبتلایان به سبزدشواربینی"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"حد استاندارد"</item>
<item msgid="4071574792028999443">"بدون پردازش در پسزمینه"</item>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index e529ac7..8e548cc 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"ذخیرهشده"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"غیرفعال شد"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"پیکربندی IP انجام نشد"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"اتصال Wi-Fi برقرار نشد"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"مشکل احراز هویت"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"در محدوده نیست"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"نمایش بهروزرسانیهای لایههای سختافزار"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"وقتی لایههای سختافزاری بهروزرسانی میشوند، به رنگ سبز درآیند"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"اشکالزدایی بازنویسی GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"غیر فعال کردن پوشش HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"همیشه از GPU در ترکیب صفحه استفاده شود"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"شبیهسازی فضای رنگ"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"برای انجام بازنشانی کارخانهای در حالت نمایشی، گذرواژه را وارد کنید"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"بعدی"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"وارد کردن گذرواژه الزامی است"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"روشهای ورودی فعال"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"استفاده از زبانهای سیستم"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml
index 00d967e..9daf237 100644
--- a/packages/SettingsLib/res/values-fi/arrays.xml
+++ b/packages/SettingsLib/res/values-fi/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Näytä päällekkäiset alueet"</item>
<item msgid="2290859360633824369">"Näytä alueet puna-vihersokeille näkyvinä"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Vakioraja"</item>
<item msgid="4071574792028999443">"Ei taustaprosesseja"</item>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 0c28710..986a7db 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Tallennettu"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Pois käytöstä"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP-kokoonpanovirhe"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi-yhteysvirhe"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Todennusvirhe"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Ei kantoalueella"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Näytä laitt.tason päiv."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Näytä laitteistotasot vihreinä niiden päivittyessä"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU-objektien päällekkäisyys"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Poista HW-peittok. käyt."</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Käytä GPU:ta näytön koostamiseen"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simuloi väriavaruus"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Palauta tehdasasetukset antamalla salasana"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Seuraava"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Salasana vaaditaan"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktiiviset syöttötavat"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Käytä järjestelmän kieliä"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
index 19f3c83..f7c2541 100644
--- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Afficher les zones de conflit"</item>
<item msgid="2290859360633824369">"Afficher les zones de deutéranomalie"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Limite standard"</item>
<item msgid="4071574792028999443">"Aucun processus en arrière-plan"</item>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index ca8f462..0f76e35 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Enregistré"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Désactivés"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Échec de configuration de l\'adresse IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Échec de connexion Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problème d\'authentification"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Hors de portée"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Mises à jour couches mat."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Couches matérielles en vert une fois mises à jour"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Déboguer les conflits GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Désact. superpos. matér."</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Toujours utiliser le GPU pour la composition écran"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simuler esp. colorimétrique"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Entrez m. passe pour réinit. en mode démo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Suivant"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Mot de passe obligatoire"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Modes de saisie actifs"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Utiliser les langues du système"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml
index e020328..088e20d 100644
--- a/packages/SettingsLib/res/values-fr/arrays.xml
+++ b/packages/SettingsLib/res/values-fr/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Afficher les zones de conflit"</item>
<item msgid="2290859360633824369">"Afficher couleurs de zones adaptées à deutéranomalie"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Limite standard"</item>
<item msgid="4071574792028999443">"Aucun processus en arrière-plan"</item>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 05c9e93..1492210 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Enregistré"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Désactivé"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Échec de configuration de l\'adresse IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Échec de la connexion Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problème d\'authentification."</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Hors de portée"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Mises à jour couches matérielles"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Couches matérielles en vert une fois mises à jour"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Déboguer les conflits GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Désactiver superpos. matér."</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Toujours utiliser le GPU pour la composition écran"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simuler espace colori."</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Saisir mot de passe pour rétablir conf. d\'usine en mode démo."</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Suivant"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Veuillez saisir le mot de passe"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Modes de saisie actifs"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Utiliser les langues du système"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-gl/arrays.xml b/packages/SettingsLib/res/values-gl/arrays.xml
index c909271..a1538a1 100644
--- a/packages/SettingsLib/res/values-gl/arrays.xml
+++ b/packages/SettingsLib/res/values-gl/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Mostrar áreas superpostas"</item>
<item msgid="2290859360633824369">"Mostrar áreas de deuteranomalía"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Límite estándar"</item>
<item msgid="4071574792028999443">"Ningún proceso en segundo plano"</item>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 5de9407..dc578b8 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Gardada"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Desactivadas"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Erro na configuración de IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Erro na conexión wifi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problema de autenticación"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Non está dentro da zona de cobertura"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ver actualizacións capas"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Iluminar capas hardware en verde ao actualizarse"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depurar superposición GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Desact. superposicións HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Utilizar sempre GPU para a composición da pantalla"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simular o espazo da cor"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Insire contrasinal para restablec. en demostración"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Seguinte"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"O contrasinal é obrigatorio"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Métodos de entrada activos"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Usar idiomas do sistema"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-gu/arrays.xml b/packages/SettingsLib/res/values-gu/arrays.xml
index 6eb4321..8b4d844 100644
--- a/packages/SettingsLib/res/values-gu/arrays.xml
+++ b/packages/SettingsLib/res/values-gu/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"ઓવરડ્રો ક્ષેત્રો બતાવો"</item>
<item msgid="2290859360633824369">"Deuteranomaly માટેના ક્ષેત્રો બતાવો"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"માનક સીમા"</item>
<item msgid="4071574792028999443">"કોઈ પૃષ્ઠભૂમિ પ્રક્રિયાઓ નથી"</item>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 2697419..a6edd8a 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"સાચવેલા"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"અક્ષમ કર્યો"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP કન્ફિગરેશન નિષ્ફળ"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi કનેક્શન નિષ્ફળ"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"પ્રમાણીકરણ સમસ્યા"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"રેન્જમાં નથી"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"હાર્ડવેર સ્તરોનાં અપડેટ્સ બતાવો"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"હાર્ડવેર સ્તરો અપડેટ થાય ત્યારે તેને લીલા રંગથી પ્રકાશિત કરો"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ઓવરડ્રો ડીબગ કરો"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW ઓવરલે અક્ષમ કરો"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"સ્ક્રીન જોડવા માટે હંમેશાં GPU નો ઉપયોગ કરો"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"રંગ સ્થાનનું અનુકરણ કરો"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"ડેમો મોડમાં ફેક્ટરી રીસેટ પાસવર્ડ દાખલ કરો"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"આગલું"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"પાસવર્ડ આવશ્યક છે"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"ઇનપુટ પદ્ધતિઓ સક્રિય કરો"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"સિસ્ટમ ભાષાઓનો ઉપયોગ કરો"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml
index d0c12c8..0543102 100644
--- a/packages/SettingsLib/res/values-hi/arrays.xml
+++ b/packages/SettingsLib/res/values-hi/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"ओवरड्रॉ क्षेत्रों को दिखाएं"</item>
<item msgid="2290859360633824369">"हरा रंग पहचानने में कमी के क्षेत्र दिखाएं"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"मानक सीमा"</item>
<item msgid="4071574792028999443">"कोई पृष्ठभूमि प्रक्रियाएं नहीं"</item>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index f0cb2e3..46fd1ee 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"सहेजा गया"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"अक्षम"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP कॉन्फ़िगरेशन की विफलता"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"वाईफ़ाई कनेक्शन विफलता"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"प्रमाणीकरण समस्या"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"रेंज में नहीं"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"हार्डवेयर लेयर की नई जानकारी"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"हार्डवेयर लेयर की नई जानकारी मिलने पर हरा फ़्लैश होता है"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ओवरड्रॉ डीबग करें"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW ओवरले अक्षम करें"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"स्क्रीन संयोजन के लिए हमेशा GPU का उपयोग करें"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"रंग स्पेस सिम्युलेट करें"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"डेमो मोड में फ़ैक्टरी रीसेट के लिए पासवर्ड डालें"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"आगे"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"पासवर्ड आवश्यक"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"टाइप करने की सक्रीय पद्धतियां"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"सिस्टम की भाषाओं का उपयोग करें"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml
index 9224adf..92905761 100644
--- a/packages/SettingsLib/res/values-hr/arrays.xml
+++ b/packages/SettingsLib/res/values-hr/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Pokaži područja slojnih iscrtavanja"</item>
<item msgid="2290859360633824369">"Prikaži područja za deuteranomaliju"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standardna ograničenje"</item>
<item msgid="4071574792028999443">"Nema pozadinskih procesa"</item>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 8313ca1..effa5dd 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Spremljeno"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Onemogućeno"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Konfiguracija IP-a nije uspjela"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Povezivanje s Wi-Fi-jem nije uspjelo"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problem u autentifikaciji"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Nije u rasponu"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Prikaži ažuriranja hardverskih slojeva"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardverski slojevi bljeskaju zeleno pri ažuriranju."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Rješavanje GPU preklapanja"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Onemogući dijeljenje mem."</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Uvijek koristi GPU za slaganje zaslona"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simuliraj prostor boja"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Unesite zaporku za resetiranje u demo načinu"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Dalje"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Potrebna je zaporka"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktivni načini unosa"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Upotrijebi jezike sustava"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml
index db5aae8..554e421 100644
--- a/packages/SettingsLib/res/values-hu/arrays.xml
+++ b/packages/SettingsLib/res/values-hu/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Tartalom-felülírási területek mutatása"</item>
<item msgid="2290859360633824369">"A deuteranomália területeinek megjelenítése"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Normál korlátozás"</item>
<item msgid="4071574792028999443">"Nincsenek háttérfolyamatok"</item>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 15417d6..ead7c65 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Mentve"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Letiltva"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP-konfigurációs hiba"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi-kapcsolati hiba"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Azonosítási probléma"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Hatókörön kívül"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Hardverréteg-frissítések"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Frissítéskor a hardverrétegek zölden villognak"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU tartalom-felülírási hibakeresés"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW fedvények letiltása"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Mindig a GPU használata képernyő-feldolgozáshoz"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Színtérszimuláció"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Írja be a jelszót a visszaállításhoz"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Következő"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Jelszó szükséges"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktív beviteli módok"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Rendszernyelvek használata"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hy/arrays.xml b/packages/SettingsLib/res/values-hy/arrays.xml
index 8925f32..03451b8 100644
--- a/packages/SettingsLib/res/values-hy/arrays.xml
+++ b/packages/SettingsLib/res/values-hy/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Ցույց տալ գերազանցված հատվածները"</item>
<item msgid="2290859360633824369">"Ցույց տալ դալտոնիզմի ոլորտները"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Սովորական սահման"</item>
<item msgid="4071574792028999443">"Հետնաշերտում գործողություններ չկան"</item>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index c75220f..340bdfd 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Պահված է"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Անջատված"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP կարգավորման ձախողում"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi կապի ձախողում"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Նույնականացման խնդիր"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Ընդգրկույթից դուրս է"</string>
@@ -124,8 +126,8 @@
<string name="tts_engine_settings_button" msgid="1030512042040722285">"Գործարկման շարժիչի կարգավորումներ"</string>
<string name="tts_engine_preference_section_title" msgid="448294500990971413">"Նախընտրած շարժիչը"</string>
<string name="tts_general_section_title" msgid="4402572014604490502">"Ընդհանուր"</string>
- <string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"Վերակայել արտասանման ձայնի բարձրությունը"</string>
- <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"Տեքստի արտասանման ձայնի բարձրությունը վերադարձնել կանխադրված արժեքի:"</string>
+ <string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"Վերակայել արտասանման ձայնի ուժգնությունը"</string>
+ <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"Տեքստի արտասանման ձայնի ուժգնությունը վերադարձնել կանխադրված արժեքի:"</string>
<string-array name="tts_rate_entries">
<item msgid="6695494874362656215">"Շատ դանդաղ"</item>
<item msgid="4795095314303559268">"Դանդաղ"</item>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ցույց տալ սարքաշարի ծածկույթի թարմացումները"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Թող սարքաշարի ծածկույթները կանաչ գույնով առկայծեն, երբ թարմացվեն"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Վրիպազերծել GPU գերազանցումները"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Կասեցնել HW վերադրումները"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Միշտ օգտագործել GPU-ն` էկրանի կազմման համար"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Նմանակել գունատարածքը"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Մուտքագրեք գաղտնաբառը՝ ցուցադրական ռեժիմում գործարանային վերակայում կատարելու համար"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Հաջորդը"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Պահանջվում է գաղտնաբառ"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Մուտքագրման ակտիվ տարբերակներ"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Օգտագործել համակարգի լեզուները"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml
index fae09d0..a401e62 100644
--- a/packages/SettingsLib/res/values-in/arrays.xml
+++ b/packages/SettingsLib/res/values-in/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Tampilkan area overdraw"</item>
<item msgid="2290859360633824369">"Tampilkan area untuk Buta Warna"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Batas standar"</item>
<item msgid="4071574792028999443">"Tanpa proses latar belakang"</item>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 186b79c..38ccbfc 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Disimpan"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Nonaktif"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Kegagalan Konfigurasi IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Kegagalan Sambungan Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Masalah autentikasi"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Tidak dalam jangkauan"</string>
@@ -87,11 +89,11 @@
<string name="process_kernel_label" msgid="3916858646836739323">"OS Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Aplikasi dihapus"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Aplikasi dan pengguna yang dihapus"</string>
- <string name="tether_settings_title_usb" msgid="6688416425801386511">"Penambatan USB"</string>
+ <string name="tether_settings_title_usb" msgid="6688416425801386511">"Tethering USB"</string>
<string name="tether_settings_title_wifi" msgid="3277144155960302049">"Hotspot portabel"</string>
- <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Penambatan bluetooth"</string>
+ <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Tethering bluetooth"</string>
<string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Menambatkan"</string>
- <string name="tether_settings_title_all" msgid="8356136101061143841">"Menambatkan & hotspot portabel"</string>
+ <string name="tether_settings_title_all" msgid="8356136101061143841">"Tethering & hotspot portabel"</string>
<string name="managed_user_title" msgid="8109605045406748842">"Semua aplikasi kerja"</string>
<string name="user_guest" msgid="8475274842845401871">"Tamu"</string>
<string name="unknown" msgid="1592123443519355854">"Tidak diketahui"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Tunjukkan pembaruan lapisan hardware"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Lapisan hardware berkedip hijau saat memperbarui"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debug overdraw oleh GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Nonaktifkan lapisan HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Selalu gunakan GPU untuk pengomposisian layar"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simulasikan ruang warna"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Masukkan sandi untuk mengembalikan ke setelan pabrik dalam mode demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Berikutnya"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Perlu sandi"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Metode masukan aktif"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Gunakan bahasa sistem"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-is/arrays.xml b/packages/SettingsLib/res/values-is/arrays.xml
index 7062632..d7775b5 100644
--- a/packages/SettingsLib/res/values-is/arrays.xml
+++ b/packages/SettingsLib/res/values-is/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Sýna yfirteiknuð svæði"</item>
<item msgid="2290859360633824369">"Sýna svæði fyrir litblinda"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Venjulegt hámark"</item>
<item msgid="4071574792028999443">"Engar bakgrunnsvinnslur"</item>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 844a3b4..9ee8437 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Vistað"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Óvirkt"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP-stillingarvilla"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi-tengingarvilla"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Vandamál við auðkenningu"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Ekkert samband"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Sýna uppfærslur vélbúnaðar"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Láta vélbúnaðarlög blikka græn við uppfærslu"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Yfirteiknun skjákorts"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Slökkva á vélb.yfirlögnum"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Nota alltaf skjákort við samsetningu skjámyndar"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Herma eftir litasviði"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Sláðu inn aðgangsorð til að framkvæma núllstillingu í sýnisútgáfu"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Áfram"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Aðgangsorðs krafist"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Virkar innsláttaraðferðir"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Nota kerfistungumál"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml
index 85904b5..b8437fb 100644
--- a/packages/SettingsLib/res/values-it/arrays.xml
+++ b/packages/SettingsLib/res/values-it/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Mostra aree overdraw"</item>
<item msgid="2290859360633824369">"Mostra aree con deuteranomalia"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Limite standard"</item>
<item msgid="4071574792028999443">"Nessun processo in background"</item>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 7e3fd48..a25ac44 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Salvata"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Disattivata"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Errore configurazione IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Errore connessione Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problema di autenticazione"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Fuori portata"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Aggiornam. livelli hardware"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Lampeggia verde se aggiornam. livelli hardware"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debug overdraw GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Disabilita overlay HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Usa sempre GPU per la composizione dello schermo"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simula spazio colore"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Inserisci la password per eseguire il ripristino dei dati di fabbrica in modalità demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Avanti"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Password obbligatoria"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Metodi di immissione attivi"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Utilizza le lingue di sistema"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml
index 2cf333f..cdc26c9 100644
--- a/packages/SettingsLib/res/values-iw/arrays.xml
+++ b/packages/SettingsLib/res/values-iw/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"הצגת אזורים עם חריגה"</item>
<item msgid="2290859360633824369">"הצגת אזורים לעיוורון צבעים"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"הגבלה סטנדרטית"</item>
<item msgid="4071574792028999443">"אין תהליכים ברקע"</item>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 3e1bfdb..c44ce2d 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"נשמר"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"מושבת"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"כשל בתצורת IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"כשל בחיבור Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"בעיית אימות"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"מחוץ לטווח"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"הצג עדכוני שכבות חומרה"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"הצג הבהוב ירוק לשכבות חומרה כשהן מתעדכנות"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"חריגה בניפוי באגים ב-GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"השבת שכבות על של HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"השתמש תמיד ב-GPU להרכבת מסך"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"צור הדמיה של מרחב צבעים"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"הזן סיסמה כדי לבצע איפוס להגדרות היצרן במצב הדגמה"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"הבא"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"דרושה סיסמה"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"שיטות קלט פעילות"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"שימוש בשפות מערכת"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml
index 748bbab..06bd00c 100644
--- a/packages/SettingsLib/res/values-ja/arrays.xml
+++ b/packages/SettingsLib/res/values-ja/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"オーバードロー領域の表示"</item>
<item msgid="2290859360633824369">"第二色弱の方向けの領域の表示"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"標準の上限"</item>
<item msgid="4071574792028999443">"バックグラウンドプロセスを使用しない"</item>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 06602e3..e9cb132 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"保存済み"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"無効"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP設定エラー"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi接続エラー"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"認証に問題"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"圏外"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ハードウェア層情報を表示"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ハードウェア層が更新されると緑を表示する"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPUオーバードローをデバッグ"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HWオーバーレイを無効"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"画面合成に常にGPUを使用する"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"色空間シミュレート"</string>
@@ -358,4 +362,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"デモモードで初期状態にリセットするには、パスワードを入力してください"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"次へ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"パスワード必須"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"有効な入力方法"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"システム言語を使用"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ka/arrays.xml b/packages/SettingsLib/res/values-ka/arrays.xml
index a630af2..ef45f791 100644
--- a/packages/SettingsLib/res/values-ka/arrays.xml
+++ b/packages/SettingsLib/res/values-ka/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"overdraw არეების ჩვენება"</item>
<item msgid="2290859360633824369">"დეუტერანომალიის არეების ჩვენება"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"სტანდარტული ლიმიტი"</item>
<item msgid="4071574792028999443">"ფონური პროცესები არ არის"</item>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 6838fbc..c392e35 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"დამახსოვრებულია"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"გამორთულია"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP კონფიგურაციის შეფერხება"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi კავშირის შეფერხება"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"ავთენტიკაციის პრობლემა"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"არ არის დიაპაზონში"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"აპარატურის დონეების განახლებების ჩვენება"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"განახლებისას სააპარატო დონეების მწვანით მონიშვნა"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU overdraw-ს გამართვა"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW გადაფარვის გამორთვა"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"ეკრანის კომპოზიციისთვის ყოველთვის გამოიყენე GPU"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"ფერთა სივრცის სიმულაცია"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"შეიყვანეთ პაროლი დემო-რეჟიმში ქარხნულ მდგომარეობაზე დასაბრუნებლად"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"შემდეგი"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"საჭიროა პაროლი"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"შეყვანის აქტიური მეთოდები"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"სისტემის ენების გამოყენება"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-kk/arrays.xml b/packages/SettingsLib/res/values-kk/arrays.xml
index 9c6e082..29e6639 100644
--- a/packages/SettingsLib/res/values-kk/arrays.xml
+++ b/packages/SettingsLib/res/values-kk/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Үстінен бастырылған аймақтарды көрсету"</item>
<item msgid="2290859360633824369">"Дейтераномалия аймақтарын көрсету"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Стандартты шектеу"</item>
<item msgid="4071574792028999443">"Фондық үрдістер жоқ"</item>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 9372dbd..3b65eee 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Сақталды"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Өшірілген"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP конфигурациясының қатесі"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi байланысының қатесі"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Растау мәселесі"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Аумақта жоқ"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Компьютерлік жабдықтама қабаттарының жаңартулары"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Жаңартылғанда компьютерлік жабдықтама қабаттарының жасыл шамы жануы"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Үстінен бастырылғанды жөндеу"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Жабдықпен үстінен бастыруды өшіру"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Экранды жасақтау үшін әрқашан графикалық процессор қолдану қажет"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Түстер аймағына еліктеу"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Демо режимде зауыттық мәндерге қайтару үшін құпия сөзді енгізу"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Келесі"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Құпия сөз қажет"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Белсенді енгізу әдістері"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Жүйелік тілдерді пайдалану"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-km/arrays.xml b/packages/SettingsLib/res/values-km/arrays.xml
index 87009e9..49840f1 100644
--- a/packages/SettingsLib/res/values-km/arrays.xml
+++ b/packages/SettingsLib/res/values-km/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"បង្ហាញតំបន់ដែលលើស"</item>
<item msgid="2290859360633824369">"បង្ហាញតំបន់សម្រាប់ Deuteranomaly"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"ដែនកំណត់ស្តង់ដារ"</item>
<item msgid="4071574792028999443">"គ្មានដំណើរការក្នុងផ្ទៃខាងក្រោយ"</item>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 22360c7..2750408 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"បានរក្សាទុក"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"បានបិទ"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"ការកំណត់រចនាសម្ព័ន្ធ IP បរាជ័យ"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"ការភ្ជាប់ WiFi បរាជ័យ"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"បញ្ហាក្នុងការផ្ទៀងផ្ទាត់"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"នៅក្រៅតំបន់"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"បង្ហាញបច្ចុប្បន្នភាពស្រទាប់ផ្នែករឹង"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ស្រទាប់ផ្នែករឹងបញ្ចេញពន្លឺបៃតង ពេលពួកវាធ្វើបច្ចុប្បន្នភាព"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"កែកំហុសការលើស GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"បិទការត្រួត HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"ប្រើ GPU ជានិច្ចសម្រាប់ផ្សំអេក្រង់"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"ក្លែងធ្វើចន្លោះពណ៌"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"បញ្ចូលពាក្យសម្ងាត់ ដើម្បីកំណត់ឧបករណ៍ឡើងវិញដូចពេលចេញពីរោងចក្រ នៅក្នុងមុខងារសាកល្បង"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"បន្ទាប់"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"តម្រូវឲ្យមានពាក្យសម្ងាត់"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"វិធីសាស្ត្របញ្ចូលសកម្ម"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"ប្រើភាសាប្រព័ន្ធ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-kn/arrays.xml b/packages/SettingsLib/res/values-kn/arrays.xml
index c729b42..096a854 100644
--- a/packages/SettingsLib/res/values-kn/arrays.xml
+++ b/packages/SettingsLib/res/values-kn/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"ಓವರ್ಡ್ರಾ ಪ್ರದೇಶಗಳನ್ನು ತೋರಿಸು"</item>
<item msgid="2290859360633824369">"ಡ್ಯೂಟರ್ನೋಮಲಿಗಾಗಿ ಪ್ರದೇಶಗಳನ್ನು ತೋರಿಸು"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"ಪ್ರಮಾಣಿತ ಮಿತಿ"</item>
<item msgid="4071574792028999443">"ಹಿನ್ನೆಲೆ ಪ್ರಕ್ರಿಯೆಗಳು ಇಲ್ಲ"</item>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 3cf5f8e..4b4485c 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"ಉಳಿಸಲಾಗಿದೆ"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP ಕಾನ್ಫಿಗರೇಶನ್ ವಿಫಲತೆ"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi ಸಂಪರ್ಕ ವಿಫಲತೆ"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"ಪ್ರಮಾಣೀಕರಣ ಸಮಸ್ಯೆ"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"ವ್ಯಾಪ್ತಿಯಲ್ಲಿಲ್ಲ"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ಹಾರ್ಡ್ವೇರ್ ಲೇಯರ್ ಅಪ್ಡೇಟ್"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ಅವುಗಳು ನವೀಕರಿಸಿದಾಗ ಹಾರ್ಡ್ವೇರ್ ಲೇಯರ್ಗಳು ಹಸಿರು ಫ್ಲ್ಯಾಶ್ ಆಗುತ್ತದೆ"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ಓವರ್ಡ್ರಾ ಡೀಬಗ್"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW ಓವರ್ಲೇ ನಿಷ್ಕ್ರಿಯ"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"ಸ್ಕ್ರೀನ್ ಸಂಯೋಜನೆಗಾಗಿ ಯಾವಾಗಲೂ GPU ಬಳಸಿ"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"ಬಣ್ಣದ ಸ್ಥಳ ಸಿಮ್ಯುಲೇಟ್"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"ಫ್ಯಾಕ್ಟರಿ ರಿಸೆಟ್ಗೆ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ಮುಂದೆ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"ಪಾಸ್ವರ್ಡ್ ಅಗತ್ಯವಿದೆ"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"ಸಕ್ರಿಯ ಇನ್ಪುಟ್ ವಿಧಾನಗಳು"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"ಸಿಸ್ಟಂ ಭಾಷೆಗಳನ್ನು ಬಳಸಿ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml
index 460f947..c5d3a0f 100644
--- a/packages/SettingsLib/res/values-ko/arrays.xml
+++ b/packages/SettingsLib/res/values-ko/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"오버드로 영역 표시"</item>
<item msgid="2290859360633824369">"녹색약 영역 표시"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"표준 제한"</item>
<item msgid="4071574792028999443">"백그라운드 프로세스 없음"</item>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 3fbf4cd..4b5661d 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"저장됨"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"사용 중지됨"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP 설정 실패"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi 연결 실패"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"인증 문제"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"범위 내에 없음"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"하드웨어 업데이트 표시"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"업데이트 할 때 하드웨어 레이어 깜박이기"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU 오버드로 디버깅"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW 오버레이 사용 안함"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"화면 합성 목적으로 항상 GPU 사용"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"색상 공간 시뮬레이션"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"데모 모드에서 초기화하려면 비밀번호 입력"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"다음"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"비밀번호 입력 필요"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"입력 방법"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"시스템 언어 사용"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ky/arrays.xml b/packages/SettingsLib/res/values-ky/arrays.xml
index 4d1a685..64e8305 100644
--- a/packages/SettingsLib/res/values-ky/arrays.xml
+++ b/packages/SettingsLib/res/values-ky/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Үстүнө тартуу аймагын көргөзүү"</item>
<item msgid="2290859360633824369">"Дейтераномалиялуулар үчүн мейкиндикти көргөзүү"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Стандарттык чектөө"</item>
<item msgid="4071574792028999443">"Фондо процесстер жок"</item>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 6608ae5..e897f1f 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Сакталды"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Өчүрүлгөн"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP конфигурациясы бузулду"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi туташуусу бузулду"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Аутентификация маселеси бар"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Тейлөө аймагында эмес"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Катмарлардын аппараттык жаңырышы"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Катмарлардын аппараттык жаңырышын жашыл м-н белг."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU үстүнө тартуусун жөндөө"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Аппар. катмарлаш-у өчүрүү"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Экранды калыптоодо ар дайым GPU колдонулсун"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Түс мейкиндигин эмуляциялоо"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Демо режиминде демейки жөндөөлөргө кайтаруу үчүн сырсөздү киргизиңиз"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Кийинки"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Сырсөз талап кылынат"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Жигердүү киргизүү ыкмалары"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Тутум тилдерин колдонуу"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lo/arrays.xml b/packages/SettingsLib/res/values-lo/arrays.xml
index 67b5943..9d269fc 100644
--- a/packages/SettingsLib/res/values-lo/arrays.xml
+++ b/packages/SettingsLib/res/values-lo/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"ສະແດງຂອບເຂດການແຕ້ມທັບ"</item>
<item msgid="2290859360633824369">"ສະແດງພື້ນທີ່ສຳລັບ Deuteranomaly"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"ຂີດຈຳກັດມາດຕະຖານ"</item>
<item msgid="4071574792028999443">"ບໍ່ມີໂປຣເຊສພື້ນຫຼັງ"</item>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 9c493f2..a1219af 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"ບັນທຶກແລ້ວ"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"ປິດການນຳໃຊ້"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"ການຕັ້ງຄ່າ IP ລົ້ມເຫຼວ"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"ການເຊື່ອມຕໍ່ WiFi ລົ້ມເຫຼວ"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"ບັນຫາການພິສູດຢືນຢັນ"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"ບໍ່ຢູ່ໃນໄລຍະທີ່ເຊື່ອມຕໍ່ໄດ້"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ສະແດງການອັບເດດເລເຢີຂອງຮາດແວ"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ກະພິບເລເຢີຂອງຮາດແວໃຫ້ເປັນສີຂຽວເມື່ອມີການອັບເດດ"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"ແກ້ບັນຫາການແຕ້ມທັບຂອງ GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"ປິດການເຮັດວຽກ HW overlays"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"ໃຊ້ GPU ໃນການວາງອົງປະກອບໜ້າຈໍສະເໝີ"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"ຈຳລອງ color space"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Enter password to perform factory reset in demo mode"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ຕໍ່ໄປ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"ຕ້ອງໃສ່ລະຫັດຜ່ານ"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"ວິທີປ້ອນຂໍ້ມູນທີ່ເຮັດວຽກຢູ່"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"ໃຊ້ພາສາຂອງລະບົບ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml
index 48fa936..f280441 100644
--- a/packages/SettingsLib/res/values-lt/arrays.xml
+++ b/packages/SettingsLib/res/values-lt/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Rodyti perdangos sritis"</item>
<item msgid="2290859360633824369">"Rodyti deuteranomalijos sritis"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standartinis apribojimas"</item>
<item msgid="4071574792028999443">"Nėra fono procesų"</item>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 3090d30..555b1fa 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Išsaugotas"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Neleidžiama"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP konfigūracijos triktis"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"„Wi-Fi“ ryšio triktis"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Autentifikavimo problema"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Ne diapazone"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Rod. apar. įr. sl. nauj."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Kai atsin. apar. įr. sl., rod. juos blyks. ž. sp."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Derinti GPU perdangą"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Neleisti HW perdangų"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Komponuojant ekraną visada naudoti GPU"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Imituoti spalvų erdvę"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Įv. slapt. ir atk. gam. nust. dem. rež."</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Kitas"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Būtina nurodyti slaptažodį"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktyvūs įvesties metodai"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Sistemos kalbų naudojimas"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lv/arrays.xml b/packages/SettingsLib/res/values-lv/arrays.xml
index 16dc981..ea0ff4a 100644
--- a/packages/SettingsLib/res/values-lv/arrays.xml
+++ b/packages/SettingsLib/res/values-lv/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Rādīt apgab., kur pārsn. kapacitāte"</item>
<item msgid="2290859360633824369">"Rādīt laukumus deiteranomālijai"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standarta ierobežojums"</item>
<item msgid="4071574792028999443">"Nav fona procesu"</item>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index d782e89..1e21dad 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Saglabāts"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Atspējots"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP konfigurācijas kļūme"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi savienojuma kļūme"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Autentificēšanas problēma"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Nav diapazona ietvaros"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Rādīt apar. slāņu atjaun."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Atjaunin. aparatūras slāņiem ir jāmirgo zaļā krāsā"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Atkļūdot graf. proc. kapac. pārsn."</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Atspējot HW pārklājumus"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Vienmēr izmantot GPU atveidi ekrāna salikšanai"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simulēt krāstelpu"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Iev. paroli, lai atiest. rūpnīcas iest. dem. režīmā"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Tālāk"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Nepieciešama parole"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktīvās ievades metodes"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Sistēmas valodu izmantošana"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mk/arrays.xml b/packages/SettingsLib/res/values-mk/arrays.xml
index e334467..01c5bb0 100644
--- a/packages/SettingsLib/res/values-mk/arrays.xml
+++ b/packages/SettingsLib/res/values-mk/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Прикажи пречекорени делови"</item>
<item msgid="2290859360633824369">"Прикажи делови за лица со девтераномалија"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Стандардна граница"</item>
<item msgid="4071574792028999443">"Нема процеси во заднина"</item>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 0662c8f..6bd1e15 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Зачувано"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Оневозможено"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Конфигурирањето ИП не успеа"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Поврзувањето преку Wi-Fi не успеа"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Проблем со автентикација"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Надвор од опсег"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ажурир. слоеви на хардвер"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Осветли слоеви на хардвер со зелено кога се ажур."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Отстр. греш. на GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Оневозможи HW преклопувања"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Секогаш користи GPU за составување екран"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Симулирај простор на бои"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Внесете лозинка за фаб. ресет. во демо"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Следно"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Потребна е лозинка"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Методи за активно внесување"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Користете ги системските јазици"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ml/arrays.xml b/packages/SettingsLib/res/values-ml/arrays.xml
index e79a567..987e879 100644
--- a/packages/SettingsLib/res/values-ml/arrays.xml
+++ b/packages/SettingsLib/res/values-ml/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"ഓവർഡ്രോ ഭാഗങ്ങൾ ദൃശ്യമാക്കുക"</item>
<item msgid="2290859360633824369">"വർണ്ണാന്ധതയ്ക്കായുള്ള ഭാഗങ്ങൾ ദൃശ്യമാക്കുക"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"അടിസ്ഥാന പരിധി"</item>
<item msgid="4071574792028999443">"പശ്ചാത്തല പ്രോസസ്സുകൾ ഒന്നുമില്ല"</item>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index b238625..f67d8a49d 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"സംരക്ഷിച്ചു"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"പ്രവർത്തനരഹിതമാക്കി"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP കോൺഫിഗറേഷൻ പരാജയം"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi കണക്ഷൻ പരാജയം"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"ആധികാരികമാക്കുന്നതിലെ പ്രശ്നം"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"പരിധിയിലില്ല"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ഹാർഡ്വെയർ ലേയർ അപ്ഡേറ്റ് കാണിക്കൂ"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ഹാർഡ്വെയർ ലേയറുകളുടെ അപ്ഡേറ്റുകൾ പൂർത്തിയാകുമ്പോൾ അവ പച്ച നിറത്തിൽ പ്രകാശിപ്പിക്കുക"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ഓവർഡ്രോ ഡീബഗ്ഗുചെയ്യുക"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW ഓവർലേ നിഷ്ക്രിയമാക്കൂ"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"സ്ക്രീൻ കമ്പോസിറ്റുചെയ്യലിനായി എല്ലായ്പ്പോഴും GPU ഉപയോഗിക്കുക"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"വർണ്ണ സ്പെയ്സ് പ്രവർത്തിപ്പിക്കുക"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"ഡെമോ മോഡിൽ ഫാക്ടറി റീസെറ്റിന് പാസ്വേഡ് നൽകുക"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"അടുത്തത്"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"പാസ്വേഡ് ആവശ്യമാണ്"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"സജീവ ടൈപ്പുചെയ്യൽ രീതികൾ"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"സിസ്റ്റം ഭാഷകൾ ഉപയോഗിക്കുക"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mn/arrays.xml b/packages/SettingsLib/res/values-mn/arrays.xml
index bb61310..ca500a0 100644
--- a/packages/SettingsLib/res/values-mn/arrays.xml
+++ b/packages/SettingsLib/res/values-mn/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Давхар дүрслэлтэй хэсгийг харуулах"</item>
<item msgid="2290859360633824369">"Өнгө үл ялгагчид зориулсан бүсүүдийг харуулах"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Стандарт хязгаар"</item>
<item msgid="4071574792028999443">"Далд процесс байхгүй"</item>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 68f3df5..d1fa849 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Хадгалагдсан"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Идэвхгүйжүүлсэн"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP тохируулга амжилтгүй"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi холболт амжилтгүй"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Гэрчлэлийн асуудал"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Хүрээнд байхгүй"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Техник хангамжийн давхаргын шинэчлэлтүүдийг харуулах"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Техник хангамжууд шинэчлэх үед давхаргыг анивчуулах"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU давхар дүрслэлийг дебаг хийх"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW давхаргыг идэвхгүйжүүлэх"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Дэлгэц нийлүүлэхэд GPU-г байнга ашиглах"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Өнгөний орчныг дууриах"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Үйлдвэрийн тохиргоог демо горимд ажиллуулахын тулд нууц үг оруулна уу"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Дараагийн"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Нууц үг шаардлагатай"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Оруулах аргуудыг идэвхжүүлэх"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Системийн хэлүүдийг ашиглах"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mr/arrays.xml b/packages/SettingsLib/res/values-mr/arrays.xml
index e83b1f9..32cc49f 100644
--- a/packages/SettingsLib/res/values-mr/arrays.xml
+++ b/packages/SettingsLib/res/values-mr/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"अधोरेखांकित क्षेत्रे दर्शवा"</item>
<item msgid="2290859360633824369">"हरित असंगतिसाठी क्षेत्रे दर्शवा"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"मानक मर्यादा"</item>
<item msgid="4071574792028999443">"एकही पार्श्वभूमी प्रक्रिया नाही"</item>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 243885f..c2908f3 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"जतन केले"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"अक्षम"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP कॉन्फिगरेशन अयशस्वी"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi कनेक्शन अयशस्वी"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"प्रमाणीकरण समस्या"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"परिक्षेत्रामध्ये नाही"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"हार्डवेअर स्तर अद्यतने दर्शवा"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"हार्डवेअर स्तर अद्ययावत झाल्यावर ते हिरव्या रंगात फ्लॅश करा"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU अधोरेखांकित डीबग करा"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW आच्छादने अक्षम करा"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"स्क्रीन तयार करण्यासाठी नेहमी GPU वापरा"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"रंग स्थानाची बतावणी करा"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"डेमो मोडमध्ये फॅक्टरी रीसेट करण्यासाठी संकेतशब्द प्रविष्ट करा"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"पुढील"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"संकेतशब्द आवश्यक"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"सक्रिय इनपुट पद्धती"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"सिस्टीम भाषा वापरा"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ms/arrays.xml b/packages/SettingsLib/res/values-ms/arrays.xml
index 886dd44..30790d1 100644
--- a/packages/SettingsLib/res/values-ms/arrays.xml
+++ b/packages/SettingsLib/res/values-ms/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Tunjukkan kawasan lebih lukis"</item>
<item msgid="2290859360633824369">"Tunjukkan kawasan untuk Deuteranomaly"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Had standard"</item>
<item msgid="4071574792028999443">"Tiada proses latar belakang"</item>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 234f4cf..1ea8f6c 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Disimpan"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Dinyahdayakan"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Kegagalan Konfigurasi IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Kegagalan Sambungan WiFi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Masalah pengesahan"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Tidak dalam liputan"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Tunjukkan kemas kini perkakasan"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Denyar hijau lapisan perkakasan yang dikemas kini"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Nyahpepijat lebih lukis GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Lumpuhkan tindihan HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Sentiasa gunakan GPU untuk komposit skrin"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Tiru ruang warna"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Mskkn kta laluan utk ttpn sml kilang dlm mod demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Seterusnya"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Kata laluan diperlukan"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Kaedah input aktif"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Gunakan bahasa sistem"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-my/arrays.xml b/packages/SettingsLib/res/values-my/arrays.xml
index c30bd20..8cacaab 100644
--- a/packages/SettingsLib/res/values-my/arrays.xml
+++ b/packages/SettingsLib/res/values-my/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"ရှိရင်းစွဲထက်ပိုသော ဧရိယာများကိုပြရန်"</item>
<item msgid="2290859360633824369">"အရောင်ရောနှောသောဧရိယာများပြရန်"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"သတ်မှတ်စံနှုန်း"</item>
<item msgid="4071574792028999443">"နောက်ခံပြုလုပ်နေသောလုပ်ငန်းစဉ်မရှိ"</item>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 93507d2..0691753 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"သိမ်းဆည်းပြီး"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"သုံးမရအောင် ပိတ်ထားသည်"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP ပြုပြင်ခြင်း မအောင်မြင်ပါ"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi ချိတ်ဆက်မှု မအောင်မြင်ပါ"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"စစ်မှန်ကြောင်းအတည်ပြုရန်၌ ပြသနာရှိခြင်း"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"စက်ကွင်းထဲတွင် မဟုတ်ပါ"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ဟာ့ဒ်ဝဲအလွှာများအဆင်မြှင့်မှုကိုပြရန်"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"အပ်ဒိတ်လုပ်ချိန် ဟာ့ဒ်ဝဲအလွှာများ အစိမ်းရောင်ပြပါ"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ပိုသုံးစွဲမှုအမှားရှာဖွေပြင်ဆင်ရန်"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HWထပ်ဆင့်အရာများပိတ်ရန်"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"GPU ကိုမျက်နှာပြင်ခင်းကျင်းရာတွင် အမြဲသုံးပါ။"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"အရောင်နေရာတူအောင် ဖန်တီးသည်"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"ဒီမိုမုဒ်၌မူလဆက်တင်ထားရန် စကားဝှက်ထည့်ပါ"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ရှေ့သို့"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"စကားဝှက် လိုအပ်သည်"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"ရနိုင်သောထည့်သွင်းရန်နည်းလမ်းများ"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"စနစ်ဘာသာစကားများကို အသုံးပြုပါ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml
index 36bc9e0..0c273a6 100644
--- a/packages/SettingsLib/res/values-nb/arrays.xml
+++ b/packages/SettingsLib/res/values-nb/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Vis overtrekksområder"</item>
<item msgid="2290859360633824369">"Vis områder for deuteranomali"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standard grense"</item>
<item msgid="4071574792028999443">"Ingen bakgrunnsprosesser"</item>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 172d59c..94096d1 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Lagret"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Slått av"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP-konfigurasjonsfeil"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi-tilkoblingsfeil"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Autentiseringsproblem"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Utenfor område"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Vis maskinvarelag-oppdat."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Maskinvarelag blinker grønt under oppdatering"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Feilsøk GPU-overtrekk"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Slå av maskinvareoverlegg"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Bruk alltid GPU for skjermsammensetting"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simuler fargeområde"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Skriv inn passordet for å tilbakestille til fabrikkstandard i demomodus"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Neste"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Passord er obligatorisk"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktive inndatametoder"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Bruk systemspråk"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ne/arrays.xml b/packages/SettingsLib/res/values-ne/arrays.xml
index cee130b..9ee306f 100644
--- a/packages/SettingsLib/res/values-ne/arrays.xml
+++ b/packages/SettingsLib/res/values-ne/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"overdraw क्षेत्रहरू देखाउनुहोस्"</item>
<item msgid="2290859360633824369">"Deuteranomaly का लागि क्षेत्रहरू देखाउनुहोस्"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"मानक सीमा"</item>
<item msgid="4071574792028999443">"कुनै पृष्ठभूमि प्रक्रियाहरू छैनन्"</item>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index c6c7fd3..c5c5d86 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"सुरक्षित गरियो"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"असक्षम पारियो"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP विन्यास असफल"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"वाईफाई जडान असफल"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"प्रमाणीकरण समस्या"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"दायराभित्र छैन"</string>
@@ -199,7 +201,7 @@
<string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Wi-Fi सक्रिय हुँदा पनि मोबाइल डेटा सधैँ सक्रिय राख्नुहोस् (द्रूत नेटवर्क स्विच गर्नको लागि)।"</string>
<string name="adb_warning_title" msgid="6234463310896563253">"USB डिबग गर्न लागि अनुमति दिने हो?"</string>
<string name="adb_warning_message" msgid="7316799925425402244">"युएसबी डिबगिङ विकास प्रयोजनका लागि मात्र निर्मित हुन्छ। यसलाई तपाईँको कम्प्युटर र तपाईँको उपकरणका बीच डेटा प्रतिलिपि गर्न, बिना सूचना तपाईँको उपकरणमा अनुप्रयोगहरू स्थापना गर्न र लग डेटा पढ्नका लागि प्रयोग गर्नुहोस्।"</string>
- <string name="adb_keys_warning_message" msgid="5659849457135841625">"तपाईँ पहिले नै अधिकृत गर्नुभएका सबै कम्प्यूटरबाट USB डिबग गर्नको लागि पहुँच रद्द गर्ने हो?"</string>
+ <string name="adb_keys_warning_message" msgid="5659849457135841625">"तपाईं पहिले नै अधिकृत गर्नुभएका सबै कम्प्यूटरबाट USB डिबग गर्नको लागि पहुँच रद्द गर्ने हो?"</string>
<string name="dev_settings_warning_title" msgid="7244607768088540165">"विकास सेटिङहरू अनुमति दिने हो?"</string>
<string name="dev_settings_warning_message" msgid="2298337781139097964">"यी सेटिङहरू केवल विकास प्रयोगको लागि विचार गरिएको हो। तिनीहरूले तपाईंको उपकरण र अनुप्रयोगहरूलाई विच्छेदन गर्न वा दुर्व्यवहार गर्न सक्दछ।"</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB मा अनुप्रयोगहरू रुजु गर्नुहोस्"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"हार्डवेयर तह अद्यावधिक देखाउनुहोस्"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"फ्ल्यास हार्डवेयर तहहरू अपडेट हुँदा हरिया हुन्छन्"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU overdraw डिबग गर्नुहोस्"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW ओवरले असक्षम पार्नुहोस्"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"स्क्रिन कोम्पजिट गर्न लागि सधैँ GPU प्रयोग गर्नुहोस्"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"रंग स्पेस अनुकरण गर्नुहोस्"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"डेमो मोडमा फ्याक्ट्री रिसेट गर्न पासवर्ड प्रविष्ट गर्नुहोस्"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"अर्को"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"पासवर्ड आवश्यक छ"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"आगत विधिहरू सक्रिय गर्नुहोस्"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"प्रणालीका भाषाहरू प्रयोग गर्नुहोस्"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml
index 93db1c6..74aa7d5 100644
--- a/packages/SettingsLib/res/values-nl/arrays.xml
+++ b/packages/SettingsLib/res/values-nl/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Gedeeltes met overbelasting weergeven"</item>
<item msgid="2290859360633824369">"Gebieden voor deuteranomalie weergeven"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standaardlimiet"</item>
<item msgid="4071574792028999443">"Geen achtergrondprocessen"</item>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 30439710..b9bcbfd 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Opgeslagen"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Uitgeschakeld"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP-configuratie mislukt"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wifi-verbinding mislukt"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Authenticatieprobleem"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Niet binnen bereik"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Updaten hardwarelgn wrgvn"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardwarelagen knipperen groen bij updates"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Foutopsporing GPU-overbelasting"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW-overlays uitschakelen"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"GPU altijd gebruiken voor schermcompositing"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Kleurruimte simuleren"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Geef wachtwoord op om terug te zetten op fabrieksinstellingen in demomodus"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Volgende"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Wachtwoord vereist"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Actieve invoermethoden"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Systeemtalen gebruiken"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pa/arrays.xml b/packages/SettingsLib/res/values-pa/arrays.xml
index f7ca9e1..d0bb038 100644
--- a/packages/SettingsLib/res/values-pa/arrays.xml
+++ b/packages/SettingsLib/res/values-pa/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"ਓਵਰਡ੍ਰਾ ਖੇਤਰ ਦਿਖਾਓ"</item>
<item msgid="2290859360633824369">"Deuteranomaly ਲਈ ਖੇਤਰ ਦਿਖਾਓ"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"ਸਟੈਂਡਰਡ ਸੀਮਾ"</item>
<item msgid="4071574792028999443">"ਕੋਈ ਪਿਛੋਕੜ ਪ੍ਰਕਿਰਿਆਵਾਂ ਨਹੀਂ"</item>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 13c817e..2e1340e 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"ਰੱਖਿਅਤ ਕੀਤਾ"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"ਅਯੋਗ ਬਣਾਇਆ"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP ਕੌਂਫਿਗਰੇਸ਼ਨ ਅਸਫਲਤਾ"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi ਕਨੈਕਸ਼ਨ ਅਸਫਲਤਾ"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"ਪ੍ਰਮਾਣੀਕਰਨ ਸਮੱਸਿਆ"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"ਰੇਂਜ ਵਿੱਚ ਨਹੀਂ ਹੈ"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ਹਾਰਡਵੇਅਰ ਲੇਅਰਸ ਅਪਡੇਟਾਂ ਦਿਖਾਓ"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ਹਾਰਡਵੇਅਰ ਲੇਅਰਾਂ ਨੂੰ ਹਰੀਆਂ ਫਲੈਸ਼ ਕਰੋ ਜਦੋਂ ਉਹ ਅਪਡੇਟ ਹੁੰਦੀਆਂ ਹਨ"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ਓਵਰਡ੍ਰਾ ਡੀਬਗ ਕਰੋ"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW ਓਵਰਲੇਜ ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"ਸਕ੍ਰੀਨ ਕੰਪੋਜਿਟਿੰਗ ਲਈ ਹਮੇਸ਼ਾਂ GPU ਵਰਤੋ"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"ਰੰਗ ਸਪੇਸ ਦੀ ਨਕਲ ਕਰੋ"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"ਡੈਮੋ ਮੋਡ \'ਚ ਫੈਕਟਰੀ ਰੀਸੈੱਟ ਲਈ ਪਾਸਵਰਡ ਦਿਓ"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ਅੱਗੇ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"ਪਾਸਵਰਡ ਦੀ ਲੋੜ ਹੈ"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"ਸਰਗਰਮ ਇਨਪੁਟ ਵਿਧੀਆਂ"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"ਸਿਸਟਮ ਭਾਸ਼ਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pl/arrays.xml b/packages/SettingsLib/res/values-pl/arrays.xml
index cd7eb7d..23bbe82 100644
--- a/packages/SettingsLib/res/values-pl/arrays.xml
+++ b/packages/SettingsLib/res/values-pl/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Pokaż przerysowywane obszary"</item>
<item msgid="2290859360633824369">"Pokaż obszary dostosowane do deuteranomalii"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standardowy limit"</item>
<item msgid="4071574792028999443">"Brak procesów w tle"</item>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index fcf974c..a216269 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Zapisana"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Wyłączona"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Błąd konfiguracji IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Błąd połączenia Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problem z uwierzytelnianiem"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Poza zasięgiem"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Pokaż zmiany warstw sprzęt."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Oznaczaj aktualizowane warstwy sprzętowe na zielono"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debuguj przerysowania GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Wyłącz nakładki HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Zawsze używaj GPU do komponowania ekranu"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Symuluj przestrzeń kolorów"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Wpisz hasło, by przywrócić ustawienia fabryczne w trybie demonstracyjnym"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Dalej"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Wymagane hasło"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktywne metody wprowadzania"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Użyj języków systemu"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
index 8a2fdc6..03bdfc1 100644
--- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Mostrar áreas de overdraw"</item>
<item msgid="2290859360633824369">"Mostrar áreas para daltonismo"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Limite padrão"</item>
<item msgid="4071574792028999443">"Sem processos em segundo plano"</item>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index dcbac24..41f37e4 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Salva"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Desativado"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Falha de configuração de IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Falha de conexão Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problema de autenticação"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Fora do alcance"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Atual. camad. de hardware"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Piscar camadas de hardware em verde ao atualizar"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depurar overdraw da GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Desativar sobreposição HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Sempre usar a GPU para composição de tela"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simular espaço de cores"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Digite a senha para redef. p/ configuração original em modo demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Próxima"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Senha necessária"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Métodos ativos de entrada"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Usar idiomas do sistema"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
index 1b10a3f..63dbd76 100644
--- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Mostrar áreas de sobreposição"</item>
<item msgid="2290859360633824369">"Mostrar áreas para Deuteranomaly"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Limite padrão"</item>
<item msgid="4071574792028999443">"Sem processos em segundo plano"</item>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index fb2bd6e..fe1d686 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Guardada"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Desativado"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Falha de configuração de IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Falha de ligação Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problema de autenticação"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Fora do alcance"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Mostrar atual. cam. hard."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Camadas de hard. flash verdes quando estão atuali."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depurar sobreposição GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Desativ. sobreposições HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Utilizar sempre GPU para a composição do ecrã"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simular espaço da cor"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Introduzir palavra-passe para efetuar a reposição de fábrica no modo demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Próximo"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Palavra-passe obrigatória"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Métodos de introdução activos"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Utilizar idiomas do sistema"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml
index 8a2fdc6..03bdfc1 100644
--- a/packages/SettingsLib/res/values-pt/arrays.xml
+++ b/packages/SettingsLib/res/values-pt/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Mostrar áreas de overdraw"</item>
<item msgid="2290859360633824369">"Mostrar áreas para daltonismo"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Limite padrão"</item>
<item msgid="4071574792028999443">"Sem processos em segundo plano"</item>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index dcbac24..41f37e4 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Salva"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Desativado"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Falha de configuração de IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Falha de conexão Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problema de autenticação"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Fora do alcance"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Atual. camad. de hardware"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Piscar camadas de hardware em verde ao atualizar"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depurar overdraw da GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Desativar sobreposição HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Sempre usar a GPU para composição de tela"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simular espaço de cores"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Digite a senha para redef. p/ configuração original em modo demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Próxima"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Senha necessária"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Métodos ativos de entrada"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Usar idiomas do sistema"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml
index 2f4d0c7..e1f2982 100644
--- a/packages/SettingsLib/res/values-ro/arrays.xml
+++ b/packages/SettingsLib/res/values-ro/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Afișați zonele cu suprapunere"</item>
<item msgid="2290859360633824369">"Afișați zonele de deuteranomalie"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Limita standard"</item>
<item msgid="4071574792028999443">"Nu există procese de fundal"</item>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 372833d..44e4a85 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Salvată"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Dezactivată"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Eroare de configurație IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Eroare de conexiune Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problemă la autentificare"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"În afara ariei de acoperire"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Actualiz. strat. hardware"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Straturile hardware clipesc verde la actualizare"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depanați suprapunerea"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Dezactivați suprapun. HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Utilizați mereu GPU pentru compunerea ecranului"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simulați spațiu culoare"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Introduceți parola pentru a reveni la setările din fabrică în modul demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Înainte"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Trebuie să introduceți o parolă"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Metode active de introducere de text"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Folosește limbile sistemului"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml
index 6498ea0..223f834 100644
--- a/packages/SettingsLib/res/values-ru/arrays.xml
+++ b/packages/SettingsLib/res/values-ru/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Показывать области наложения"</item>
<item msgid="2290859360633824369">"Выделять области определенного цвета"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Стандартное ограничение"</item>
<item msgid="4071574792028999443">"Без фоновых процессов"</item>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 97aea30..1295561 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Сохранено"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Отключено"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Ошибка IP-конфигурации"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Ошибка подключения Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Ошибка аутентификации"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Недоступна"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Показ. аппаратные обновл."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Выделять аппаратные уровни зеленым при обновлении"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Отладка наложения"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Откл. аппарат. наложения"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Всегда использовать GPU при компоновке экрана"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Имитировать аномалию"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Чтобы сбросить настройки в деморежиме, введите пароль."</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Далее"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Требуется пароль"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Активные способы ввода"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Языки системы"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-si/arrays.xml b/packages/SettingsLib/res/values-si/arrays.xml
index 4af877d..bf05b9d 100644
--- a/packages/SettingsLib/res/values-si/arrays.xml
+++ b/packages/SettingsLib/res/values-si/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"වැඩිකොට දක්වනවා ඇති ප්රදේශ පෙන්වන්න"</item>
<item msgid="2290859360633824369">"අපවිෂවීම සඳහා ප්රදේශ පෙන්වන්න"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"සම්මත සීමාව"</item>
<item msgid="4071574792028999443">"පසුබිම් ක්රියාවලි නොමැත"</item>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index b53a46f..fc4769c 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"සුරකින ලදි"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"අබලයි"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP වින්යාස කිරීම අසාර්ථකයි"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi සම්බන්ධතාව අසාර්ථකයි"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"සත්යාපනයේ ගැටලුවකි"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"පරාසයේ නැත"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"දෘඨාංග ස්ථර යාවත්කාලීන"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"යාවත්කාලින වන විට දෘඩාංග තලය කොළ පහන් දැල්වෙන්න"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU වැඩිකොට දැක්වීම නිදොස් කරන්න"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW වසාලන අක්රිය කරන්න"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"තිර සංයුක්ත කිරීමට සැමවිටම GPU භාවිතා කරන්න"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"වර්ණ අවකාශය අනුකරණය කරන්න"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"ආදර්ශන ප්රකාර කර්මාන්තශාලා යළි සැකසීමට මුරපදය ඇ. ක."</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ඊළඟ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"මුරපදය අවශ්යයි"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"සක්රීය ආදායක මාර්ග"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"පද්ධති භාෂා භාවිත කරන්න"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sk/arrays.xml b/packages/SettingsLib/res/values-sk/arrays.xml
index c0cc99e..a00315b 100644
--- a/packages/SettingsLib/res/values-sk/arrays.xml
+++ b/packages/SettingsLib/res/values-sk/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Zobraziť oblasti prekreslení"</item>
<item msgid="2290859360633824369">"Zobraziť oblasti pre deuteranomáliu"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Štandardný limit"</item>
<item msgid="4071574792028999443">"Žiadne procesy na pozadí"</item>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index ce1315a..0a2db73 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Uložené"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Zakázané"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Zlyhanie konfigurácie adresy IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Zlyhanie pripojenia Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problém s overením totožnosti"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Mimo dosah"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Obnovenie hardvér. vrstiev"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Rozblikať zelene hardvérové vrstvy pri obnovení"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Ladenie prekresľovania GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Zakázať hardvérové prekrytia"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Vždy používať GPU na skladanie obrazovky"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simulácia far. priestoru"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Zadajte heslo na obnovenie továrenských nastavení v režime ukážky"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Ďalej"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Vyžaduje sa heslo"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktívne metódy vstupu"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Použiť jazyky systému"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sl/arrays.xml b/packages/SettingsLib/res/values-sl/arrays.xml
index 5560936..159a1d6 100644
--- a/packages/SettingsLib/res/values-sl/arrays.xml
+++ b/packages/SettingsLib/res/values-sl/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Pokaži risanje zunaj vidnega območja"</item>
<item msgid="2290859360633824369">"Pokaži območja za devteranomalijo"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standardna omejitev"</item>
<item msgid="4071574792028999443">"Ni postopkov v ozadju"</item>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index ca9eb95..c2a24ac 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Shranjeno"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Onemogočeno"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Konfiguracija IP-ja ni uspela"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Povezava prek Wi-Fi-ja ni uspela"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Težava s preverjanjem pristnosti"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Ni v obsegu"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Pokaži pos. sl. str. opr."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Obarvaj sloje strojne opreme zeleno ob posodobitvi"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Prekoračitev območja GPE"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Onem. strojni medp."</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Za sestavljanje slike vedno uporabi graf. procesor"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simul. barvnega prostora"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Geslo za tovar. nast. v predstav. načinu"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Naprej"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Vnesite geslo"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktivni načini vnosa"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Uporaba sistemskih jezikov"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sq/arrays.xml b/packages/SettingsLib/res/values-sq/arrays.xml
index 0f8269a..dcfc1ef 100644
--- a/packages/SettingsLib/res/values-sq/arrays.xml
+++ b/packages/SettingsLib/res/values-sq/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Shfaq zonat e konfliktit"</item>
<item msgid="2290859360633824369">"Shfaq zonat për deuteranomalinë"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Kufizim standard"</item>
<item msgid="4071574792028999443">"Nuk ka procese në sfond"</item>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 7163852..a88dcd5 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"U ruajt"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Të çaktivizuara"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Dështim në konfigurimin e IP-së"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Dështim i lidhjes WiFi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problem me vërtetimin"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Nuk është brenda rrezes"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Shfaq përditësimet e shtresave të harduerit"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Ndriço në të gjelbër shtresat e harduerit që përditësohen"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Korrigjo konfliktet e GPU-së"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Çaktivizo mbishtresimin e HW-së"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Përdor gjithmonë GPU-në për përbërjen e ekranit"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simulo hapësirën e ngjyrës"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Fut fjalëkalimin për të kryer rivendosje në gjendje fabrike në modalitetin e demonstrimit"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Përpara"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Kërkohet fjalëkalimi"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Metodat aktive të hyrjeve"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Përdor gjuhët e sistemit"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml
index 912d20b..44aaca6 100644
--- a/packages/SettingsLib/res/values-sr/arrays.xml
+++ b/packages/SettingsLib/res/values-sr/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Прикажи области преклапања"</item>
<item msgid="2290859360633824369">"Прикажи области за деутераномалију"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Стандардно ограничење"</item>
<item msgid="4071574792028999443">"Без позадинских процеса"</item>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 7ea3bf3..044fd49 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Сачувано"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Онемогућено"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP конфигурација је отказала"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi веза је отказала"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Проблем са потврдом аутентичности"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Није у опсегу"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Прикажи ажурирања хардверских слојева"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Хардверски слојеви трепере зелено када се ажурирају"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Отклони грешке GPU преклапања"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Онемог. HW пост. елементе"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Увек користи GPU за компоновање екрана"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Симулирај простор боје"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Унесите лозинку да бисте обавили ресетовање на фабричка подешавања у режиму демонстрације"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Даље"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Потребна је лозинка"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Методе активног уноса"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Користи језике система"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml
index 26496aa..0e47b18 100644
--- a/packages/SettingsLib/res/values-sv/arrays.xml
+++ b/packages/SettingsLib/res/values-sv/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Visa områden som överskrider gränsen"</item>
<item msgid="2290859360633824369">"Visa områden för deuteranomali"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standardgräns"</item>
<item msgid="4071574792028999443">"Inga bakgrundsprocesser"</item>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index c8d3127..cece259 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Sparat"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Inaktiverad"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP-konfigurationsfel"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi-anslutningsfel"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Autentiseringsproblem"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Utom räckhåll"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Visa maskinvaruskiktuppd."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Låt maskinvaruskikt blinka grönt vid uppdateringar"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Felsök överskriden GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Inaktivera HW-överlagringar"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Använd alltid GPU för skärmsammansättning"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simulera färgrymd"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Ange lösenord och utför fabriksåterställning i demoläge"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Nästa"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Lösenord krävs"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktiva inmatningsmetoder"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Använda systemspråk"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml
index 92dbaeb..45dd3fe 100644
--- a/packages/SettingsLib/res/values-sw/arrays.xml
+++ b/packages/SettingsLib/res/values-sw/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Onyesha maeneo yaliyoondolewa"</item>
<item msgid="2290859360633824369">"Onyesha sehemu za Upofu Rangi Kijani"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Kiwango cha wastani"</item>
<item msgid="4071574792028999443">"Hakuna mchakato wa mandari nyuma"</item>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 9296e81..060aabb 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Imehifadhiwa"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Imezimwa"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Haikuweza Kusanidi IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Haikuweza Kuunganisha kwenye WiFi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Tatizo la uthibitishaji"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Haiko karibu"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Onyesha sasisho za safu za maunzi"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Angaza kijani safu za maunzi zinaposasisha"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Tatua uondoaji wa GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Lemaza miekeleo ya HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Daima tumia GPU kwa mchanganyiko wa skrini"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Kuiga nafasi ya rangi"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Weka nenosiri ili urejeshe mipangilio ya kiwandani ikiwa katika hali ya onyesho."</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Inayofuata"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Nenosiri linahitajika"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Mbinu zinazotumika"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Tumia lugha za mfumo"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ta/arrays.xml b/packages/SettingsLib/res/values-ta/arrays.xml
index cefb5de..32dcfe9 100644
--- a/packages/SettingsLib/res/values-ta/arrays.xml
+++ b/packages/SettingsLib/res/values-ta/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"ஓவர்டிரா பகுதிகளைக் காட்டு"</item>
<item msgid="2290859360633824369">"நிறக்குருடின் பகுதிகளைக் காட்டு"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"நிலையான வரம்பு"</item>
<item msgid="4071574792028999443">"பின்புலச் செயல்முறைகள் இல்லை"</item>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 7768dfd..e359dab 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"சேமிக்கப்பட்டது"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"முடக்கப்பட்டது"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP உள்ளமைவில் தோல்வி"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"வைஃபை இணைப்பில் தோல்வி"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"அங்கீகரிப்புச் சிக்கல்"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"தொடர்பு எல்லையில் இல்லை"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"வன்பொருள் லேயர்களின் புதுப்பிப்புகளைக் காட்டு"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"வன்பொருள் லேயர்களைப் புதுப்பிக்கும்போது, அவற்றைப் பச்சை நிறத்தில் காட்டு"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ஓவர்டிராவைப் பிழைதிருத்து"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW மேலடுக்குகளை முடக்கு"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"திரைத் தொகுத்தலுக்கு எப்போதும் GPU ஐப் பயன்படுத்து"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"வண்ணத்தின் இடைவெளியை உருவகப்படுத்து"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"டெமோ பயன்முறையில் ஆரம்பநிலை மீட்டமைவைச் செயல்படுத்த, கடவுச்சொல்லை உள்ளிடவும்"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"அடுத்து"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"கடவுச்சொல் தேவை"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"செயலில் உள்ள உள்ளீட்டு முறைகள்"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"முறைமை மொழிகளைப் பயன்படுத்து"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml
index dd9810b..a891465 100644
--- a/packages/SettingsLib/res/values-te/arrays.xml
+++ b/packages/SettingsLib/res/values-te/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"ఓవర్డ్రా ప్రాంతాలను చూపండి"</item>
<item msgid="2290859360633824369">"డ్యూటెరానోమలీ కోసం ప్రాంతాలను చూపండి"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"ప్రామాణిక పరిమితి"</item>
<item msgid="4071574792028999443">"నేపథ్య ప్రాసెస్లు లేవు"</item>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 8379dd8..b325616 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"సేవ్ చేయబడింది"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"నిలిపివేయబడింది"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP కాన్ఫిగరేషన్ వైఫల్యం"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi కనెక్షన్ వైఫల్యం"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"ప్రామాణీకరణ సమస్య"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"పరిధిలో లేదు"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"హార్డ్వేర్ లేయర్ల నవీకరణలను చూపండి"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"హార్డ్వేర్ లేయర్లు నవీకరించబడినప్పుడు వాటిని ఆకుపచ్చ రంగులో ఫ్లాష్ చేయండి"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ఓవర్డ్రాను డీబగ్ చేయండి"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW అతివ్యాప్తులను నిలిపివేయి"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"స్క్రీన్ కంపోజిషనింగ్ కోసం ఎల్లప్పుడూ GPUని ఉపయోగించు"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"రంగు అంతరాన్ని అనుకరించు"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"డెమో మోడ్లో ఫ్యాక్టరీ రీసెట్ను నిర్వహించడానికి పాస్వర్డ్ను నమోదు చేయండి"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"తదుపరి"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"పాస్వర్డ్ అవసరం"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"సక్రియ ఇన్పుట్ పద్ధతులు"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"సిస్టమ్ భాషలను ఉపయోగించు"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml
index c1178d2..f3d1a3e 100644
--- a/packages/SettingsLib/res/values-th/arrays.xml
+++ b/packages/SettingsLib/res/values-th/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"แสดงพื้นที่การวาดทับ"</item>
<item msgid="2290859360633824369">"แสดงพื้นที่สำหรับคนตาบอดสีเขียว"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"ขีดจำกัดมาตรฐาน"</item>
<item msgid="4071574792028999443">"ไม่มีกระบวนการพื้นหลัง"</item>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 8f9bd86..651a02c 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"บันทึกแล้ว"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"ปิดอยู่"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"การกำหนดค่า IP ล้มเหลว"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"การเชื่อมต่อ Wi-Fi ล้มเหลว"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"ปัญหาในการตรวจสอบสิทธิ์"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"ไม่อยู่ในพื้นที่ให้บริการ"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"แสดงอัปเดตเลเยอร์ฮาร์ดแวร์"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"เลเยอร์ฮาร์ดแวร์กะพริบเป็นสีเขียว เมื่อมีการอัปเดต"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"แก้ปัญหาการวาดทับด้วย GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"ปิดใช้งานการวางซ้อน HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"ใช้ GPU ในการจัดวางองค์ประกอบหน้าจอเสมอ"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"จำลองระบบสี"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"ป้อนรหัสผ่านเพื่อรีเซ็ตค่าในโหมดสาธิต"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ถัดไป"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"ต้องป้อนรหัสผ่าน"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"วิธีการป้อนข้อมูลที่ใช้งาน"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"ใช้ภาษาของระบบ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml
index a5a8219..2a34364 100644
--- a/packages/SettingsLib/res/values-tl/arrays.xml
+++ b/packages/SettingsLib/res/values-tl/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Tingnan ang mga overdraw na bahagi"</item>
<item msgid="2290859360633824369">"Ipakita ang mga lugar para sa Deuteranomaly"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Karaniwang limitasyon"</item>
<item msgid="4071574792028999443">"Walang mga proseso sa background"</item>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 47fdae2..405f179 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Na-save"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Naka-disable"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Pagkabigo ng Configuration ng IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Pagkabigo ng Koneksyon sa WiFi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problema sa pagpapatotoo"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Wala sa sakop"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ipakita ang mga update ng hardware layers"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"I-flash nang berde ang hardware layer pag nag-update ito"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"I-debug ang GPU overdraw"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Wag paganahin HW overlay"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Laging gamitin ang GPU para sa screen compositing"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Gayahin ang color space"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Ilagay ang password upang mag-factory reset sa demo mode"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Susunod"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Kinakailangan ang password"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Mga aktibong paraan ng pag-input"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Gamitin ang mga wika ng system"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml
index 234ab28..8fda919 100644
--- a/packages/SettingsLib/res/values-tr/arrays.xml
+++ b/packages/SettingsLib/res/values-tr/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Fazla çizilen alanları göster"</item>
<item msgid="2290859360633824369">"Alanları renk körlüğüne uygun olarak göster"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standart sınır"</item>
<item msgid="4071574792028999443">"Arka planda işlem yok"</item>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 57acf21..d3519c8 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Kaydedildi"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Devre dışı"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP Yapılandırması Hatası"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Kablosuz Bağlantı Hatası"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Kimlik doğrulama sorunu"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Kapsama alanı dışında"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Donanım katmanı güncellemelerini göster"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Flash donanım katmanları güncellendiğinde yeşildir"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU fazla çizim hatasını ayıkla"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Donanım katmanlarını devre dışı bırak"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Ekran oluştururken her zaman GPU\'yu kullan"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Renk uzayını simüle et"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Demo modunda sıfırlamak için şifreyi girin"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Sonraki"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Şifre gerekli"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Etkin giriş yöntemleri"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Sistem dillerini kullan"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml
index ea7af71..af6fbcb 100644
--- a/packages/SettingsLib/res/values-uk/arrays.xml
+++ b/packages/SettingsLib/res/values-uk/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Показувати області накладання"</item>
<item msgid="2290859360633824369">"Показувати області дейтераномалії"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Стандартне обмеження"</item>
<item msgid="4071574792028999443">"Без фонових процесів"</item>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 9a742cb..b347d82 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Збережено"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Вимкнено"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Помилка конфігурації IP-адреси"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Помилка з’єднання Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Проблема з автентифікацією"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Не в діапазоні"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Показ. апаратні оновлення"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Виділяти апаратні рівні зеленим під час оновлення"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Налагодити накладання GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Вимк. апаратн. накладання"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Завжди використовувати GPU для компонування екрана"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Моделювання кольорів"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Введіть пароль, щоб скинути налаштування в демо-режимі"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Далі"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Потрібен пароль"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Активні методи введення"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Використовувати мови системи"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ur/arrays.xml b/packages/SettingsLib/res/values-ur/arrays.xml
index 7ad1d17..1a8bb89 100644
--- a/packages/SettingsLib/res/values-ur/arrays.xml
+++ b/packages/SettingsLib/res/values-ur/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"اوور ڈرا والے حصے دکھائیں"</item>
<item msgid="2290859360633824369">"Deuteranomaly کیلئے حصے دکھائیں"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"معیاری حد"</item>
<item msgid="4071574792028999443">"کوئی پس منظر والے پروسیسز نہیں ہیں"</item>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index b5a52ba..1f02e66 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"محفوظ کردیا گیا"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"غیر فعال"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP کنفیگریشن کی ناکامی"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi کنکشن کی ناکامی"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"توثیق کا مسئلہ"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"رینج میں نہیں ہے"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ہارڈویئر پرتوں کی اپ ڈیٹس دکھائیں"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ہارڈویئر پرتیں اپ ڈیٹ ہونے پر سبز رنگ میں جھلملائیں"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU اوور ڈرا کو ڈیبگ کریں"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"HW اوور لیز غیر فعال کریں"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"سکرین کی ساخت بنانے کیلئے ہمیشہ GPU استعمال کریں"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"رنگ کی جگہ کو تحریک دیں"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"ڈیمو موڈ میں فیکٹری ری سیٹ کیلئے پاس ورڈ درج کریں"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"اگلا"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"پاس ورڈ درکار ہے"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"فعال اندراج کے طریقے"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"سسٹم زبانیں استعمال کریں"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-uz/arrays.xml b/packages/SettingsLib/res/values-uz/arrays.xml
index 9790d65..cf1fe78 100644
--- a/packages/SettingsLib/res/values-uz/arrays.xml
+++ b/packages/SettingsLib/res/values-uz/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Ortiqcha chizilgan joylarni ko‘rsatish"</item>
<item msgid="2290859360633824369">"Muayyan rangdagi hududlarni ajratib belgilash"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standard cheklov"</item>
<item msgid="4071574792028999443">"Fondagi jarayonlarsiz"</item>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index b5460c2..56c7f4f 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Saqlandi"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"O‘chiq"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP manzilini sozlab bo‘lmadi"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi ulanishini o‘rnatib bo‘lmadi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Tasdiqdan o‘tishda muammo"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Aloqada emas"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Apparatli yangilanishlarni ko‘rsatish"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Yangilanganda apparatli darajalarni yashil bilan belgilash"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ortiqcha chiziqlarini o‘chirish"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Apparatli qatlamlarni o‘ch. qo‘yish"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Ekranda tasvirlarni biriktirish uchun doim GPU ishlatilsin"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Rang maydonini simulyatsiyalash"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Demo rejimda zavod holatiga qaytarish uchun parolni kiriting"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Keyingisi"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Parolni kiritish zarur"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Faol matn kiritish usullari"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Tizimda mavjud tillar"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-vi/arrays.xml b/packages/SettingsLib/res/values-vi/arrays.xml
index c239039..e331feb 100644
--- a/packages/SettingsLib/res/values-vi/arrays.xml
+++ b/packages/SettingsLib/res/values-vi/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Hiển thị các vùng vẽ quá"</item>
<item msgid="2290859360633824369">"Hiển thị các vùng mô phỏng mù màu lục"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Giới hạn tiêu chuẩn"</item>
<item msgid="4071574792028999443">"Không có quá trình nền"</item>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index ff9a557..ffcba79 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Đã lưu"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Đã tắt"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Lỗi cấu hình IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Lỗi kết nối WiFi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Sự cố xác thực"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Ngoài vùng phủ sóng"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Hiện c.nhật lớp phần cứng"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Lớp phần cứng flash có màu xanh khi chúng cập nhật"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Hiển thị mức vẽ quá GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Vô hiệu hóa các lớp phủ HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Luôn sử dụng GPU để tổng hợp màn hình"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Mô phỏng không gian màu"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Nhập mật khẩu để tiến hành khôi phục cài đặt gốc ở chế độ trình diễn"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Tiếp theo"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Yêu cầu mật khẩu"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Phương pháp nhập liệu hoạt động"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Sử dụng ngôn ngữ hệ thống"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rCN/arrays.xml b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
index 7c6e2ee..dccca74 100644
--- a/packages/SettingsLib/res/values-zh-rCN/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"显示过度绘制区域"</item>
<item msgid="2290859360633824369">"显示适合绿色弱视患者查看的区域"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"标准限制"</item>
<item msgid="4071574792028999443">"不允许后台进程"</item>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 97a5678..2174a86 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"已保存"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"已停用"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP 配置失败"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WLAN 连接失败"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"身份验证出现问题"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"不在范围内"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"显示硬件层更新"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Flash 硬件层在进行更新时会显示为绿色"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"调试 GPU 过度绘制"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"停用 HW 叠加层"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"始终使用 GPU 进行屏幕合成"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"模拟颜色空间"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"输入密码即可在演示模式下恢复出厂设置"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"下一步"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"需要输入密码"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"有效的输入法"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"使用系统语言"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rHK/arrays.xml b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
index 642d616..1167f25 100644
--- a/packages/SettingsLib/res/values-zh-rHK/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"顯示過度繪製區域"</item>
<item msgid="2290859360633824369">"顯示綠色弱視區域"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"標準限制"</item>
<item msgid="4071574792028999443">"無背景處理程序"</item>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 0838496..a05b90e 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"已儲存"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"已停用"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP 設定失敗"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi 連線失敗"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"驗證問題"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"超出可用範圍"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"顯示硬件層更新"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"在硬件層更新時閃動綠燈"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU 透支偵錯"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"停用 HW 重疊效果"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"永遠使用 GPU 進行畫面合成"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"模擬色彩空間"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"輸入密碼即可在示範模式下重設原廠設定"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"下一步"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"請輸入密碼"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"可用的輸入法"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"使用系統語言"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rTW/arrays.xml b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
index 449ccc1..f6c5607 100644
--- a/packages/SettingsLib/res/values-zh-rTW/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"顯示透支區域"</item>
<item msgid="2290859360633824369">"顯示綠色弱視區域"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"標準限制"</item>
<item msgid="4071574792028999443">"不執行背景處理程序"</item>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 4d7f736..9bb806c 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"已儲存"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"已停用"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP 設定失敗"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi 連線失敗"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"驗證問題"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"不在有效範圍內"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"顯示硬體層更新"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"在硬體層更新時閃綠燈"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"針對 GPU 重複繪圖進行偵錯"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"停用硬體重疊圖層"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"一律使用 GPU 進行畫面合成"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"模擬色彩空間"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"如要在示範模式中恢復原廠設定,請輸入密碼"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"下一步"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"請輸入密碼"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"啟用的輸入法"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"使用系統語言"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zu/arrays.xml b/packages/SettingsLib/res/values-zu/arrays.xml
index ed78ed8..726d5a9 100644
--- a/packages/SettingsLib/res/values-zu/arrays.xml
+++ b/packages/SettingsLib/res/values-zu/arrays.xml
@@ -216,6 +216,8 @@
<item msgid="7688197031296835369">"Bonisa izindawo zokukhipha okungaphezulu"</item>
<item msgid="2290859360633824369">"Bonisa izindawo ze-Deuteranomaly"</item>
</string-array>
+ <!-- no translation found for debug_hw_renderer_entries:0 (2578620445459945681) -->
+ <!-- no translation found for debug_hw_renderer_entries:1 (2839130076198120436) -->
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Isilanganiso esivamile"</item>
<item msgid="4071574792028999443">"Azikho izinqubo zesizinda"</item>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 9f7e72e..0132d5a 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -25,6 +25,8 @@
<string name="wifi_remembered" msgid="4955746899347821096">"Kulondoloziwe"</string>
<string name="wifi_disabled_generic" msgid="4259794910584943386">"Akusebenzi"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Ukwehluleka kokulungiswa kwe-IP"</string>
+ <!-- no translation found for wifi_disabled_by_recommendation_provider (5168315140978066096) -->
+ <skip />
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Ukwehlulekla koxhumo le-WiFi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Inkinga yokufakazela ubuqiniso"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Ayikho ebubanzini"</string>
@@ -235,6 +237,8 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Bonisa izibuyekezo zezendlalelo izingxenyekazi zekhompyutha"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Izendlalelo zengxenyekazi zekhompyutha eziluhlaza uma zibuyekeza"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Susa iphutha lokukhipha okungaphezulu kwe-GPU"</string>
+ <!-- no translation found for debug_hw_renderer (7568529019431785816) -->
+ <skip />
<string name="disable_overlays" msgid="2074488440505934665">"Khubaza izimbondela ze-HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Njalo sebenzisa i-GPU ukwakha isikrini"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Qoqa isikhala sombala"</string>
@@ -356,4 +360,6 @@
<string name="retail_demo_reset_message" msgid="118771671364131297">"Faka iphasiwedi ukuze wenze ukusetha kwefekthri kumodi yedemo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Okulandelayo"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Iphasiwedi iyadingeka"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"Izindlela zokufakwayo okusebenzayo"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Sebenzisa izilimi zesistimu"</string>
</resources>
diff --git a/packages/SettingsLib/res/values/arrays.xml b/packages/SettingsLib/res/values/arrays.xml
index eb64b3a..9ff22c7 100644
--- a/packages/SettingsLib/res/values/arrays.xml
+++ b/packages/SettingsLib/res/values/arrays.xml
@@ -444,6 +444,18 @@
<item>show_deuteranomaly</item>
</string-array>
+ <!-- Titles for debug renderer preference. [CHAR LIMIT=50] -->
+ <string-array name="debug_hw_renderer_entries">
+ <item>OpenGL (Default)</item>
+ <item>OpenGL (Skia)</item>
+ </string-array>
+
+ <!-- Values for debug renderer preference. -->
+ <string-array name="debug_hw_renderer_values" translatable="false" >
+ <item>opengl</item>
+ <item>skiagl</item>
+ </string-array>
+
<!-- Titles for app process limit preference. [CHAR LIMIT=35] -->
<string-array name="app_process_limit_entries">
<item>Standard limit</item>
@@ -526,7 +538,7 @@
<item>100</item>
</array>
<array name="batterymeter_color_values">
- <item>@*android:color/battery_saver_mode_color</item>
+ <item>?android:attr/colorError</item>
<item>@android:color/white</item>
</array>
<array name="batterymeter_bolt_points">
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 5475b32..f77d466 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -57,6 +57,8 @@
<string name="wifi_disabled_generic">Disabled</string>
<!-- Status for networked disabled from a DNS or DHCP failure -->
<string name="wifi_disabled_network_failure">IP Configuration Failure</string>
+ <!-- Status for networks disabled by the network recommendation provider -->
+ <string name="wifi_disabled_by_recommendation_provider">Not connected due to low quality network</string>
<!-- Status for networked disabled from a wifi association failure -->
<string name="wifi_disabled_wifi_failure">WiFi Connection Failure</string>
<!-- Status for networks disabled from authentication failure (wrong password
@@ -535,6 +537,11 @@
<string name="wait_for_debugger_summary">Debugged application waits for debugger to
attach before executing</string>
+ <!-- UI debug setting: title for Telephonymonitor switch [CHAR LIMIT=50] -->
+ <string name="telephony_monitor_switch">Telephony Monitor</string>
+ <!-- UI debug setting: summary for switch of Telephonymonitor [CHAR LIMIT=500] -->
+ <string name="telephony_monitor_switch_summary">TelephonyMonitor will collect logs when it detects a problem with telephony/modem functionality and prompt notification to user to file a bug</string>
+
<!-- Preference category for input debugging development settings. [CHAR LIMIT=25] -->
<string name="debug_input_category">Input</string>
@@ -584,6 +591,9 @@
<!-- UI debug setting: show the amount of overdraw in apps using the GPU [CHAR LIMIT=25] -->
<string name="debug_hw_overdraw">Debug GPU overdraw</string>
+ <!-- UI debug setting: select the renderer to use by RenderThread [CHAR LIMIT=25] -->
+ <string name="debug_hw_renderer">Set GPU Renderer</string>
+
<!-- UI debug setting: disable use of overlays? [CHAR LIMIT=25] -->
<string name="disable_overlays">Disable HW overlays</string>
<!-- UI debug setting: disable use of overlays summary [CHAR LIMIT=50] -->
@@ -903,4 +913,12 @@
<!-- Glyph to be overlaid atop the battery when the level is extremely low. Do not translate. -->
<string name="battery_meter_very_low_overlay_symbol">!</string>
+
+ <!-- Title for settings of active input methods in each IME [CHAR LIMIT=35] -->
+ <string name="active_input_method_subtypes">Active input methods</string>
+ <!-- Title for settings whether or not the framework will select input methods in an IME based
+ on the current system locales. (The user can select multiple system locales)
+ [CHAR LIMIT=35] -->
+ <string name="use_system_language_to_select_input_method_subtypes">Use system languages</string>
+
</resources>
diff --git a/packages/SettingsLib/src/com/android/settingslib/BatteryInfo.java b/packages/SettingsLib/src/com/android/settingslib/BatteryInfo.java
index fa1f91f..22f8856 100644
--- a/packages/SettingsLib/src/com/android/settingslib/BatteryInfo.java
+++ b/packages/SettingsLib/src/com/android/settingslib/BatteryInfo.java
@@ -38,6 +38,7 @@
public long remainingTimeUs = 0;
public String batteryPercentString;
public String remainingLabel;
+ public String statusLabel;
private BatteryStats mStats;
private boolean mCharging;
private long timePeriod;
@@ -135,6 +136,7 @@
info.batteryPercentString = Utils.formatPercentage(info.mBatteryLevel);
info.mCharging = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0;
final Resources resources = context.getResources();
+ info.statusLabel = Utils.getBatteryStatus(resources, batteryBroadcast, shortString);
if (!info.mCharging) {
final long drainTime = stats.computeBatteryTimeRemaining(elapsedRealtimeUs);
if (drainTime > 0) {
@@ -155,8 +157,6 @@
}
} else {
final long chargeTime = stats.computeChargeTimeRemaining(elapsedRealtimeUs);
- final String statusLabel = Utils.getBatteryStatus(
- resources, batteryBroadcast, shortString);
final int status = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS,
BatteryManager.BATTERY_STATUS_UNKNOWN);
if (chargeTime > 0 && status != BatteryManager.BATTERY_STATUS_FULL) {
@@ -184,9 +184,9 @@
info.mChargeLabelString = resources.getString(
resId, info.batteryPercentString, timeString);
} else {
- info.remainingLabel = statusLabel;
+ info.remainingLabel = null;
info.mChargeLabelString = resources.getString(
- R.string.power_charging, info.batteryPercentString, statusLabel);
+ R.string.power_charging, info.batteryPercentString, info.statusLabel);
}
}
return info;
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java
index 99d7f1e..49fc2ea 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java
@@ -16,6 +16,11 @@
package com.android.settingslib;
+import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_NONE;
+import static android.app.admin.DevicePolicyManager.PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.AppGlobals;
import android.app.admin.DevicePolicyManager;
@@ -29,6 +34,7 @@
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
import android.text.Spanned;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
@@ -108,47 +114,68 @@
}
/**
- * Checks if keyguard features are disabled by policy.
+ * Checks whether keyguard features are disabled by policy.
*
- * @param keyguardFeatures Could be any of keyguard features that can be
+ * @param context {@link Context} for the calling user.
+ *
+ * @param keyguardFeatures Any one of keyguard features that can be
* disabled by {@link android.app.admin.DevicePolicyManager#setKeyguardDisabledFeatures}.
+ *
+ * @param userId User to check enforced admin status for.
+ *
* @return EnforcedAdmin Object containing the enforced admin component and admin user details,
* or {@code null} If the notification features are not disabled. If the restriction is set by
* multiple admins, then the admin component will be set to {@code null} and userId to
* {@link UserHandle#USER_NULL}.
*/
public static EnforcedAdmin checkIfKeyguardFeaturesDisabled(Context context,
- int keyguardFeatures, int userId) {
- final LockSettingCheck check =
- (DevicePolicyManager dpm, ComponentName admin, @UserIdInt int checkUser) ->
- (dpm.getKeyguardDisabledFeatures(admin, checkUser) & keyguardFeatures) != 0;
+ int keyguardFeatures, final @UserIdInt int userId) {
+ final LockSettingCheck check = (dpm, admin, checkUser) -> {
+ int effectiveFeatures = dpm.getKeyguardDisabledFeatures(admin, checkUser);
+ if (checkUser != userId) {
+ effectiveFeatures &= PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER;
+ }
+ return (effectiveFeatures & keyguardFeatures) != KEYGUARD_DISABLE_FEATURES_NONE;
+ };
+ if (UserManager.get(context).getUserInfo(userId).isManagedProfile()) {
+ DevicePolicyManager dpm =
+ (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
+ return findEnforcedAdmin(dpm.getActiveAdminsAsUser(userId), dpm, userId, check);
+ }
+ return checkForLockSetting(context, userId, check);
+ }
- final DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
- Context.DEVICE_POLICY_SERVICE);
- if (dpm == null) {
+ /**
+ * Filter a set of device admins based on a predicate {@code check}. This is equivalent to
+ * {@code admins.stream().filter(check).map(x → new EnforcedAdmin(admin, userId)} except it's
+ * returning a zero/one/many-type thing.
+ *
+ * @param admins set of candidate device admins identified by {@link ComponentName}.
+ * @param userId user to create the resultant {@link EnforcedAdmin} as.
+ * @param check filter predicate.
+ *
+ * @return {@code null} if none of the {@param admins} match.
+ * An {@link EnforcedAdmin} if exactly one of the admins matches.
+ * Otherwise, {@link EnforcedAdmin#MULTIPLE_ENFORCED_ADMIN} for multiple matches.
+ */
+ @Nullable
+ private static EnforcedAdmin findEnforcedAdmin(@Nullable List<ComponentName> admins,
+ @NonNull DevicePolicyManager dpm, @UserIdInt int userId,
+ @NonNull LockSettingCheck check) {
+ if (admins == null) {
return null;
}
-
- final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
- if (um.getUserInfo(userId).isManagedProfile()) {
- final List<ComponentName> admins = dpm.getActiveAdminsAsUser(userId);
- if (admins == null) {
- return null;
- }
- EnforcedAdmin enforcedAdmin = null;
- for (ComponentName admin : admins) {
- if (check.isEnforcing(dpm, admin, userId)) {
- if (enforcedAdmin == null) {
- enforcedAdmin = new EnforcedAdmin(admin, userId);
- } else {
- return EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN;
- }
+ EnforcedAdmin enforcedAdmin = null;
+ for (ComponentName admin : admins) {
+ if (check.isEnforcing(dpm, admin, userId)) {
+ if (enforcedAdmin == null) {
+ enforcedAdmin = new EnforcedAdmin(admin, userId);
+ } else {
+ return EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN;
}
}
- return enforcedAdmin;
- } else {
- return checkForLockSetting(context, userId, check);
}
+ return enforcedAdmin;
}
public static EnforcedAdmin checkIfUninstallBlocked(Context context,
@@ -361,7 +388,7 @@
}
LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
- if (lockPatternUtils.isSeparateProfileChallengeEnabled(userId)) {
+ if (sProxy.isSeparateProfileChallengeEnabled(lockPatternUtils, userId)) {
// userId is managed profile and has a separate challenge, only consider
// the admins in that user.
final List<ComponentName> admins = dpm.getActiveAdminsAsUser(userId);
@@ -428,7 +455,7 @@
if (userInfo.isManagedProfile()) {
// If userInfo.id is a managed profile, we also need to look at
// the policies set on the parent.
- final DevicePolicyManager parentDpm = dpm.getParentProfileInstance(userInfo);
+ DevicePolicyManager parentDpm = sProxy.getParentProfileInstance(dpm, userInfo);
if (parentDpm.getMaximumTimeToLock(admin, userInfo.id) > 0) {
if (enforcedAdmin == null) {
enforcedAdmin = new EnforcedAdmin(admin, userInfo.id);
@@ -448,8 +475,9 @@
/**
* Checks whether any of the user's profiles enforce the lock setting. A managed profile is only
- * included if it does not have a separate challenege but the settings for it's parent (i.e. the
- * user being checked) are always included.
+ * included if it does not have a separate challenge.
+ *
+ * The user identified by {@param userId} is always included.
*/
private static EnforcedAdmin checkForLockSetting(
Context context, @UserIdInt int userId, LockSettingCheck check) {
@@ -468,7 +496,7 @@
continue;
}
final boolean isSeparateProfileChallengeEnabled =
- lockPatternUtils.isSeparateProfileChallengeEnabled(userInfo.id);
+ sProxy.isSeparateProfileChallengeEnabled(lockPatternUtils, userInfo.id);
for (ComponentName admin : admins) {
if (!isSeparateProfileChallengeEnabled) {
if (check.isEnforcing(dpm, admin, userInfo.id)) {
@@ -487,7 +515,7 @@
if (userInfo.isManagedProfile()) {
// If userInfo.id is a managed profile, we also need to look at
// the policies set on the parent.
- final DevicePolicyManager parentDpm = dpm.getParentProfileInstance(userInfo);
+ DevicePolicyManager parentDpm = sProxy.getParentProfileInstance(dpm, userInfo);
if (check.isEnforcing(parentDpm, admin, userInfo.id)) {
if (enforcedAdmin == null) {
enforcedAdmin = new EnforcedAdmin(admin, userInfo.id);
@@ -733,4 +761,23 @@
other.userId = userId;
}
}
+
+ /**
+ * Static {@link LockPatternUtils} and {@link DevicePolicyManager} wrapper for testing purposes.
+ * {@link LockPatternUtils} is an internal API not supported by robolectric.
+ * {@link DevicePolicyManager} has a {@code getProfileParent} not yet suppored by robolectric.
+ */
+ @VisibleForTesting
+ static Proxy sProxy = new Proxy();
+
+ @VisibleForTesting
+ static class Proxy {
+ public boolean isSeparateProfileChallengeEnabled(LockPatternUtils utils, int userHandle) {
+ return utils.isSeparateProfileChallengeEnabled(userHandle);
+ }
+
+ public DevicePolicyManager getParentProfileInstance(DevicePolicyManager dpm, UserInfo ui) {
+ return dpm.getParentProfileInstance(ui);
+ }
+ }
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/TronUtils.java b/packages/SettingsLib/src/com/android/settingslib/TronUtils.java
index 1d9d03a..bea6e8f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/TronUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/TronUtils.java
@@ -16,7 +16,7 @@
package com.android.settingslib;
import android.content.Context;
-import android.net.ScoredNetwork;
+import android.net.NetworkBadging;
import com.android.internal.logging.MetricsLogger;
@@ -34,7 +34,7 @@
*
* @param context Context
* @param histogram the Tron histogram name to write to
- * @param badgeEnum the {@link ScoredNetwork.Badging} badge value
+ * @param badgeEnum the {@link NetworkBadging.Badging} badge value
* @throws IllegalArgumentException if the given badge enum is not supported
*/
private static void logNetworkBadgeMetric(
@@ -42,16 +42,16 @@
throws IllegalArgumentException {
int bucket;
switch (badgeEnum) {
- case ScoredNetwork.BADGING_NONE:
+ case NetworkBadging.BADGING_NONE:
bucket = 0;
break;
- case ScoredNetwork.BADGING_SD:
+ case NetworkBadging.BADGING_SD:
bucket = 1;
break;
- case ScoredNetwork.BADGING_HD:
+ case NetworkBadging.BADGING_HD:
bucket = 2;
break;
- case ScoredNetwork.BADGING_4K:
+ case NetworkBadging.BADGING_4K:
bucket = 3;
break;
default:
diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java
index 11e2a71..7e7b391 100644
--- a/packages/SettingsLib/src/com/android/settingslib/Utils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java
@@ -17,7 +17,7 @@
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.net.ConnectivityManager;
-import android.net.ScoredNetwork;
+import android.net.NetworkBadging;
import android.os.BatteryManager;
import android.os.UserManager;
import android.print.PrintManager;
@@ -112,6 +112,12 @@
UserIcons.getDefaultUserIcon(user.id, /* light= */ false)).bake();
}
+ /** Formats a double from 0.0..100.0 with an option to round **/
+ public static String formatPercentage(double percentage, boolean round) {
+ final int localPercentage = round ? Math.round((float) percentage) : (int) percentage;
+ return formatPercentage(localPercentage);
+ }
+
/** Formats the ratio of amount/total as a percentage. */
public static String formatPercentage(long amount, long total) {
return formatPercentage(((double) amount) / total);
@@ -124,7 +130,7 @@
/** Formats a double from 0.0..1.0 as a percentage. */
private static String formatPercentage(double percentage) {
- return NumberFormat.getPercentInstance().format(percentage);
+ return NumberFormat.getPercentInstance().format(percentage);
}
public static int getBatteryLevel(Intent batteryChangedIntent) {
@@ -178,10 +184,7 @@
@ColorInt
public static int getColorError(Context context) {
- TypedArray ta = context.obtainStyledAttributes(new int[]{android.R.attr.textColorError});
- @ColorInt int colorError = ta.getColor(0, 0);
- ta.recycle();
- return colorError;
+ return getColorAttr(context, android.R.attr.colorError);
}
@ColorInt
@@ -215,6 +218,13 @@
return colorAccent;
}
+ public static Drawable getDrawable(Context context, int attr) {
+ TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
+ Drawable drawable = ta.getDrawable(0);
+ ta.recycle();
+ return drawable;
+ }
+
/**
* Determine whether a package is a "system package", in which case certain things (like
* disabling notifications or disabling the package altogether) should be disallowed.
@@ -297,13 +307,13 @@
*/
public static int getWifiBadgeResource(int badge) {
switch (badge) {
- case ScoredNetwork.BADGING_NONE:
+ case NetworkBadging.BADGING_NONE:
return View.NO_ID;
- case ScoredNetwork.BADGING_SD:
+ case NetworkBadging.BADGING_SD:
return com.android.internal.R.drawable.ic_signal_wifi_badged_sd;
- case ScoredNetwork.BADGING_HD:
+ case NetworkBadging.BADGING_HD:
return com.android.internal.R.drawable.ic_signal_wifi_badged_hd;
- case ScoredNetwork.BADGING_4K:
+ case NetworkBadging.BADGING_4K:
return com.android.internal.R.drawable.ic_signal_wifi_badged_4k;
default:
throw new IllegalArgumentException(
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java b/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java
index f6d9134..7f7249f0 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java
@@ -19,9 +19,11 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.hardware.usb.IUsbManager;
import android.os.RemoteException;
+import android.os.SystemProperties;
import android.os.UserHandle;
import android.util.Log;
@@ -68,4 +70,29 @@
return prefActList.size() > 0;
}
+ /**
+ * Returns a boolean indicating whether the given package should be considered an instant app
+ */
+ public static boolean isInstant(ApplicationInfo info) {
+ if (info.isInstantApp()) {
+ return true;
+ }
+
+ // For debugging/testing, we support setting the following property to a comma-separated
+ // list of search terms (typically, but not necessarily, full package names) to match
+ // against the package names of the app.
+ String propVal = SystemProperties.get("settingsdebug.instant.packages");
+ if (propVal != null && !propVal.isEmpty() && info.packageName != null) {
+ String[] searchTerms = propVal.split(",");
+ if (searchTerms != null) {
+ for (String term : searchTerms) {
+ if (info.packageName.contains(term)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
index 1f03b51..fda3914 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
@@ -98,6 +98,7 @@
boolean mResumed;
boolean mHaveDisabledApps;
+ boolean mHaveInstantApps;
// Information about all applications. Synchronize on mEntriesMap
// to protect access to these.
@@ -212,6 +213,7 @@
}
mHaveDisabledApps = false;
+ mHaveInstantApps = false;
for (int i=0; i<mApplications.size(); i++) {
final ApplicationInfo info = mApplications.get(i);
// Need to trim out any applications that are disabled by
@@ -224,6 +226,10 @@
}
mHaveDisabledApps = true;
}
+ if (!mHaveInstantApps && AppUtils.isInstant(info)) {
+ mHaveInstantApps = true;
+ }
+
int userId = UserHandle.getUserId(info.uid);
final AppEntry entry = mEntriesMap.get(userId).get(info.packageName);
if (entry != null) {
@@ -250,6 +256,9 @@
public boolean haveDisabledApps() {
return mHaveDisabledApps;
}
+ public boolean haveInstantApps() {
+ return mHaveInstantApps;
+ }
void doPauseIfNeededLocked() {
if (!mResumed) {
@@ -379,6 +388,9 @@
}
mHaveDisabledApps = true;
}
+ if (AppUtils.isInstant(info)) {
+ mHaveInstantApps = true;
+ }
mApplications.add(info);
if (!mBackgroundHandler.hasMessages(BackgroundHandler.MSG_LOAD_ENTRIES)) {
mBackgroundHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ENTRIES);
@@ -408,13 +420,22 @@
mApplications.remove(idx);
if (!info.enabled) {
mHaveDisabledApps = false;
- for (int i=0; i<mApplications.size(); i++) {
- if (!mApplications.get(i).enabled) {
+ for (ApplicationInfo otherInfo : mApplications) {
+ if (!otherInfo.enabled) {
mHaveDisabledApps = true;
break;
}
}
}
+ if (AppUtils.isInstant(info)) {
+ mHaveInstantApps = false;
+ for (ApplicationInfo otherInfo : mApplications) {
+ if (AppUtils.isInstant(otherInfo)) {
+ mHaveInstantApps = true;
+ break;
+ }
+ }
+ }
if (!mMainHandler.hasMessages(MainHandler.MSG_PACKAGE_LIST_CHANGED)) {
mMainHandler.sendEmptyMessage(MainHandler.MSG_PACKAGE_LIST_CHANGED);
}
@@ -1290,6 +1311,7 @@
public static final AppFilter FILTER_PERSONAL = new AppFilter() {
private int mCurrentUser;
+ @Override
public void init() {
mCurrentUser = ActivityManager.getCurrentUser();
}
@@ -1301,8 +1323,9 @@
};
public static final AppFilter FILTER_WITHOUT_DISABLED_UNTIL_USED = new AppFilter() {
+ @Override
public void init() {
- // do nothings
+ // do nothing
}
@Override
@@ -1315,6 +1338,7 @@
public static final AppFilter FILTER_WORK = new AppFilter() {
private int mCurrentUser;
+ @Override
public void init() {
mCurrentUser = ActivityManager.getCurrentUser();
}
@@ -1329,6 +1353,7 @@
* Displays a combined list with "downloaded" and "visible in launcher" apps only.
*/
public static final AppFilter FILTER_DOWNLOADED_AND_LAUNCHER = new AppFilter() {
+ @Override
public void init() {
}
@@ -1348,6 +1373,7 @@
};
public static final AppFilter FILTER_THIRD_PARTY = new AppFilter() {
+ @Override
public void init() {
}
@@ -1363,26 +1389,40 @@
};
public static final AppFilter FILTER_DISABLED = new AppFilter() {
+ @Override
public void init() {
}
@Override
public boolean filterApp(AppEntry entry) {
- return !entry.info.enabled;
+ return !entry.info.enabled && !AppUtils.isInstant(entry.info);
+ }
+ };
+
+ public static final AppFilter FILTER_INSTANT = new AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(AppEntry entry) {
+ return AppUtils.isInstant(entry.info);
}
};
public static final AppFilter FILTER_ALL_ENABLED = new AppFilter() {
+ @Override
public void init() {
}
@Override
public boolean filterApp(AppEntry entry) {
- return entry.info.enabled;
+ return entry.info.enabled && !AppUtils.isInstant(entry.info);
}
};
public static final AppFilter FILTER_EVERYTHING = new AppFilter() {
+ @Override
public void init() {
}
@@ -1393,6 +1433,7 @@
};
public static final AppFilter FILTER_WITH_DOMAIN_URLS = new AppFilter() {
+ @Override
public void init() {
}
@@ -1405,6 +1446,7 @@
public static final AppFilter FILTER_NOT_HIDE = new AppFilter() {
private String[] mHidePackageNames;
+ @Override
public void init(Context context) {
mHidePackageNames = context.getResources()
.getStringArray(R.array.config_hideWhenDisabled_packageNames);
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
index 2b482fd..fc1a3a9 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
@@ -2,6 +2,7 @@
import android.content.Context;
import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceScreen;
import java.util.List;
@@ -73,9 +74,27 @@
* Removes preference from screen.
*/
protected final void removePreference(PreferenceScreen screen, String key) {
- Preference pref = screen.findPreference(key);
- if (pref != null) {
- screen.removePreference(pref);
- }
+ findAndRemovePreference(screen, key);
}
+
+ // finds the preference recursively and removes it from its parent
+ private boolean findAndRemovePreference(PreferenceGroup prefGroup, String key) {
+ final int preferenceCount = prefGroup.getPreferenceCount();
+ for (int i = 0; i < preferenceCount; i++) {
+ final Preference preference = prefGroup.getPreference(i);
+ final String curKey = preference.getKey();
+
+ if (curKey != null && curKey.equals(key)) {
+ return prefGroup.removePreference(preference);
+ }
+
+ if (preference instanceof PreferenceGroup) {
+ if (findAndRemovePreference((PreferenceGroup) preference, key)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
index 9ad0b3e..a8cab17 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
@@ -465,8 +465,7 @@
}
boolean isNavDrawerEnabled() {
- return !isDashboardFeatureEnabled()
- || getResources().getBoolean(R.bool.config_enable_nav_drawer);
+ return getResources().getBoolean(R.bool.config_enable_nav_drawer);
}
private class PackageReceiver extends BroadcastReceiver {
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java b/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java
index 6e10aab..f31c09b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java
@@ -33,7 +33,6 @@
import android.os.UserManager;
import android.provider.Settings.Global;
import android.text.TextUtils;
-import android.util.ArrayMap;
import android.util.Log;
import android.util.Pair;
@@ -353,10 +352,7 @@
CharSequence title = null;
String summary = null;
String keyHint = null;
- String uriString = null;
Uri uri = null;
- // Several resources can be using the same provider. Only acquire a single provider.
- Map<String, IContentProvider> providerMap = new ArrayMap<>();
// Get the activity's meta-data
try {
@@ -365,11 +361,7 @@
Bundle metaData = activityInfo.metaData;
if (res != null && metaData != null) {
- if (metaData.containsKey(META_DATA_PREFERENCE_ICON_URI)) {
- iconFromUri = getIconFromUri(context, activityInfo.packageName,
- metaData.getString(META_DATA_PREFERENCE_ICON_URI), providerMap);
- }
- if (iconFromUri == null && metaData.containsKey(META_DATA_PREFERENCE_ICON)) {
+ if (metaData.containsKey(META_DATA_PREFERENCE_ICON)) {
icon = metaData.getInt(META_DATA_PREFERENCE_ICON);
}
if (metaData.containsKey(META_DATA_PREFERENCE_TITLE)) {
@@ -379,13 +371,7 @@
title = metaData.getString(META_DATA_PREFERENCE_TITLE);
}
}
- if (metaData.containsKey(META_DATA_PREFERENCE_SUMMARY_URI)) {
- summary = getTextFromUri(context,
- metaData.getString(META_DATA_PREFERENCE_SUMMARY_URI), providerMap,
- META_DATA_PREFERENCE_SUMMARY);
- }
- if (TextUtils.isEmpty(summary)
- && metaData.containsKey(META_DATA_PREFERENCE_SUMMARY)) {
+ if (metaData.containsKey(META_DATA_PREFERENCE_SUMMARY)) {
if (metaData.get(META_DATA_PREFERENCE_SUMMARY) instanceof Integer) {
summary = res.getString(metaData.getInt(META_DATA_PREFERENCE_SUMMARY));
} else {
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
index fd2e7ca..6764a6b 100755
--- a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
@@ -29,7 +29,8 @@
import android.graphics.RectF;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
-import android.provider.Settings;
+import android.util.TypedValue;
+
import com.android.settingslib.R;
import com.android.settingslib.Utils;
@@ -97,9 +98,13 @@
final int N = levels.length();
mColors = new int[2 * N];
- for (int i = 0; i < N; i++) {
+ for (int i=0; i < N; i++) {
mColors[2 * i] = levels.getInt(i, 0);
- mColors[2 * i + 1] = colors.getColor(i, 0);
+ if (colors.getType(i) == TypedValue.TYPE_ATTRIBUTE) {
+ mColors[2 * i + 1] = Utils.getColorAttr(context, colors.getResourceId(i, 0));
+ } else {
+ mColors[2 * i + 1] = colors.getColor(i, 0);
+ }
}
levels.recycle();
colors.recycle();
diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeEnablerManager.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeEnablerManager.java
new file mode 100644
index 0000000..c9e3475
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeEnablerManager.java
@@ -0,0 +1,263 @@
+/*
+ * 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.settingslib.inputmethod;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.res.Configuration;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceCategory;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.preference.TwoStatePreference;
+import android.text.TextUtils;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
+
+import com.android.settingslib.R;
+
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class InputMethodAndSubtypeEnablerManager implements Preference.OnPreferenceChangeListener {
+
+ private final PreferenceFragment mFragment;
+
+ private boolean mHaveHardKeyboard;
+ private final HashMap<String, List<Preference>> mInputMethodAndSubtypePrefsMap =
+ new HashMap<>();
+ private final HashMap<String, TwoStatePreference> mAutoSelectionPrefsMap = new HashMap<>();
+ private InputMethodManager mImm;
+ // TODO: Change mInputMethodInfoList to Map
+ private List<InputMethodInfo> mInputMethodInfoList;
+ private final Collator mCollator = Collator.getInstance();
+
+ public InputMethodAndSubtypeEnablerManager(PreferenceFragment fragment) {
+ mFragment = fragment;
+ mImm = fragment.getContext().getSystemService(InputMethodManager.class);
+
+ mInputMethodInfoList = mImm.getInputMethodList();
+ }
+
+ public void init(PreferenceFragment fragment, String targetImi, PreferenceScreen root) {
+ final Configuration config = fragment.getResources().getConfiguration();
+ mHaveHardKeyboard = (config.keyboard == Configuration.KEYBOARD_QWERTY);
+
+ for (final InputMethodInfo imi : mInputMethodInfoList) {
+ // Add subtype preferences of this IME when it is specified or no IME is specified.
+ if (imi.getId().equals(targetImi) || TextUtils.isEmpty(targetImi)) {
+ addInputMethodSubtypePreferences(fragment, imi, root);
+ }
+ }
+ }
+
+ public void refresh(Context context, PreferenceFragment fragment) {
+ // Refresh internal states in mInputMethodSettingValues to keep the latest
+ // "InputMethodInfo"s and "InputMethodSubtype"s
+ InputMethodSettingValuesWrapper
+ .getInstance(context).refreshAllInputMethodAndSubtypes();
+ InputMethodAndSubtypeUtil.loadInputMethodSubtypeList(fragment, context.getContentResolver(),
+ mInputMethodInfoList, mInputMethodAndSubtypePrefsMap);
+ updateAutoSelectionPreferences();
+ }
+
+ public void save(Context context, PreferenceFragment fragment) {
+ InputMethodAndSubtypeUtil.saveInputMethodSubtypeList(fragment, context.getContentResolver(),
+ mInputMethodInfoList, mHaveHardKeyboard);
+ }
+
+ @Override
+ public boolean onPreferenceChange(final Preference pref, final Object newValue) {
+ if (!(newValue instanceof Boolean)) {
+ return true; // Invoke default behavior.
+ }
+ final boolean isChecking = (Boolean) newValue;
+ for (final String imiId : mAutoSelectionPrefsMap.keySet()) {
+ // An auto select subtype preference is changing.
+ if (mAutoSelectionPrefsMap.get(imiId) == pref) {
+ final TwoStatePreference autoSelectionPref = (TwoStatePreference) pref;
+ autoSelectionPref.setChecked(isChecking);
+ // Enable or disable subtypes depending on the auto selection preference.
+ setAutoSelectionSubtypesEnabled(imiId, autoSelectionPref.isChecked());
+ return false;
+ }
+ }
+ // A subtype preference is changing.
+ if (pref instanceof InputMethodSubtypePreference) {
+ final InputMethodSubtypePreference subtypePref = (InputMethodSubtypePreference) pref;
+ subtypePref.setChecked(isChecking);
+ if (!subtypePref.isChecked()) {
+ // It takes care of the case where no subtypes are explicitly enabled then the auto
+ // selection preference is going to be checked.
+ updateAutoSelectionPreferences();
+ }
+ return false;
+ }
+ return true; // Invoke default behavior.
+ }
+
+ private void addInputMethodSubtypePreferences(PreferenceFragment fragment, InputMethodInfo imi,
+ final PreferenceScreen root) {
+ Context prefContext = fragment.getPreferenceManager().getContext();
+
+ final int subtypeCount = imi.getSubtypeCount();
+ if (subtypeCount <= 1) {
+ return;
+ }
+ final String imiId = imi.getId();
+ final PreferenceCategory keyboardSettingsCategory =
+ new PreferenceCategory(prefContext);
+ root.addPreference(keyboardSettingsCategory);
+ final PackageManager pm = prefContext.getPackageManager();
+ final CharSequence label = imi.loadLabel(pm);
+
+ keyboardSettingsCategory.setTitle(label);
+ keyboardSettingsCategory.setKey(imiId);
+ // TODO: Use toggle Preference if images are ready.
+ final TwoStatePreference autoSelectionPref =
+ new SwitchWithNoTextPreference(prefContext);
+ mAutoSelectionPrefsMap.put(imiId, autoSelectionPref);
+ keyboardSettingsCategory.addPreference(autoSelectionPref);
+ autoSelectionPref.setOnPreferenceChangeListener(this);
+
+ final PreferenceCategory activeInputMethodsCategory =
+ new PreferenceCategory(prefContext);
+ activeInputMethodsCategory.setTitle(R.string.active_input_method_subtypes);
+ root.addPreference(activeInputMethodsCategory);
+
+ CharSequence autoSubtypeLabel = null;
+ final ArrayList<Preference> subtypePreferences = new ArrayList<>();
+ for (int index = 0; index < subtypeCount; ++index) {
+ final InputMethodSubtype subtype = imi.getSubtypeAt(index);
+ if (subtype.overridesImplicitlyEnabledSubtype()) {
+ if (autoSubtypeLabel == null) {
+ autoSubtypeLabel = InputMethodAndSubtypeUtil.getSubtypeLocaleNameAsSentence(
+ subtype, prefContext, imi);
+ }
+ } else {
+ final Preference subtypePref = new InputMethodSubtypePreference(
+ prefContext, subtype, imi);
+ subtypePreferences.add(subtypePref);
+ }
+ }
+ subtypePreferences.sort((lhs, rhs) -> {
+ if (lhs instanceof InputMethodSubtypePreference) {
+ return ((InputMethodSubtypePreference) lhs).compareTo(rhs, mCollator);
+ }
+ return lhs.compareTo(rhs);
+ });
+ for (final Preference pref : subtypePreferences) {
+ activeInputMethodsCategory.addPreference(pref);
+ pref.setOnPreferenceChangeListener(this);
+ InputMethodAndSubtypeUtil.removeUnnecessaryNonPersistentPreference(pref);
+ }
+ mInputMethodAndSubtypePrefsMap.put(imiId, subtypePreferences);
+ if (TextUtils.isEmpty(autoSubtypeLabel)) {
+ autoSelectionPref.setTitle(
+ R.string.use_system_language_to_select_input_method_subtypes);
+ } else {
+ autoSelectionPref.setTitle(autoSubtypeLabel);
+ }
+ }
+
+ private boolean isNoSubtypesExplicitlySelected(final String imiId) {
+ final List<Preference> subtypePrefs = mInputMethodAndSubtypePrefsMap.get(imiId);
+ for (final Preference pref : subtypePrefs) {
+ if (pref instanceof TwoStatePreference && ((TwoStatePreference) pref).isChecked()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void setAutoSelectionSubtypesEnabled(final String imiId,
+ final boolean autoSelectionEnabled) {
+ final TwoStatePreference autoSelectionPref = mAutoSelectionPrefsMap.get(imiId);
+ if (autoSelectionPref == null) {
+ return;
+ }
+ autoSelectionPref.setChecked(autoSelectionEnabled);
+ final List<Preference> subtypePrefs = mInputMethodAndSubtypePrefsMap.get(imiId);
+ for (final Preference pref : subtypePrefs) {
+ if (pref instanceof TwoStatePreference) {
+ // When autoSelectionEnabled is true, all subtype prefs need to be disabled with
+ // implicitly checked subtypes. In case of false, all subtype prefs need to be
+ // enabled.
+ pref.setEnabled(!autoSelectionEnabled);
+ if (autoSelectionEnabled) {
+ ((TwoStatePreference) pref).setChecked(false);
+ }
+ }
+ }
+ if (autoSelectionEnabled) {
+ InputMethodAndSubtypeUtil.saveInputMethodSubtypeList(
+ mFragment, mFragment.getContext().getContentResolver(),
+ mInputMethodInfoList, mHaveHardKeyboard);
+ updateImplicitlyEnabledSubtypes(imiId);
+ }
+ }
+
+ private void updateImplicitlyEnabledSubtypes(final String targetImiId) {
+ // When targetImiId is null, apply to all subtypes of all IMEs
+ for (final InputMethodInfo imi : mInputMethodInfoList) {
+ final String imiId = imi.getId();
+ final TwoStatePreference autoSelectionPref = mAutoSelectionPrefsMap.get(imiId);
+ // No need to update implicitly enabled subtypes when the user has unchecked the
+ // "subtype auto selection".
+ if (autoSelectionPref == null || !autoSelectionPref.isChecked()) {
+ continue;
+ }
+ if (imiId.equals(targetImiId) || targetImiId == null) {
+ updateImplicitlyEnabledSubtypesOf(imi);
+ }
+ }
+ }
+
+ private void updateImplicitlyEnabledSubtypesOf(final InputMethodInfo imi) {
+ final String imiId = imi.getId();
+ final List<Preference> subtypePrefs = mInputMethodAndSubtypePrefsMap.get(imiId);
+ final List<InputMethodSubtype> implicitlyEnabledSubtypes =
+ mImm.getEnabledInputMethodSubtypeList(imi, true);
+ if (subtypePrefs == null || implicitlyEnabledSubtypes == null) {
+ return;
+ }
+ for (final Preference pref : subtypePrefs) {
+ if (!(pref instanceof TwoStatePreference)) {
+ continue;
+ }
+ final TwoStatePreference subtypePref = (TwoStatePreference) pref;
+ subtypePref.setChecked(false);
+ for (final InputMethodSubtype subtype : implicitlyEnabledSubtypes) {
+ final String implicitlyEnabledSubtypePrefKey = imiId + subtype.hashCode();
+ if (subtypePref.getKey().equals(implicitlyEnabledSubtypePrefKey)) {
+ subtypePref.setChecked(true);
+ break;
+ }
+ }
+ }
+ }
+
+ private void updateAutoSelectionPreferences() {
+ for (final String imiId : mInputMethodAndSubtypePrefsMap.keySet()) {
+ setAutoSelectionSubtypesEnabled(imiId, isNoSubtypesExplicitlySelected(imiId));
+ }
+ updateImplicitlyEnabledSubtypes(null /* targetImiId */ /* check */);
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtil.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtil.java
new file mode 100644
index 0000000..3f6f5b5
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtil.java
@@ -0,0 +1,420 @@
+/*
+ * 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.settingslib.inputmethod;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.res.Configuration;
+import android.icu.text.ListFormatter;
+import android.provider.Settings;
+import android.provider.Settings.SettingNotFoundException;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.preference.TwoStatePreference;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodSubtype;
+
+import com.android.internal.app.LocaleHelper;
+import com.android.internal.inputmethod.InputMethodUtils;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+// TODO: Consolidate this with {@link InputMethodSettingValuesWrapper}.
+public class InputMethodAndSubtypeUtil {
+
+ private static final boolean DEBUG = false;
+ private static final String TAG = "InputMethdAndSubtypeUtl";
+
+ private static final char INPUT_METHOD_SEPARATER = ':';
+ private static final char INPUT_METHOD_SUBTYPE_SEPARATER = ';';
+ private static final int NOT_A_SUBTYPE_ID = -1;
+
+ private static final TextUtils.SimpleStringSplitter sStringInputMethodSplitter
+ = new TextUtils.SimpleStringSplitter(INPUT_METHOD_SEPARATER);
+
+ private static final TextUtils.SimpleStringSplitter sStringInputMethodSubtypeSplitter
+ = new TextUtils.SimpleStringSplitter(INPUT_METHOD_SUBTYPE_SEPARATER);
+
+ // InputMethods and subtypes are saved in the settings as follows:
+ // ime0;subtype0;subtype1:ime1;subtype0:ime2:ime3;subtype0;subtype1
+ private static String buildInputMethodsAndSubtypesString(
+ final HashMap<String, HashSet<String>> imeToSubtypesMap) {
+ final StringBuilder builder = new StringBuilder();
+ for (final String imi : imeToSubtypesMap.keySet()) {
+ if (builder.length() > 0) {
+ builder.append(INPUT_METHOD_SEPARATER);
+ }
+ final HashSet<String> subtypeIdSet = imeToSubtypesMap.get(imi);
+ builder.append(imi);
+ for (final String subtypeId : subtypeIdSet) {
+ builder.append(INPUT_METHOD_SUBTYPE_SEPARATER).append(subtypeId);
+ }
+ }
+ return builder.toString();
+ }
+
+ private static String buildInputMethodsString(final HashSet<String> imiList) {
+ final StringBuilder builder = new StringBuilder();
+ for (final String imi : imiList) {
+ if (builder.length() > 0) {
+ builder.append(INPUT_METHOD_SEPARATER);
+ }
+ builder.append(imi);
+ }
+ return builder.toString();
+ }
+
+ private static int getInputMethodSubtypeSelected(ContentResolver resolver) {
+ try {
+ return Settings.Secure.getInt(resolver,
+ Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE);
+ } catch (SettingNotFoundException e) {
+ return NOT_A_SUBTYPE_ID;
+ }
+ }
+
+ private static boolean isInputMethodSubtypeSelected(ContentResolver resolver) {
+ return getInputMethodSubtypeSelected(resolver) != NOT_A_SUBTYPE_ID;
+ }
+
+ private static void putSelectedInputMethodSubtype(ContentResolver resolver, int hashCode) {
+ Settings.Secure.putInt(resolver, Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE, hashCode);
+ }
+
+ // Needs to modify InputMethodManageService if you want to change the format of saved string.
+ private static HashMap<String, HashSet<String>> getEnabledInputMethodsAndSubtypeList(
+ ContentResolver resolver) {
+ final String enabledInputMethodsStr = Settings.Secure.getString(
+ resolver, Settings.Secure.ENABLED_INPUT_METHODS);
+ if (DEBUG) {
+ Log.d(TAG, "--- Load enabled input methods: " + enabledInputMethodsStr);
+ }
+ return parseInputMethodsAndSubtypesString(enabledInputMethodsStr);
+ }
+
+ private static HashMap<String, HashSet<String>> parseInputMethodsAndSubtypesString(
+ final String inputMethodsAndSubtypesString) {
+ final HashMap<String, HashSet<String>> subtypesMap = new HashMap<>();
+ if (TextUtils.isEmpty(inputMethodsAndSubtypesString)) {
+ return subtypesMap;
+ }
+ sStringInputMethodSplitter.setString(inputMethodsAndSubtypesString);
+ while (sStringInputMethodSplitter.hasNext()) {
+ final String nextImsStr = sStringInputMethodSplitter.next();
+ sStringInputMethodSubtypeSplitter.setString(nextImsStr);
+ if (sStringInputMethodSubtypeSplitter.hasNext()) {
+ final HashSet<String> subtypeIdSet = new HashSet<>();
+ // The first element is {@link InputMethodInfoId}.
+ final String imiId = sStringInputMethodSubtypeSplitter.next();
+ while (sStringInputMethodSubtypeSplitter.hasNext()) {
+ subtypeIdSet.add(sStringInputMethodSubtypeSplitter.next());
+ }
+ subtypesMap.put(imiId, subtypeIdSet);
+ }
+ }
+ return subtypesMap;
+ }
+
+ private static HashSet<String> getDisabledSystemIMEs(ContentResolver resolver) {
+ HashSet<String> set = new HashSet<>();
+ String disabledIMEsStr = Settings.Secure.getString(
+ resolver, Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS);
+ if (TextUtils.isEmpty(disabledIMEsStr)) {
+ return set;
+ }
+ sStringInputMethodSplitter.setString(disabledIMEsStr);
+ while(sStringInputMethodSplitter.hasNext()) {
+ set.add(sStringInputMethodSplitter.next());
+ }
+ return set;
+ }
+
+ public static void saveInputMethodSubtypeList(PreferenceFragment context,
+ ContentResolver resolver, List<InputMethodInfo> inputMethodInfos,
+ boolean hasHardKeyboard) {
+ String currentInputMethodId = Settings.Secure.getString(resolver,
+ Settings.Secure.DEFAULT_INPUT_METHOD);
+ final int selectedInputMethodSubtype = getInputMethodSubtypeSelected(resolver);
+ final HashMap<String, HashSet<String>> enabledIMEsAndSubtypesMap =
+ getEnabledInputMethodsAndSubtypeList(resolver);
+ final HashSet<String> disabledSystemIMEs = getDisabledSystemIMEs(resolver);
+
+ boolean needsToResetSelectedSubtype = false;
+ for (final InputMethodInfo imi : inputMethodInfos) {
+ final String imiId = imi.getId();
+ final Preference pref = context.findPreference(imiId);
+ if (pref == null) {
+ continue;
+ }
+ // In the choose input method screen or in the subtype enabler screen,
+ // <code>pref</code> is an instance of TwoStatePreference.
+ final boolean isImeChecked = (pref instanceof TwoStatePreference) ?
+ ((TwoStatePreference) pref).isChecked()
+ : enabledIMEsAndSubtypesMap.containsKey(imiId);
+ final boolean isCurrentInputMethod = imiId.equals(currentInputMethodId);
+ final boolean systemIme = InputMethodUtils.isSystemIme(imi);
+ if ((!hasHardKeyboard && InputMethodSettingValuesWrapper.getInstance(
+ context.getActivity()).isAlwaysCheckedIme(imi, context.getActivity()))
+ || isImeChecked) {
+ if (!enabledIMEsAndSubtypesMap.containsKey(imiId)) {
+ // imiId has just been enabled
+ enabledIMEsAndSubtypesMap.put(imiId, new HashSet<>());
+ }
+ final HashSet<String> subtypesSet = enabledIMEsAndSubtypesMap.get(imiId);
+
+ boolean subtypePrefFound = false;
+ final int subtypeCount = imi.getSubtypeCount();
+ for (int i = 0; i < subtypeCount; ++i) {
+ final InputMethodSubtype subtype = imi.getSubtypeAt(i);
+ final String subtypeHashCodeStr = String.valueOf(subtype.hashCode());
+ final TwoStatePreference subtypePref = (TwoStatePreference) context
+ .findPreference(imiId + subtypeHashCodeStr);
+ // In the Configure input method screen which does not have subtype preferences.
+ if (subtypePref == null) {
+ continue;
+ }
+ if (!subtypePrefFound) {
+ // Once subtype preference is found, subtypeSet needs to be cleared.
+ // Because of system change, hashCode value could have been changed.
+ subtypesSet.clear();
+ // If selected subtype preference is disabled, needs to reset.
+ needsToResetSelectedSubtype = true;
+ subtypePrefFound = true;
+ }
+ // Checking <code>subtypePref.isEnabled()</code> is insufficient to determine
+ // whether the user manually enabled this subtype or not. Implicitly-enabled
+ // subtypes are also checked just as an indicator to users. We also need to
+ // check <code>subtypePref.isEnabled()</code> so that only manually enabled
+ // subtypes can be saved here.
+ if (subtypePref.isEnabled() && subtypePref.isChecked()) {
+ subtypesSet.add(subtypeHashCodeStr);
+ if (isCurrentInputMethod) {
+ if (selectedInputMethodSubtype == subtype.hashCode()) {
+ // Selected subtype is still enabled, there is no need to reset
+ // selected subtype.
+ needsToResetSelectedSubtype = false;
+ }
+ }
+ } else {
+ subtypesSet.remove(subtypeHashCodeStr);
+ }
+ }
+ } else {
+ enabledIMEsAndSubtypesMap.remove(imiId);
+ if (isCurrentInputMethod) {
+ // We are processing the current input method, but found that it's not enabled.
+ // This means that the current input method has been uninstalled.
+ // If currentInputMethod is already uninstalled, InputMethodManagerService will
+ // find the applicable IME from the history and the system locale.
+ if (DEBUG) {
+ Log.d(TAG, "Current IME was uninstalled or disabled.");
+ }
+ currentInputMethodId = null;
+ }
+ }
+ // If it's a disabled system ime, add it to the disabled list so that it
+ // doesn't get enabled automatically on any changes to the package list
+ if (systemIme && hasHardKeyboard) {
+ if (disabledSystemIMEs.contains(imiId)) {
+ if (isImeChecked) {
+ disabledSystemIMEs.remove(imiId);
+ }
+ } else {
+ if (!isImeChecked) {
+ disabledSystemIMEs.add(imiId);
+ }
+ }
+ }
+ }
+
+ final String enabledIMEsAndSubtypesString = buildInputMethodsAndSubtypesString(
+ enabledIMEsAndSubtypesMap);
+ final String disabledSystemIMEsString = buildInputMethodsString(disabledSystemIMEs);
+ if (DEBUG) {
+ Log.d(TAG, "--- Save enabled inputmethod settings. :" + enabledIMEsAndSubtypesString);
+ Log.d(TAG, "--- Save disabled system inputmethod settings. :"
+ + disabledSystemIMEsString);
+ Log.d(TAG, "--- Save default inputmethod settings. :" + currentInputMethodId);
+ Log.d(TAG, "--- Needs to reset the selected subtype :" + needsToResetSelectedSubtype);
+ Log.d(TAG, "--- Subtype is selected :" + isInputMethodSubtypeSelected(resolver));
+ }
+
+ // Redefines SelectedSubtype when all subtypes are unchecked or there is no subtype
+ // selected. And if the selected subtype of the current input method was disabled,
+ // We should reset the selected input method's subtype.
+ if (needsToResetSelectedSubtype || !isInputMethodSubtypeSelected(resolver)) {
+ if (DEBUG) {
+ Log.d(TAG, "--- Reset inputmethod subtype because it's not defined.");
+ }
+ putSelectedInputMethodSubtype(resolver, NOT_A_SUBTYPE_ID);
+ }
+
+ Settings.Secure.putString(resolver,
+ Settings.Secure.ENABLED_INPUT_METHODS, enabledIMEsAndSubtypesString);
+ if (disabledSystemIMEsString.length() > 0) {
+ Settings.Secure.putString(resolver, Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS,
+ disabledSystemIMEsString);
+ }
+ // If the current input method is unset, InputMethodManagerService will find the applicable
+ // IME from the history and the system locale.
+ Settings.Secure.putString(resolver, Settings.Secure.DEFAULT_INPUT_METHOD,
+ currentInputMethodId != null ? currentInputMethodId : "");
+ }
+
+ public static void loadInputMethodSubtypeList(final PreferenceFragment context,
+ final ContentResolver resolver, final List<InputMethodInfo> inputMethodInfos,
+ final Map<String, List<Preference>> inputMethodPrefsMap) {
+ final HashMap<String, HashSet<String>> enabledSubtypes =
+ getEnabledInputMethodsAndSubtypeList(resolver);
+
+ for (final InputMethodInfo imi : inputMethodInfos) {
+ final String imiId = imi.getId();
+ final Preference pref = context.findPreference(imiId);
+ if (pref instanceof TwoStatePreference) {
+ final TwoStatePreference subtypePref = (TwoStatePreference) pref;
+ final boolean isEnabled = enabledSubtypes.containsKey(imiId);
+ subtypePref.setChecked(isEnabled);
+ if (inputMethodPrefsMap != null) {
+ for (final Preference childPref: inputMethodPrefsMap.get(imiId)) {
+ childPref.setEnabled(isEnabled);
+ }
+ }
+ setSubtypesPreferenceEnabled(context, inputMethodInfos, imiId, isEnabled);
+ }
+ }
+ updateSubtypesPreferenceChecked(context, inputMethodInfos, enabledSubtypes);
+ }
+
+ private static void setSubtypesPreferenceEnabled(final PreferenceFragment context,
+ final List<InputMethodInfo> inputMethodProperties, final String id,
+ final boolean enabled) {
+ final PreferenceScreen preferenceScreen = context.getPreferenceScreen();
+ for (final InputMethodInfo imi : inputMethodProperties) {
+ if (id.equals(imi.getId())) {
+ final int subtypeCount = imi.getSubtypeCount();
+ for (int i = 0; i < subtypeCount; ++i) {
+ final InputMethodSubtype subtype = imi.getSubtypeAt(i);
+ final TwoStatePreference pref = (TwoStatePreference) preferenceScreen
+ .findPreference(id + subtype.hashCode());
+ if (pref != null) {
+ pref.setEnabled(enabled);
+ }
+ }
+ }
+ }
+ }
+
+ private static void updateSubtypesPreferenceChecked(final PreferenceFragment context,
+ final List<InputMethodInfo> inputMethodProperties,
+ final HashMap<String, HashSet<String>> enabledSubtypes) {
+ final PreferenceScreen preferenceScreen = context.getPreferenceScreen();
+ for (final InputMethodInfo imi : inputMethodProperties) {
+ final String id = imi.getId();
+ if (!enabledSubtypes.containsKey(id)) {
+ // There is no need to enable/disable subtypes of disabled IMEs.
+ continue;
+ }
+ final HashSet<String> enabledSubtypesSet = enabledSubtypes.get(id);
+ final int subtypeCount = imi.getSubtypeCount();
+ for (int i = 0; i < subtypeCount; ++i) {
+ final InputMethodSubtype subtype = imi.getSubtypeAt(i);
+ final String hashCode = String.valueOf(subtype.hashCode());
+ if (DEBUG) {
+ Log.d(TAG, "--- Set checked state: " + "id" + ", " + hashCode + ", "
+ + enabledSubtypesSet.contains(hashCode));
+ }
+ final TwoStatePreference pref = (TwoStatePreference) preferenceScreen
+ .findPreference(id + hashCode);
+ if (pref != null) {
+ pref.setChecked(enabledSubtypesSet.contains(hashCode));
+ }
+ }
+ }
+ }
+
+ public static void removeUnnecessaryNonPersistentPreference(final Preference pref) {
+ final String key = pref.getKey();
+ if (pref.isPersistent() || key == null) {
+ return;
+ }
+ final SharedPreferences prefs = pref.getSharedPreferences();
+ if (prefs != null && prefs.contains(key)) {
+ prefs.edit().remove(key).apply();
+ }
+ }
+
+ @NonNull
+ public static String getSubtypeLocaleNameAsSentence(@Nullable InputMethodSubtype subtype,
+ @NonNull final Context context, @NonNull final InputMethodInfo inputMethodInfo) {
+ if (subtype == null) {
+ return "";
+ }
+ final Locale locale = getDisplayLocale(context);
+ final CharSequence subtypeName = subtype.getDisplayName(context,
+ inputMethodInfo.getPackageName(), inputMethodInfo.getServiceInfo()
+ .applicationInfo);
+ return LocaleHelper.toSentenceCase(subtypeName.toString(), locale);
+ }
+
+ @NonNull
+ public static String getSubtypeLocaleNameListAsSentence(
+ @NonNull final List<InputMethodSubtype> subtypes, @NonNull final Context context,
+ @NonNull final InputMethodInfo inputMethodInfo) {
+ if (subtypes.isEmpty()) {
+ return "";
+ }
+ final Locale locale = getDisplayLocale(context);
+ final int subtypeCount = subtypes.size();
+ final CharSequence[] subtypeNames = new CharSequence[subtypeCount];
+ for (int i = 0; i < subtypeCount; i++) {
+ subtypeNames[i] = subtypes.get(i).getDisplayName(context,
+ inputMethodInfo.getPackageName(), inputMethodInfo.getServiceInfo()
+ .applicationInfo);
+ }
+ return LocaleHelper.toSentenceCase(
+ ListFormatter.getInstance(locale).format(subtypeNames), locale);
+ }
+
+ @NonNull
+ private static Locale getDisplayLocale(@Nullable final Context context) {
+ if (context == null) {
+ return Locale.getDefault();
+ }
+ if (context.getResources() == null) {
+ return Locale.getDefault();
+ }
+ final Configuration configuration = context.getResources().getConfiguration();
+ if (configuration == null) {
+ return Locale.getDefault();
+ }
+ final Locale configurationLocale = configuration.getLocales().get(0);
+ if (configurationLocale == null) {
+ return Locale.getDefault();
+ }
+ return configurationLocale;
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java
new file mode 100644
index 0000000..fac50bd
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java
@@ -0,0 +1,185 @@
+/*
+ * 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.settingslib.inputmethod;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.os.RemoteException;
+import android.util.Log;
+import android.util.Slog;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
+
+import com.android.internal.inputmethod.InputMethodUtils;
+import com.android.internal.inputmethod.InputMethodUtils.InputMethodSettings;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * This class is a wrapper for InputMethodSettings. You need to refresh internal states
+ * manually on some events when "InputMethodInfo"s and "InputMethodSubtype"s can be
+ * changed.
+ */
+// TODO: Consolidate this with {@link InputMethodAndSubtypeUtil}.
+public class InputMethodSettingValuesWrapper {
+ private static final String TAG = InputMethodSettingValuesWrapper.class.getSimpleName();
+
+ private static volatile InputMethodSettingValuesWrapper sInstance;
+ private final ArrayList<InputMethodInfo> mMethodList = new ArrayList<>();
+ private final HashMap<String, InputMethodInfo> mMethodMap = new HashMap<>();
+ private final InputMethodSettings mSettings;
+ private final InputMethodManager mImm;
+ private final HashSet<InputMethodInfo> mAsciiCapableEnabledImis = new HashSet<>();
+
+ public static InputMethodSettingValuesWrapper getInstance(Context context) {
+ if (sInstance == null) {
+ synchronized (TAG) {
+ if (sInstance == null) {
+ sInstance = new InputMethodSettingValuesWrapper(context);
+ }
+ }
+ }
+ return sInstance;
+ }
+
+ private static int getDefaultCurrentUserId() {
+ try {
+ return ActivityManager.getService().getCurrentUser().id;
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Couldn't get current user ID; guessing it's 0", e);
+ }
+ return 0;
+ }
+
+ // Ensure singleton
+ private InputMethodSettingValuesWrapper(Context context) {
+ mSettings = new InputMethodSettings(context.getResources(), context.getContentResolver(),
+ mMethodMap, mMethodList, getDefaultCurrentUserId(), false /* copyOnWrite */);
+ mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
+ refreshAllInputMethodAndSubtypes();
+ }
+
+ public void refreshAllInputMethodAndSubtypes() {
+ synchronized (mMethodMap) {
+ mMethodList.clear();
+ mMethodMap.clear();
+ final List<InputMethodInfo> imms = mImm.getInputMethodList();
+ mMethodList.addAll(imms);
+ for (InputMethodInfo imi : imms) {
+ mMethodMap.put(imi.getId(), imi);
+ }
+ updateAsciiCapableEnabledImis();
+ }
+ }
+
+ // TODO: Add a cts to ensure at least one AsciiCapableSubtypeEnabledImis exist
+ private void updateAsciiCapableEnabledImis() {
+ synchronized (mMethodMap) {
+ mAsciiCapableEnabledImis.clear();
+ final List<InputMethodInfo> enabledImis = mSettings.getEnabledInputMethodListLocked();
+ for (final InputMethodInfo imi : enabledImis) {
+ final int subtypeCount = imi.getSubtypeCount();
+ for (int i = 0; i < subtypeCount; ++i) {
+ final InputMethodSubtype subtype = imi.getSubtypeAt(i);
+ if (InputMethodUtils.SUBTYPE_MODE_KEYBOARD.equalsIgnoreCase(subtype.getMode())
+ && subtype.isAsciiCapable()) {
+ mAsciiCapableEnabledImis.add(imi);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ public List<InputMethodInfo> getInputMethodList() {
+ synchronized (mMethodMap) {
+ return mMethodList;
+ }
+ }
+
+ public boolean isAlwaysCheckedIme(InputMethodInfo imi, Context context) {
+ final boolean isEnabled = isEnabledImi(imi);
+ synchronized (mMethodMap) {
+ if (mSettings.getEnabledInputMethodListLocked().size() <= 1 && isEnabled) {
+ return true;
+ }
+ }
+
+ final int enabledValidSystemNonAuxAsciiCapableImeCount =
+ getEnabledValidSystemNonAuxAsciiCapableImeCount(context);
+
+ return enabledValidSystemNonAuxAsciiCapableImeCount <= 1
+ && !(enabledValidSystemNonAuxAsciiCapableImeCount == 1 && !isEnabled)
+ && InputMethodUtils.isSystemIme(imi)
+ && isValidSystemNonAuxAsciiCapableIme(imi, context);
+
+ }
+
+ private int getEnabledValidSystemNonAuxAsciiCapableImeCount(Context context) {
+ int count = 0;
+ final List<InputMethodInfo> enabledImis;
+ synchronized (mMethodMap) {
+ enabledImis = mSettings.getEnabledInputMethodListLocked();
+ }
+ for (final InputMethodInfo imi : enabledImis) {
+ if (isValidSystemNonAuxAsciiCapableIme(imi, context)) {
+ ++count;
+ }
+ }
+ if (count == 0) {
+ Log.w(TAG, "No \"enabledValidSystemNonAuxAsciiCapableIme\"s found.");
+ }
+ return count;
+ }
+
+ public boolean isEnabledImi(InputMethodInfo imi) {
+ final List<InputMethodInfo> enabledImis;
+ synchronized (mMethodMap) {
+ enabledImis = mSettings.getEnabledInputMethodListLocked();
+ }
+ for (final InputMethodInfo tempImi : enabledImis) {
+ if (tempImi.getId().equals(imi.getId())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isValidSystemNonAuxAsciiCapableIme(InputMethodInfo imi, Context context) {
+ if (imi.isAuxiliaryIme()) {
+ return false;
+ }
+ final Locale systemLocale = context.getResources().getConfiguration().locale;
+ if (InputMethodUtils.isSystemImeThatHasSubtypeOf(imi, context,
+ true /* checkDefaultAttribute */, systemLocale, false /* checkCountry */,
+ InputMethodUtils.SUBTYPE_MODE_ANY)) {
+ return true;
+ }
+ if (mAsciiCapableEnabledImis.isEmpty()) {
+ Log.w(TAG, "ascii capable subtype enabled imi not found. Fall back to English"
+ + " Keyboard subtype.");
+ return InputMethodUtils.containsSubtypeOf(imi, Locale.ENGLISH, false /* checkCountry */,
+ InputMethodUtils.SUBTYPE_MODE_KEYBOARD);
+ }
+ return mAsciiCapableEnabledImis.contains(imi);
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSubtypePreference.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSubtypePreference.java
new file mode 100644
index 0000000..5fdab29
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSubtypePreference.java
@@ -0,0 +1,91 @@
+/*
+ * 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.settingslib.inputmethod;
+
+import android.content.Context;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.text.TextUtils;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodSubtype;
+
+import com.android.internal.inputmethod.InputMethodUtils;
+
+import java.text.Collator;
+import java.util.Locale;
+
+/**
+ * Input method subtype preference.
+ *
+ * This preference represents a subtype of an IME. It is used to enable or disable the subtype.
+ */
+public class InputMethodSubtypePreference extends SwitchWithNoTextPreference {
+ private final boolean mIsSystemLocale;
+ private final boolean mIsSystemLanguage;
+
+ public InputMethodSubtypePreference(final Context context, final InputMethodSubtype subtype,
+ final InputMethodInfo imi) {
+ super(context);
+ setPersistent(false);
+ setKey(imi.getId() + subtype.hashCode());
+ final CharSequence subtypeLabel =
+ InputMethodAndSubtypeUtil.getSubtypeLocaleNameAsSentence(subtype, context, imi);
+ setTitle(subtypeLabel);
+ final String subtypeLocaleString = subtype.getLocale();
+ if (TextUtils.isEmpty(subtypeLocaleString)) {
+ mIsSystemLocale = false;
+ mIsSystemLanguage = false;
+ } else {
+ final Locale systemLocale = context.getResources().getConfiguration().locale;
+ mIsSystemLocale = subtypeLocaleString.equals(systemLocale.toString());
+ mIsSystemLanguage = mIsSystemLocale
+ || InputMethodUtils.getLanguageFromLocaleString(subtypeLocaleString)
+ .equals(systemLocale.getLanguage());
+ }
+ }
+
+ public int compareTo(final Preference rhs, final Collator collator) {
+ if (this == rhs) {
+ return 0;
+ }
+ if (rhs instanceof InputMethodSubtypePreference) {
+ final InputMethodSubtypePreference rhsPref = (InputMethodSubtypePreference) rhs;
+ if (mIsSystemLocale && !rhsPref.mIsSystemLocale) {
+ return -1;
+ }
+ if (!mIsSystemLocale && rhsPref.mIsSystemLocale) {
+ return 1;
+ }
+ if (mIsSystemLanguage && !rhsPref.mIsSystemLanguage) {
+ return -1;
+ }
+ if (!mIsSystemLanguage && rhsPref.mIsSystemLanguage) {
+ return 1;
+ }
+ final CharSequence t0 = getTitle();
+ final CharSequence t1 = rhs.getTitle();
+ if (t0 == null && t1 == null) {
+ return Integer.compare(hashCode(), rhs.hashCode());
+ }
+ if (t0 != null && t1 != null) {
+ return collator.compare(t0.toString(), t1.toString());
+ }
+ return t0 == null ? -1 : 1;
+ }
+ return super.compareTo(rhs);
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/SwitchWithNoTextPreference.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/SwitchWithNoTextPreference.java
new file mode 100644
index 0000000..798f8fe
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/SwitchWithNoTextPreference.java
@@ -0,0 +1,30 @@
+/*
+ * 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.settingslib.inputmethod;
+
+import android.content.Context;
+import android.support.v14.preference.SwitchPreference;
+
+public class SwitchWithNoTextPreference extends SwitchPreference {
+ private static final String EMPTY_TEXT = "";
+
+ public SwitchWithNoTextPreference(final Context context) {
+ super(context);
+ setSwitchTextOn(EMPTY_TEXT);
+ setSwitchTextOff(EMPTY_TEXT);
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java b/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java
index 4c11197..0fc9a4d 100644
--- a/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java
@@ -116,7 +116,7 @@
if (info == null || !info.enabled
|| (info.flags&ApplicationInfo.FLAG_INSTALLED) == 0) {
mIPm.installExistingPackageAsUser(packageName, mUser.getIdentifier(),
- PackageManager.INSTALL_REASON_UNKNOWN);
+ 0 /*installFlags*/, PackageManager.INSTALL_REASON_UNKNOWN);
if (DEBUG) {
Log.d(TAG, "Installing " + packageName);
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index 82e69d8..6fe581e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -22,12 +22,11 @@
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
-import android.net.Network;
+import android.net.NetworkBadging;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.NetworkInfo.DetailedState;
import android.net.NetworkInfo.State;
-import android.net.NetworkKey;
import android.net.ScoredNetwork;
import android.net.wifi.IWifiManager;
import android.net.wifi.ScanResult;
@@ -51,7 +50,6 @@
import com.android.settingslib.R;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
@@ -91,15 +89,15 @@
new ConcurrentHashMap<String, ScanResult>(32);
private static final long MAX_SCAN_RESULT_AGE_MS = 15000;
- private static final String KEY_NETWORKINFO = "key_networkinfo";
- private static final String KEY_WIFIINFO = "key_wifiinfo";
- private static final String KEY_SCANRESULT = "key_scanresult";
- private static final String KEY_SSID = "key_ssid";
- private static final String KEY_SECURITY = "key_security";
- private static final String KEY_PSKTYPE = "key_psktype";
- private static final String KEY_SCANRESULTCACHE = "key_scanresultcache";
- private static final String KEY_CONFIG = "key_config";
- private static final AtomicInteger sLastId = new AtomicInteger(0);
+ static final String KEY_NETWORKINFO = "key_networkinfo";
+ static final String KEY_WIFIINFO = "key_wifiinfo";
+ static final String KEY_SCANRESULT = "key_scanresult";
+ static final String KEY_SSID = "key_ssid";
+ static final String KEY_SECURITY = "key_security";
+ static final String KEY_PSKTYPE = "key_psktype";
+ static final String KEY_SCANRESULTCACHE = "key_scanresultcache";
+ static final String KEY_CONFIG = "key_config";
+ static final AtomicInteger sLastId = new AtomicInteger(0);
/**
* These values are matched in string arrays -- changes must be kept in sync
@@ -116,6 +114,8 @@
public static final int SIGNAL_LEVELS = 4;
+ static final int UNREACHABLE_RSSI = Integer.MAX_VALUE;
+
private final Context mContext;
private String ssid;
@@ -127,7 +127,7 @@
private WifiConfiguration mConfig;
- private int mRssi = Integer.MAX_VALUE;
+ private int mRssi = UNREACHABLE_RSSI;
private long mSeen = 0;
private WifiInfo mInfo;
@@ -137,7 +137,7 @@
private Object mTag;
private int mRankingScore = Integer.MIN_VALUE;
- private int mBadge = ScoredNetwork.BADGING_NONE;
+ private int mBadge = NetworkBadging.BADGING_NONE;
// used to co-relate internal vs returned accesspoint.
int mId;
@@ -216,6 +216,21 @@
this.mRankingScore = that.mRankingScore;
}
+ /**
+ * Returns a negative integer, zero, or a positive integer if this AccessPoint is less than,
+ * equal to, or greater than the other AccessPoint.
+ *
+ * Sort order rules for AccessPoints:
+ * 1. Active before inactive
+ * 2. Reachable before unreachable
+ * 3. Saved before unsaved
+ * 4. (Internal only) Network ranking score
+ * 5. Stronger signal before weaker signal
+ * 6. SSID alphabetically
+ *
+ * Note that AccessPoints with a signal are usually also Reachable,
+ * and will thus appear before unreachable saved AccessPoints.
+ */
@Override
public int compareTo(@NonNull AccessPoint other) {
// Active one goes first.
@@ -223,18 +238,16 @@
if (!isActive() && other.isActive()) return 1;
// Reachable one goes before unreachable one.
- if (mRssi != Integer.MAX_VALUE && other.mRssi == Integer.MAX_VALUE) return -1;
- if (mRssi == Integer.MAX_VALUE && other.mRssi != Integer.MAX_VALUE) return 1;
+ if (isReachable() && !other.isReachable()) return -1;
+ if (!isReachable() && other.isReachable()) return 1;
// Configured (saved) one goes before unconfigured one.
- if (networkId != WifiConfiguration.INVALID_NETWORK_ID
- && other.networkId == WifiConfiguration.INVALID_NETWORK_ID) return -1;
- if (networkId == WifiConfiguration.INVALID_NETWORK_ID
- && other.networkId != WifiConfiguration.INVALID_NETWORK_ID) return 1;
+ if (isSaved() && !other.isSaved()) return -1;
+ if (!isSaved() && other.isSaved()) return 1;
// Higher scores go before lower scores
- if (mRankingScore != other.mRankingScore) {
- return (mRankingScore > other.mRankingScore) ? -1 : 1;
+ if (getRankingScore() != other.getRankingScore()) {
+ return (getRankingScore() > other.getRankingScore()) ? -1 : 1;
}
// Sort by signal strength, bucketed by level
@@ -244,7 +257,7 @@
return difference;
}
// Sort by ssid.
- return ssid.compareToIgnoreCase(other.ssid);
+ return getSsidStr().compareToIgnoreCase(other.getSsidStr());
}
@Override
@@ -267,6 +280,9 @@
public String toString() {
StringBuilder builder = new StringBuilder().append("AccessPoint(")
.append(ssid);
+ if (bssid != null) {
+ builder.append(":").append(bssid);
+ }
if (isSaved()) {
builder.append(',').append("saved");
}
@@ -282,6 +298,7 @@
if (security != SECURITY_NONE) {
builder.append(',').append(securityToString(security, pskType));
}
+ builder.append(",level=").append(getLevel());
builder.append(",rankingScore=").append(mRankingScore);
builder.append(",badge=").append(mBadge);
@@ -296,7 +313,7 @@
boolean updateScores(WifiNetworkScoreCache scoreCache) {
int oldBadge = mBadge;
int oldRankingScore = mRankingScore;
- mBadge = ScoredNetwork.BADGING_NONE;
+ mBadge = NetworkBadging.BADGING_NONE;
mRankingScore = Integer.MIN_VALUE;
for (ScanResult result : mScanResultCache.values()) {
@@ -353,7 +370,7 @@
}
public int getLevel() {
- if (mRssi == Integer.MAX_VALUE) {
+ if (!isReachable()) {
return -1;
}
return WifiManager.calculateSignalLevel(mRssi, SIGNAL_LEVELS);
@@ -503,7 +520,8 @@
// This is the active connection on non-passpoint network
summary.append(getSummary(mContext, getDetailedState(),
mInfo != null && mInfo.isEphemeral()));
- } else if (config != null && config.isPasspoint()) {
+ } else if (config != null && config.isPasspoint()
+ && config.getNetworkSelectionStatus().isNetworkEnabled()) {
String format = mContext.getString(R.string.available_via_passpoint);
summary.append(String.format(format, config.providerFriendlyName));
} else if (config != null && config.hasNoInternetAccess()) {
@@ -526,7 +544,9 @@
summary.append(mContext.getString(R.string.wifi_disabled_generic));
break;
}
- } else if (mRssi == Integer.MAX_VALUE) { // Wifi out of range
+ } else if (config != null && config.getNetworkSelectionStatus().isNotRecommended()) {
+ summary.append(mContext.getString(R.string.wifi_disabled_by_recommendation_provider));
+ } else if (!isReachable()) { // Wifi out of range
summary.append(mContext.getString(R.string.wifi_not_in_range));
} else { // In range, not disabled.
if (config != null) { // Is saved network
@@ -765,11 +785,7 @@
}
void loadConfig(WifiConfiguration config) {
- if (config.isPasspoint())
- ssid = config.providerFriendlyName;
- else
- ssid = (config.SSID == null ? "" : removeDoubleQuotes(config.SSID));
-
+ ssid = (config.SSID == null ? "" : removeDoubleQuotes(config.SSID));
bssid = config.BSSID;
security = getSecurity(config);
networkId = config.networkId;
@@ -873,6 +889,11 @@
return mBadge;
}
+ /** Return true if the current RSSI is reachable, and false otherwise. */
+ boolean isReachable() {
+ return mRssi != UNREACHABLE_RSSI;
+ }
+
public static String getSummary(Context context, String ssid, DetailedState state,
boolean isEphemeral, String passpointProvider) {
if (state == DetailedState.CONNECTED && ssid == null) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
index a77c310..69da548 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
@@ -22,7 +22,6 @@
import android.graphics.drawable.Drawable;
import android.graphics.drawable.StateListDrawable;
import android.net.NetworkBadging;
-import android.net.ScoredNetwork;
import android.net.wifi.WifiConfiguration;
import android.os.Looper;
import android.os.UserHandle;
@@ -61,7 +60,7 @@
private int mLevel;
private CharSequence mContentDescription;
private int mDefaultIconResId;
- private int mWifiBadge = ScoredNetwork.BADGING_NONE;
+ private int mWifiBadge = NetworkBadging.BADGING_NONE;
static final int[] WIFI_CONNECTION_STRENGTH = {
R.string.accessibility_wifi_one_bar,
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index 0ec16ae2..8421c2c 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -271,7 +271,6 @@
if (mWifiManager.isWifiEnabled()) {
mScanner.resume();
}
- mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_ACCESS_POINTS);
}
/**
@@ -469,29 +468,22 @@
}
AccessPoint accessPoint = getCachedOrCreate(config, cachedAccessPoints);
if (mLastInfo != null && mLastNetworkInfo != null) {
- if (config.isPasspoint() == false) {
- accessPoint.update(connectionConfig, mLastInfo, mLastNetworkInfo);
- }
+ accessPoint.update(connectionConfig, mLastInfo, mLastNetworkInfo);
}
if (mIncludeSaved) {
- if (!config.isPasspoint() || mIncludePasspoints) {
- // If saved network not present in scan result then set its Rssi to MAX_VALUE
- boolean apFound = false;
- for (ScanResult result : results) {
- if (result.SSID.equals(accessPoint.getSsidStr())) {
- apFound = true;
- break;
- }
+ // If saved network not present in scan result then set its Rssi to MAX_VALUE
+ boolean apFound = false;
+ for (ScanResult result : results) {
+ if (result.SSID.equals(accessPoint.getSsidStr())) {
+ apFound = true;
+ break;
}
- if (!apFound) {
- accessPoint.setRssi(Integer.MAX_VALUE);
- }
- accessPoints.add(accessPoint);
}
-
- if (config.isPasspoint() == false) {
- apMap.put(accessPoint.getSsidStr(), accessPoint);
+ if (!apFound) {
+ accessPoint.setRssi(Integer.MAX_VALUE);
}
+ accessPoints.add(accessPoint);
+ apMap.put(accessPoint.getSsidStr(), accessPoint);
} else {
// If we aren't using saved networks, drop them into the cache so that
// we have access to their saved info.
@@ -510,7 +502,7 @@
}
NetworkKey key = NetworkKey.createFromScanResult(result);
- if (!mRequestedScores.contains(key)) {
+ if (key != null && !mRequestedScores.contains(key)) {
scoresToRequest.add(key);
}
@@ -528,20 +520,16 @@
}
if (result.isPasspointNetwork()) {
+ // Retrieve a WifiConfiguration for a Passpoint provider that matches
+ // the given ScanResult. This is used for showing that a given AP
+ // (ScanResult) is available via a Passpoint provider (provider friendly
+ // name).
WifiConfiguration config = mWifiManager.getMatchingWifiConfig(result);
if (config != null) {
accessPoint.update(config);
}
}
- if (mLastInfo != null && mLastInfo.getBSSID() != null
- && mLastInfo.getBSSID().equals(result.BSSID)
- && connectionConfig != null && connectionConfig.isPasspoint()) {
- /* This network is connected via this passpoint config */
- /* SSID match is not going to work for it; so update explicitly */
- accessPoint.update(connectionConfig);
- }
-
accessPoints.add(accessPoint);
apMap.put(accessPoint.getSsidStr(), accessPoint);
}
@@ -726,9 +714,9 @@
mMainHandler.sendEmptyMessage(MainHandler.MSG_CONNECTED_CHANGED);
- mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_ACCESS_POINTS);
mWorkHandler.obtainMessage(WorkHandler.MSG_UPDATE_NETWORK_INFO, info)
.sendToTarget();
+ mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_ACCESS_POINTS);
}
}
};
diff --git a/packages/SettingsLib/tests/integ/Android.mk b/packages/SettingsLib/tests/integ/Android.mk
index bd910dd..091f965 100644
--- a/packages/SettingsLib/tests/integ/Android.mk
+++ b/packages/SettingsLib/tests/integ/Android.mk
@@ -31,6 +31,12 @@
legacy-android-test \
truth-prebuilt
+# Code coverage puts us over the dex limit, so enable multi-dex for coverage-enabled builds
+ifeq (true,$(EMMA_INSTRUMENT))
+LOCAL_JACK_FLAGS := --multi-dex native
+LOCAL_DX_FLAGS := --multi-dex
+endif # EMMA_INSTRUMENT
+
include frameworks/base/packages/SettingsLib/common.mk
include $(BUILD_PACKAGE)
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/applications/ApplicationsStateTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/applications/ApplicationsStateTest.java
index 80e1cbf..e204a3a 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/applications/ApplicationsStateTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/applications/ApplicationsStateTest.java
@@ -19,6 +19,7 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import android.content.pm.ApplicationInfo;
@@ -107,4 +108,32 @@
assertThat(ApplicationsState.FILTER_OTHER_APPS.filterApp(mEntry)).isTrue();
}
+
+ @Test
+ public void testInstantFilterAcceptsInstantApp() {
+ when(mEntry.info.isInstantApp()).thenReturn(true);
+ assertThat(ApplicationsState.FILTER_INSTANT.filterApp(mEntry)).isTrue();
+ }
+
+ @Test
+ public void testInstantFilterRejectsNonInstantApp() {
+ when(mEntry.info.isInstantApp()).thenReturn(false);
+ assertThat(ApplicationsState.FILTER_INSTANT.filterApp(mEntry)).isFalse();
+ }
+
+ @Test
+ public void testEnabledFilterRejectsInstantApp() {
+ mEntry.info.enabled = true;
+ assertThat(ApplicationsState.FILTER_ALL_ENABLED.filterApp(mEntry)).isTrue();
+ when(mEntry.info.isInstantApp()).thenReturn(true);
+ assertThat(ApplicationsState.FILTER_ALL_ENABLED.filterApp(mEntry)).isFalse();
+ }
+
+ @Test
+ public void testDisabledFilterRejectsInstantApp() {
+ mEntry.info.enabled = false;
+ assertThat(ApplicationsState.FILTER_DISABLED.filterApp(mEntry)).isTrue();
+ when(mEntry.info.isInstantApp()).thenReturn(true);
+ assertThat(ApplicationsState.FILTER_DISABLED.filterApp(mEntry)).isFalse();
+ }
}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawer/SettingsDrawerActivityTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawer/SettingsDrawerActivityTest.java
index 2fd5ec0..c3f2f73 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawer/SettingsDrawerActivityTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawer/SettingsDrawerActivityTest.java
@@ -16,6 +16,7 @@
package com.android.settingslib.drawer;
+import android.app.Activity;
import android.app.Instrumentation;
import android.content.Intent;
import android.support.test.InstrumentationRegistry;
@@ -25,6 +26,8 @@
import com.android.settingslib.R;
+import com.google.common.truth.Truth;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -36,12 +39,12 @@
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription;
+import static com.google.common.truth.Truth.assertThat;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class SettingsDrawerActivityTest {
-
@Rule
public ActivityTestRule<TestActivity> mActivityRule =
new ActivityTestRule<>(TestActivity.class, true, true);
@@ -83,6 +86,16 @@
.check(matches(isDisplayed()));
}
+ @Test
+ public void startActivity_shouldNotHaveNavDrawer() {
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ Activity activity = instrumentation.startActivitySync(
+ new Intent(instrumentation.getTargetContext(), TestActivity.class));
+
+ assertThat(((SettingsDrawerActivity) activity).isNavDrawerEnabled())
+ .isFalse();
+ }
+
/**
* Test Activity in this test.
*
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java
index 4df199c..8cfec7a 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java
@@ -146,7 +146,7 @@
mHelper.applyUserAppsStates(mockListener);
verify(mIpm, times(1)).installExistingPackageAsUser("app1", testUserId,
- PackageManager.INSTALL_REASON_UNKNOWN);
+ 0 /*installFlags*/, PackageManager.INSTALL_REASON_UNKNOWN);
verify(mIpm, times(1)).setApplicationHiddenSettingAsUser("app2", false, testUserId);
verify(mockListener).onDisableUiForPackage("app2");
verify(mPm, times(1)).deletePackageAsUser(eq("app3"), any(IPackageDeleteObserver.class),
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
index 6481f4d..ec0190c 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
@@ -15,9 +15,8 @@
*/
package com.android.settingslib.wifi;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
import android.content.Context;
import android.net.ConnectivityManager;
@@ -39,6 +38,7 @@
import org.junit.runner.RunWith;
import java.util.ArrayList;
+import java.util.Collections;
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -59,12 +59,12 @@
final AccessPoint ap = new AccessPoint(InstrumentationRegistry.getTargetContext(), bundle);
final CharSequence ssid = ap.getSsid();
- assertTrue(ssid instanceof SpannableString);
+ assertThat(ssid instanceof SpannableString).isTrue();
TtsSpan[] spans = ((SpannableString) ssid).getSpans(0, TEST_SSID.length(), TtsSpan.class);
- assertEquals(1, spans.length);
- assertEquals(TtsSpan.TYPE_TELEPHONE, spans[0].getType());
+ assertThat(spans.length).isEqualTo(1);
+ assertThat(spans[0].getType()).isEqualTo(TtsSpan.TYPE_TELEPHONE);
}
@Test
@@ -80,11 +80,11 @@
originalAccessPoint.update(configuration, wifiInfo, networkInfo);
AccessPoint copy = new AccessPoint(mContext, originalAccessPoint);
- assertEquals(originalAccessPoint.getSsid().toString(), copy.getSsid().toString());
- assertEquals(originalAccessPoint.getBssid(), copy.getBssid());
- assertSame(originalAccessPoint.getConfig(), copy.getConfig());
- assertEquals(originalAccessPoint.getSecurity(), copy.getSecurity());
- assertTrue(originalAccessPoint.compareTo(copy) == 0);
+ assertThat(originalAccessPoint.getSsid().toString()).isEqualTo(copy.getSsid().toString());
+ assertThat(originalAccessPoint.getBssid()).isEqualTo(copy.getBssid());
+ assertThat(originalAccessPoint.getConfig()).isEqualTo(copy.getConfig());
+ assertThat(originalAccessPoint.getSecurity()).isEqualTo(copy.getSecurity());
+ assertThat(originalAccessPoint.compareTo(copy) == 0).isTrue();
}
@Test
@@ -101,11 +101,93 @@
bundle.putParcelableArrayList("key_scanresultcache", scanResults);
AccessPoint original = new AccessPoint(mContext, bundle);
- assertEquals(4, original.getRssi());
+ assertThat(original.getRssi()).isEqualTo(4);
AccessPoint copy = new AccessPoint(mContext, createWifiConfiguration());
- assertEquals(Integer.MIN_VALUE, copy.getRssi());
+ assertThat(copy.getRssi()).isEqualTo(Integer.MIN_VALUE);
copy.copyFrom(original);
- assertEquals(original.getRssi(), copy.getRssi());
+ assertThat(original.getRssi()).isEqualTo(copy.getRssi());
+ }
+
+ @Test
+ public void testCompareTo_GivesActiveBeforeInactive() {
+ AccessPoint activeAp = new TestAccessPointBuilder(mContext).setActive(true).build();
+ AccessPoint inactiveAp = new TestAccessPointBuilder(mContext).setActive(false).build();
+
+ assertSortingWorks(activeAp, inactiveAp);
+ }
+
+ @Test
+ public void testCompareTo_GivesReachableBeforeUnreachable() {
+ AccessPoint nearAp = new TestAccessPointBuilder(mContext).setReachable(true).build();
+ AccessPoint farAp = new TestAccessPointBuilder(mContext).setReachable(false).build();
+
+ assertSortingWorks(nearAp, farAp);
+ }
+
+ @Test
+ public void testCompareTo_GivesSavedBeforeUnsaved() {
+ AccessPoint savedAp = new TestAccessPointBuilder(mContext).setSaved(true).build();
+ AccessPoint notSavedAp = new TestAccessPointBuilder(mContext).setSaved(false).build();
+
+ assertSortingWorks(savedAp, notSavedAp);
+ }
+
+ //TODO: add tests for mRankingScore sort order if ranking is exposed
+
+ @Test
+ public void testCompareTo_GivesHighLevelBeforeLowLevel() {
+ final int highLevel = AccessPoint.SIGNAL_LEVELS - 1;
+ final int lowLevel = 1;
+ assertThat(highLevel).isGreaterThan(lowLevel);
+
+ AccessPoint strongAp = new TestAccessPointBuilder(mContext).setLevel(highLevel).build();
+ AccessPoint weakAp = new TestAccessPointBuilder(mContext).setLevel(lowLevel).build();
+
+ assertSortingWorks(strongAp, weakAp);
+ }
+
+ @Test
+ public void testCompareTo_GivesSsidAlphabetically() {
+
+ final String firstName = "AAAAAA";
+ final String secondName = "zzzzzz";
+
+ AccessPoint firstAp = new TestAccessPointBuilder(mContext).setSsid(firstName).build();
+ AccessPoint secondAp = new TestAccessPointBuilder(mContext).setSsid(secondName).build();
+
+ assertThat(firstAp.getSsidStr().compareToIgnoreCase(secondAp.getSsidStr()) < 0).isTrue();
+ assertSortingWorks(firstAp, secondAp);
+ }
+
+ @Test
+ public void testCompareTo_AllSortingRulesCombined() {
+
+ AccessPoint active = new TestAccessPointBuilder(mContext).setActive(true).build();
+ AccessPoint reachableAndMinLevel = new TestAccessPointBuilder(mContext)
+ .setReachable(true).build();
+ AccessPoint saved = new TestAccessPointBuilder(mContext).setSaved(true).build();
+ AccessPoint highLevelAndReachable = new TestAccessPointBuilder(mContext)
+ .setLevel(AccessPoint.SIGNAL_LEVELS - 1).build();
+ AccessPoint firstName = new TestAccessPointBuilder(mContext).setSsid("a").build();
+ AccessPoint lastname = new TestAccessPointBuilder(mContext).setSsid("z").build();
+
+ ArrayList<AccessPoint> points = new ArrayList<AccessPoint>();
+ points.add(lastname);
+ points.add(firstName);
+ points.add(highLevelAndReachable);
+ points.add(saved);
+ points.add(reachableAndMinLevel);
+ points.add(active);
+
+ Collections.sort(points);
+ assertThat(points.indexOf(active)).isLessThan(points.indexOf(reachableAndMinLevel));
+ assertThat(points.indexOf(reachableAndMinLevel)).isLessThan(points.indexOf(saved));
+ // note: the saved AP will not appear before highLevelAndReachable,
+ // because all APs with a signal level are reachable,
+ // and isReachable() takes higher sorting precedence than isSaved().
+ assertThat(points.indexOf(saved)).isLessThan(points.indexOf(firstName));
+ assertThat(points.indexOf(highLevelAndReachable)).isLessThan(points.indexOf(firstName));
+ assertThat(points.indexOf(firstName)).isLessThan(points.indexOf(lastname));
}
private WifiConfiguration createWifiConfiguration() {
@@ -115,4 +197,85 @@
configuration.networkId = 123;
return configuration;
}
+
+ /**
+ * Assert that the first AccessPoint appears after the second AccessPoint
+ * once sorting has been completed.
+ */
+ private void assertSortingWorks(AccessPoint first, AccessPoint second) {
+
+ ArrayList<AccessPoint> points = new ArrayList<AccessPoint>();
+
+ // add in reverse order so we can tell that sorting actually changed something
+ points.add(second);
+ points.add(first);
+ Collections.sort(points);
+ assertWithMessage(
+ String.format("After sorting: second AccessPoint should have higher array index "
+ + "than the first, but found indicies second '%s' and first '%s'.",
+ points.indexOf(second), points.indexOf(first)))
+ .that(points.indexOf(second)).isGreaterThan(points.indexOf(first));
+ }
+
+ @Test
+ public void testBuilder_setActive() {
+ AccessPoint activeAp = new TestAccessPointBuilder(mContext).setActive(true).build();
+ assertThat(activeAp.isActive()).isTrue();
+
+ AccessPoint inactiveAp = new TestAccessPointBuilder(mContext).setActive(false).build();
+ assertThat(inactiveAp.isActive()).isFalse();
+ }
+
+ @Test
+ public void testBuilder_setReachable() {
+ AccessPoint nearAp = new TestAccessPointBuilder(mContext).setReachable(true).build();
+ assertThat(nearAp.isReachable()).isTrue();
+
+ AccessPoint farAp = new TestAccessPointBuilder(mContext).setReachable(false).build();
+ assertThat(farAp.isReachable()).isFalse();
+ }
+
+ @Test
+ public void testBuilder_setSaved() {
+ AccessPoint savedAp = new TestAccessPointBuilder(mContext).setSaved(true).build();
+ assertThat(savedAp.isSaved()).isTrue();
+
+ AccessPoint newAp = new TestAccessPointBuilder(mContext).setSaved(false).build();
+ assertThat(newAp.isSaved()).isFalse();
+ }
+
+ @Test
+ public void testBuilder_setLevel() {
+ AccessPoint testAp;
+
+ for (int i = 0; i < AccessPoint.SIGNAL_LEVELS; i++) {
+ testAp = new TestAccessPointBuilder(mContext).setLevel(i).build();
+ assertThat(testAp.getLevel()).isEqualTo(i);
+ }
+
+ // numbers larger than the max level should be set to max
+ testAp = new TestAccessPointBuilder(mContext).setLevel(AccessPoint.SIGNAL_LEVELS).build();
+ assertThat(testAp.getLevel()).isEqualTo(AccessPoint.SIGNAL_LEVELS - 1);
+
+ // numbers less than 0 should give level 0
+ testAp = new TestAccessPointBuilder(mContext).setLevel(-100).build();
+ assertThat(testAp.getLevel()).isEqualTo(0);
+ }
+
+ @Test
+ public void testBuilder_settingReachableAfterLevelDoesNotAffectLevel() {
+ int level = 1;
+ assertThat(level).isLessThan(AccessPoint.SIGNAL_LEVELS - 1);
+
+ AccessPoint testAp =
+ new TestAccessPointBuilder(mContext).setLevel(level).setReachable(true).build();
+ assertThat(testAp.getLevel()).isEqualTo(level);
+ }
+
+ @Test
+ public void testBuilder_setSsid() {
+ String name = "AmazingSsid!";
+ AccessPoint namedAp = new TestAccessPointBuilder(mContext).setSsid(name).build();
+ assertThat(namedAp.getSsidStr()).isEqualTo(name);
+ }
}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/TestAccessPointBuilder.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
new file mode 100644
index 0000000..665c439
--- /dev/null
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
@@ -0,0 +1,128 @@
+/*
+ * 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.settingslib.wifi;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiConfiguration;
+import android.os.Bundle;
+
+/**
+* Build and return a valid AccessPoint.
+*
+* Only intended for testing the AccessPoint class;
+* AccessPoints were designed to only be populated
+* by the mechanisms of scan results and wifi configurations.
+*/
+public class TestAccessPointBuilder {
+ // match the private values in WifiManager
+ private static final int MIN_RSSI = -100;
+ private static final int MAX_RSSI = -55;
+
+ // set some sensible defaults
+ private int mRssi = AccessPoint.UNREACHABLE_RSSI;
+ private int networkId = WifiConfiguration.INVALID_NETWORK_ID;
+ private String ssid = "TestSsid";
+ private NetworkInfo mNetworkInfo = null;
+
+ Context mContext;
+
+ public TestAccessPointBuilder(Context context) {
+ mContext = context;
+ }
+
+ public AccessPoint build() {
+ Bundle bundle = new Bundle();
+
+ WifiConfiguration wifiConig = new WifiConfiguration();
+ wifiConig.networkId = networkId;
+
+ bundle.putString(AccessPoint.KEY_SSID, ssid);
+ bundle.putParcelable(AccessPoint.KEY_CONFIG, wifiConig);
+ bundle.putParcelable(AccessPoint.KEY_NETWORKINFO, mNetworkInfo);
+ AccessPoint ap = new AccessPoint(mContext, bundle);
+ ap.setRssi(mRssi);
+ return ap;
+ }
+
+ public TestAccessPointBuilder setActive(boolean active) {
+ if (active) {
+ mNetworkInfo = new NetworkInfo(
+ ConnectivityManager.TYPE_DUMMY,
+ ConnectivityManager.TYPE_DUMMY,
+ "TestNetwork",
+ "TestNetwork");
+ } else {
+ mNetworkInfo = null;
+ }
+ return this;
+ }
+
+ /**
+ * Set the signal level.
+ * Side effect: if this AccessPoint was previously unreachable,
+ * setting the level will also make it reachable.
+ */
+ public TestAccessPointBuilder setLevel(int level) {
+ int outputRange = AccessPoint.SIGNAL_LEVELS - 1;
+
+ if (level > outputRange) {
+ level = outputRange;
+ } else if (level < 0) {
+ level = 0;
+ }
+
+ int inputRange = MAX_RSSI - MIN_RSSI;
+
+ // calculate the rssi required to get the level we want.
+ // this is a rearrangement of the formula from WifiManager.calculateSignalLevel()
+ mRssi = (int)((float)(level * inputRange) / (float)outputRange) + MIN_RSSI;
+ return this;
+ }
+
+ /**
+ * Set whether the AccessPoint is reachable.
+ * Side effect: if the signal level was not previously set,
+ * making an AccessPoint reachable will set the signal to the minimum level.
+ */
+ public TestAccessPointBuilder setReachable(boolean reachable) {
+ if (reachable) {
+ // only override the mRssi if it hasn't been set yet
+ if (mRssi == AccessPoint.UNREACHABLE_RSSI) {
+ mRssi = MIN_RSSI;
+ }
+ } else {
+ mRssi = AccessPoint.UNREACHABLE_RSSI;
+ }
+ return this;
+ }
+
+ public TestAccessPointBuilder setSaved(boolean saved){
+ if (saved) {
+ networkId = 1;
+ } else {
+ networkId = WifiConfiguration.INVALID_NETWORK_ID;
+ }
+ return this;
+ }
+
+ public TestAccessPointBuilder setSsid(String newSsid) {
+ ssid = newSsid;
+ return this;
+ }
+}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
index 0f220aa..e100884 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
@@ -15,6 +15,8 @@
*/
package com.android.settingslib.wifi;
+import static com.google.common.truth.Truth.assertThat;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -27,6 +29,8 @@
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
+import android.net.NetworkBadging;
+import android.net.NetworkInfo;
import android.net.NetworkKey;
import android.net.NetworkScoreManager;
import android.net.ScoredNetwork;
@@ -34,6 +38,7 @@
import android.net.WifiKey;
import android.net.wifi.ScanResult;
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;
@@ -67,6 +72,8 @@
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+// TODO(sghuman): Change these to robolectric tests b/35766684.
+
@SmallTest
@RunWith(AndroidJUnit4.class)
public class WifiTrackerTest {
@@ -80,7 +87,7 @@
new NetworkKey(new WifiKey('"' + SSID_1 + '"', BSSID_1));
private static final int RSSI_1 = -30;
private static final byte SCORE_1 = 10;
- private static final int BADGE_1 = ScoredNetwork.BADGING_SD;
+ private static final int BADGE_1 = NetworkBadging.BADGING_SD;
private static final String SSID_2 = "ssid2";
private static final String BSSID_2 = "AA:AA:AA:AA:AA:AA";
@@ -88,7 +95,7 @@
new NetworkKey(new WifiKey('"' + SSID_2 + '"', BSSID_2));
private static final int RSSI_2 = -30;
private static final byte SCORE_2 = 15;
- private static final int BADGE_2 = ScoredNetwork.BADGING_HD;
+ private static final int BADGE_2 = NetworkBadging.BADGING_HD;
@Captor ArgumentCaptor<WifiNetworkScoreCache> mScoreCacheCaptor;
@Mock private ConnectivityManager mockConnectivityManager;
@@ -114,9 +121,10 @@
@Before
public void setUp() {
- mContext = InstrumentationRegistry.getTargetContext();
MockitoAnnotations.initMocks(this);
+ mContext = InstrumentationRegistry.getTargetContext();
+
mWorkerThread = new HandlerThread("TestHandlerWorkerThread");
mWorkerThread.start();
mLooper = mWorkerThread.getLooper();
@@ -220,9 +228,15 @@
SystemClock.elapsedRealtime() * 1000 /* microsecond timestamp */);
}
- private WifiTracker createTrackerAndInjectInitialScanResults() throws InterruptedException {
+ private WifiTracker createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(
+ Intent ... intents)
+ throws InterruptedException {
WifiTracker tracker = createMockedWifiTracker();
+
startTracking(tracker);
+ for (Intent intent : intents) {
+ tracker.mReceiver.onReceive(mContext, intent);
+ }
mAccessPointsChangedLatch = new CountDownLatch(1);
sendScanResultsAndProcess(tracker);
@@ -234,16 +248,16 @@
private WifiTracker createMockedWifiTracker() {
WifiTracker tracker =
new WifiTracker(
- mContext,
- mockWifiListener,
- mLooper,
- true,
- true,
- true,
- mockWifiManager,
- mockConnectivityManager,
- mockNetworkScoreManager,
- mMainLooper
+ mContext,
+ mockWifiListener,
+ mLooper,
+ true,
+ true,
+ true,
+ mockWifiManager,
+ mockConnectivityManager,
+ mockNetworkScoreManager,
+ mMainLooper
);
return tracker;
@@ -293,6 +307,31 @@
scoreCache.updateScores(Arrays.asList(sc1, sc2));
}
+ private WifiTracker createTrackerWithScanResultsAndAccessPoint1Connected()
+ throws InterruptedException {
+ int networkId = 123;
+
+ WifiInfo wifiInfo = new WifiInfo();
+ wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(SSID_1));
+ wifiInfo.setBSSID(BSSID_1);
+ wifiInfo.setNetworkId(networkId);
+ when(mockWifiManager.getConnectionInfo()).thenReturn(wifiInfo);
+
+ WifiConfiguration configuration = new WifiConfiguration();
+ configuration.SSID = SSID_1;
+ configuration.BSSID = BSSID_1;
+ configuration.networkId = networkId;
+ when(mockWifiManager.getConfiguredNetworks()).thenReturn(Arrays.asList(configuration));
+
+ NetworkInfo networkInfo = new NetworkInfo(
+ ConnectivityManager.TYPE_WIFI, 0, "Type Wifi", "subtype");
+ networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "connected", "test");
+
+ Intent intent = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+ intent.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo);
+ return createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(intent);
+ }
+
@Test
public void testAccessPointListenerSetWhenLookingUpUsingScanResults() {
ScanResult scanResult = new ScanResult();
@@ -356,12 +395,21 @@
}
@Test
+ public void startTrackingShouldSetConnectedAccessPointAsActive() throws InterruptedException {
+ WifiTracker tracker = createTrackerWithScanResultsAndAccessPoint1Connected();
+
+ List<AccessPoint> aps = tracker.getAccessPoints();
+
+ assertThat(aps).hasSize(2);
+ assertThat(aps.get(0).isActive()).isTrue();
+ }
+
+ @Test
public void startTrackingShouldRequestScoresForCurrentAccessPoints() throws InterruptedException {
// Start the tracker and inject the initial scan results and then stop tracking
- WifiTracker tracker = createTrackerAndInjectInitialScanResults();
+ WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
tracker.stopTracking();
- android.util.Log.d("WifiTrackerTest", "Clearing previously captured requested keys");
mRequestedKeys.clear();
mRequestScoresLatch = new CountDownLatch(1);
@@ -369,7 +417,6 @@
assertTrue("Latch timed out",
mRequestScoresLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
- android.util.Log.d("WifiTrackerTest", "requested keys: " + mRequestedKeys);
assertTrue(mRequestedKeys.contains(NETWORK_KEY_1));
assertTrue(mRequestedKeys.contains(NETWORK_KEY_2));
}
@@ -393,7 +440,7 @@
@Test
public void scoreCacheUpdateScoresShouldChangeSortOrder() throws InterruptedException {
- WifiTracker tracker = createTrackerAndInjectInitialScanResults();
+ WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
List<AccessPoint> aps = tracker.getAccessPoints();
assertTrue(aps.size() == 2);
assertEquals(aps.get(0).getSsidStr(), SSID_1);
@@ -415,7 +462,7 @@
Settings.Global.NETWORK_SCORING_UI_ENABLED,
0 /* disabled */);
- WifiTracker tracker = createTrackerAndInjectInitialScanResults();
+ WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
List<AccessPoint> aps = tracker.getAccessPoints();
assertTrue(aps.size() == 2);
assertEquals(aps.get(0).getSsidStr(), SSID_1);
@@ -431,7 +478,7 @@
@Test
public void scoreCacheUpdateScoresShouldInsertBadgeIntoAccessPoint() throws InterruptedException {
- WifiTracker tracker = createTrackerAndInjectInitialScanResults();
+ WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
updateScoresAndWaitForAccessPointsChangedCallback();
List<AccessPoint> aps = tracker.getAccessPoints();
@@ -453,16 +500,16 @@
Settings.Global.NETWORK_SCORING_UI_ENABLED,
0 /* disabled */);
- WifiTracker tracker = createTrackerAndInjectInitialScanResults();
+ WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
updateScoresAndWaitForAccessPointsChangedCallback();
List<AccessPoint> aps = tracker.getAccessPoints();
for (AccessPoint ap : aps) {
if (ap.getSsidStr().equals(SSID_1)) {
- assertEquals(ScoredNetwork.BADGING_NONE, ap.getBadge());
+ assertEquals(NetworkBadging.BADGING_NONE, ap.getBadge());
} else if (ap.getSsidStr().equals(SSID_2)) {
- assertEquals(ScoredNetwork.BADGING_NONE, ap.getBadge());
+ assertEquals(NetworkBadging.BADGING_NONE, ap.getBadge());
}
}
}
@@ -472,7 +519,7 @@
// Scores can be requested together or serially depending on how the scan results are
// processed.
mRequestScoresLatch = new CountDownLatch(2);
- WifiTracker tracker = createTrackerAndInjectInitialScanResults();
+ WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
mRequestScoresLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS);
mRequestedKeys.clear();
@@ -502,7 +549,7 @@
@Test
public void scoreCacheAndListenerShouldBeUnregisteredWhenStopTrackingIsCalled() throws Exception
{
- WifiTracker tracker = createTrackerAndInjectInitialScanResults();
+ WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
WifiNetworkScoreCache cache = mScoreCacheCaptor.getValue();
tracker.stopTracking();
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/BatteryInfoTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/BatteryInfoTest.java
new file mode 100644
index 0000000..1364958
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/BatteryInfoTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.settingslib;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.BatteryManager;
+import android.os.BatteryStats;
+import android.os.SystemClock;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class BatteryInfoTest {
+ private static final String STATUS_FULL = "Full";
+ private Intent mBatteryBroadcast;
+ @Mock
+ private BatteryStats mBatteryStats;
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mBatteryBroadcast = new Intent();
+ mBatteryBroadcast.putExtra(BatteryManager.EXTRA_PLUGGED, 0);
+ mBatteryBroadcast.putExtra(BatteryManager.EXTRA_LEVEL, 0);
+ mBatteryBroadcast.putExtra(BatteryManager.EXTRA_SCALE, 100);
+ mBatteryBroadcast.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_FULL);
+
+ when(mContext.getResources().getString(R.string.battery_info_status_full))
+ .thenReturn(STATUS_FULL);
+ }
+
+ @Test
+ public void testGetBatteryInfo_HasStatusLabel() {
+ BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mBatteryBroadcast, mBatteryStats,
+ SystemClock.elapsedRealtime() * 1000, true);
+
+ assertThat(info.statusLabel).isEqualTo(STATUS_FULL);
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java
index 2958740..c506358 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java
@@ -16,6 +16,17 @@
package com.android.settingslib;
+import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_NONE;
+import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT;
+import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_REMOTE_INPUT;
+import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS;
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.when;
+
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
@@ -25,18 +36,13 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import java.util.Arrays;
-import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT;
-import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_REMOTE_INPUT;
-import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.when;
-
@RunWith(SettingLibRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class RestrictedLockUtilsTest {
@@ -47,8 +53,11 @@
private DevicePolicyManager mDevicePolicyManager;
@Mock
private UserManager mUserManager;
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private RestrictedLockUtils.Proxy mProxy;
private static final int mUserId = 194;
+ private static final int mProfileId = 160;
private static final ComponentName mAdmin1 = new ComponentName("admin1", "admin1class");
private static final ComponentName mAdmin2 = new ComponentName("admin2", "admin2class");
@@ -60,12 +69,13 @@
.thenReturn(mDevicePolicyManager);
when(mContext.getSystemService(Context.USER_SERVICE))
.thenReturn(mUserManager);
+
+ RestrictedLockUtils.sProxy = mProxy;
}
@Test
public void checkIfKeyguardFeaturesDisabled_noEnforcedAdminForManagedProfile() {
- setUpManagedProfile(mUserId);
- setUpActiveAdmins(mUserId, new ComponentName[] {mAdmin1, mAdmin2});
+ setUpManagedProfile(mUserId, new ComponentName[] {mAdmin1, mAdmin2});
final EnforcedAdmin enforcedAdmin = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
mContext, KEYGUARD_DISABLE_FINGERPRINT, mUserId);
@@ -75,8 +85,7 @@
@Test
public void checkIfKeyguardFeaturesDisabled_oneEnforcedAdminForManagedProfile() {
- setUpManagedProfile(mUserId);
- setUpActiveAdmins(mUserId, new ComponentName[] {mAdmin1, mAdmin2});
+ setUpManagedProfile(mUserId, new ComponentName[] {mAdmin1, mAdmin2});
when(mDevicePolicyManager.getKeyguardDisabledFeatures(mAdmin1, mUserId))
.thenReturn(KEYGUARD_DISABLE_FINGERPRINT);
@@ -89,8 +98,7 @@
@Test
public void checkIfKeyguardFeaturesDisabled_multipleEnforcedAdminForManagedProfile() {
- setUpManagedProfile(mUserId);
- setUpActiveAdmins(mUserId, new ComponentName[] {mAdmin1, mAdmin2});
+ setUpManagedProfile(mUserId, new ComponentName[] {mAdmin1, mAdmin2});
when(mDevicePolicyManager.getKeyguardDisabledFeatures(mAdmin1, mUserId))
.thenReturn(KEYGUARD_DISABLE_REMOTE_INPUT);
@@ -103,9 +111,129 @@
assertThat(enforcedAdmin).isEqualTo(EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN);
}
- private UserInfo setUpManagedProfile(int userId) {
- final UserInfo userInfo = new UserInfo(userId, "myuser", UserInfo.FLAG_MANAGED_PROFILE);
+ @Test
+ public void checkIfKeyguardFeaturesAreDisabled_doesMatchAllowedFeature_unifiedManagedProfile() {
+ UserInfo userInfo = setUpUser(mUserId, new ComponentName[] {mAdmin1});
+ UserInfo profileInfo = setUpManagedProfile(mProfileId, new ComponentName[] {mAdmin2});
+ when(mUserManager.getProfiles(mUserId)).thenReturn(Arrays.asList(new UserInfo[] {
+ userInfo, profileInfo}));
+
+ when(mDevicePolicyManager.getKeyguardDisabledFeatures(mAdmin1, mUserId))
+ .thenReturn(KEYGUARD_DISABLE_FEATURES_NONE);
+ when(mDevicePolicyManager.getKeyguardDisabledFeatures(mAdmin2, mProfileId))
+ .thenReturn(KEYGUARD_DISABLE_FINGERPRINT);
+
+ // Querying the parent should return the policy, since it affects the parent.
+ EnforcedAdmin parent = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
+ mContext, KEYGUARD_DISABLE_FINGERPRINT, mUserId);
+ assertThat(parent).isEqualTo(new EnforcedAdmin(mAdmin2, mProfileId));
+
+ // Querying the child should return that too.
+ EnforcedAdmin profile = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
+ mContext, KEYGUARD_DISABLE_FINGERPRINT, mProfileId);
+ assertThat(profile).isEqualTo(new EnforcedAdmin(mAdmin2, mProfileId));
+
+ // Querying for some unrelated feature should return nothing. Nothing!
+ assertThat(RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
+ mContext, KEYGUARD_DISABLE_REMOTE_INPUT, mUserId)).isNull();
+ assertThat(RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
+ mContext, KEYGUARD_DISABLE_REMOTE_INPUT, mProfileId)).isNull();
+ }
+
+ @Test
+ public void checkIfKeyguardFeaturesAreDisabled_notMatchOtherFeatures_unifiedManagedProfile() {
+ UserInfo userInfo = setUpUser(mUserId, new ComponentName[] {mAdmin1});
+ UserInfo profileInfo = setUpManagedProfile(mProfileId, new ComponentName[] {mAdmin2});
+ when(mUserManager.getProfiles(mUserId)).thenReturn(Arrays.asList(new UserInfo[] {
+ userInfo, profileInfo}));
+
+ when(mDevicePolicyManager.getKeyguardDisabledFeatures(mAdmin1, mUserId))
+ .thenReturn(KEYGUARD_DISABLE_FEATURES_NONE);
+ when(mDevicePolicyManager.getKeyguardDisabledFeatures(mAdmin2, mProfileId))
+ .thenReturn(KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
+
+ // Querying the parent should not return the policy, because it's not a policy that should
+ // affect parents even when the lock screen is unified.
+ EnforcedAdmin primary = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
+ mContext, KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS, mUserId);
+ assertThat(primary).isNull();
+
+ // Querying the child should still return the policy.
+ EnforcedAdmin profile = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
+ mContext, KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS, mProfileId);
+ assertThat(profile).isEqualTo(new EnforcedAdmin(mAdmin2, mProfileId));
+ }
+
+ @Test
+ public void checkIfKeyguardFeaturesAreDisabled_onlyMatchesProfile_separateManagedProfile() {
+ UserInfo userInfo = setUpUser(mUserId, new ComponentName[] {mAdmin1});
+ UserInfo profileInfo = setUpManagedProfile(mProfileId, new ComponentName[] {mAdmin2});
+ when(mUserManager.getProfiles(mUserId)).thenReturn(Arrays.asList(new UserInfo[] {
+ userInfo, profileInfo}));
+
+ when(mDevicePolicyManager.getKeyguardDisabledFeatures(mAdmin1, mUserId))
+ .thenReturn(KEYGUARD_DISABLE_FEATURES_NONE);
+ when(mDevicePolicyManager.getKeyguardDisabledFeatures(mAdmin2, mProfileId))
+ .thenReturn(KEYGUARD_DISABLE_FINGERPRINT);
+
+ // Crucially for this test, isSeparateWorkChallengeEnabled => true.
+ doReturn(true).when(mProxy).isSeparateProfileChallengeEnabled(any(), eq(mProfileId));
+
+ // Querying the parent should not return the policy, even though it's shared by default,
+ // because the parent doesn't share a lock screen with the profile any more.
+ EnforcedAdmin parent = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
+ mContext, KEYGUARD_DISABLE_FINGERPRINT, mUserId);
+ assertThat(parent).isNull();
+
+ // Querying the child should still return the policy.
+ EnforcedAdmin profile = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
+ mContext, KEYGUARD_DISABLE_FINGERPRINT, mProfileId);
+ assertThat(profile).isEqualTo(new EnforcedAdmin(mAdmin2, mProfileId));
+ }
+
+ /**
+ * This test works great. The real world implementation is sketchy though.
+ * <p>
+ * DevicePolicyManager.getParentProfileInstance(UserInfo) does not do what it looks like it does
+ * (which would be to get an instance for the parent of the user that's passed in to it.)
+ * <p>
+ * Instead it just always returns a parent instance for the current user.
+ * <p>
+ * Still, the test works.
+ */
+ @Test
+ public void checkIfKeyguardFeaturesAreDisabled_onlyMatchesParent_profileParentPolicy() {
+ UserInfo userInfo = setUpUser(mUserId, new ComponentName[] {mAdmin1});
+ UserInfo profileInfo = setUpManagedProfile(mProfileId, new ComponentName[] {mAdmin2});
+ when(mUserManager.getProfiles(mUserId)).thenReturn(Arrays.asList(new UserInfo[] {
+ userInfo, profileInfo}));
+
+ when(mProxy.getParentProfileInstance(any(DevicePolicyManager.class), any())
+ .getKeyguardDisabledFeatures(mAdmin2, mProfileId))
+ .thenReturn(KEYGUARD_DISABLE_FINGERPRINT);
+
+ // Parent should get the policy.
+ EnforcedAdmin parent = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
+ mContext, KEYGUARD_DISABLE_FINGERPRINT, mUserId);
+ assertThat(parent).isEqualTo(new EnforcedAdmin(mAdmin2, mProfileId));
+
+ // Profile should not get the policy.
+ EnforcedAdmin profile = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
+ mContext, KEYGUARD_DISABLE_FINGERPRINT, mProfileId);
+ assertThat(profile).isNull();
+ }
+
+ private UserInfo setUpUser(int userId, ComponentName[] admins) {
+ UserInfo userInfo = new UserInfo(userId, "primary", 0);
when(mUserManager.getUserInfo(userId)).thenReturn(userInfo);
+ setUpActiveAdmins(userId, admins);
+ return userInfo;
+ }
+
+ private UserInfo setUpManagedProfile(int userId, ComponentName[] admins) {
+ UserInfo userInfo = new UserInfo(userId, "profile", UserInfo.FLAG_MANAGED_PROFILE);
+ when(mUserManager.getUserInfo(userId)).thenReturn(userInfo);
+ setUpActiveAdmins(userId, admins);
return userInfo;
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingLibRobolectricTestRunner.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingLibRobolectricTestRunner.java
index 11c925e..fd3b1dc6 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingLibRobolectricTestRunner.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingLibRobolectricTestRunner.java
@@ -20,9 +20,6 @@
import org.robolectric.annotation.Config;
import org.robolectric.manifest.AndroidManifest;
import org.robolectric.res.Fs;
-import org.robolectric.res.ResourcePath;
-
-import java.util.List;
public class SettingLibRobolectricTestRunner extends RobolectricTestRunner {
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
new file mode 100644
index 0000000..e42c35b
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
@@ -0,0 +1,57 @@
+/*
+ * 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.settingslib;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import static com.google.common.truth.Truth.assertThat;
+
+@RunWith(SettingLibRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class UtilsTest {
+ private static final double[] TEST_PERCENTAGES = {0, 0.4, 0.5, 0.6, 49, 49.3, 49.8, 50, 100};
+ private static final String PERCENTAGE_0 = "0%";
+ private static final String PERCENTAGE_1 = "1%";
+ private static final String PERCENTAGE_49 = "49%";
+ private static final String PERCENTAGE_50 = "50%";
+ private static final String PERCENTAGE_100 = "100%";
+
+ @Test
+ public void testFormatPercentage_RoundTrue_RoundUpIfPossible() {
+ final String[] expectedPercentages = {PERCENTAGE_0, PERCENTAGE_0, PERCENTAGE_1,
+ PERCENTAGE_1, PERCENTAGE_49, PERCENTAGE_49, PERCENTAGE_50, PERCENTAGE_50,
+ PERCENTAGE_100};
+
+ for (int i = 0, size = TEST_PERCENTAGES.length; i < size; i++) {
+ final String percentage = Utils.formatPercentage(TEST_PERCENTAGES[i], true);
+ assertThat(percentage).isEqualTo(expectedPercentages[i]);
+ }
+ }
+
+ @Test
+ public void testFormatPercentage_RoundFalse_NoRound() {
+ final String[] expectedPercentages = {PERCENTAGE_0, PERCENTAGE_0, PERCENTAGE_0,
+ PERCENTAGE_0, PERCENTAGE_49, PERCENTAGE_49, PERCENTAGE_49, PERCENTAGE_50,
+ PERCENTAGE_100};
+
+ for (int i = 0, size = TEST_PERCENTAGES.length; i < size; i++) {
+ final String percentage = Utils.formatPercentage(TEST_PERCENTAGES[i], false);
+ assertThat(percentage).isEqualTo(expectedPercentages[i]);
+ }
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/PreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/PreferenceControllerTest.java
index 126bc16..9d7cd11 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/PreferenceControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/PreferenceControllerTest.java
@@ -17,6 +17,8 @@
import android.content.Context;
import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceGroup;
+import android.support.v7.preference.PreferenceManager;
import android.support.v7.preference.PreferenceScreen;
import com.android.settingslib.TestConfig;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -26,10 +28,13 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
import org.robolectric.RobolectricTestRunner;
import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -54,7 +59,9 @@
@Test
public void removeExistingPref_shouldBeRemoved() {
- when(mScreen.findPreference(TestPrefController.KEY_PREF)).thenReturn(mPreference);
+ when(mScreen.getPreferenceCount()).thenReturn(1);
+ when(mScreen.getPreference(0)).thenReturn(mPreference);
+ when(mPreference.getKey()).thenReturn(TestPrefController.KEY_PREF);
mTestPrefController.removePreference(mScreen, TestPrefController.KEY_PREF);
@@ -79,7 +86,9 @@
@Test
public void doNotDisplayPref_ifNotAvailable() {
- when(mScreen.findPreference(TestPrefController.KEY_PREF)).thenReturn(mPreference);
+ when(mScreen.getPreferenceCount()).thenReturn(1);
+ when(mScreen.getPreference(0)).thenReturn(mPreference);
+ when(mPreference.getKey()).thenReturn(TestPrefController.KEY_PREF);
mTestPrefController.isAvailable = false;
mTestPrefController.displayPreference(mScreen);
@@ -87,6 +96,61 @@
verify(mScreen).removePreference(any(Preference.class));
}
+ @Test
+ public void removePreference_shouldRemoveRecursively() {
+ final Context context = ShadowApplication.getInstance().getApplicationContext();
+ final PreferenceManager preferenceManager = mock(PreferenceManager.class);
+ // Top level
+ PreferenceScreen prefRoot = spy(new PreferenceScreen(context, null));
+ when(prefRoot.getPreferenceManager()).thenReturn(preferenceManager);
+ Preference pref1 = mock(Preference.class);
+ when(pref1.getKey()).thenReturn("key1");
+ PreferenceGroup prefGroup2 = spy(new PreferenceScreen(context, null));
+ when(prefGroup2.getPreferenceManager()).thenReturn(preferenceManager);
+ when(prefGroup2.getKey()).thenReturn("group2");
+ Preference pref3 = mock(Preference.class);
+ when(pref3.getKey()).thenReturn("key3");
+ PreferenceGroup prefGroup4 = spy(new PreferenceScreen(context, null));
+ when(prefGroup4.getPreferenceManager()).thenReturn(preferenceManager);
+ when(prefGroup4.getKey()).thenReturn("group4");
+ prefRoot.addPreference(pref1);
+ prefRoot.addPreference(prefGroup2);
+ prefRoot.addPreference(pref3);
+ prefRoot.addPreference(prefGroup4);
+
+ // 2nd level
+ Preference pref21 = mock(Preference.class);
+ when(pref21.getKey()).thenReturn("key21");
+ Preference pref22 = mock(Preference.class);
+ when(pref22.getKey()).thenReturn("key22");
+ prefGroup2.addPreference(pref21);
+ prefGroup2.addPreference(pref22);
+ PreferenceGroup prefGroup41 = spy(new PreferenceScreen(context, null));
+ when(prefGroup41.getKey()).thenReturn("group41");
+ when(prefGroup41.getPreferenceManager()).thenReturn(preferenceManager);
+ Preference pref42 = mock(Preference.class);
+ when(pref42.getKey()).thenReturn("key42");
+ prefGroup4.addPreference(prefGroup41);
+ prefGroup4.addPreference(pref42);
+
+ // 3rd level
+ Preference pref411 = mock(Preference.class);
+ when(pref411.getKey()).thenReturn("key411");
+ Preference pref412 = mock(Preference.class);
+ when(pref412.getKey()).thenReturn("key412");
+ prefGroup41.addPreference(pref411);
+ prefGroup41.addPreference(pref412);
+
+ mTestPrefController.removePreference(prefRoot, "key1");
+ verify(prefRoot).removePreference(pref1);
+
+ mTestPrefController.removePreference(prefRoot, "key411");
+ verify(prefGroup41).removePreference(pref411);
+
+ mTestPrefController.removePreference(prefRoot, "group41");
+ verify(prefGroup4).removePreference(prefGroup41);
+ }
+
private class TestPrefController extends AbstractPreferenceController {
private static final String KEY_PREF = "test_pref";
public boolean isAvailable;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/CategoryManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/CategoryManagerTest.java
index 573ec1f0..434241d 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/CategoryManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/CategoryManagerTest.java
@@ -21,12 +21,12 @@
import android.content.Intent;
import android.util.Pair;
+import com.android.settingslib.SettingLibRobolectricTestRunner;
import com.android.settingslib.TestConfig;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
@@ -35,7 +35,7 @@
import static com.google.common.truth.Truth.assertThat;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingLibRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class CategoryManagerTest {
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java
index 1683901..2d3c4a7 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java
@@ -282,26 +282,11 @@
when(mPackageManager.queryIntentActivitiesAsUser(eq(intent), anyInt(), anyInt()))
.thenReturn(info);
- Bundle bundle = new Bundle();
- bundle.putInt("com.android.settings.icon", 161803);
- bundle.putString("com.android.settings.icon_package", "abc");
- bundle.putString("com.android.settings.summary", "dynamic-summary");
- when(mIContentProvider.call(anyString(),
- eq(TileUtils.getMethodFromUri(Uri.parse(URI_GET_ICON))), eq(URI_GET_ICON), any()))
- .thenReturn(bundle);
- when(mIContentProvider.call(anyString(),
- eq(TileUtils.getMethodFromUri(Uri.parse(URI_GET_SUMMARY))), eq(URI_GET_SUMMARY),
- any())).thenReturn(bundle);
- when(mContentResolver.acquireProvider(anyString())).thenReturn(mIContentProvider);
- when(mContentResolver.acquireProvider(any(Uri.class))).thenReturn(mIContentProvider);
-
TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache,
null /* defaultCategory */, outTiles, false /* usePriority */,
false /* checkCategory */);
assertThat(outTiles.size()).isEqualTo(1);
- assertThat(outTiles.get(0).icon.getResId()).isEqualTo(161803);
- assertThat(outTiles.get(0).summary).isEqualTo("dynamic-summary");
}
public static ResolveInfo newInfo(boolean systemApp, String category) {
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index 499b6ae..14bb02d 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -38,7 +38,7 @@
<bool name="def_bluetooth_on">true</bool>
<bool name="def_wifi_display_on">false</bool>
- <bool name="def_install_non_market_apps">true</bool>
+ <bool name="def_install_non_market_apps">false</bool>
<bool name="def_package_verifier_enable">true</bool>
<!-- Comma-separated list of location providers.
Network location is off by default because it requires
@@ -98,7 +98,7 @@
<bool name="def_accessibility_script_injection">false</bool>
<!-- Default for Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD -->
- <bool name="def_accessibility_speak_password">false</bool>
+ <bool name="def_accessibility_speak_password">true</bool>
<!-- Default for Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS -->
<string name="def_accessibility_web_content_key_bindings" translatable="false">
@@ -227,7 +227,4 @@
<!-- default setting for Settings.System.END_BUTTON_BEHAVIOR : END_BUTTON_BEHAVIOR_SLEEP -->
<integer name="def_end_button_behavior">0x2</integer>
-
- <!--Default settings for network recommendations. -->
- <string name="def_network_recommendations_package" translatable="false">com.android.networkrecommendation</string>
</resources>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index edcb9b5..5b4d2fd 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -32,6 +32,8 @@
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
import android.database.Cursor;
import android.database.MatrixCursor;
@@ -58,7 +60,7 @@
import android.os.UserManager;
import android.os.UserManagerInternal;
import android.provider.Settings;
-import android.provider.Settings.Global;
+import android.service.notification.NotificationListenerService;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -86,6 +88,7 @@
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
@@ -1037,7 +1040,7 @@
final int callingUserId = resolveCallingUserIdEnforcingPermissionsLocked(requestingUserId);
// Ensure the caller can access the setting.
- enforceSettingReadable(name, SETTINGS_TYPE_SECURE, callingUserId);
+ enforceSettingReadable(name, SETTINGS_TYPE_SECURE, UserHandle.getCallingUserId());
// Determine the owning user as some profile settings are cloned from the parent.
final int owningUserId = resolveOwningUserIdForSecureSettingLocked(callingUserId, name);
@@ -1233,7 +1236,7 @@
final int callingUserId = resolveCallingUserIdEnforcingPermissionsLocked(requestingUserId);
// Ensure the caller can access the setting.
- enforceSettingReadable(name, SETTINGS_TYPE_SYSTEM, callingUserId);
+ enforceSettingReadable(name, SETTINGS_TYPE_SYSTEM, UserHandle.getCallingUserId());
// Determine the owning user as some profile settings are cloned from the parent.
final int owningUserId = resolveOwningUserIdForSystemSettingLocked(callingUserId, name);
@@ -1531,14 +1534,14 @@
}
}
- private Set<String> getEphemeralAccessibleSettings(int settingsType) {
+ private Set<String> getInstantAppAccessibleSettings(int settingsType) {
switch (settingsType) {
case SETTINGS_TYPE_GLOBAL:
- return Settings.Global.EPHEMERAL_SETTINGS;
+ return Settings.Global.INSTANT_APP_SETTINGS;
case SETTINGS_TYPE_SECURE:
- return Settings.Secure.EPHEMERAL_SETTINGS;
+ return Settings.Secure.INSTANT_APP_SETTINGS;
case SETTINGS_TYPE_SYSTEM:
- return Settings.System.EPHEMERAL_SETTINGS;
+ return Settings.System.INSTANT_APP_SETTINGS;
default:
throw new IllegalArgumentException("Invalid settings type: " + settingsType);
}
@@ -1547,7 +1550,7 @@
private List<String> getSettingsNamesLocked(int settingsType, int userId) {
ApplicationInfo ai = getCallingApplicationInfoOrThrow(userId);
if (ai.isInstantApp()) {
- return new ArrayList<String>(getEphemeralAccessibleSettings(settingsType));
+ return new ArrayList<String>(getInstantAppAccessibleSettings(settingsType));
} else {
return mSettingsRegistry.getSettingsNamesLocked(settingsType, userId);
}
@@ -1561,7 +1564,7 @@
if (!ai.isInstantApp()) {
return;
}
- if (!getEphemeralAccessibleSettings(settingsType).contains(settingName)) {
+ if (!getInstantAppAccessibleSettings(settingsType).contains(settingName)) {
throw new SecurityException("Setting " + settingName + " is not accessible from"
+ " ephemeral package " + getCallingPackage());
}
@@ -1654,7 +1657,7 @@
return false;
}
- String oldProviders = (settingValue != null) ? settingValue.getValue() : "";
+ String oldProviders = !settingValue.isNull() ? settingValue.getValue() : "";
int index = oldProviders.indexOf(value);
int end = index + value.length();
@@ -2615,6 +2618,8 @@
if (isSecureSettingsKey(key)) {
maybeNotifyProfiles(getTypeFromKey(key), userId, uri, name,
sSecureCloneToManagedSettings);
+ maybeNotifyProfiles(SETTINGS_TYPE_SYSTEM, userId, uri, name,
+ sSystemCloneFromParentOnDependency.values());
} else if (isSystemSettingsKey(key)) {
maybeNotifyProfiles(getTypeFromKey(key), userId, uri, name,
sSystemCloneToManagedSettings);
@@ -2624,7 +2629,7 @@
}
private void maybeNotifyProfiles(int type, int userId, Uri uri, String name,
- Set<String> keysCloned) {
+ Collection<String> keysCloned) {
if (keysCloned.contains(name)) {
for (int profileId : mUserManager.getProfileIdsWithDisabled(userId)) {
// the notification for userId has already been sent.
@@ -2735,7 +2740,7 @@
}
private final class UpgradeController {
- private static final int SETTINGS_VERSION = 139;
+ private static final int SETTINGS_VERSION = 142;
private final int mUserId;
@@ -3174,35 +3179,112 @@
// setting through the UI.
final SettingsState secureSetting = getSecureSettingsLocked(userId);
if (!mUserManager.hasUserRestriction(
- UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, UserHandle.of(userId))) {
+ UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, UserHandle.of(userId))
+ && secureSetting.getSettingLocked(
+ Settings.Secure.INSTALL_NON_MARKET_APPS).getValue().equals("0")) {
+
secureSetting.insertSettingLocked(Settings.Secure.INSTALL_NON_MARKET_APPS,
"1", null, true, SettingsState.SYSTEM_PACKAGE_NAME);
+ // For managed profiles with profile owners, DevicePolicyManagerService
+ // may want to set the user restriction in this case
+ secureSetting.insertSettingLocked(
+ Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED, "1", null, true,
+ SettingsState.SYSTEM_PACKAGE_NAME);
}
currentVersion = 138;
}
if (currentVersion == 138) {
- // Version 139: Applying the default to NETWORK_RECOMMENDATIONS_PACKAGE
- if (userId == UserHandle.USER_SYSTEM) {
- final SettingsState globalSettings = getGlobalSettingsLocked();
- final String defaultAppPackage = getContext().getResources()
- .getString(R.string.def_network_recommendations_package);
-
- // Set the network recommendations package name
- globalSettings.insertSettingLocked(
- Global.NETWORK_RECOMMENDATIONS_PACKAGE,
- defaultAppPackage, null, true,
- SettingsState.SYSTEM_PACKAGE_NAME);
-
- // Clear the scorer setting since it's no longer needed.
- globalSettings.insertSettingLocked(
- Global.NETWORK_SCORER_APP,
- null, null, true,
- SettingsState.SYSTEM_PACKAGE_NAME);
- }
+ // Version 139: Removed.
currentVersion = 139;
}
+ if (currentVersion == 139) {
+ // Version 140: Settings.Secure#ACCESSIBILITY_SPEAK_PASSWORD is deprecated and
+ // the user can no longer change the value of this setting through the UI.
+ // Force to true.
+ final SettingsState secureSettings = getSecureSettingsLocked(userId);
+ secureSettings.updateSettingLocked(Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD,
+ "1", null, true, SettingsState.SYSTEM_PACKAGE_NAME);
+ currentVersion = 140;
+ }
+
+ if (currentVersion == 140) {
+ // Version 141: One-time grant of notification listener privileges
+ // to packages specified in overlay.
+ String defaultListenerAccess = getContext().getResources().getString(
+ com.android.internal.R.string.config_defaultListenerAccessPackages);
+ if (defaultListenerAccess != null) {
+ StringBuffer newListeners = new StringBuffer();
+ for (String whitelistPkg : defaultListenerAccess.split(":")) {
+ // Gather all notification listener components for candidate pkgs.
+ Intent serviceIntent =
+ new Intent(NotificationListenerService.SERVICE_INTERFACE)
+ .setPackage(whitelistPkg);
+ List<ResolveInfo> installedServices =
+ getContext().getPackageManager().queryIntentServicesAsUser(
+ serviceIntent,
+ PackageManager.GET_SERVICES
+ | PackageManager.GET_META_DATA
+ | PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
+ userId);
+
+ for (int i = 0, count = installedServices.size(); i < count; i++) {
+ ResolveInfo resolveInfo = installedServices.get(i);
+ ServiceInfo info = resolveInfo.serviceInfo;
+ if (!android.Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE
+ .equals(info.permission)) {
+ continue;
+ }
+ newListeners.append(":")
+ .append(info.getComponentName().flattenToString());
+ }
+ }
+
+ if (newListeners.length() > 0) {
+ final SettingsState secureSetting = getSecureSettingsLocked(userId);
+ final Setting existingSetting = secureSetting.getSettingLocked(
+ Settings.Secure.ENABLED_NOTIFICATION_LISTENERS);
+ if (existingSetting.isNull()) {
+ secureSetting.insertSettingLocked(
+ Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
+ newListeners.toString(), null, true,
+ SettingsState.SYSTEM_PACKAGE_NAME);
+ } else {
+ StringBuilder currentSetting =
+ new StringBuilder(existingSetting.getValue());
+ currentSetting.append(newListeners.toString());
+ secureSetting.updateSettingLocked(
+ Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
+ currentSetting.toString(), null, true,
+ SettingsState.SYSTEM_PACKAGE_NAME);
+ }
+ }
+ }
+ currentVersion = 141;
+ }
+
+ if (currentVersion == 141) {
+ // Version 141: We added the notion of a default and whether the system set
+ // the setting. This is used for resetting the internal state and we need
+ // to make sure this value is updated for the existing settings, otherwise
+ // we would delete system set settings while they should stay unmodified.
+ SettingsState globalSettings = getGlobalSettingsLocked();
+ ensureLegacyDefaultValueAndSystemSetUpdatedLocked(globalSettings);
+ globalSettings.persistSyncLocked();
+
+ SettingsState secureSettings = getSecureSettingsLocked(mUserId);
+ ensureLegacyDefaultValueAndSystemSetUpdatedLocked(secureSettings);
+ secureSettings.persistSyncLocked();
+
+ SettingsState systemSettings = getSystemSettingsLocked(mUserId);
+ ensureLegacyDefaultValueAndSystemSetUpdatedLocked(systemSettings);
+ systemSettings.persistSyncLocked();
+
+ currentVersion = 142;
+ }
+
if (currentVersion != newVersion) {
Slog.wtf("SettingsProvider", "warning: upgrading settings database to version "
+ newVersion + " left it at "
@@ -3218,5 +3300,22 @@
return currentVersion;
}
}
+
+ private void ensureLegacyDefaultValueAndSystemSetUpdatedLocked(SettingsState settings) {
+ List<String> names = settings.getSettingNamesLocked();
+ final int nameCount = names.size();
+ for (int i = 0; i < nameCount; i++) {
+ String name = names.get(i);
+ Setting setting = settings.getSettingLocked(name);
+ if (setting.getDefaultValue() == null) {
+ boolean systemSet = SettingsState.isSystemPackage(getContext(),
+ setting.getPackageName());
+ if (systemSet) {
+ settings.insertSettingLocked(name, setting.getValue(),
+ setting.getTag(), true, setting.getPackageName());
+ }
+ }
+ }
+ }
}
}
diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/InstallNonMarketAppsDeprecationTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/InstallNonMarketAppsDeprecationTest.java
index 51e4373..d8ee9b6 100644
--- a/packages/SettingsProvider/test/src/com/android/providers/settings/InstallNonMarketAppsDeprecationTest.java
+++ b/packages/SettingsProvider/test/src/com/android/providers/settings/InstallNonMarketAppsDeprecationTest.java
@@ -22,6 +22,7 @@
import android.content.Context;
import android.content.pm.UserInfo;
+import android.os.Process;
import android.os.SystemClock;
import android.os.UserManager;
import android.provider.Settings;
@@ -37,6 +38,7 @@
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
+import java.util.ArrayList;
import java.util.List;
@LargeTest
@@ -47,7 +49,8 @@
private UserManager mUm;
private boolean mHasUserRestriction;
- private List<UserInfo> mCurrentUsers;
+ private boolean mSystemSetUserRestriction;
+ private List<Integer> mUsersAddedByTest;
private String waitTillValueChanges(String errorMessage, String oldValue) {
boolean interrupted = false;
@@ -84,7 +87,10 @@
public void setUp() {
mUm = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
mHasUserRestriction = mUm.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
- mCurrentUsers = mUm.getUsers();
+ mSystemSetUserRestriction = mUm.getUserRestrictionSource(
+ UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, Process.myUserHandle())
+ == UserManager.RESTRICTION_SOURCE_SYSTEM;
+ mUsersAddedByTest = new ArrayList<>();
}
@Test
@@ -108,6 +114,7 @@
@Test
public void testValueForNewUser() throws Exception {
UserInfo newUser = mUm.createUser("TEST_USER", 0);
+ mUsersAddedByTest.add(newUser.id);
String value = getSecureSettingForUserViaShell(newUser.id);
assertEquals("install_non_market_apps should be 1 for a new user", value, "1");
}
@@ -117,6 +124,13 @@
String value = getSetting(SETTING_TYPE_SECURE, Settings.Secure.INSTALL_NON_MARKET_APPS);
assertEquals(value, mHasUserRestriction ? "0" : "1");
+ if (mHasUserRestriction && !mSystemSetUserRestriction) {
+ // User restriction set by device policy. This case should be covered in DO/PO related
+ // tests. Pass.
+ Log.w(TAG, "User restriction set by PO/DO. Skipping testValueRespectsUserRestriction");
+ return;
+ }
+
mUm.setUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, !mHasUserRestriction);
value = waitTillValueChanges(
"Changing user restriction did not change the value of install_non_market_apps",
@@ -132,15 +146,13 @@
@After
public void tearDown() {
- if (mUm.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES)
- != mHasUserRestriction) {
+ if (!mHasUserRestriction || mSystemSetUserRestriction) {
+ // The test may have modified the user restriction state. Restore it.
mUm.setUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES,
mHasUserRestriction);
}
- mUm.getUsers().forEach(user -> {
- if (!mCurrentUsers.contains(user)) {
- mUm.removeUser(user.id);
- }
- });
+ for (int userId : mUsersAddedByTest) {
+ mUm.removeUser(userId);
+ }
}
}
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index d4c7c7a..5b4dd48 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -41,6 +41,7 @@
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" />
+ <uses-permission android:name="android.permission.MANAGE_USB" />
<!-- System tool permissions granted to the shell. -->
<uses-permission android:name="android.permission.REAL_GET_TASKS" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
@@ -117,6 +118,8 @@
<uses-permission android:name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME" />
<!-- Permission needed to hold a wakelock in dumpstate.cpp (drop_root_user()) -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
+ <!-- Permission needed to enable/disable overlays -->
+ <uses-permission android:name="android.permission.CHANGE_OVERLAY_PACKAGES" />
<application android:label="@string/app_label"
android:defaultToDeviceProtectedStorage="true"
@@ -154,8 +157,8 @@
android:name=".BugreportReceiver"
android:permission="android.permission.DUMP">
<intent-filter>
- <action android:name="android.intent.action.BUGREPORT_STARTED" />
- <action android:name="android.intent.action.BUGREPORT_FINISHED" />
+ <action android:name="com.android.internal.intent.action.BUGREPORT_STARTED" />
+ <action android:name="com.android.internal.intent.action.BUGREPORT_FINISHED" />
</intent-filter>
</receiver>
@@ -163,7 +166,7 @@
android:name=".RemoteBugreportReceiver"
android:permission="android.permission.DUMP">
<intent-filter>
- <action android:name="android.intent.action.REMOTE_BUGREPORT_FINISHED" />
+ <action android:name="com.android.internal.intent.action.REMOTE_BUGREPORT_FINISHED" />
</intent-filter>
</receiver>
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 17d0a09..1df626f 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -44,6 +44,7 @@
import libcore.io.Streams;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.app.ChooserActivity;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.FastPrintWriter;
@@ -133,10 +134,12 @@
private static final String AUTHORITY = "com.android.shell";
// External intents sent by dumpstate.
- static final String INTENT_BUGREPORT_STARTED = "android.intent.action.BUGREPORT_STARTED";
- static final String INTENT_BUGREPORT_FINISHED = "android.intent.action.BUGREPORT_FINISHED";
+ static final String INTENT_BUGREPORT_STARTED =
+ "com.android.internal.intent.action.BUGREPORT_STARTED";
+ static final String INTENT_BUGREPORT_FINISHED =
+ "com.android.internal.intent.action.BUGREPORT_FINISHED";
static final String INTENT_REMOTE_BUGREPORT_FINISHED =
- "android.intent.action.REMOTE_BUGREPORT_FINISHED";
+ "com.android.internal.intent.action.REMOTE_BUGREPORT_FINISHED";
// Internal intents used on notification actions.
static final String INTENT_BUGREPORT_CANCEL = "android.intent.action.BUGREPORT_CANCEL";
@@ -941,8 +944,13 @@
}
static void sendShareIntent(Context context, Intent intent) {
- context.startActivity(Intent.createChooser(intent,
- context.getResources().getText(R.string.bugreport_intent_chooser_title)));
+ final Intent chooserIntent = Intent.createChooser(intent,
+ context.getResources().getText(R.string.bugreport_intent_chooser_title));
+
+ // Since we may be launched behind lockscreen, make sure that ChooserActivity doesn't finish
+ // itself in onStop.
+ chooserIntent.putExtra(ChooserActivity.EXTRA_PRIVATE_RETAIN_IN_ON_STOP, true);
+ context.startActivity(chooserIntent);
}
/**
diff --git a/packages/SystemUI/plugin/ExamplePlugin/src/com/android/systemui/plugin/testoverlayplugin/SampleOverlayPlugin.java b/packages/SystemUI/plugin/ExamplePlugin/src/com/android/systemui/plugin/testoverlayplugin/SampleOverlayPlugin.java
index 13fc76c..79a0c35 100644
--- a/packages/SystemUI/plugin/ExamplePlugin/src/com/android/systemui/plugin/testoverlayplugin/SampleOverlayPlugin.java
+++ b/packages/SystemUI/plugin/ExamplePlugin/src/com/android/systemui/plugin/testoverlayplugin/SampleOverlayPlugin.java
@@ -24,7 +24,9 @@
import android.view.ViewTreeObserver.InternalInsetsInfo;
import android.view.ViewTreeObserver.OnComputeInternalInsetsListener;
import com.android.systemui.plugins.OverlayPlugin;
+import com.android.systemui.plugins.annotations.Requires;
+@Requires(target = OverlayPlugin.class, version = OverlayPlugin.VERSION)
public class SampleOverlayPlugin implements OverlayPlugin {
private static final String TAG = "SampleOverlayPlugin";
private Context mPluginContext;
@@ -36,12 +38,6 @@
private float mStatusBarHeight;
@Override
- public int getVersion() {
- Log.d(TAG, "getVersion " + VERSION);
- return VERSION;
- }
-
- @Override
public void onCreate(Context sysuiContext, Context pluginContext) {
Log.d(TAG, "onCreate");
mPluginContext = pluginContext;
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/IntentButtonProvider.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/IntentButtonProvider.java
index 9c173bd..97dbafd 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/IntentButtonProvider.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/IntentButtonProvider.java
@@ -14,6 +14,8 @@
package com.android.systemui.plugins;
+import com.android.systemui.plugins.annotations.ProvidesInterface;
+
import android.content.Intent;
import android.graphics.drawable.Drawable;
@@ -21,6 +23,7 @@
* An Intent Button represents a triggerable element in SysUI that consists of an
* Icon and an intent to trigger when it is activated (clicked, swiped, etc.).
*/
+@ProvidesInterface(version = IntentButtonProvider.VERSION)
public interface IntentButtonProvider extends Plugin {
public static final int VERSION = 1;
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/OverlayPlugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/OverlayPlugin.java
index f5074f7..61aa60b 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/OverlayPlugin.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/OverlayPlugin.java
@@ -13,12 +13,15 @@
*/
package com.android.systemui.plugins;
+import com.android.systemui.plugins.annotations.ProvidesInterface;
+
import android.view.View;
+@ProvidesInterface(action = OverlayPlugin.ACTION, version = OverlayPlugin.VERSION)
public interface OverlayPlugin extends Plugin {
String ACTION = "com.android.systemui.action.PLUGIN_OVERLAY";
- int VERSION = 1;
+ int VERSION = 2;
void setup(View statusBar, View navBar);
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/Plugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/Plugin.java
index e75ecb7..bb93367 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/Plugin.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/Plugin.java
@@ -13,6 +13,8 @@
*/
package com.android.systemui.plugins;
+import com.android.systemui.plugins.annotations.Requires;
+
import android.content.Context;
/**
@@ -111,18 +113,13 @@
public interface Plugin {
/**
- * Should be implemented as the following directly referencing the version constant
- * from the plugin interface being implemented, this will allow recompiles to automatically
- * pick up the current version.
- * <pre class="prettyprint">
- * {@literal
- * public int getVersion() {
- * return VERSION;
- * }
- * }
- * @return
+ * @deprecated
+ * @see Requires
*/
- int getVersion();
+ default int getVersion() {
+ // Default of -1 indicates the plugin supports the new Requires model.
+ return -1;
+ }
default void onCreate(Context sysuiContext, Context pluginContext) {
}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/annotations/Dependencies.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/annotations/Dependencies.java
new file mode 100644
index 0000000..dbbf047
--- /dev/null
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/annotations/Dependencies.java
@@ -0,0 +1,27 @@
+/*
+ * 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.plugins.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Used for repeated @DependsOn internally, not for plugin
+ * use.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Dependencies {
+ DependsOn[] value();
+}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/annotations/DependsOn.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/annotations/DependsOn.java
new file mode 100644
index 0000000..b81d673
--- /dev/null
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/annotations/DependsOn.java
@@ -0,0 +1,32 @@
+/*
+ * 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.plugins.annotations;
+
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Used to indicate that an interface in the plugin library needs another
+ * interface to function properly. When this is added, it will be enforced
+ * that all plugins that @Requires the annotated interface also @Requires
+ * the specified class as well.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Repeatable(value = Dependencies.class)
+public @interface DependsOn {
+ Class<?> target();
+
+}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/annotations/ProvidesInterface.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/annotations/ProvidesInterface.java
new file mode 100644
index 0000000..d0e14b8
--- /dev/null
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/annotations/ProvidesInterface.java
@@ -0,0 +1,30 @@
+/*
+ * 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.plugins.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Should be added to all interfaces in plugin lib to specify their
+ * current version and optionally their action to implement the plugin.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ProvidesInterface {
+ int version();
+
+ String action() default "";
+
+}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/annotations/Requirements.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/annotations/Requirements.java
new file mode 100644
index 0000000..9cfa279
--- /dev/null
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/annotations/Requirements.java
@@ -0,0 +1,27 @@
+/*
+ * 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.plugins.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Used for repeated @Requires internally, not for plugin
+ * use.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Requirements {
+ Requires[] value();
+}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/annotations/Requires.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/annotations/Requires.java
new file mode 100644
index 0000000..e1b1303
--- /dev/null
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/annotations/Requires.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.plugins.annotations;
+
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Used to annotate which interfaces a given plugin depends on.
+ *
+ * At minimum all plugins should have at least one @Requires annotation
+ * for the plugin interface that they are implementing. They will also
+ * need an @Requires for each class that the plugin interface @DependsOn.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Repeatable(value = Requirements.class)
+public @interface Requires {
+ Class<?> target();
+ int version();
+}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/doze/DozeProvider.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/doze/DozeProvider.java
index 688df46..0688481 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/doze/DozeProvider.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/doze/DozeProvider.java
@@ -20,10 +20,12 @@
import android.content.Context;
import com.android.systemui.plugins.Plugin;
+import com.android.systemui.plugins.annotations.ProvidesInterface;
/**
* Provides a {@link DozeUi}.
*/
+@ProvidesInterface(action = DozeProvider.ACTION, version = DozeProvider.VERSION)
public interface DozeProvider extends Plugin {
String ACTION = "com.android.systemui.action.PLUGIN_DOZE";
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
index e21a282..b7467eb 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
@@ -14,29 +14,32 @@
package com.android.systemui.plugins.qs;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.PendingIntent;
+import com.android.systemui.plugins.FragmentBase;
+import com.android.systemui.plugins.annotations.DependsOn;
+import com.android.systemui.plugins.annotations.ProvidesInterface;
+import com.android.systemui.plugins.qs.QS.Callback;
+import com.android.systemui.plugins.qs.QS.DetailAdapter;
+import com.android.systemui.plugins.qs.QS.HeightListener;
+
import android.content.Context;
import android.content.Intent;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.FrameLayout;
import android.widget.RelativeLayout;
-import com.android.systemui.plugins.FragmentBase;
-
/**
* Fragment that contains QS in the notification shade. Most of the interface is for
* handling the expand/collapsing of the view interaction.
*/
+@ProvidesInterface(action = QS.ACTION, version = QS.VERSION)
+@DependsOn(target = HeightListener.class)
+@DependsOn(target = Callback.class)
+@DependsOn(target = DetailAdapter.class)
public interface QS extends FragmentBase {
public static final String ACTION = "com.android.systemui.action.PLUGIN_QS";
- // This should be incremented any time this class or ActivityStarter or BaseStatusBarHeader
- // change in incompatible ways.
public static final int VERSION = 5;
String TAG = "QS";
@@ -64,17 +67,23 @@
public abstract void setContainer(ViewGroup container);
+ @ProvidesInterface(version = HeightListener.VERSION)
public interface HeightListener {
+ public static final int VERSION = 1;
void onQsHeightChanged();
}
+ @ProvidesInterface(version = Callback.VERSION)
public interface Callback {
+ public static final int VERSION = 1;
void onShowingDetail(DetailAdapter detail, int x, int y);
void onToggleStateChanged(boolean state);
void onScanStateChanged(boolean state);
}
+ @ProvidesInterface(version = DetailAdapter.VERSION)
public interface DetailAdapter {
+ public static final int VERSION = 1;
CharSequence getTitle();
Boolean getToggleState();
default boolean getToggleEnabled() {
@@ -92,7 +101,9 @@
default boolean hasHeader() { return true; }
}
+ @ProvidesInterface(version = BaseStatusBarHeader.VERSION)
public abstract static class BaseStatusBarHeader extends RelativeLayout {
+ public static final int VERSION = 1;
public BaseStatusBarHeader(Context context, AttributeSet attrs) {
super(context, attrs);
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationMenuRowProvider.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationMenuRowProvider.java
index 41a0907..529c421 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationMenuRowProvider.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationMenuRowProvider.java
@@ -10,7 +10,10 @@
import java.util.ArrayList;
import com.android.systemui.plugins.Plugin;
+import com.android.systemui.plugins.annotations.ProvidesInterface;
+@ProvidesInterface(action = NotificationMenuRowProvider.ACTION,
+ version = NotificationMenuRowProvider.VERSION)
public interface NotificationMenuRowProvider extends Plugin {
public static final String ACTION = "com.android.systemui.action.PLUGIN_NOTIFICATION_MENU_ROW";
@@ -40,6 +43,8 @@
public View getContentView();
public boolean handleCloseControls(boolean save);
+
+ public boolean willBeRemoved();
}
public interface SnoozeGutsContent extends GutsContent {
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavBarButtonProvider.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavBarButtonProvider.java
index d54e33f..5243228 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavBarButtonProvider.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavBarButtonProvider.java
@@ -14,14 +14,15 @@
package com.android.systemui.plugins.statusbar.phone;
-import android.annotation.DrawableRes;
import android.annotation.Nullable;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.ViewGroup;
import com.android.systemui.plugins.Plugin;
+import com.android.systemui.plugins.annotations.ProvidesInterface;
+@ProvidesInterface(action = NavBarButtonProvider.ACTION, version = NavBarButtonProvider.VERSION)
public interface NavBarButtonProvider extends Plugin {
public static final String ACTION = "com.android.systemui.action.PLUGIN_NAV_BUTTON";
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavGesture.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavGesture.java
index 918d6e9..ddee89e 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavGesture.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavGesture.java
@@ -17,7 +17,9 @@
import android.view.MotionEvent;
import com.android.systemui.plugins.Plugin;
+import com.android.systemui.plugins.annotations.ProvidesInterface;
+@ProvidesInterface(action = NavGesture.ACTION, version = NavBarButtonProvider.VERSION)
public interface NavGesture extends Plugin {
public static final String ACTION = "com.android.systemui.action.PLUGIN_NAV_GESTURE";
diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml
index ef6d58f..83ed6cd 100644
--- a/packages/SystemUI/res-keyguard/values-af/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-af/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Knoppie vir wissel van invoermetode."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Tik PIN-kode in"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Tik SIM se PUK- en nuwe PIN-kode in"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM se PUK-kode"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"SIM se nuwe PIN-kode"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Raak om wagwoord in te tik"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Voer wagwoord in om te ontsluit"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Tik PIN in om te ontsluit"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Verkeerde PIN-kode."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Gelaai"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Laai"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Laai tans vinnig"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Laai tans stadig"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Koppel jou laaier."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Druk Kieslys om te ontsluit."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Netwerk is gesluit"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Geen SIM-kaart nie"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Geen SIM-kaart in tablet nie."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Geen SIM-kaart in foon nie."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Steek \'n SIM-kaart in."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Die SIM-kaart is weg of nie leesbaar nie. Steek \'n SIM-kaart in."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Onbruikbare SIM-kaart."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Jou SIM-kaart is permanent gedeaktiveer.\n Kontak jou draadlose diensverskaffer vir \'n ander SIM-kaart."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM-kaart is gesluit."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM-kaart is PUK-geslote."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Ontsluit tans SIM-kaart …"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN-area"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM-PIN-area"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"SIM-PUK-area"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Volgende wekker gestel vir <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Vee uit"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Het jy die patroon vergeet?"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Verkeerde patroon"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Verkeerde wagwoord"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Verkeerde PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Probeer weer oor <xliff:g id="NUMBER">%d</xliff:g> sekondes."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Teken jou patroon"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Voer SIM se PIN in"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Voer SIM se PIN vir \"<xliff:g id="CARRIER">%1$s</xliff:g>\" in"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Voer PIN in"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Voer wagwoord in"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM is nou gedeaktiveer. Voer PUK-kode in om voort te gaan. Kontak diensverskaffer vir besonderhede."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM vir \"<xliff:g id="CARRIER">%1$s</xliff:g>\" is nou gedeaktiveer. Voer die PUK-kode in om voort te gaan. Kontak die diensverskaffer vir besonderhede."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Voer die gewenste PIN-kode in"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Bevestig gewenste PIN-kode"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Ontsluit tans SIM-kaart …"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Tik \'n PIN wat 4 to 8 syfers lank is, in."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK-kode moet 8 of meer syfers wees."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Voer die korrekte PUK-kode weer in. Herhaalde pogings sal die SIM permanent deaktiveer."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN-kodes stem nie ooreen nie"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Te veel patroonpogings"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Jy het jou PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> keer verkeerd ingetik. \n\nProbeer weer oor <xliff:g id="NUMBER_1">%2$d</xliff:g> sekondes."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Jy het jou wagwoord <xliff:g id="NUMBER_0">%1$d</xliff:g> keer verkeerd ingetik. \n\nProbeer weer oor <xliff:g id="NUMBER_1">%2$d</xliff:g> sekondes."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Jy het jou ontsluitpatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer verkeerd geteken. \n\nProbeer weer oor <xliff:g id="NUMBER_1">%2$d</xliff:g> sekondes."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Jy het die tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> keer verkeerd probeer ontsluit. Na nóg <xliff:g id="NUMBER_1">%2$d</xliff:g> onsuksesvolle pogings sal hierdie tablet teruggestel word, wat al sy data sal uitvee."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Jy het die foon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer verkeerd probeer ontsluit. Na nóg <xliff:g id="NUMBER_1">%2$d</xliff:g> onsuksesvolle pogings sal hierdie foon teruggestel word, wat al sy data sal uitvee."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Jy het die tablet <xliff:g id="NUMBER">%d</xliff:g> keer verkeerd probeer ontsluit. Hierdie tablet sal teruggestel word, wat al sy data sal uitvee."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Jy het die foon <xliff:g id="NUMBER">%d</xliff:g> keer verkeerd probeer ontsluit. Hierdie foon sal teruggestel word, wat al sy data sal uitvee."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Jy het die tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> keer verkeerd probeer ontsluit. Na nóg <xliff:g id="NUMBER_1">%2$d</xliff:g> onsuksesvolle pogings sal hierdie gebruiker verwyder word, wat alle gebruikerdata sal uitvee."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Jy het die foon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer verkeerd probeer ontsluit. Na nóg <xliff:g id="NUMBER_1">%2$d</xliff:g> onsuksesvolle pogings sal hierdie gebruiker verwyder word, wat alle gebruikerdata sal uitvee."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Jy het die tablet <xliff:g id="NUMBER">%d</xliff:g> keer verkeerd probeer ontsluit. Hierdie gebruiker sal verwyder word, wat alle gebruikerdata sal uitvee."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Jy het die foon <xliff:g id="NUMBER">%d</xliff:g> keer verkeerd probeer ontsluit. Hierdie gebruiker sal verwyder word, wat alle gebruikerdata sal uitvee."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Jy het die tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> keer verkeerd probeer ontsluit. Na nog <xliff:g id="NUMBER_1">%2$d</xliff:g> onsuksesvolle pogings sal die werkprofiel verwyder word, wat alle profieldata sal uitvee."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Jy het die foon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer verkeerd probeer ontsluit. Na nog <xliff:g id="NUMBER_1">%2$d</xliff:g> onsuksesvolle pogings sal die werkprofiel verwyder word, wat alle profieldata sal uitvee."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Jy het die tablet <xliff:g id="NUMBER">%d</xliff:g> keer verkeerd probeer ontsluit. Die werkprofiel sal verwyder word, wat alle profieldata sal uitvee."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Jy het die foon <xliff:g id="NUMBER">%d</xliff:g> keer verkeerd probeer ontsluit. Die werkprofiel sal verwyder word, wat alle profieldata sal uitvee."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Jy het jou ontsluitpatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer verkeerd geteken. Na nóg <xliff:g id="NUMBER_1">%2$d</xliff:g> onsuksesvolle pogings sal jy gevra word om jou e-posrekening te gebruik om jou tablet te ontsluit.\n\n Probeer weer oor <xliff:g id="NUMBER_2">%3$d</xliff:g> sekondes."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Jy het jou ontsluitpatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer verkeerd geteken. Na nóg <xliff:g id="NUMBER_1">%2$d</xliff:g> onsuksesvolle pogings sal jy gevra word om jou e-posrekening te gebruik om jou foon te ontsluit.\n\n Probeer weer oor <xliff:g id="NUMBER_2">%3$d</xliff:g> sekondes."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Verkeerde SIM-PIN-kode. Jy sal nou jou diensverskaffer moet kontak om jou toestel te ontsluit."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Verkeerde SIM-PIN-kode. Jy het <xliff:g id="NUMBER_1">%d</xliff:g> pogings oor.</item>
+ <item quantity="one">Verkeerde SIM-PIN-kode. Jy het <xliff:g id="NUMBER_0">%d</xliff:g> oorblywende poging voordat jy jou diensverskaffer sal moet kontak om jou toestel te ontsluit.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM is onbruikbaar. Kontak jou diensverskaffer."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Verkeerde SIM-PUK-kode. Jy het <xliff:g id="NUMBER_1">%d</xliff:g> pogings oor voordat SIM permanent onbruikbaar word.</item>
+ <item quantity="one">Verkeerde SIM-PUK-kode. Jy het <xliff:g id="NUMBER_0">%d</xliff:g> poging oor voordat SIM permanent onbruikbaar word.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"SIM-PIN-bewerking het misluk!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"SIM-PUK-bewerking het misluk!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kode is aanvaar!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Geen diens nie."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Wissel invoermetode"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Vliegtuigmodus"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Patroon word vereis nadat toestel herbegin het"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"PIN word vereis nadat toestel herbegin het"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Wagwoord word vereis nadat toestel herbegin het"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Patroon word vir bykomende sekuriteit vereis"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"PIN word vir bykomende sekuriteit vereis"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Wagwoord word vir bykomende sekuriteit vereis"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Patroon word vereis wanneer jy profiele wissel"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"PIN word vereis wanneer jy profiele wissel"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Wagwoord word vereis wanneer jy profiele wissel"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Toesteladministrateur het toestel gesluit"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Toestel is handmatig gesluit"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Toestel is <xliff:g id="NUMBER_1">%d</xliff:g> uur lank nie ontsluit nie. Bevestig patroon.</item>
+ <item quantity="one">Toestel is <xliff:g id="NUMBER_0">%d</xliff:g> uur lank nie ontsluit nie. Bevestig patroon.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Toestel is <xliff:g id="NUMBER_1">%d</xliff:g> uur lank nie ontsluit nie. Bevestig PIN.</item>
+ <item quantity="one">Toestel is <xliff:g id="NUMBER_0">%d</xliff:g> uur lank nie ontsluit nie. Bevestig PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Toestel is <xliff:g id="NUMBER_1">%d</xliff:g> uur lank nie ontsluit nie. Bevestig wagwoord.</item>
+ <item quantity="one">Toestel is <xliff:g id="NUMBER_0">%d</xliff:g> uur lank nie ontsluit nie. Bevestig wagwoord.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nie herken nie"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml
index 99de8ef..8b6d6a48 100644
--- a/packages/SystemUI/res-keyguard/values-am/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-am/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"የግቤት ስልት አዝራር ቀይር"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"የቁልፍ ጥበቃ"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"ፒን ኮድ ይተይቡ"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"የሲም ፒዩኬ እና አዲሱን ፒን ኮድ ይተይቡ"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"የሲም ፒዩኬ ኮድ"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"አዲስ የሲም ፒን ኮድ"</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">"ለመክፈት ፒን ይተይቡ"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"ትክክል ያልሆነ ፒን ኮድ።"</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_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">"ምንም ሲም ካርድ የለም"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"በጡባዊ ውስጥ ምንም ሲም ካርድ የለም።"</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"በስልክ ውስጥ ምንም ሲም ካርድ የለም።"</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"ሲም ካርድ ያስገቡ።"</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"ሲም ካርዱ ጠፍቷል ወይም መነበብ አይችልም። እባክዎ ሲም ካርድ ያስገቡ።"</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"የማይሰራ ሲም ካርድ።"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"ሲም ካርድዎ እስከመጨረሻው ተሰናክሏል።\n ሌላ ሲም ካርድ ለማግኘት ከገመድ አልባ አገልግሎት አቅራቢዎ ጋር ይገናኙ።"</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"ሲም ካርድ ተዘግቷል።"</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"ሲም ካርድ በፒዩኬ ተቆልፏል።"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"ሲም ካርድን በመክፈት ላይ..."</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"የፒን አካባቢ"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"የሲም ፒን አካባቢ"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"የሲም ፒዩኬ አካባቢ"</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="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">"የተሳሳተ ፒን"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"በ<xliff:g id="NUMBER">%d</xliff:g> ሰከንዶች ውስጥ እንደገና ይሞክሩ።"</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ስርዓተ ጥለትዎን ይሳሉ"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"የሲም ፒን ያስገቡ"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"የ«<xliff:g id="CARRIER">%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">"ሲም አሁን ተሰናክሏል። ለመቀጠል የፒዩኬ ኮድ ያስገቡ። ለዝርዝር አገልግሎት አቅራቢን ያግኙ።"</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"ሲም «<xliff:g id="CARRIER">%1$s</xliff:g>» አሁን ተሰናክሏል። ለመቀጠል የፒዩኬ ኮድ ያስገቡ። ዝርዝር መረጃን ለማግኘት የተንቀሳቃሽ ስልክ አገልግሎት አቅራቢውን ያነጋግሩ።"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"የተፈለገውን የፒን ኮድ ያስገቡ"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"የተፈለገውን ፒን ኮድ ያረጋግጡ"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"ሲም ካርድን በመክፈት ላይ..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"ከ4 እስከ 8 ቁጥሮች የያዘ ፒን ይተይቡ።"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"የፒዩኬ ኮድ 8 ወይም ከዚያ በላይ ቁጥሮች ሊኖረው ይገባል።"</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"ትክክለኛውን የፒዩኬ ኮድ እንደገና ያስገቡ። ተደጋጋሚ ሙከራዎች ሲሙን እስከመጨረሻው ያሰናክሉታል።"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"ፒን ኮዶቹ አይገጣጠሙም"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"በጣም ብዙ የስርዓተ ጥለት ሙከራዎች"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"ፒንዎን <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">"ልክ ያልሆነ የሲም ፒን ኮድ። አሁን መሣሪያዎን ለማስከፈት አገልግሎት አቅራቢዎን ማነጋገር አለብዎት።"</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">ልክ ያልሆነ የሲም ፒን ኮድ፣ <xliff:g id="NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል።</item>
+ <item quantity="other">ልክ ያልሆነ የሲም ፒን ኮድ፣ <xliff:g id="NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል።</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"ሲሙ ጥቅም ላይ መዋል እይችልም። የአገልግሎት አቅራቢዎን ያነጋግሩ።"</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">ልክ ያልሆነ የሲም ፒዩኬ ኮድ፣ ሲሙ እስከመጨረሻው የማይሰራ ከመሆኑ በፊት <xliff:g id="NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል።</item>
+ <item quantity="other">ልክ ያልሆነ የሲም ፒዩኬ ኮድ፣ ሲሙ እስከመጨረሻው የማይሰራ ከመሆኑ በፊት <xliff:g id="NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል።</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"የሲም ፒን ክወና አልተሳካም!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"የሲም ፒዩኬ ክወና አልተሳካም!"</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">"ፒን ለተጨማሪ ደህንነት ያስፈልጋል"</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">"መገለጫዎችን በሚቀያይሯቸው ጊዜ ፒን ያስፈልጋል"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"መገለጫዎችን በሚቀያይሯቸው ጊዜ የይለፍ ቃል ያስፈልጋል"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"የመሣሪያ አስተዳዳሪ መሣሪያውን ቆልፈዋል"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"መሣሪያ በተጠቃሚው ራሱ ተቆልፏል"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">ው ለ<xliff:g id="NUMBER_1">%d</xliff:g> ሰዓቶች አልተከፈተም ነበር። ስርዓተ-ጥለት ያረጋግጡ።</item>
+ <item quantity="other">መሣሪያው ለ<xliff:g id="NUMBER_1">%d</xliff:g> ሰዓቶች አልተከፈተም ነበር። ስርዓተ-ጥለት ያረጋግጡ።</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">መሣሪያው ለ<xliff:g id="NUMBER_1">%d</xliff:g> ሰዓቶች አልተከፈተም ነበር። ፒን ያረጋግጡ።</item>
+ <item quantity="other">መሣሪያው ለ<xliff:g id="NUMBER_1">%d</xliff:g> ሰዓቶች አልተከፈተም ነበር። ፒን ያረጋግጡ።</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">መሣሪያው ለ<xliff:g id="NUMBER_1">%d</xliff:g> ሰዓቶች አልተከፈተም ነበር። የይለፍ ቃል ያረጋግጡ።</item>
+ <item quantity="other">መሣሪያው ለ<xliff:g id="NUMBER_1">%d</xliff:g> ሰዓቶች አልተከፈተም ነበር። የይለፍ ቃል ያረጋግጡ።</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"አልታወቀም"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml
index 28c3f25..3ed9815 100644
--- a/packages/SystemUI/res-keyguard/values-ar/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml
@@ -20,186 +20,133 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"زر تبديل طريقة الإدخال."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"تأمين المفاتيح"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"اكتب رمز رقم التعريف الشخصي"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"أدخل رمز PUK لشريحة SIM ورمز \"رقم التعريف الشخصي\" الجديد"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"رمز PUK لشريحة SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"رمز رقم تعريف شخصي جديد لشريحة SIM"</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">"اكتب رمز رقم التعريف الشخصي لإلغاء التأمين"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"رمز رقم التعريف الشخصي غير صحيح."</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_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">"منطقة رقم التعريف الشخصي"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"منطقة رقم التعريف الشخصي لشريحة SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"منطقة PUK لشريحة SIM"</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">"Delete"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</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">"رقم تعريف شخصي خاطئ"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ارسم نقشك"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"أدخل رمز رقم التعريف الشخصي لشريحة SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"أدخل رقم التعريف الشخصي لشريحة SIM التابعة للمشغّل \"<xliff:g id="CARRIER">%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">"شريحة 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">"أدخل رمز رقم التعريف الشخصي المطلوب"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"تأكيد رمز رقم التعريف الشخصي المطلوب"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"جارٍ إلغاء تأمين شريحة SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"اكتب رمز رقم التعريف الشخصي المكوّن من ٤ إلى ٨ أرقام."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"يجب أن يتضمن رمز PUK ۸ أرقام أو أكثر."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"أعد إدخال رمز PUK الصحيح. وستؤدي المحاولات المتكررة إلى تعطيل شريحة SIM نهائيًا."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"لا يتطابق رمز رقم التعريف الشخصي"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"محاولات النقش كثيرة جدًا"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"لقد كتبت رقم التعريف الشخصي بشكل غير صحيح <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 غير صحيح، ويلزمك الاتصال الآن بمشغّل شبكة الجوّال لإلغاء قفل الجهاز."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="zero">رمز رقم التعريف الشخصي لشريحة SIM غير صحيح، ولم تتبق لديك أية محاولات (<xliff:g id="NUMBER_1">%d</xliff:g>).</item>
+ <item quantity="two">رمز رقم التعريف الشخصي لشريحة SIM غير صحيح، ويتبقى لديك محاولتان (<xliff:g id="NUMBER_1">%d</xliff:g>).</item>
+ <item quantity="few">رمز رقم التعريف الشخصي لشريحة SIM غير صحيح، ويتبقى لديك <xliff:g id="NUMBER_1">%d</xliff:g> محاولات.</item>
+ <item quantity="many">رمز رقم التعريف الشخصي لشريحة SIM غير صحيح، ويتبقى لديك <xliff:g id="NUMBER_1">%d</xliff:g> محاولة.</item>
+ <item quantity="other">رمز رقم التعريف الشخصي لشريحة SIM غير صحيح، ويتبقى لديك <xliff:g id="NUMBER_1">%d</xliff:g> محاولة.</item>
+ <item quantity="one">رمز \"رقم التعريف الشخصي\" لشريحة SIM غير صحيح، ويتبقى لديك محاولة واحدة (<xliff:g id="NUMBER_0">%d</xliff:g>) يتعين عليك بعدها الاتصال بمشغّل شبكة الجوّال لإلغاء قفل الجهاز.</item>
+ </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="zero">رمز PUK لشريحة SIM غير صحيح، ولم تتبق لديك أية محاولات (<xliff:g id="NUMBER_1">%d</xliff:g>) تصبح بعدها شريحة SIM غير صالحة للاستخدام بشكل دائم.</item>
+ <item quantity="two">رمز PUK لشريحة SIM غير صحيح، ويتبقى لديك محاولتان (<xliff:g id="NUMBER_1">%d</xliff:g>) تصبح بعدها شريحة SIM غير صالحة للاستخدام بشكل دائم.</item>
+ <item quantity="few">رمز PUK لشريحة SIM غير صحيح، ويتبقى لديك <xliff:g id="NUMBER_1">%d</xliff:g> محاولات تصبح بعدها شريحة SIM غير صالحة للاستخدام بشكل دائم.</item>
+ <item quantity="many">رمز PUK لشريحة SIM غير صحيح، ويتبقى لديك <xliff:g id="NUMBER_1">%d</xliff:g> محاولة تصبح بعدها شريحة SIM غير صالحة للاستخدام بشكل دائم.</item>
+ <item quantity="other">رمز PUK لشريحة SIM غير صحيح، ويتبقى لديك <xliff:g id="NUMBER_1">%d</xliff:g> من المحاولات تصبح بعدها شريحة SIM غير صالحة للاستخدام بشكل دائم.</item>
+ <item quantity="one">رمز PUK لشريحة SIM غير صالح، ويتبقى لديك محاولة واحدة (<xliff:g id="NUMBER_0">%d</xliff:g>)، تصبح بعدها شريحة SIM غير صالحة للاستخدام بشكل دائم.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"أخفقت عملية \"رقم التعريف الشخصي\" لشريحة SIM"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"أخفقت عملية PUK لشريحة SIM"</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">"يجب إدخال رقم التعريف الشخصي لمزيد من الأمان"</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">"يجب إدخال رقم التعريف الشخصي عند تبديل الملفات الشخصية"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"يجب إدخال كلمة المرور عند تبديل الملفات الشخصية."</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"تم حظر الجهاز بواسطة المسؤول"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"تم حظر الجهاز يدويًا"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="zero">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد النقش.</item>
+ <item quantity="two">لم يتم إلغاء تأمين الجهاز لمدة ساعتين (<xliff:g id="NUMBER_1">%d</xliff:g>). تأكيد النقش.</item>
+ <item quantity="few">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعات. تأكيد النقش.</item>
+ <item quantity="many">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد النقش.</item>
+ <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="zero">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد رقم التعريف الشخصي.</item>
+ <item quantity="two">لم يتم إلغاء تأمين الجهاز لمدة ساعتين (<xliff:g id="NUMBER_1">%d</xliff:g>). تأكيد رقم التعريف الشخصي.</item>
+ <item quantity="few">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد رقم التعريف الشخصي.</item>
+ <item quantity="many">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد رقم التعريف الشخصي.</item>
+ <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_password" formatted="false" msgid="257297696215346527">
+ <item quantity="zero">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد كلمة المرور.</item>
+ <item quantity="two">لم يتم إلغاء تأمين الجهاز لمدة ساعتين (<xliff:g id="NUMBER_1">%d</xliff:g>). تأكيد كلمة المرور.</item>
+ <item quantity="few">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعات. تأكيد كلمة المرور.</item>
+ <item quantity="many">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد كلمة المرور.</item>
+ <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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml
index 0e8ddfa..ec7a3e6 100644
--- a/packages/SystemUI/res-keyguard/values-az/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-az/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Daxiletmə metodu düyməsinə keç"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Ekran kilidi"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"PIN kod daxil edin"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"SIM PUK və yeni PIN kodu yazın"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM PUK kod"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Yeni SIM PIN kod"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Parol daxil etmək üçün toxunun"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Kilidi açmaq üçün parol daxil edin"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Kilidi açmaq üçün PIN daxil edin"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Yanlış PIN kod."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Enerji yığdı"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Enerji yığır"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Sürətlə enerji yığır"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Yavaş enerji yığır"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Adapteri qoşun."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Kilidi açmaq üçün Menyu düyməsinə basın."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Şəbəkə kilidlidir"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"SIM kart yoxdur."</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Planşetdə SIM kart yoxdur."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Telefonda SIM kart yoxdur."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"SIM kart daxil edin."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM kart yoxdur və ya oxuna bilinmir. SIM kart daxil edin."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Yararsız SIM kart."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"SIM kartınız həmişəlik deaktivləşib.\n Başqa SIM kart üçün simsiz xidmət provayderinə müraciət edin."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM kart kilidlənib."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM kart PUK ilə kilidlənib."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"SIM kartın kilidi açılır..."</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN sahəsi"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM PIN sahəsi"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"SIM PUK sahəsi"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Növbəti zəng vaxtı: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Silin"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Daxil edin"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Modeli unutmuşam"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Yanlış Model"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Yanlış Parol"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Yanlış PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> saniyə sonra yenidən cəhd edin."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Modeli çəkin"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM PIN kodu daxil edin"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" üçün SIM PIN daxil edin"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN daxil edin"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Parol daxil edin"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM indi deaktivdir. Davam etmək üçün PUK kod daxil edin. Ətraflı məlumat üçün operatorla əlaqə saxlayın."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" indi deaktivdir. Davam etmək üçün PUK kodu daxil edin. Ətraflı məlumat üçün operatorla əlaqə saxlayın."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"İstədiyiniz PIN kodu daxil edin"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"İstədiyiniz PIN kodu təsdiqləyin"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"SIM kartın kilidi açılır..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"4-8 rəqəmli PIN daxil edin."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK kod 8 rəqəm və ya daha çox olmalıdır."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Yenidən düzgün PUK kod daxil edin. Təkrarlanan cəhdlər SIM-i birdəfəlik sıradan çıxaracaq."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN kodlar uyğun gəlmir"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Həddindən çox model cəhdi"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"PIN kodu <xliff:g id="NUMBER_0">%1$d</xliff:g> dəfə yanlış daxil etdiniz. \n \n<xliff:g id="NUMBER_1">%2$d</xliff:g> saniyə sonra yenidən cəhd edin."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Parolu <xliff:g id="NUMBER_0">%1$d</xliff:g> dəfə yanlış daxil etdiniz. \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> saniyə sonra yenidən cəhd edin."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Kilid modelini <xliff:g id="NUMBER_0">%1$d</xliff:g> dəfə yanlış çəkdiniz. \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> saniyə sonra yenidən cəhd edin."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Planşetin kilidini açmaq üçün <xliff:g id="NUMBER_0">%1$d</xliff:g> dəfə yanlış cəhdlər etmisiniz. Daha <xliff:g id="NUMBER_1">%2$d</xliff:g> uğursuz cəhddən sonra bu planşet sıfırlanacaq və bütün data silinəcək."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Telefonun kilidini açmaq üçün <xliff:g id="NUMBER_0">%1$d</xliff:g> dəfə yanlış cəhdlər etmisiniz. Daha <xliff:g id="NUMBER_1">%2$d</xliff:g> uğursuz cəhddən sonra bu telefon sıfırlanacaq və bütün data silinəcək."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Planşetin kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə yanlış cəhdlər etmisiniz. Bu planşet sıfırlanacaq və bütün data silinəcək."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Telefonun kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə yanlış cəhdlər etmisiniz. Bu telefon sıfırlanacaq və bütün data silinəcək."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Planşetin kilidini açmaq üçün <xliff:g id="NUMBER_0">%1$d</xliff:g> dəfə yanlış cəhdlər etdiniz. Daha <xliff:g id="NUMBER_1">%2$d</xliff:g> uğursuz cəhddən sonra bu istifadəçi silinəcək və bütün istifadəçi datası ləğv ediləcək."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Telefonun kilidini açmaq üçün <xliff:g id="NUMBER_0">%1$d</xliff:g> dəfə yanlış cəhdlər etdiniz. Daha <xliff:g id="NUMBER_1">%2$d</xliff:g> uğursuz cəhddən sonra bu istifadəçi silinəcək və bütün istifadəçi datası ləğv ediləcək."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Planşetin kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə yanlış cəhdlər etmisiniz. Bu istifadəçi silinəcək və bütün data ləğv ediləcək."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Telefonun kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə yanlış cəhdlər etmisiniz. Bu istifadəçi silinəcək və bütün data ləğv ediləcək."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Planşetin kilidini açmaq üçün <xliff:g id="NUMBER_0">%1$d</xliff:g> dəfə yanlış cəhdlər etmisiniz. Daha <xliff:g id="NUMBER_1">%2$d</xliff:g> uğursuz cəhddən sonra iş profili silinəcək və bütün profil datası ləğv ediləcək."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Telefonun kilidini açmaq üçün <xliff:g id="NUMBER_0">%1$d</xliff:g> dəfə yanlış cəhdlər etmisiniz. Daha <xliff:g id="NUMBER_1">%2$d</xliff:g> uğursuz cəhddən sonra iş profili silinəcək və bütün profil datası ləğv ediləcək."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Planşetin kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə yanlış cəhdlər etmisiniz. İş profili silinəcək və bütün data ləğv ediləcək."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Telefonun kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə yanlış cəhdlər etmisiniz. İş profili silinəcək və bütün data ləğv ediləcək."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Kilid açma modelini <xliff:g id="NUMBER_0">%1$d</xliff:g> dəfə yanlış çəkmisiniz. Daha <xliff:g id="NUMBER_1">%2$d</xliff:g> uğursuz cəhddən sonra planşet kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> saniyə sonra yenidən cəhd edin."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Kilid açma modelini artıq <xliff:g id="NUMBER_0">%1$d</xliff:g> dəfə yanlış çəkmisiniz. Daha <xliff:g id="NUMBER_1">%2$d</xliff:g> uğursuz cəhddən sonra telefon kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> saniyə sonra yenidən cəhd edin."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Yanlış SIM PIN kodu cihazın açılması üçün operatorla indi əlaqə saxlamalısınız."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Yanlış SIM PIN kodu, <xliff:g id="NUMBER_1">%d</xliff:g> cəhdiniz qalır.</item>
+ <item quantity="one">Yanlış SIM PIN kodu, <xliff:g id="NUMBER_0">%d</xliff:g> cəhddən sonra cihazı kiliddən çıxarmaq üçün operatorla əlaqə saxlamalısınız.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM yararsızdır. Operatorla əlaqə saxlayın."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Yanlış SIM PUK kodu,<xliff:g id="NUMBER_1">%d</xliff:g> cəhddən sonra SIM kart həmişəlik yararsız olacaq.</item>
+ <item quantity="one">Yanlış SIM PUK kodu, <xliff:g id="NUMBER_0">%d</xliff:g> cəhddən sonra SIM kart həmişəlik yararsız olacaq.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"SIM PIN əməliyyatı alınmadı!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"SIM PUK əməliyyatı alınmadı!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kod Qəbul Edildi!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Xidmət yoxdur."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Daxiletmə metoduna keçin"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Təyyarə rejimi"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Cihaz yenidən başladıqdan sonra model tələb olunur"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Cihaz yeniden başladıqdan sonra PIN tələb olunur"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Cihaz yeniden başladıqdan sonra parol tələb olunur"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Əlavə təhlükəsizlik üçün model tələb olunur"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Əlavə təhlükəsizlik üçün PIN tələb olunur"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Əlavə təhlükəsizlik üçün parol tələb olunur"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Profillər arasında keçid edərkən model tələb olunur"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Profillər arasında keçid edərkən PIN kod tələb olunur"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Profillər arasında keçid edərkən parol tələb olunur"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Cihaz administratoru cihazı kilidlədi"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Cihaz əl ilə kilidləndi"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Cihaz <xliff:g id="NUMBER_1">%d</xliff:g> saat kiliddən çıxarılmayıb. Nümunə kodu təsdiq edin.</item>
+ <item quantity="one">Cihaz <xliff:g id="NUMBER_0">%d</xliff:g> saat kiliddən çıxarılmayıb. Nümunə kodu təsdiq edin.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Cihaz <xliff:g id="NUMBER_1">%d</xliff:g> saat kiliddən çıxarılmayıb. PIN kodu təsdiq edin.</item>
+ <item quantity="one">Cihaz <xliff:g id="NUMBER_0">%d</xliff:g> saat kiliddən çıxarılmayıb. PIN kodu təsdiq edin.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Cihaz <xliff:g id="NUMBER_1">%d</xliff:g> saat kiliddən çıxarılmayıb. Parolu təsdiq edin.</item>
+ <item quantity="one">Cihaz <xliff:g id="NUMBER_0">%d</xliff:g> saat kiliddən çıxarılmayıb. Parolu təsdiq edin.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Tanınmır"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
index bb027e3..c7cfe88 100644
--- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
@@ -20,186 +20,118 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Dugme Promeni metod unosa."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Zaključavanje tastature"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Unesite PIN kôd"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Unesite PUK za SIM i novi PIN kôd"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK kôd za SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Novi PIN kôd za SIM"</string>
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"PIN kôd je netačan."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Napunjena je"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Puni se"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Brzo se puni"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Sporo se puni"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Priključite punjač."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Pritisnite Meni da biste otključali."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Mreža je zaključana"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Nema SIM kartice"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"U tabletu nema SIM kartice."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"U telefonu nema SIM kartice."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Umetnite SIM karticu."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM kartica nedostaje ili ne može da se pročita. Umetnite SIM karticu."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"SIM kartica je neupotrebljiva."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"SIM kartica je trajno onemogućena.\nObratite se dobavljaču usluge bežične mreže da biste dobili drugu SIM karticu."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM kartica je zaključana."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM kartica je zaključana PUK kodom."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"SIM kartica se otključava…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Oblast za PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Oblast za PIN za SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Oblast za PUK za SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Sledeći alarm je podešen za <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Izbriši"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Zaboravio/la sam šablon"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Pogrešan šablon"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Pogrešna lozinka"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Pogrešan PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sek."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Nacrtajte šablon"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Unesite PIN za SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Unesite PIN za SIM „<xliff:g id="CARRIER">%1$s</xliff:g>“"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Unesite PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Unesite lozinku"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM kartica je sada onemogućena. Unesite PUK kôd da biste nastavili. Detaljne informacije potražite od mobilnog operatera."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM „<xliff:g id="CARRIER">%1$s</xliff:g>“ je sada onemogućen. Unesite PUK kôd da biste nastavili. Detaljne informacije potražite od mobilnog operatera."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Unesite željeni PIN kôd"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Potvrdite željeni PIN kôd"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"SIM kartica se otključava…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Unesite PIN koji ima 4–8 brojeva."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK kôd treba da ima 8 ili više brojeva."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Ponovo unesite tačan PUK kôd. Ponovljeni pokušaji će trajno onemogućiti SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN kodovi se ne podudaraju"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Previše pokušaja unosa šablona"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Uneli ste pogrešan PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sek."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Uneli ste pogrešnu lozinku <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sek."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Nacrtali ste netačan šablon za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sek."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Pogrešno ste pokušali da otključate tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, ovaj tablet će se resetovati, čime se brišu svi podaci korisnika."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, ovaj telefon će se resetovati, čime se brišu svi podaci korisnika."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Pogrešno ste pokušali da otključate tablet <xliff:g id="NUMBER">%d</xliff:g> puta. Ovaj tablet će se resetovati, čime se brišu svi podaci."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER">%d</xliff:g> puta. Ovaj telefon će se resetovati, čime se brišu svi podaci."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Pogrešno ste pokušali da otključate tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, uklonićemo ovog korisnika, čime se brišu svi podaci korisnika."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, uklonićemo ovog korisnika, čime se brišu svi podaci korisnika."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Pogrešno ste pokušali da otključate tablet <xliff:g id="NUMBER">%d</xliff:g> puta. Uklonićemo ovog korisnika, čime se brišu svi podaci korisnika."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER">%d</xliff:g> puta. Uklonićemo ovog korisnika, čime se brišu svi podaci korisnika."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Pogrešno ste pokušali da otključate tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, uklonićemo profil za Work, čime se brišu svi podaci sa profila."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, uklonićemo profil za Work, čime se brišu svi podaci sa profila."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Pogrešno ste pokušali da otključate tablet <xliff:g id="NUMBER">%d</xliff:g> puta. Uklonićemo profil za Work, čime se brišu svi podaci sa profila."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER">%d</xliff:g> puta. Uklonićemo profil za Work, čime se brišu svi podaci sa profila."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Netačno ste nacrtali šablon za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, zatražićemo da otključate tablet pomoću imejl naloga.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Netačno ste nacrtali šablon za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, zatražićemo da otključate telefon pomoću imejl naloga.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Netačan PIN kôd za SIM. Sada morate da kontaktirate mobilnog operatera da biste otključali uređaj."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Netačan PIN kôd za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item>
+ <item quantity="few">Netačan PIN kôd za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item>
+ <item quantity="other">Netačan PIN kôd za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM kartica je neupotrebljiva. Kontaktirajte mobilnog operatera."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">Netačan PUK kôd za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj pre nego što SIM kartica postane trajno neupotrebljiva.</item>
+ <item quantity="few">Netačan PUK kôd za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja pre nego što SIM kartica postane trajno neupotrebljiva.</item>
+ <item quantity="other">Netačan PUK kôd za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja pre nego što SIM kartica postane trajno neupotrebljiva.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Radnja sa PIN kodom za SIM nije uspela!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Radnja sa PUK kodom za SIM nije uspela!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kôd je prihvaćen!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Mreža nije dostupna."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Promeni metod unosa"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Režim rada u avionu"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Treba da unesete šablon kada se uređaj ponovo pokrene"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Treba da unesete PIN kada se uređaj ponovo pokrene"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Treba da unesete lozinku kada se uređaj ponovo pokrene"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Treba da unesete šablon radi dodatne bezbednosti"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Treba da unesete PIN radi dodatne bezbednosti"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Treba da unesete lozinku radi dodatne bezbednosti"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Treba da unesete šablon kada prelazite sa jednog profila na drugi"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Treba da unesete PIN kada prelazite sa jednog profila na drugi"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Treba da unesete lozinku kada prelazite sa jednog profila na drugi"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Administrator uređaja je zaključao uređaj"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Uređaj je ručno zaključan"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Niste otključali uređaj <xliff:g id="NUMBER_1">%d</xliff:g> sat. Potvrdite šablon.</item>
+ <item quantity="few">Niste otključali uređaj <xliff:g id="NUMBER_1">%d</xliff:g> sata. Potvrdite šablon.</item>
+ <item quantity="other">Niste otključali uređaj <xliff:g id="NUMBER_1">%d</xliff:g> sati. Potvrdite šablon.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Niste otključali uređaj <xliff:g id="NUMBER_1">%d</xliff:g> sat. Potvrdite PIN.</item>
+ <item quantity="few">Niste otključali uređaj <xliff:g id="NUMBER_1">%d</xliff:g> sata. Potvrdite PIN.</item>
+ <item quantity="other">Niste otključali uređaj <xliff:g id="NUMBER_1">%d</xliff:g> sati. Potvrdite PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Niste otključali uređaj <xliff:g id="NUMBER_1">%d</xliff:g> sat. Potvrdite lozinku.</item>
+ <item quantity="few">Niste otključali uređaj <xliff:g id="NUMBER_1">%d</xliff:g> sata. Potvrdite lozinku.</item>
+ <item quantity="other">Niste otključali uređaj <xliff:g id="NUMBER_1">%d</xliff:g> sati. Potvrdite lozinku.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nije prepoznat"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml
index c960e4a..e1dfc04 100644
--- a/packages/SystemUI/res-keyguard/values-be/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-be/strings.xml
@@ -20,186 +20,123 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Кнопка пераключэння метаду ўводу."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Увядзіце PIN-код"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Увядзіце PUK-код і новы PIN-код SIM-карты"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK-код SIM-карты"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Новы PIN-код SIM-карты"</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_password_wrong_pin_code" msgid="6535018036285012028">"Няправільны PIN-код."</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_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">"Поле для PIN-кода SIM-карты"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Поле для PUK-кода SIM-карты"</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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> с."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Намалюйце ўзор"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Увядзіце PIN-код SIM-карты"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Увядзіце PIN-код SIM-карты \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</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">"Увядзіце PIN-код, які змяшчае ад 4 да 8 лічбаў."</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">"Няправільны PIN-код SIM-карты, цяпер вы павінны звязацца з аператарам для разблакіроўкі прылады."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Няправільны PIN-код SIM-карты, у вас засталася <xliff:g id="NUMBER_1">%d</xliff:g> спроба.</item>
+ <item quantity="few">Няправільны PIN-код SIM-карты, у вас засталіся <xliff:g id="NUMBER_1">%d</xliff:g> спробы.</item>
+ <item quantity="many">Няправільны PIN-код SIM-карты, у вас засталіся <xliff:g id="NUMBER_1">%d</xliff:g> спроб.</item>
+ <item quantity="other">Няправільны PIN-код SIM-карты, у вас засталіся <xliff:g id="NUMBER_1">%d</xliff:g> спробы.</item>
+ </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="one">Няправільны PUK-код SIM-карты, у вас засталася <xliff:g id="NUMBER_1">%d</xliff:g> спроба перад тым, як SIM-карта перастане працаваць назаўжды.</item>
+ <item quantity="few">Няправільны PUK-код SIM-карты, у вас засталіся <xliff:g id="NUMBER_1">%d</xliff:g> спробы перад тым, як SIM-карта перастане працаваць назаўжды.</item>
+ <item quantity="many">Няправільны PUK-код SIM-карты, у вас засталіся <xliff:g id="NUMBER_1">%d</xliff:g> спроб перад тым, як SIM-карта перастане працаваць назаўжды.</item>
+ <item quantity="other">Няправільны PUK-код SIM-карты, у вас засталіся <xliff:g id="NUMBER_1">%d</xliff:g> спробы перад тым, як SIM-карта перастане працаваць назаўжды.</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">"Пасля перазапуску прылады патрабуецца PIN-код"</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="2438626748767361010">"Адміністратар прылады заблакіраваў яе"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Прылада была заблакіравана ўручную"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Прылада не была разблакіравана на працягу <xliff:g id="NUMBER_1">%d</xliff:g> гадзіны. Увядзіце ўзор.</item>
+ <item quantity="few">Прылада не была разблакіравана на працягу <xliff:g id="NUMBER_1">%d</xliff:g> гадзін. Увядзіце ўзор.</item>
+ <item quantity="many">Прылада не была разблакіравана на працягу <xliff:g id="NUMBER_1">%d</xliff:g> гадзін. Увядзіце ўзор.</item>
+ <item quantity="other">Прылада не была разблакіравана на працягу <xliff:g id="NUMBER_1">%d</xliff:g> гадзіны. Увядзіце ўзор.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Прылада не была разблакіравана на працягу <xliff:g id="NUMBER_1">%d</xliff:g> гадзіны. Увядзіце PIN-код.</item>
+ <item quantity="few">Прылада не была разблакіравана на працягу <xliff:g id="NUMBER_1">%d</xliff:g> гадзін. Увядзіце PIN-код.</item>
+ <item quantity="many">Прылада не была разблакіравана на працягу <xliff:g id="NUMBER_1">%d</xliff:g> гадзін. Увядзіце PIN-код.</item>
+ <item quantity="other">Прылада не была разблакіравана на працягу <xliff:g id="NUMBER_1">%d</xliff:g> гадзіны. Увядзіце PIN-код.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Прылада не была разблакіравана на працягу <xliff:g id="NUMBER_1">%d</xliff:g> гадзіны. Увядзіце пароль.</item>
+ <item quantity="few">Прылада не была разблакіравана на працягу <xliff:g id="NUMBER_1">%d</xliff:g> гадзін. Увядзіце пароль.</item>
+ <item quantity="many">Прылада не была разблакіравана на працягу <xliff:g id="NUMBER_1">%d</xliff:g> гадзін. Увядзіце пароль.</item>
+ <item quantity="other">Прылада не была разблакіравана на працягу <xliff:g id="NUMBER_1">%d</xliff:g> гадзіны. Увядзіце пароль.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Не распазнаны"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml
index 1777805..6af7c40 100644
--- a/packages/SystemUI/res-keyguard/values-bg/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Бутон за превключване на метода на въвеждане."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Въведете ПИН кода"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Въведете PUK за SIM картата и новия ПИН код"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK код за SIM картата"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Нов ПИН код за SIM картата"</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">"Въведете ПИН кода, за да отключите"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Неправилен ПИН код."</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_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За да получите друга, се свържете с доставчика на безжичната си услуга."</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">"Област за ПИН кода"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Област за ПИН кода на SIM картата"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Област за PUK кода на SIM картата"</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="keyboardview_keycode_enter" msgid="4505833604411016668">"„Enter“"</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">"Грешен ПИН код"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Опитайте отново след <xliff:g id="NUMBER">%d</xliff:g> секунди."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Начертайте фигурата си"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Въведете ПИН кода за SIM картата"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Въведете ПИН кода на SIM картата за „<xliff:g id="CARRIER">%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">"SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Свържете се с оператора за подробности."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM картата „<xliff:g id="CARRIER">%1$s</xliff:g>“ вече е деактивирана. Въведете PUK кодa, за да продължите. Свържете се с оператора за подробности."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Въведете желания ПИН код"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Потвърдете желания ПИН код"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"SIM картата се отключва..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Въведете ПИН код с четири до осем цифри."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK кодът трябва да е с осем или повече цифри."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Въведете отново правилния PUK код. Многократните опити ще деактивират за постоянно SIM картата."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"ПИН кодовете не съвпадат"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Опитите за фигурата са твърде много"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Въведохте неправилно ПИН кода си <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 картата – сега трябва да се свържете с оператора си, за да отключите устройството."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Неправилен ПИН код за SIM картата – остават ви <xliff:g id="NUMBER_1">%d</xliff:g> опита.</item>
+ <item quantity="one">Неправилен ПИН код за SIM картата – остава ви <xliff:g id="NUMBER_0">%d</xliff:g> опит, преди да трябва да се свържете с оператора си, за да отключите устройството.</item>
+ </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">Неправилен PUK код за SIM картата – остават ви <xliff:g id="NUMBER_1">%d</xliff:g> опита, преди тя да стане неизползваема завинаги.</item>
+ <item quantity="one">Неправилен PUK код за SIM картата – остава ви <xliff:g id="NUMBER_0">%d</xliff:g> опит, преди тя да стане неизползваема завинаги.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Операцията с ПИН кода за SIM картата не бе успешна!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Операцията с PUK кода за SIM картата не бе успешна!"</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">"За допълнителна сигурност се изисква ПИН код"</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">"При превключване между потребителските профили се изисква ПИН код"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"При превключване между потребителските профили се изисква парола"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Устройството е заключено от администратора му"</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> часа. Потвърдете ПИН кода.</item>
+ <item quantity="one">Устройството не е отключвано от <xliff:g id="NUMBER_0">%d</xliff:g> час. Потвърдете ПИН кода.</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml
index 1c9cbb1..9495286 100644
--- a/packages/SystemUI/res-keyguard/values-bn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"ইনপুট পদ্ধতির বোতাম পরিবর্তন করুন৷"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"কীগার্ড"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"পিন কোড লিখুন"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"সিম PUK এবং নতুন পিন কোড লিখুন"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"সিম PUK কোড"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"নতুন সিম পিন কোড"</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">"আনলক করতে পিন লিখুন"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"ভুল পিন কোড দেওয়া হয়েছে।"</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_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">"কোনো সিম কার্ড নেই"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"ট্যাবলেটের মধ্যে কোনো সিম কার্ড নেই।"</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"ফোনের মধ্যে কোনো সিম কার্ড নেই।"</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"একটি সিম কার্ড লাগান।"</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"সিম কার্ড নেই বা সেটি পড়া যাচ্ছে না। একটি সিম কার্ড লাগান।"</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"অব্যবহারযোগ্য সিম কার্ড।"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"আপনার সিম কার্ডটি স্থায়ীভাবে অক্ষম করা হয়েছে।\n অন্য একটি সিম কার্ড পেতে আপনার ওয়্যারলেস পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।"</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"সিম কার্ড লক করা আছে।"</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"সিম কার্ডটি PUK কোড দিয়ে লক করা আছে।"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"সিম কার্ড আনলক করা হচ্ছে…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"পিন অঞ্চল"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"সিম পিন অঞ্চল"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"সিম 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="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">"ভুল পিন"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন।"</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"আপনার প্যাটার্ন আঁকুন"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"সিমের পিন লিখুন"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%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>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"সিম <xliff:g id="CARRIER">%1$s</xliff:g> এখন অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোডটি লিখুন। বিশদ বিবরণের জন্য পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"আপনার পছন্দের পিন কোড লিখুন"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"পছন্দের পিন কোড নিশ্চিত করুন"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"সিম কার্ড আনলক করা হচ্ছে…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"একটি ৪ থেকে ৮ সংখ্যার পিন লিখুন।"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK কোডটি ৮ বা তার বেশি সংখ্যার হতে হবে।"</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"সঠিক PUK কোডটি পুনরায় লিখুন। বার বার চেষ্টা করা হলে সিমটি স্থায়ীভাবে অক্ষম হয়ে যাবে।"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"পিন কোডগুলি মেল হচ্ছে না"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"বিভিন্ন প্যাটার্নের সাহায্যে খুব বেশি বার প্রচেষ্টা করা হয়ে গেছে"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"আপনি <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">"ভুল সিম পিন কোড দিয়েছেন, আপনার ডিভাইসটি আনলক করতে এখন আপনাকে অবশ্যই আপনার পরিষেবা প্রদানকারীর সাথে যোগাযোগ করতে হবে।"</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">সিমের পিন কোডটি ভুল, আপনি আর <xliff:g id="NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারেন।</item>
+ <item quantity="other">সিমের পিন কোডটি ভুল, আপনি আর <xliff:g id="NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারেন।</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"সিমটি ব্যবহার করা যাবে না। আপনার পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।"</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">সিমের PUK কোডটি ভুল, আপনি আর <xliff:g id="NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারেন, তারপর আপনার সিমটি স্থায়ীভাবে অব্যবহারযোগ্য হবে।</item>
+ <item quantity="other">সিমের PUK কোডটি ভুল, আপনি আর <xliff:g id="NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারেন, তারপর আপনার সিমটি স্থায়ীভাবে অব্যবহারযোগ্য হবে।</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"সিম পিন দিয়ে আনলক করা যায়নি!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"সিম 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">"অতিরিক্ত সুরক্ষার জন্য পিন দেওয়া প্রয়োজন"</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">"আপনি প্রোফাইলগুলি স্যুইচ করার সময় পিন এর প্রয়োজন হবে"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"আপনি প্রোফাইলগুলি স্যুইচ করার সময় পাসওয়ার্ডের প্রয়োজন হবে"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"ডিভাইস প্রশাসক ডিভাইসটিকে লক করেছেন"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"ডিভাইসটিকে ম্যানুয়ালি লক করা হয়েছে"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">ডিভাইসটি <xliff:g id="NUMBER_1">%d</xliff:g> ঘন্টা ধরে আনলক করা হয় নি। প্যাটার্নটি নিশ্চিত করুন।</item>
+ <item quantity="other">ডিভাইসটি <xliff:g id="NUMBER_1">%d</xliff:g> ঘন্টা ধরে আনলক করা হয় নি। প্যাটার্নটি নিশ্চিত করুন।</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">ডিভাইসটি <xliff:g id="NUMBER_1">%d</xliff:g> ঘন্টা ধরে আনলক করা হয় নি। পিন নিশ্চিত করুন।</item>
+ <item quantity="other">ডিভাইসটি <xliff:g id="NUMBER_1">%d</xliff:g> ঘন্টা ধরে আনলক করা হয় নি। পিন নিশ্চিত করুন।</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">ডিভাইসটি <xliff:g id="NUMBER_1">%d</xliff:g> ঘন্টা ধরে আনলক করা হয় নি। পাসওয়ার্ড নিশ্চিত করুন।</item>
+ <item quantity="other">ডিভাইসটি <xliff:g id="NUMBER_1">%d</xliff:g> ঘন্টা ধরে আনলক করা হয় নি। পাসওয়ার্ড নিশ্চিত করুন।</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"স্বীকৃত নয়"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml
index 65acca1..04256f1 100644
--- a/packages/SystemUI/res-keyguard/values-bs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml
@@ -20,186 +20,118 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Promijeni dugme za način unosa."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Zaključavanje tastature"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Upišite PIN kôd"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Upišite PUK kôd za SIM karticu i novi PIN kôd"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK kôd za SIM karticu"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Novi PIN kôd za SIM karticu"</string>
+ <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 kôd za otključavanje"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Pogrešan PIN kôd."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Napunjeno"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Puni se"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Brzo punjenje"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Sporo punjenje"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Priključite punjač."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Pritisnite meni da otključate."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Mreža je zaključana"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Nema SIM kartice"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Nema SIM kartice u tabletu."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Nema SIM kartice u telefonu."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Umetnite SIM karticu."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM kartica nije umetnuta ili je uređaj ne može očitati. Umetnite SIM karticu."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Neupotrebljiva SIM kartica."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Vaša SIM kartica je trajno onemogućena.\nDa dobijete drugu SIM karticu, obratite se pružaocu bežičnih usluga."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM kartica je zaključana."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM kartica je zaključana PUK kodom."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Otključavanje SIM kartice…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Prostor za PIN kôd"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Prostor za PIN kôd za SIM karticu"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Prostor za PUK kôd za SIM karticu"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Naredni alarm je podešen za <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Izbriši"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Zaboravili ste uzorak?"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Pogrešan uzorak"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Pogrešna lozinka"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Pogrešan PIN kôd"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sek."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Nacrtajte uzorak"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Unesite PIN kôd za SIM karticu"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Unesite PIN kôd za SIM karticu operatera \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Unesite PIN kôd"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Unesite lozinku"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM kartica je sada onemogućena. Unesite PUK kôd da nastavite. Obratite se operateru za detalje."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"Operater SIM kartice \"<xliff:g id="CARRIER">%1$s</xliff:g>\" sada je onemogućen. Unesite PUK kôd da nastavite. Za više detalja obratite se operateru."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Unesite željeni PIN kôd"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Potvrdite željeni PIN kôd"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Otključavanje SIM kartice…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Unesite PIN kôd koji sadrži 4 do 8 brojeva."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK kôd treba sadržavati najmanje 8 brojeva."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Ponovo unesite ispravan PUK kôd. Ponovljeni pokušaji će trajno onemogućiti SIM karticu."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN kodovi se ne poklapaju"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Previše puta ste pokušali otključati uređaj crtanjem uzorka"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Pogrešno ste unijeli PIN kôd <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sek."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Pogrešno ste unijeli lozinku <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sek."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Pogrešno ste nacrtali svoj uzorak za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sek."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Pokušali ste <xliff:g id="NUMBER_0">%1$d</xliff:g> puta neispravno otključati tablet. U slučaju još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja bez uspjeha, tablet će se vratiti na fabričke postavke i svi podaci će se izbrisati."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Pokušali ste <xliff:g id="NUMBER_0">%1$d</xliff:g> puta neispravno otključati telefon. U slučaju još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja bez uspjeha, telefon će se vratiti na fabričke postavke i svi podaci će se izbrisati."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Pokušali ste <xliff:g id="NUMBER">%d</xliff:g> puta neispravno otključati tablet. Tablet će se sada vratiti na fabričke postavke i svi podaci će se izbrisati."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Pokušali ste <xliff:g id="NUMBER">%d</xliff:g> puta neispravno otključati telefon. Telefon će se sada vratiti na fabričke postavke i svi podaci će se izbrisati."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Pokušali ste <xliff:g id="NUMBER_0">%1$d</xliff:g> puta neispravno otključati tablet. U slučaju još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja bez uspjeha, ovaj korisnik će se ukloniti i svi podaci korisnika će se izbrisati."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Pokušali ste <xliff:g id="NUMBER_0">%1$d</xliff:g> puta neispravno otključati telefon. U slučaju još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja bez uspjeha, ovaj korisnik će se ukloniti i svi podaci korisnika će se izbrisati."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Pokušali ste <xliff:g id="NUMBER">%d</xliff:g> puta neispravno otključati tablet. Korisnik će se ukloniti i svi podaci korisnika će se izbrisati."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Pokušali ste <xliff:g id="NUMBER">%d</xliff:g> puta neispravno otključati telefon. Korisnik će se ukloniti i svi podaci korisnika će se izbrisati."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Pokušali ste <xliff:g id="NUMBER_0">%1$d</xliff:g> puta neispravno otključati tablet. U slučaju još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja bez uspjeha, poslovni profil će se ukloniti i svi podaci s profila će se izbrisati."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Pokušali ste <xliff:g id="NUMBER_0">%1$d</xliff:g> puta neispravno otključati telefon. U slučaju još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja bez uspjeha, poslovni profil će se ukloniti i svi podaci s profila će se izbrisati."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Pokušali ste <xliff:g id="NUMBER">%d</xliff:g> puta neispravno otključati tablet. Poslovni profil će se ukloniti i svi podaci s profila će se izbrisati."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Pokušali ste <xliff:g id="NUMBER">%d</xliff:g> puta neispravno otključati telefon. Poslovni profil će se ukloniti i svi podaci s profila će se izbrisati."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Pogrešno ste nacrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. U slučaju još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja bez uspjeha, od vas će se tražiti da tablet otključate koristeći račun e-pošte.\n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Pogrešno ste nacrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. U slučaju još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja bez uspjeha, od vas će se tražiti da telefon otključate koristeći račun e-pošte.\n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"PIN kôd za SIM karticu je netačan. Za otključavanje uređaja sada se morate obratiti svom operateru."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">PIN kôd za SIM karticu je netačan. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item>
+ <item quantity="few">PIN kôd za SIM karticu je netačan. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item>
+ <item quantity="other">PIN kôd za SIM karticu je netačan. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM kartica je neupotrebljiva. Obratite se svom operateru."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">PUK kôd za SIM karticu je netačan. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj prije nego što SIM kartica postane trajno neupotrebljiva.</item>
+ <item quantity="few">PUK kôd za SIM karticu je netačan. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva.</item>
+ <item quantity="other">PUK kôd za SIM karticu je netačan. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Korištenje PIN koda za SIM karticu nije uspjelo!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Korištenje PUK koda za SIM karticu nije uspjelo!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kôd je prihvaćen"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Nema mreže."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Promjena načina unosa"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Način rada u avionu"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Potreban je uzorak nakon što se uređaj ponovo pokrene"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Potreban je PIN kôd nakon što se uređaj ponovo pokrene"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Potrebna je lozinka nakon što se uređaj ponovo pokrene"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Uzorak je potreban radi dodatne sigurnosti"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"PIN kôd je potreban radi dodatne sigurnosti"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Lozinka je potrebna radi dodatne sigurnosti"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Potreban je uzorak nakon prelaska na drugi profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Potreban je PIN kôd nakon prelaska na drugi profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Potrebna je lozinka nakon prelaska na drugi profil"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Administrator je zaključao uređaj."</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Uređaj je ručno zaključan"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Uređaj nije otključavan <xliff:g id="NUMBER_1">%d</xliff:g> sat. Potvrdite uzorak.</item>
+ <item quantity="few">Uređaj nije otključavan <xliff:g id="NUMBER_1">%d</xliff:g> sata. Potvrdite uzorak.</item>
+ <item quantity="other">Uređaj nije otključavan <xliff:g id="NUMBER_1">%d</xliff:g> sati. Potvrdite uzorak.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Uređaj nije otključavan <xliff:g id="NUMBER_1">%d</xliff:g> sat. Potvrdite PIN kôd.</item>
+ <item quantity="few">Uređaj nije otključavan <xliff:g id="NUMBER_1">%d</xliff:g> sata. Potvrdite PIN kôd.</item>
+ <item quantity="other">Uređaj nije otključavan <xliff:g id="NUMBER_1">%d</xliff:g> sati. Potvrdite PIN kôd.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Uređaj nije otključavan <xliff:g id="NUMBER_1">%d</xliff:g> sat. Potvrdite lozinku.</item>
+ <item quantity="few">Uređaj nije otključavan <xliff:g id="NUMBER_1">%d</xliff:g> sata. Potvrdite lozinku.</item>
+ <item quantity="other">Uređaj nije otključavan <xliff:g id="NUMBER_1">%d</xliff:g> sati. Potvrdite lozinku.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nije prepoznat"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml
index fab2335..3e8f2fa 100644
--- a/packages/SystemUI/res-keyguard/values-ca/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Botó de canvi del mètode d\'entrada."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Bloqueig de teclat"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Escriu el codi PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Escriu el PUK de la SIM i el codi PIN nou"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Codi PUK de la SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Codi PIN de la SIM nou"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Toca per escriure la contrasenya"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Escriu la contrasenya per desbloquejar"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Escriu el PIN per desbloquejar"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"El codi PIN no és correcte."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Bateria carregada"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"S\'està carregant"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"S\'està carregant ràpidament"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"S\'està carregant lentament"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Connecta el carregador."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Prem Menú per desbloquejar."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"La xarxa està bloquejada"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"No hi ha cap targeta SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"No hi ha cap targeta SIM a la tauleta."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"No hi ha cap targeta SIM al telèfon."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Insereix una targeta SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Falta la targeta SIM o no es pot llegir. Insereix-ne una."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"La targeta SIM no es pot fer servir."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"La targeta SIM s\'ha desactivat permanentment.\nContacta amb el teu proveïdor de serveis sense fil per obtenir-ne una altra."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"La targeta SIM està bloquejada."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"La targeta SIM està bloquejada pel PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"S\'està desbloquejant la targeta SIM…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Zona del PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Zona del PIN de la SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Zona del PUK de la SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"S\'ha definit la pròxima alarma per a l\'hora següent: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Suprimeix"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Retorn"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"He oblidat el patró"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"El patró no és correcte"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"La contrasenya no és correcta"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"El PIN no és correcte"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Torna-ho a provar d\'aquí a <xliff:g id="NUMBER">%d</xliff:g> segons."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Dibuixa el patró"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Introdueix el PIN de la SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Introdueix el PIN de la SIM següent: <xliff:g id="CARRIER">%1$s</xliff:g>"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Introdueix el PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Introdueix la contrasenya"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La SIM està desactivada. Introdueix el codi PUK per continuar. Contacta amb l\'operador de telefonia mòbil per obtenir més informació."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"La SIM <xliff:g id="CARRIER">%1$s</xliff:g> està desactivada. Introdueix el codi PUK per continuar. Contacta amb l\'operador de telefonia mòbil per obtenir més informació."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Introdueix el codi PIN que vulguis"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Confirma el codi PIN"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"S\'està desbloquejant la targeta SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Escriu un PIN que tingui entre 4 i 8 números."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"El codi PUK ha de tenir 8 números o més."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Torna a introduir el codi PUK correcte. Si ho intentes diverses vegades, es desactivarà la SIM de manera permanent."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Els codis PIN no coincideixen"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Has intentat dibuixar el patró massa vegades"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Has escrit el PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> vegades de manera incorrecta. \n\nTorna-ho a provar d\'aquí a <xliff:g id="NUMBER_1">%2$d</xliff:g> segons."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Has escrit la contrasenya <xliff:g id="NUMBER_0">%1$d</xliff:g> vegades de manera incorrecta. \n\nTorna-ho a provar d\'aquí a <xliff:g id="NUMBER_1">%2$d</xliff:g> segons."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Has dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%1$d</xliff:g> vegades de manera incorrecta. \n\nTorna-ho a provar d\'aquí a <xliff:g id="NUMBER_1">%2$d</xliff:g> segons."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Has provat de desbloquejar la tauleta <xliff:g id="NUMBER_0">%1$d</xliff:g> vegades de manera incorrecta. Si falles <xliff:g id="NUMBER_1">%2$d</xliff:g> vegades més, la tauleta es restablirà i se\'n suprimiran totes les dades."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Has provat de desbloquejar el telèfon <xliff:g id="NUMBER_0">%1$d</xliff:g> vegades de manera incorrecta. Si falles <xliff:g id="NUMBER_1">%2$d</xliff:g> vegades més, el telèfon es restablirà i se\'n suprimiran totes les dades."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Has provat de desbloquejar la tauleta <xliff:g id="NUMBER">%d</xliff:g> vegades de manera incorrecta. La tauleta es restablirà i se\'n suprimiran totes les dades."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Has provat de desbloquejar el telèfon <xliff:g id="NUMBER">%d</xliff:g> vegades de manera incorrecta. El telèfon es restablirà i se\'n suprimiran totes les dades."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Has provat de desbloquejar la tauleta <xliff:g id="NUMBER_0">%1$d</xliff:g> vegades de manera incorrecta. Si falles <xliff:g id="NUMBER_1">%2$d</xliff:g> vegades més, l\'usuari se suprimirà, juntament amb totes les seves dades."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Has provat de desbloquejar el telèfon <xliff:g id="NUMBER_0">%1$d</xliff:g> vegades de manera incorrecta. Si falles <xliff:g id="NUMBER_1">%2$d</xliff:g> vegades més, l\'usuari se suprimirà, juntament amb totes les seves dades."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Has provat de desbloquejar la tauleta <xliff:g id="NUMBER">%d</xliff:g> vegades de manera incorrecta. L\'usuari se suprimirà, juntament amb totes les seves dades."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Has provat de desbloquejar el telèfon <xliff:g id="NUMBER">%d</xliff:g> vegades de manera incorrecta. L\'usuari se suprimirà, juntament amb totes les seves dades."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Has provat de desbloquejar la tauleta <xliff:g id="NUMBER_0">%1$d</xliff:g> vegades de manera incorrecta. Si falles <xliff:g id="NUMBER_1">%2$d</xliff:g> vegades més, el perfil professional se suprimirà, juntament amb totes les dades que contingui."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Has provat de desbloquejar el telèfon <xliff:g id="NUMBER_0">%1$d</xliff:g> vegades de manera incorrecta. Si falles <xliff:g id="NUMBER_1">%2$d</xliff:g> vegades més, el perfil professional se suprimirà, juntament amb totes les dades que contingui."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Has provat de desbloquejar la tauleta <xliff:g id="NUMBER">%d</xliff:g> vegades de manera incorrecta. El perfil professional se suprimirà, juntament amb totes les dades que contingui."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Has provat de desbloquejar el telèfon <xliff:g id="NUMBER">%d</xliff:g> vegades de manera incorrecta. El perfil professional se suprimirà, juntament amb totes les dades que contingui."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Has dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%1$d</xliff:g> vegades de manera incorrecta. Si falles <xliff:g id="NUMBER_1">%2$d</xliff:g> vegades més, se\'t demanarà que desbloquegis la tauleta amb un compte de correu electrònic.\n\n Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%3$d</xliff:g> segons."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Has dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%1$d</xliff:g> vegades de manera incorrecta. Si falles <xliff:g id="NUMBER_1">%2$d</xliff:g> vegades més, se\'t demanarà que desbloquegis el telèfon amb un compte de correu electrònic.\n\n Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%3$d</xliff:g> segons."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"El codi PIN de la SIM no és correcte. Contacta amb l\'operador de telefonia mòbil per desbloquejar el dispositiu."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">El codi PIN de la SIM no és correcte. Et queden <xliff:g id="NUMBER_1">%d</xliff:g> intents.</item>
+ <item quantity="one">El codi PIN de la SIM no és correcte. Et queda <xliff:g id="NUMBER_0">%d</xliff:g> intent; si no l\'encertes, contacta amb l\'operador de telefonia mòbil per desbloquejar el dispositiu.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"La SIM no es pot fer servir. Contacta amb l\'operador de telefonia mòbil."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">El codi PUK de la SIM no és correcte. Et queden <xliff:g id="NUMBER_1">%d</xliff:g> intents; si els esgotes tots, la SIM no es podrà tornar a fer servir.</item>
+ <item quantity="one">El codi PUK de la SIM no és correcte. Et queda <xliff:g id="NUMBER_0">%d</xliff:g> intent; si no l\'encertes, la SIM no es podrà tornar a fer servir.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"No s\'ha pogut desbloquejar la SIM amb el codi PIN."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"No s\'ha pogut desbloquejar la SIM amb el codi PUK."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"S\'ha acceptat el codi."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Sense servei"</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Canvia el mètode d\'introducció"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Mode d\'avió"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Cal introduir el patró quan es reinicia el dispositiu"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Cal introduir el PIN quan es reinicia el dispositiu"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Cal introduir la contrasenya quan es reinicia el dispositiu"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Cal introduir el patró per disposar de més seguretat"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Cal introduir el PIN per disposar de més seguretat"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Cal introduir la contrasenya per disposar de més seguretat"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Cal introduir el patró en canviar de perfil"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Cal introduir el PIN en canviar de perfil"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Cal introduir la contrasenya en canviar de perfil"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"L\'administrador ha bloquejat el dispositiu"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"El dispositiu s\'ha bloquejat manualment"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Fa <xliff:g id="NUMBER_1">%d</xliff:g> hores que no es desbloqueja el dispositiu. Confirma el patró.</item>
+ <item quantity="one">Fa <xliff:g id="NUMBER_0">%d</xliff:g> hora que no es desbloqueja el dispositiu. Confirma el patró.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Fa <xliff:g id="NUMBER_1">%d</xliff:g> hores que no es desbloqueja el dispositiu. Confirma el PIN.</item>
+ <item quantity="one">Fa <xliff:g id="NUMBER_0">%d</xliff:g> hora que no es desbloqueja el dispositiu. Confirma el PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Fa <xliff:g id="NUMBER_1">%d</xliff:g> hores que no es desbloqueja el dispositiu. Confirma la contrasenya.</item>
+ <item quantity="one">Fa <xliff:g id="NUMBER_0">%d</xliff:g> hora que no es desbloqueja el dispositiu. Confirma la contrasenya.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"No s\'ha reconegut"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml
index d383f70..f0b638a 100644
--- a/packages/SystemUI/res-keyguard/values-cs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml
@@ -20,186 +20,123 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Tlačítko přepnutí metody zadávání"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Uzamknutí"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Zadejte kód PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Zadejte kód PUK SIM karty a nový kód PIN"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Kód PUK SIM karty"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Nový PIN SIM karty"</string>
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"Nesprávný kód PIN."</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_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>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Není vložena SIM karta"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"V tabletu není SIM karta."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"V telefonu není SIM karta."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Vložte SIM kartu."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM karta chybí nebo je nečitelná. Vložte SIM kartu."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Nepoužitelná SIM karta."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Vaše SIM karta byla natrvalo zablokována.\n Požádejte svého poskytovatele bezdrátových služeb o další SIM kartu."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM karta je zablokována."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM karta je zablokována pomocí kódu PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Odblokování SIM karty…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Oblast kódu PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Oblast kódu PIN SIM karty"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Oblast kódu PUK SIM karty"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Další budík je nastaven na <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Smazat"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Zapomenuté gesto"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Nesprávné gesto"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Nesprávné heslo"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Nesprávný kód PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Zkuste to znovu za <xliff:g id="NUMBER">%d</xliff:g> s."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Zadejte gesto"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Zadejte kód PIN SIM karty"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Zadejte kód PIN SIM karty <xliff:g id="CARRIER">%1$s</xliff:g>"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Zadejte kód PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Zadejte heslo"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM karta byla zablokována. Chcete-li pokračovat, je třeba zadat kód PUK. Podrobné informace získáte od operátora."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM karta <xliff:g id="CARRIER">%1$s</xliff:g> je nyní zablokována. Chcete-li pokračovat, zadejte kód PUK. Podrobnosti vám poskytne operátor."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Zadejte požadovaný kód PIN"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Potvrďte požadovaný kód PIN"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Odblokování SIM karty…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Zadejte kód PIN o délce 4–8 číslic."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"Minimální délka kódu PUK je 8 číslic."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Znovu zadejte správný kód PUK. Opakovanými pokusy SIM kartu trvale zablokujete."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Kódy PIN se neshodují"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Příliš mnoho pokusů o zadání gesta"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Již <xliff:g id="NUMBER_0">%1$d</xliff:g>krát jste zadali nesprávný kód PIN. \n\nZkuste to znovu za <xliff:g id="NUMBER_1">%2$d</xliff:g> s."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Již <xliff:g id="NUMBER_0">%1$d</xliff:g>krát jste nesprávně zadali heslo. \n\nZkuste to znovu za <xliff:g id="NUMBER_1">%2$d</xliff:g> s."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Již <xliff:g id="NUMBER_0">%1$d</xliff:g>krát jste zadali nesprávné bezpečnostní gesto. \n\nZkuste to znovu za <xliff:g id="NUMBER_1">%2$d</xliff:g> s."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Již jste se <xliff:g id="NUMBER_0">%1$d</xliff:g>krát pokusili odemknout tablet nesprávným způsobem. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> dalších neúspěšných pokusech bude tablet resetován, čímž se z něj smažou všechna data."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Již jste se <xliff:g id="NUMBER_0">%1$d</xliff:g>krát pokusili odemknout telefon nesprávným způsobem. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> dalších neúspěšných pokusech bude telefon resetován, čímž se z něj smažou všechna data."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Již jste se <xliff:g id="NUMBER">%d</xliff:g>krát pokusili odemknout tablet nesprávným způsobem. Tablet bude resetován, čímž z něj budou smazána všechna data."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Již jste se <xliff:g id="NUMBER">%d</xliff:g>krát pokusili odemknout telefon nesprávným způsobem. Telefon bude resetován, čímž z něj budou smazána všechna data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Již jste se <xliff:g id="NUMBER_0">%1$d</xliff:g>krát pokusili odemknout tablet nesprávným způsobem. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> dalších neúspěšných pokusech bude tento uživatel odstraněn, čímž se smažou všechna jeho data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Již jste se <xliff:g id="NUMBER_0">%1$d</xliff:g>krát pokusili odemknout telefon nesprávným způsobem. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> dalších neúspěšných pokusech bude tento uživatel odstraněn, čímž se smažou všechna jeho data."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Již jste se <xliff:g id="NUMBER">%d</xliff:g>krát pokusili odemknout tablet nesprávným způsobem. Uživatel bude odstraněn, čímž budou smazána všechna jeho data."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Již jste se <xliff:g id="NUMBER">%d</xliff:g>krát pokusili odemknout telefon nesprávným způsobem. Uživatel bude odstraněn, čímž budou smazána všechna jeho data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Již jste se <xliff:g id="NUMBER_0">%1$d</xliff:g>krát pokusili odemknout tablet nesprávným způsobem. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> dalších neúspěšných pokusech bude pracovní profil odstraněn, čímž se smažou všechna jeho data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Již jste se <xliff:g id="NUMBER_0">%1$d</xliff:g>krát pokusili odemknout telefon nesprávným způsobem. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> dalších neúspěšných pokusech bude pracovní profil odstraněn, čímž se smažou všechna jeho data."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Již jste se <xliff:g id="NUMBER">%d</xliff:g>krát pokusili odemknout tablet nesprávným způsobem. Pracovní profil bude odstraněn, čímž budou smazána všechna jeho data."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Již jste se <xliff:g id="NUMBER">%d</xliff:g>krát pokusili odemknout telefon nesprávným způsobem. Pracovní profil bude odstraněn, čímž budou smazána všechna jeho data."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Již <xliff:g id="NUMBER_0">%1$d</xliff:g>krát jste nesprávně zadali své bezpečnostní gesto. Po <xliff:g id="NUMBER_1">%2$d</xliff:g>dalších neúspěšných pokusech budete požádáni o odemčení tabletu pomocí e-mailového účtu.\n\n Zkuste to znovu za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Již <xliff:g id="NUMBER_0">%1$d</xliff:g>krát jste nesprávně zadali své bezpečnostní gesto. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> dalších neúspěšných pokusech budete požádáni o odemčení telefonu pomocí e-mailového účtu.\n\n Zkuste to znovu za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Zadali jste nesprávný kód PIN SIM karty. Nyní musíte za účelem odemknutí zařízení kontaktovat svého operátora."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="few">Zadali jste nesprávný kód PIN SIM karty. Máte ještě <xliff:g id="NUMBER_1">%d</xliff:g> pokusy.</item>
+ <item quantity="many">Zadali jste nesprávný kód PIN SIM karty. Máte ještě <xliff:g id="NUMBER_1">%d</xliff:g> pokusu.</item>
+ <item quantity="other">Zadali jste nesprávný kód PIN SIM karty. Máte ještě <xliff:g id="NUMBER_1">%d</xliff:g> pokusů.</item>
+ <item quantity="one">Zadali jste nesprávný PIN SIM karty. Zbývá <xliff:g id="NUMBER_0">%d</xliff:g> pokus, poté bude muset zařízení odemknout operátor.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM kartu nelze použít. Kontaktujte operátora."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="few">Nesprávný kód PUK SIM karty. Máte ještě <xliff:g id="NUMBER_1">%d</xliff:g> pokusy, poté bude SIM karta natrvalo zablokována.</item>
+ <item quantity="many">Nesprávný kód PUK SIM karty. Máte ještě <xliff:g id="NUMBER_1">%d</xliff:g> pokusu, poté bude SIM karta natrvalo zablokována.</item>
+ <item quantity="other">Nesprávný kód PUK SIM karty. Máte ještě <xliff:g id="NUMBER_1">%d</xliff:g> pokusů, poté bude SIM karta natrvalo zablokována.</item>
+ <item quantity="one">Nesprávný kód PUK SIM karty. Máte ještě <xliff:g id="NUMBER_0">%d</xliff:g> pokus, poté bude SIM karta natrvalo zablokována.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Operace pomocí kódu PIN SIM karty se nezdařila."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Operace pomocí kódu PUK SIM karty se nezdařila."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kód byl přijat."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Žádný signál"</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Přepnout metodu zadávání"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Režim Letadlo"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Po restartování zařízení je vyžadováno gesto"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Po restartování zařízení je vyžadován kód PIN"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Po restartování zařízení je vyžadováno heslo"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Za účelem zvýšení zabezpečení je vyžadováno gesto"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Za účelem zvýšení zabezpečení je vyžadován kód PIN"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Za účelem zvýšení zabezpečení je vyžadováno heslo"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Po přepnutí profilů je vyžadováno gesto"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Po přepnutí profilů je vyžadován kód PIN"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Po přepnutí profilů je vyžadováno heslo"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Administrátor toto zařízení uzamkl"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Zařízení bylo ručně uzamčeno"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="few">Zařízení již <xliff:g id="NUMBER_1">%d</xliff:g> hodiny nebylo odemknuto. Zadejte gesto.</item>
+ <item quantity="many">Zařízení již <xliff:g id="NUMBER_1">%d</xliff:g> hodiny nebylo odemknuto. Zadejte gesto.</item>
+ <item quantity="other">Zařízení již <xliff:g id="NUMBER_1">%d</xliff:g> hodin nebylo odemknuto. Zadejte gesto.</item>
+ <item quantity="one">Zařízení již <xliff:g id="NUMBER_0">%d</xliff:g> hodinu nebylo odemknuto. Zadejte gesto.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="few">Zařízení již <xliff:g id="NUMBER_1">%d</xliff:g> hodiny nebylo odemknuto. Zadejte PIN.</item>
+ <item quantity="many">Zařízení již <xliff:g id="NUMBER_1">%d</xliff:g> hodiny nebylo odemknuto. Zadejte PIN.</item>
+ <item quantity="other">Zařízení již <xliff:g id="NUMBER_1">%d</xliff:g> hodin nebylo odemknuto. Zadejte PIN.</item>
+ <item quantity="one">Zařízení již <xliff:g id="NUMBER_0">%d</xliff:g> hodinu nebylo odemknuto. Zadejte PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="few">Zařízení již <xliff:g id="NUMBER_1">%d</xliff:g> hodiny nebylo odemknuto. Zadejte heslo.</item>
+ <item quantity="many">Zařízení již <xliff:g id="NUMBER_1">%d</xliff:g> hodiny nebylo odemknuto. Zadejte heslo.</item>
+ <item quantity="other">Zařízení již <xliff:g id="NUMBER_1">%d</xliff:g> hodin nebylo odemknuto. Zadejte heslo.</item>
+ <item quantity="one">Zařízení již <xliff:g id="NUMBER_0">%d</xliff:g> hodinu nebylo odemknuto. Zadejte heslo.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nerozpoznáno"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml
index 7148d5f..fb782ee 100644
--- a/packages/SystemUI/res-keyguard/values-da/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-da/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Skift indtastningsmetode-knappen."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Nøglebeskyttelse"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Indtast pinkoden"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Indtast PUK-koden og den nye pinkode til SIM-kortet"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK-kode til SIM-kort"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Ny pinkode til SIM-kortet"</string>
+ <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>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Forkert pinkode."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Opladet"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Oplader"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Oplader hurtigt"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Oplader langsomt"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Tilslut din oplader."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Tryk på menuen for at låse op."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Netværket er låst"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Der er ikke noget SIM-kort"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Der er ikke noget SIM-kort i denne tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Der er ikke noget SIM-kort i telefonen."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Indsæt et SIM-kort."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM-kortet mangler eller kan ikke læses. Indsæt et SIM-kort."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Ubrugeligt SIM-kort."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Dit SIM-kort er blevet permanent deaktiveret.\nKontakt din tjenesteudbyder for at få et nyt SIM-kort."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM-kortet er låst."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM-kortet er låst med PUK-kode."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Låser SIM-kortet op…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Område for pinkoden"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Område for pinkoden til SIM-kortet"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Område for PUK-koden til SIM-kortet"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Næste alarm er indstillet til <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Slet"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Har du glemt mønsteret?"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Forkert mønster"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Forkert adgangskode"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Forkert pinkode"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Prøv igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Tegn dit mønster"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Indtast pinkoden til SIM-kortet"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Indtast pinkoden til SIM-kortet for \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Indtast pinkode"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Angiv adgangskode"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kortet er nu deaktiveret. Indtast PUK-koden for at fortsætte. Kontakt mobilselskabet for at få flere oplysninger."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM-kortet fra \"<xliff:g id="CARRIER">%1$s</xliff:g>\" er nu deaktiveret. Indtast PUK-koden for at fortsætte. Kontakt mobilselskabet for at få flere oplysninger."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Indtast den ønskede pinkode"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Bekræft den ønskede pinkode"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Låser SIM-kortet op…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Indtast en pinkode på mellem 4 og 8 tal."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK-koden skal være på 8 tal eller mere."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Indtast den korrekte PUK-kode. Gentagne forsøg deaktiverer permanent SIM-kortet."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Pinkoderne stemmer ikke overens"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Du har brugt for mange forsøg på at tegne mønsteret korrekt"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Du har indtastet en forkert pinkode <xliff:g id="NUMBER_0">%1$d</xliff:g> gange. \n\nPrøv igen om <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunder."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Du har indtastet din adgangskode forkert <xliff:g id="NUMBER_0">%1$d</xliff:g> gange. \n\nPrøv igen om <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunder."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%1$d</xliff:g> gange. \n\nPrøv igen om <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunder."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Du har forsøgt at låse denne tablet op med den forkerte adgangskode <xliff:g id="NUMBER_0">%1$d</xliff:g> gange. Efter endnu <xliff:g id="NUMBER_1">%2$d</xliff:g> mislykkede forsøg nulstilles denne tablet, hvilket sletter alle dens data."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Du har forsøgt at låse telefonen op med den forkerte adgangskode <xliff:g id="NUMBER_0">%1$d</xliff:g> gange. Efter endnu <xliff:g id="NUMBER_1">%2$d</xliff:g> mislykkede forsøg nulstilles denne telefon, hvilket sletter alle dens data."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Du har forsøgt at låse denne tablet op på forkert vis <xliff:g id="NUMBER">%d</xliff:g> gange. Denne tablet nulstilles, hvilket sletter alle dens data."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Du har forsøgt at låse telefonen op på forkert vis <xliff:g id="NUMBER">%d</xliff:g> gange. Telefonen nulstilles, hvilket sletter alle dens data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Du har forsøgt at låse denne tablet op med den forkerte adgangskode <xliff:g id="NUMBER_0">%1$d</xliff:g> gange. Efter endnu <xliff:g id="NUMBER_1">%2$d</xliff:g> mislykkede forsøg fjernes denne bruger, hvilket sletter alle brugerdata."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Du har forsøgt at låse telefonen op med den forkerte adgangskode <xliff:g id="NUMBER_0">%1$d</xliff:g> gange. Efter endnu <xliff:g id="NUMBER_1">%2$d</xliff:g> mislykkede forsøg fjernes denne bruger, hvilket sletter alle brugerdata."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Du har forsøgt at låse denne tablet op på forkert vis <xliff:g id="NUMBER">%d</xliff:g> gange. Brugeren fjernes, hvilket sletter alle brugerdata."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Du har forsøgt at låse telefonen op på forkert vis <xliff:g id="NUMBER">%d</xliff:g> gange. Brugeren fjernes, hvilket sletter alle brugerdata."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Du har forsøgt at låse denne tablet op med den forkerte adgangskode <xliff:g id="NUMBER_0">%1$d</xliff:g> gange. Efter endnu <xliff:g id="NUMBER_1">%2$d</xliff:g> mislykkede forsøg fjernes arbejdsprofilen, hvilket sletter alle profildata."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Du har forsøgt at låse telefonen op med den forkerte adgangskode <xliff:g id="NUMBER_0">%1$d</xliff:g> gange. Efter endnu <xliff:g id="NUMBER_1">%2$d</xliff:g> mislykkede forsøg fjernes arbejdsprofilen, hvilket sletter alle profildata."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Du har forsøgt at låse denne tablet op på forkert vis <xliff:g id="NUMBER">%d</xliff:g> gange. Arbejdsprofilen fjernes, hvilket sletter alle profildata."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Du har forsøgt at låse telefonen op på forkert vis <xliff:g id="NUMBER">%d</xliff:g> gange. Arbejdsprofilen fjernes, hvilket sletter alle profildata."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%1$d</xliff:g> gange. Efter endnu <xliff:g id="NUMBER_1">%2$d</xliff:g> mislykkede forsøg bliver du bedt om at låse din tablet op ved hjælp af en e-mailkonto.\n\n Prøv igen om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%1$d</xliff:g> gange. Efter endnu <xliff:g id="NUMBER_1">%2$d</xliff:g> mislykkede forsøg bliver du bedt om at låse din telefon op ved hjælp af en e-mailkonto.\n\n Prøv igen om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Forkert pinkode til SIM-kort. Du er nu nødt til at kontakte dit mobilselskab for at låse din enhed op."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Forkert pinkode til SIM-kort. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøg tilbage.</item>
+ <item quantity="other">Forkert pinkode til SIM-kort. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøg tilbage.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM-kortet er ubrugeligt. Kontakt dit mobilselskab."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">Forkert PUK-kode til SIM-kort. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt.</item>
+ <item quantity="other">Forkert PUK-kode til SIM-kort. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Pinkoden til SIM-kortet blev afvist"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"PUK-koden til SIM-kortet blev afvist"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Koden blev accepteret."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Ingen dækning."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Skift indtastningsmetode"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Flytilstand"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Der skal angives et mønster efter genstart af enheden"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Der skal indtastes en pinkode efter genstart af enheden"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Der skal indtastes en adgangskode efter genstart af enheden"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Der kræves et mønster som ekstra beskyttelse"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Der kræves en pinkode som ekstra beskyttelse"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Der kræves en adgangskode som ekstra beskyttelse"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Der skal angives et mønster, når du skifter profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Der skal indtastes en pinkode, når du skifter profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Der skal indtastes en adgangskode, når du skifter profil"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Enhedsadministratoren har låst enheden"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Enheden blev låst manuelt"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Enheden blev sidst låst op for <xliff:g id="NUMBER_1">%d</xliff:g> time siden. Bekræft mønsteret.</item>
+ <item quantity="other">Enheden blev sidst låst op for <xliff:g id="NUMBER_1">%d</xliff:g> timer siden. Bekræft mønsteret.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Enheden blev sidst låst op for <xliff:g id="NUMBER_1">%d</xliff:g> time siden. Bekræft pinkoden.</item>
+ <item quantity="other">Enheden blev sidst låst op for <xliff:g id="NUMBER_1">%d</xliff:g> timer siden. Bekræft pinkoden.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Enheden blev sidst låst op for <xliff:g id="NUMBER_1">%d</xliff:g> time siden. Bekræft adgangskoden.</item>
+ <item quantity="other">Enheden blev sidst låst op for <xliff:g id="NUMBER_1">%d</xliff:g> timer siden. Bekræft adgangskoden.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ikke genkendt"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml
index 4003cc8..05e3c4d 100644
--- a/packages/SystemUI/res-keyguard/values-de/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-de/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Schaltfläche zum Ändern der Eingabemethode"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Bitte gib den PIN-Code ein"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Gib den PUK-Code der SIM-Karte und den neuen PIN-Code ein"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK-Code der SIM-Karte"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Neuer PIN-Code der SIM-Karte"</string>
+ <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>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Falscher PIN-Code."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Aufgeladen"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Wird aufgeladen"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Schnelles Aufladen"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Langsames Aufladen"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Ladegerät anschließen."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Zum Entsperren die Menütaste drücken."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Netzwerk gesperrt"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Keine SIM-Karte"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Keine SIM-Karte im Tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Keine SIM-Karte im Telefon."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"SIM-Karte einlegen."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM-Karte fehlt oder ist nicht lesbar. Bitte lege eine SIM-Karte ein."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"SIM-Karte unbrauchbar."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Deine SIM-Karte wurde dauerhaft deaktiviert.\n Wende dich an deinen Mobilfunkanbieter, um eine andere SIM-Karte zu erhalten."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM-Karte ist gesperrt."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"PUK-Sperre auf SIM-Karte."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"SIM-Karte wird entsperrt..."</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN-Bereich"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM-PIN-Bereich"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"SIM-PUK-Bereich"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Nächster Wecker gestellt für <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Löschen"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Eingabe"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Muster vergessen"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Falsches Muster"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Falsches Passwort"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Falsche PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Versuche es in <xliff:g id="NUMBER">%d</xliff:g> Sekunden noch einmal."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Muster zeichnen"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM-PIN eingeben"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"SIM-PIN für \"<xliff:g id="CARRIER">%1$s</xliff:g>\" eingeben"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN eingeben"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Passwort eingeben"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Weitere Informationen erhältst du von deinem Mobilfunkanbieter."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"Die SIM-Karte \"<xliff:g id="CARRIER">%1$s</xliff:g>\" ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Weitere Informationen erhältst du von deinem Mobilfunkanbieter."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Gewünschten PIN-Code eingeben"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Gewünschten PIN-Code bestätigen"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"SIM-Karte wird entsperrt..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Gib eine 4- bis 8-stellige PIN ein."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"Der PUK-Code muss mindestens 8 Ziffern aufweisen."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Gib den richtigen PUK-Code ein. Bei wiederholten Versuchen wird die SIM-Karte dauerhaft deaktiviert."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN-Codes stimmen nicht überein"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Zu viele Musterversuche"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Du hast deine PIN <xliff:g id="NUMBER_0">%1$d</xliff:g>-mal falsch eingegeben.\n\nBitte versuche es in <xliff:g id="NUMBER_1">%2$d</xliff:g> Sekunden noch einmal."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Du hast dein Passwort <xliff:g id="NUMBER_0">%1$d</xliff:g>-mal falsch eingegeben.\n\nBitte versuche es in <xliff:g id="NUMBER_1">%2$d</xliff:g> Sekunden noch einmal."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Du hast dein Entsperrungsmuster <xliff:g id="NUMBER_0">%1$d</xliff:g>-mal falsch gezeichnet. \n\nBitte versuche es in <xliff:g id="NUMBER_1">%2$d</xliff:g> Sekunden noch einmal."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Du hast <xliff:g id="NUMBER_0">%1$d</xliff:g>-mal erfolglos versucht, das Tablet zu entsperren. Nach <xliff:g id="NUMBER_1">%2$d</xliff:g> weiteren erfolglosen Versuchen wird dieses Tablet zurückgesetzt. Dadurch werden alle Gerätedaten gelöscht."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Du hast <xliff:g id="NUMBER_0">%1$d</xliff:g>-mal erfolglos versucht, das Telefon zu entsperren. Nach <xliff:g id="NUMBER_1">%2$d</xliff:g> weiteren erfolglosen Versuchen wird dieses Telefon zurückgesetzt. Dadurch werden alle Gerätedaten gelöscht."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Du hast <xliff:g id="NUMBER">%d</xliff:g>-mal erfolglos versucht, das Tablet zu entsperren. Dieses Tablet wird nun zurückgesetzt und alle Gerätedaten werden gelöscht."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Du hast <xliff:g id="NUMBER">%d</xliff:g>-mal erfolglos versucht, das Telefon zu entsperren. Dieses Telefon wird nun zurückgesetzt und alle Gerätedaten werden gelöscht."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Du hast <xliff:g id="NUMBER_0">%1$d</xliff:g>-mal erfolglos versucht, das Tablet zu entsperren. Nach <xliff:g id="NUMBER_1">%2$d</xliff:g> weiteren erfolglosen Versuchen wird dieser Nutzer entfernt. Dadurch werden alle Nutzerdaten gelöscht."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Du hast <xliff:g id="NUMBER_0">%1$d</xliff:g>-mal erfolglos versucht, das Telefon zu entsperren. Nach <xliff:g id="NUMBER_1">%2$d</xliff:g> weiteren erfolglosen Versuchen wird dieser Nutzer entfernt. Dadurch werden alle Nutzerdaten gelöscht."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Du hast <xliff:g id="NUMBER">%d</xliff:g>-mal erfolglos versucht, das Tablet zu entsperren. Dieser Nutzer wird nun entfernt und alle Nutzerdaten werden gelöscht."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Du hast <xliff:g id="NUMBER">%d</xliff:g>-mal erfolglos versucht, das Telefon zu entsperren. Dieser Nutzer wird nun entfernt und alle Nutzerdaten werden gelöscht."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Du hast <xliff:g id="NUMBER_0">%1$d</xliff:g>-mal erfolglos versucht, das Tablet zu entsperren. Nach <xliff:g id="NUMBER_1">%2$d</xliff:g> weiteren erfolglosen Versuchen wird das Arbeitsprofil entfernt. Dadurch werden alle Profildaten gelöscht."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Du hast <xliff:g id="NUMBER_0">%1$d</xliff:g>-mal erfolglos versucht, das Telefon zu entsperren. Nach <xliff:g id="NUMBER_1">%2$d</xliff:g> weiteren erfolglosen Versuchen wird das Arbeitsprofil entfernt. Dadurch werden alle Profildaten gelöscht."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Du hast <xliff:g id="NUMBER">%d</xliff:g>-mal erfolglos versucht, das Tablet zu entsperren. Das Arbeitsprofil wird nun entfernt und alle Profildaten werden gelöscht."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Du hast <xliff:g id="NUMBER">%d</xliff:g>-mal erfolglos versucht, das Telefon zu entsperren. Das Arbeitsprofil wird nun entfernt und alle Profildaten werden gelöscht."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Du hast dein Entsperrungsmuster <xliff:g id="NUMBER_0">%1$d</xliff:g>-mal falsch gezeichnet. Nach <xliff:g id="NUMBER_1">%2$d</xliff:g> weiteren erfolglosen Versuchen wirst du aufgefordert, dein Tablet mithilfe eines E-Mail-Kontos zu entsperren.\n\n Versuche es in <xliff:g id="NUMBER_2">%3$d</xliff:g> Sekunden noch einmal."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Du hast dein Entsperrungsmuster <xliff:g id="NUMBER_0">%1$d</xliff:g>-mal falsch gezeichnet. Nach <xliff:g id="NUMBER_1">%2$d</xliff:g> weiteren erfolglosen Versuchen wirst du aufgefordert, dein Telefon mithilfe eines E-Mail-Kontos zu entsperren.\n\n Versuche es in <xliff:g id="NUMBER_2">%3$d</xliff:g> Sekunden noch einmal."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Falscher PIN-Code der SIM-Karte. Bitte wende dich an deinen Mobilfunkanbieter, damit er dein Gerät entsperrt."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Falscher PIN-Code der SIM-Karte. Du hast noch <xliff:g id="NUMBER_1">%d</xliff:g> Versuche.</item>
+ <item quantity="one">Falscher PIN-Code der SIM-Karte. Du hast noch <xliff:g id="NUMBER_0">%d</xliff:g> Versuch, bevor du das Gerät von deinem Mobilfunkanbieter entsperren lassen musst.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"Die SIM-Karte kann nicht verwendet werden. Bitte wende dich an deinen Mobilfunkanbieter."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Falscher PUK-Code der SIM-Karte. Du hast noch <xliff:g id="NUMBER_1">%d</xliff:g> Versuche, bevor deine SIM-Karte endgültig gesperrt wird.</item>
+ <item quantity="one">Falscher PUK-Code der SIM-Karte. Du hast noch <xliff:g id="NUMBER_0">%d</xliff:g> Versuch, bevor deine SIM-Karte endgültig gesperrt wird.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Fehler beim Entsperren der SIM-Karte mit der PIN."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Fehler beim Entsperren der SIM-Karte mithilfe des PUK-Codes."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Code akzeptiert."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Kein Dienst."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Eingabemethode wechseln"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Flugmodus"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Nach dem Neustart des Geräts ist die Eingabe des Musters erforderlich"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Nach dem Neustart des Geräts ist die Eingabe der PIN erforderlich"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Nach dem Neustart des Geräts ist die Eingabe des Passworts erforderlich"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Zur Verbesserung der Sicherheit ist ein Muster erforderlich"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Zur Verbesserung der Sicherheit ist eine PIN erforderlich"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Zur Verbesserung der Sicherheit ist ein Passwort erforderlich"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Beim Profilwechsel ist die Eingabe des Musters erforderlich"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Beim Profilwechsel ist die Eingabe der PIN erforderlich"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Beim Profilwechsel ist die Eingabe des Passworts erforderlich"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Gerät von Geräteadministrator gesperrt"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Gerät manuell gesperrt"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Das Gerät wurde seit <xliff:g id="NUMBER_1">%d</xliff:g> Stunden nicht mehr entsperrt. Bitte bestätige das Muster.</item>
+ <item quantity="one">Das Gerät wurde seit <xliff:g id="NUMBER_0">%d</xliff:g> Stunde nicht mehr entsperrt. Bitte bestätige das Muster.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Das Gerät wurde seit <xliff:g id="NUMBER_1">%d</xliff:g> Stunden nicht mehr entsperrt. Bitte bestätige die PIN.</item>
+ <item quantity="one">Das Gerät wurde seit <xliff:g id="NUMBER_0">%d</xliff:g> Stunde nicht mehr entsperrt. Bitte bestätige die PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Das Gerät wurde seit <xliff:g id="NUMBER_1">%d</xliff:g> Stunden nicht mehr entsperrt. Bitte bestätige das Passwort.</item>
+ <item quantity="one">Das Gerät wurde seit <xliff:g id="NUMBER_0">%d</xliff:g> Stunde nicht mehr entsperrt. Bitte bestätige das Passwort.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nicht erkannt"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml
index 5f88df5..af886bb 100644
--- a/packages/SystemUI/res-keyguard/values-el/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-el/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Κουμπί εναλλαγής μεθόδου εισόδου"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Πληκτρολογήστε τον κωδικό PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Πληκτρολογήστε τον κωδικό PUK της κάρτας SIM και τον νέο κωδικό PIN"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Κωδικός PUK κάρτας SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Νέος κωδικός PIN της κάρτας SIM"</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_password_wrong_pin_code" msgid="6535018036285012028">"Λανθασμένος κωδικός PIN."</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_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 στο tablet."</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">"Περιοχή αριθμού PIN κάρτας SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Περιοχή κωδικού PUK κάρτας SIM"</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="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Δοκιμάστε ξανά σε <xliff:g id="NUMBER">%d</xliff:g> δευτερόλεπτα."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Σχεδιάστε το μοτίβο σας"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Εισαγωγή αριθμού PIN της κάρτας SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Εισάγετε τον αριθμό PIN της SIM της εταιρείας κινητής τηλεφωνίας \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</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">"Πληκτρολογήστε έναν αριθμό PIN που να αποτελείται από 4 έως 8 αριθμούς."</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">"Δοκιμάσατε να ξεκλειδώσετε το tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> φορές χωρίς επιτυχία. Μετά από <xliff:g id="NUMBER_1">%2$d</xliff:g> ακόμα ανεπιτυχείς προσπάθειες, αυτό το tablet θα ρυθμιστεί εκ νέου και θα διαγραφούν όλα τα δεδομένα του."</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">"Δοκιμάσατε να ξεκλειδώσετε αυτό το tablet <xliff:g id="NUMBER">%d</xliff:g> φορές χωρίς επιτυχία. Αυτό το tablet θα ρυθμιστεί εκ νέου και θα διαγραφούν όλα τα δεδομένα του."</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">"Δοκιμάσατε να ξεκλειδώσετε το tablet <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">"Δοκιμάσατε να ξεκλειδώσετε το tablet <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">"Δοκιμάσατε να ξεκλειδώσετε το tablet <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">"Δοκιμάσατε να ξεκλειδώσετε το tablet <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> ακόμα ανεπιτυχείς προσπάθειες, θα σας ζητηθεί να ξεκλειδώσετε το tablet με τη χρήση ενός λογαριασμού ηλεκτρονικού ταχυδρομείου.\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">"Λανθασμένος κωδικός PIN κάρτας SIM. Θα πρέπει να επικοινωνήσετε με την εταιρεία κινητής τηλεφωνίας σας για να ξεκλειδώσετε τη συσκευή σας."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Λανθασμένος κωδικός PIN κάρτας SIM. Απομένουν άλλες <xliff:g id="NUMBER_1">%d</xliff:g> προσπάθειες.</item>
+ <item quantity="one">Λανθασμένος κωδικός PIN κάρτας SIM. Απομένει άλλη <xliff:g id="NUMBER_0">%d</xliff:g> προσπάθεια. Στη συνέχεια, θα πρέπει να επικοινωνήσετε με την εταιρεία κινητής τηλεφωνίας σας για να ξεκλειδώσετε τη συσκευή σας.</item>
+ </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">Λανθασμένος κωδικός PUK κάρτας SIM. Απομένουν άλλες <xliff:g id="NUMBER_1">%d</xliff:g> προσπάθειες προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM.</item>
+ <item quantity="one">Λανθασμένος κωδικός PUK κάρτας SIM. Απομένει άλλη <xliff:g id="NUMBER_0">%d</xliff:g> προσπάθεια προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Αποτυχία λειτουργίας κωδικού PIN κάρτας SIM!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Αποτυχία λειτουργίας κωδικού PUK κάρτας SIM!"</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">"Απαιτείται αριθμός PIN μετά από την επανεκκίνηση της συσκευής"</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="2438626748767361010">"Η συσκευή κλειδώθηκε από το διαχειριστή της"</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
index d324941..5298875 100644
--- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Switch input method button."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Type PIN code"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Type SIM PUK and new PIN code"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM PUK code"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"New SIM PIN code"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Touch to type password"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Type password to unlock"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Type PIN to unlock"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Incorrect PIN code."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Charged"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Charging"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Charging rapidly"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Charging slowly"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Connect your charger."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Press Menu to unlock."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Network locked"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"No SIM card"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"No SIM card in tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"No SIM card in phone."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Insert a SIM card."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"The SIM card is missing or not readable. Insert a SIM card."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Unusable SIM card."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Your SIM card has been permanently disabled.\n Contact your wireless service provider for another SIM card."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM card is locked."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM card is PUK-locked."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Unlocking SIM card…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN area"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM PIN area"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"SIM PUK area"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Next alarm set for <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Forgotten Pattern"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Wrong Pattern"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Wrong Password"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Wrong PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Draw your pattern"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Enter SIM PIN"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Enter SIM PIN for \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Enter PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Enter Password"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM is now disabled. Enter PUK code to continue. Contact carrier for details."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" is now disabled. Enter PUK code to continue. Contact operator for details."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Enter desired PIN code"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Confirm desired PIN code"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Unlocking SIM card…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Type a PIN that is 4 to 8 numbers."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK code should be 8 numbers or more."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Re-enter the correct PUK code. Repeated attempts will permanently disable the SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN codes do not match"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Too many pattern attempts"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"You have incorrectly typed your PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%2$d</xliff:g> seconds."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"You have incorrectly typed your password <xliff:g id="NUMBER_0">%1$d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%2$d</xliff:g> seconds."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%2$d</xliff:g> seconds."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, this tablet will be reset, which will delete all its data."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, this phone will be reset, which will delete all its data."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER">%d</xliff:g> times. This tablet will be reset, which will delete all its data."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. This phone will be reset, which will delete all its data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, this user will be removed, which will delete all user data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, this user will be removed, which will delete all user data."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER">%d</xliff:g> times. This user will be removed, which will delete all user data."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. This user will be removed, which will delete all user data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, the work profile will be removed, which will delete all profile data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, the work profile will be removed, which will delete all profile data."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Incorrect SIM PIN code; you must now contact your operator to unlock your device."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Incorrect SIM PIN code. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
+ <item quantity="one">Incorrect SIM PIN code. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your provider to unlock your device.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM is unusable. Contact your operator."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Incorrect SIM PUK code. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable.</item>
+ <item quantity="one">Incorrect SIM PUK code. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"SIM PIN operation failed!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"SIM PUK operation failed!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Code accepted"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"No service"</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Switch input method"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Aeroplane mode"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Pattern required after device restarts"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"PIN required after device restarts"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Password required after device restarts"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Pattern required for additional security"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"PIN required for additional security"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Password required for additional security"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Pattern required when you switch profiles"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"PIN required when you switch profiles"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Password required when you switch profiles"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Device administrator locked device"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Device was locked manually"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm pattern.</item>
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_0">%d</xliff:g> hour. Confirm pattern.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm PIN.</item>
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_0">%d</xliff:g> hour. Confirm PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm password.</item>
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_0">%d</xliff:g> hour. Confirm password.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Not recognised"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
index d324941..5298875 100644
--- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Switch input method button."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Type PIN code"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Type SIM PUK and new PIN code"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM PUK code"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"New SIM PIN code"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Touch to type password"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Type password to unlock"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Type PIN to unlock"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Incorrect PIN code."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Charged"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Charging"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Charging rapidly"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Charging slowly"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Connect your charger."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Press Menu to unlock."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Network locked"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"No SIM card"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"No SIM card in tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"No SIM card in phone."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Insert a SIM card."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"The SIM card is missing or not readable. Insert a SIM card."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Unusable SIM card."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Your SIM card has been permanently disabled.\n Contact your wireless service provider for another SIM card."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM card is locked."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM card is PUK-locked."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Unlocking SIM card…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN area"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM PIN area"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"SIM PUK area"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Next alarm set for <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Forgotten Pattern"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Wrong Pattern"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Wrong Password"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Wrong PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Draw your pattern"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Enter SIM PIN"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Enter SIM PIN for \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Enter PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Enter Password"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM is now disabled. Enter PUK code to continue. Contact carrier for details."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" is now disabled. Enter PUK code to continue. Contact operator for details."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Enter desired PIN code"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Confirm desired PIN code"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Unlocking SIM card…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Type a PIN that is 4 to 8 numbers."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK code should be 8 numbers or more."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Re-enter the correct PUK code. Repeated attempts will permanently disable the SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN codes do not match"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Too many pattern attempts"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"You have incorrectly typed your PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%2$d</xliff:g> seconds."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"You have incorrectly typed your password <xliff:g id="NUMBER_0">%1$d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%2$d</xliff:g> seconds."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%2$d</xliff:g> seconds."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, this tablet will be reset, which will delete all its data."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, this phone will be reset, which will delete all its data."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER">%d</xliff:g> times. This tablet will be reset, which will delete all its data."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. This phone will be reset, which will delete all its data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, this user will be removed, which will delete all user data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, this user will be removed, which will delete all user data."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER">%d</xliff:g> times. This user will be removed, which will delete all user data."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. This user will be removed, which will delete all user data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, the work profile will be removed, which will delete all profile data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, the work profile will be removed, which will delete all profile data."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Incorrect SIM PIN code; you must now contact your operator to unlock your device."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Incorrect SIM PIN code. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
+ <item quantity="one">Incorrect SIM PIN code. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your provider to unlock your device.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM is unusable. Contact your operator."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Incorrect SIM PUK code. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable.</item>
+ <item quantity="one">Incorrect SIM PUK code. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"SIM PIN operation failed!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"SIM PUK operation failed!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Code accepted"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"No service"</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Switch input method"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Aeroplane mode"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Pattern required after device restarts"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"PIN required after device restarts"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Password required after device restarts"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Pattern required for additional security"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"PIN required for additional security"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Password required for additional security"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Pattern required when you switch profiles"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"PIN required when you switch profiles"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Password required when you switch profiles"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Device administrator locked device"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Device was locked manually"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm pattern.</item>
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_0">%d</xliff:g> hour. Confirm pattern.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm PIN.</item>
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_0">%d</xliff:g> hour. Confirm PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm password.</item>
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_0">%d</xliff:g> hour. Confirm password.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Not recognised"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
index d324941..5298875 100644
--- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Switch input method button."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Type PIN code"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Type SIM PUK and new PIN code"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM PUK code"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"New SIM PIN code"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Touch to type password"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Type password to unlock"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Type PIN to unlock"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Incorrect PIN code."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Charged"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Charging"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Charging rapidly"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Charging slowly"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Connect your charger."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Press Menu to unlock."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Network locked"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"No SIM card"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"No SIM card in tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"No SIM card in phone."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Insert a SIM card."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"The SIM card is missing or not readable. Insert a SIM card."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Unusable SIM card."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Your SIM card has been permanently disabled.\n Contact your wireless service provider for another SIM card."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM card is locked."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM card is PUK-locked."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Unlocking SIM card…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN area"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM PIN area"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"SIM PUK area"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Next alarm set for <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Forgotten Pattern"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Wrong Pattern"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Wrong Password"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Wrong PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Draw your pattern"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Enter SIM PIN"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Enter SIM PIN for \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Enter PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Enter Password"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM is now disabled. Enter PUK code to continue. Contact carrier for details."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" is now disabled. Enter PUK code to continue. Contact operator for details."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Enter desired PIN code"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Confirm desired PIN code"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Unlocking SIM card…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Type a PIN that is 4 to 8 numbers."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK code should be 8 numbers or more."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Re-enter the correct PUK code. Repeated attempts will permanently disable the SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN codes do not match"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Too many pattern attempts"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"You have incorrectly typed your PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%2$d</xliff:g> seconds."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"You have incorrectly typed your password <xliff:g id="NUMBER_0">%1$d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%2$d</xliff:g> seconds."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%2$d</xliff:g> seconds."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, this tablet will be reset, which will delete all its data."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, this phone will be reset, which will delete all its data."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER">%d</xliff:g> times. This tablet will be reset, which will delete all its data."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. This phone will be reset, which will delete all its data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, this user will be removed, which will delete all user data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, this user will be removed, which will delete all user data."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER">%d</xliff:g> times. This user will be removed, which will delete all user data."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. This user will be removed, which will delete all user data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, the work profile will be removed, which will delete all profile data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, the work profile will be removed, which will delete all profile data."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Incorrect SIM PIN code; you must now contact your operator to unlock your device."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Incorrect SIM PIN code. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
+ <item quantity="one">Incorrect SIM PIN code. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your provider to unlock your device.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM is unusable. Contact your operator."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Incorrect SIM PUK code. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable.</item>
+ <item quantity="one">Incorrect SIM PUK code. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"SIM PIN operation failed!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"SIM PUK operation failed!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Code accepted"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"No service"</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Switch input method"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Aeroplane mode"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Pattern required after device restarts"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"PIN required after device restarts"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Password required after device restarts"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Pattern required for additional security"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"PIN required for additional security"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Password required for additional security"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Pattern required when you switch profiles"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"PIN required when you switch profiles"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Password required when you switch profiles"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Device administrator locked device"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Device was locked manually"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm pattern.</item>
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_0">%d</xliff:g> hour. Confirm pattern.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm PIN.</item>
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_0">%d</xliff:g> hour. Confirm PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm password.</item>
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_0">%d</xliff:g> hour. Confirm password.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Not recognised"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
index 347a676..c44c291 100644
--- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Botón Cambiar método de entrada"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Bloqueo de teclado"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Ingresa el código PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Escribe el código PUK de la tarjeta SIM y el código PIN nuevo"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Código PUK de la tarjeta SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Nuevo código PIN de la tarjeta SIM"</string>
+ <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>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Código PIN incorrecto"</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Cargada"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Cargando"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Carga rápida"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Carga lenta"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Conecta tu cargador."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Presiona Menú para desbloquear."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Bloqueada para la red"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Sin tarjeta SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"No hay tarjeta SIM en la tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"No hay tarjeta SIM en el teléfono."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Inserta una tarjeta SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Falta la tarjeta SIM o no se puede leer. Introduce una tarjeta SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Tarjeta SIM inutilizable"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Tu tarjeta SIM se inhabilitó de manera permanente.\n Comunícate con tu proveedor de servicios inalámbricos para obtener otra."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"La tarjeta SIM está bloqueada."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"La tarjeta SIM está bloqueada con el código PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Desbloqueando tarjeta SIM…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Área de PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Área de PIN de la tarjeta SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Área de PUK de la tarjeta SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Próxima alarma establecida: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Borrar"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Intro"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"¿Olvidaste el patrón?"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Patrón incorrecto"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Contraseña incorrecta"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"PIN incorrecto"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Vuelve a intentarlo en <xliff:g id="NUMBER">%d</xliff:g> segundos."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Dibuja tu patrón"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Ingresa el PIN de la tarjeta SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Ingresa el PIN de la tarjeta SIM para \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Ingresa el PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Ingresa tu contraseña"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La tarjeta SIM está inhabilitada. Para continuar, ingresa el código PUK. Si quieres obtener más información, comunícate con el proveedor."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"La tarjeta SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" está inhabilitada. Para continuar, ingresa el código PUK. Para obtener más información, comunícate con el proveedor."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Ingresa el código PIN deseado"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Confirma el código PIN deseado"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Desbloqueando tarjeta SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Escribe un PIN que tenga entre 4 y 8 números."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"El código PUK debe tener al menos 8 números."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Vuelve a ingresar el código PUK correcto. Si ingresas un código incorrecto varias veces, se inhabilitará la tarjeta SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Los códigos PIN no coinciden"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Demasiados intentos incorrectos para el ingreso del patrón"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Escribiste tu PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de manera incorrecta. \n\nVuelve a intentarlo en <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Escribiste tu contraseña <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de manera incorrecta. \n\nVuelve a intentarlo en <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Dibujaste tu patrón de desbloqueo <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de manera incorrecta. \n\nVuelve a intentarlo en <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Intentaste desbloquear la tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de manera incorrecta. Después de <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se restablecerá la tablet, lo que borrará todos los datos."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Intentaste desbloquear el teléfono <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de manera incorrecta. Después de <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se restablecerá el teléfono, lo que borrará todos los datos."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Intentaste desbloquear la tablet <xliff:g id="NUMBER">%d</xliff:g> veces de manera incorrecta. Se restablecerá la tablet, lo que borrará todos los datos."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Intentaste desbloquear el teléfono <xliff:g id="NUMBER">%d</xliff:g> veces de manera incorrecta. Se restablecerá el teléfono, lo que borrará todos los datos."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Intentaste desbloquear la tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de manera incorrecta. Después de <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se quitará este usuario, lo que borrará todos los datos asociados."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Intentaste desbloquear el teléfono <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de manera incorrecta. Después de <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se quitará este usuario, lo que borrará todos los datos asociados."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Intentaste desbloquear la tablet <xliff:g id="NUMBER">%d</xliff:g> veces de manera incorrecta. Se quitará el usuario, lo que borrará todos los datos asociados."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Intentaste desbloquear el teléfono <xliff:g id="NUMBER">%d</xliff:g> veces de manera incorrecta. Se quitará el usuario, lo que borrará todos los datos asociados."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Intentaste desbloquear la tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de manera incorrecta. Después de <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se quitará el perfil de trabajo, lo que borrará todos los datos asociados."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Intentaste desbloquear el teléfono <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de manera incorrecta. Después de <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se quitará el perfil de trabajo, lo que borrará todos los datos asociados."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Intentaste desbloquear la tablet <xliff:g id="NUMBER">%d</xliff:g> veces de manera incorrecta. Se quitará el perfil de trabajo, lo que borrará todos los datos asociados."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Intentaste desbloquear el teléfono <xliff:g id="NUMBER">%d</xliff:g> veces de manera incorrecta. Se quitará el perfil de trabajo, lo que borrará todos los datos asociados."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Dibujaste incorrectamente tu patrón de desbloqueo <xliff:g id="NUMBER_0">%1$d</xliff:g> veces. Luego de <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se te solicitará que desbloquees tu tablet mediante una cuenta de correo electrónico.\n\n Vuelve a intentarlo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Dibujaste incorrectamente tu patrón de desbloqueo <xliff:g id="NUMBER_0">%1$d</xliff:g> veces. Luego de <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se te solicitará que desbloquees tu dispositivo mediante una cuenta de correo electrónico.\n\n Vuelve a intentarlo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"El código PIN de la tarjeta SIM es incorrecto. Debes comunicarte con tu proveedor para desbloquear el dispositivo."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">El código PIN de la tarjeta SIM es incorrecto. Te quedan <xliff:g id="NUMBER_1">%d</xliff:g> intentos más.</item>
+ <item quantity="one">El código PIN de la tarjeta SIM es incorrecto. Te queda <xliff:g id="NUMBER_0">%d</xliff:g> intento antes de que debas comunicarte con tu proveedor para desbloquear el dispositivo.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"La tarjeta SIM no se puede usar. Comunícate con tu proveedor."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">El código PUK de la tarjeta SIM es incorrecto. Tienes <xliff:g id="NUMBER_1">%d</xliff:g> intentos más antes de que la tarjeta SIM quede inutilizable de manera permanente.</item>
+ <item quantity="one">El código PUK de la tarjeta SIM es incorrecto. Tienes <xliff:g id="NUMBER_0">%d</xliff:g> intento antes de que la tarjeta SIM quede inutilizable de manera permanente.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Se produjo un error al desbloquear la tarjeta SIM con el PIN."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Se produjo un error al desbloquear la tarjeta SIM con el PUK."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Se aceptó el código."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Sin servicio"</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Cambiar método de entrada"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Modo de avión"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Se requiere el patrón después de reiniciar el dispositivo"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Se requiere el PIN después de reiniciar el dispositivo"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Se requiere la contraseña después de reiniciar el dispositivo"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Se requiere el patrón por razones de seguridad"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Se requiere el PIN por razones de seguridad"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Se requiere la contraseña por razones de seguridad"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Se requiere el patrón al cambiar de perfil"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Se requiere el PIN al cambiar de perfil"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Se requiere la contraseña al cambiar de perfil"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"El administrador bloqueó el dispositivo"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"El dispositivo se bloqueó de forma manual"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Hace <xliff:g id="NUMBER_1">%d</xliff:g> horas que no se desbloquea el dispositivo. Confirma el patrón.</item>
+ <item quantity="one">Hace <xliff:g id="NUMBER_0">%d</xliff:g> hora que no se desbloquea el dispositivo. Confirma el patrón.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Hace <xliff:g id="NUMBER_1">%d</xliff:g> horas que no se desbloquea el dispositivo. Confirma el PIN.</item>
+ <item quantity="one">Hace <xliff:g id="NUMBER_0">%d</xliff:g> hora que no se desbloquea el dispositivo. Confirma el PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Hace <xliff:g id="NUMBER_1">%d</xliff:g> horas que no se desbloquea el dispositivo. Confirma la contraseña.</item>
+ <item quantity="one">Hace <xliff:g id="NUMBER_0">%d</xliff:g> hora que no se desbloquea el dispositivo. Confirma la contraseña.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"No se reconoció"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml
index 347a676..962d7bd 100644
--- a/packages/SystemUI/res-keyguard/values-es/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Botón Cambiar método de entrada"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Bloqueo"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Escribe el código PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Escribe el PUK de la tarjeta SIM y un nuevo código PIN"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Código PUK de la tarjeta SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Nuevo código PIN de la tarjeta SIM"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Toca para escribir contraseña"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Escribe la contraseña para desbloquear"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Escribe el código PIN para desbloquear"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"El código PIN es incorrecto."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Cargada"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Cargando"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Cargando rápidamente"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Cargando lentamente"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Conecta el cargador."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Pulsa el menú para desbloquear la pantalla."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Bloqueada para la red"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Falta la tarjeta SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"No se ha insertado ninguna tarjeta SIM en el tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"No se ha insertado ninguna tarjeta SIM en el teléfono."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Inserta una tarjeta SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Falta la tarjeta SIM o no se puede leer. Inserta una tarjeta SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"La tarjeta SIM se ha inhabilitado."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"La tarjeta SIM se ha inhabilitado permanentemente.\n Para obtener otra, ponte en contacto con tu proveedor de servicios de telefonía."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"La tarjeta SIM está bloqueada."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"La tarjeta SIM está bloqueada con el código PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Desbloqueando la tarjeta SIM…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Área de PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Área de PIN de la tarjeta SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Área de PUK de la tarjeta SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Próxima alarma: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Eliminar"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Intro"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"¿Has olvidado el patrón?"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Patrón incorrecto"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Contraseña incorrecta"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"PIN incorrecto"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Vuelve a intentarlo en <xliff:g id="NUMBER">%d</xliff:g> segundos."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Dibuja tu patrón"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Introduce el PIN de la tarjeta SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Introduce el PIN de la tarjeta SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Introduce el PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Introduce tu contraseña"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La tarjeta SIM está inhabilitada. Para continuar, introduce el código PUK. Si quieres obtener más información, ponte en contacto con el operador."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"La tarjeta SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" está inhabilitada. Para continuar, introduce el código PUK. Si quieres obtener más información, ponte en contacto con el operador."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Introduce el código PIN que quieras utilizar"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Confirma el código PIN que quieras utilizar"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Desbloqueando la tarjeta SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Escribe un código PIN que tenga entre 4 y 8 dígitos."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"El código PUK debe tener 8 números como mínimo."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Vuelve a introducir el código PUK correcto. Si introduces un código incorrecto varias veces, se inhabilitará la tarjeta SIM de forma permanente."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Los códigos PIN no coinciden"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Has fallado demasiadas veces al introducir el patrón"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Has fallado <xliff:g id="NUMBER_0">%1$d</xliff:g> veces al escribir el PIN. \n\nVuelve a intentarlo dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Has fallado <xliff:g id="NUMBER_0">%1$d</xliff:g> veces al introducir la contraseña. \n\nVuelve a intentarlo dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Has fallado <xliff:g id="NUMBER_0">%1$d</xliff:g> veces al dibujar el patrón de desbloqueo. \n\nVuelve a intentarlo dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Has fallado <xliff:g id="NUMBER_0">%1$d</xliff:g> veces al desbloquear el tablet. Si fallas otras <xliff:g id="NUMBER_1">%2$d</xliff:g> veces, se recuperarán los ajustes de fábrica de este tablet y se eliminarán todos sus datos."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Has fallado <xliff:g id="NUMBER_0">%1$d</xliff:g> veces al desbloquear el teléfono. Si fallas otras <xliff:g id="NUMBER_1">%2$d</xliff:g> veces, se recuperarán los ajustes de fábrica de este teléfono y se eliminarán todos sus datos."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Has fallado <xliff:g id="NUMBER">%d</xliff:g> veces al desbloquear el tablet. Se recuperarán los ajustes de fábrica de este tablet y se eliminarán todos sus datos."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Has fallado <xliff:g id="NUMBER">%d</xliff:g> veces al desbloquear el teléfono. Se recuperarán los ajustes de fábrica de este teléfono y se eliminarán todos sus datos."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Has fallado <xliff:g id="NUMBER_0">%1$d</xliff:g> veces al desbloquear el tablet. Si fallas otras <xliff:g id="NUMBER_1">%2$d</xliff:g> veces, se quitará a este usuario y se eliminarán todos sus datos."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Has fallado <xliff:g id="NUMBER_0">%1$d</xliff:g> veces al desbloquear el teléfono. Si fallas otras <xliff:g id="NUMBER_1">%2$d</xliff:g> veces, se quitará a este usuario y se eliminarán todos sus datos."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Has fallado <xliff:g id="NUMBER">%d</xliff:g> veces al desbloquear el tablet. Se quitará a este usuario y se eliminarán todos sus datos."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Has fallado <xliff:g id="NUMBER">%d</xliff:g> veces al desbloquear el teléfono. Se quitará a este usuario y se eliminarán todos sus datos."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Has fallado <xliff:g id="NUMBER_0">%1$d</xliff:g> veces al desbloquear el tablet. Si fallas otras <xliff:g id="NUMBER_1">%2$d</xliff:g> veces, se quitará el perfil de trabajo y se eliminarán todos sus datos."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Has fallado <xliff:g id="NUMBER_0">%1$d</xliff:g> veces al desbloquear el teléfono. Si fallas otras <xliff:g id="NUMBER_1">%2$d</xliff:g> veces, se quitará el perfil de trabajo y se eliminarán todos sus datos."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Has fallado <xliff:g id="NUMBER">%d</xliff:g> veces al desbloquear el tablet. Se quitará este perfil de trabajo se quitará y se eliminarán todos sus datos."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Has fallado <xliff:g id="NUMBER">%d</xliff:g> veces al desbloquear el teléfono. Se quitará este perfil de trabajo y se eliminarán todos sus datos."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Has fallado <xliff:g id="NUMBER_0">%1$d</xliff:g> veces al dibujar el patrón de desbloqueo. Si fallas otras <xliff:g id="NUMBER_1">%2$d</xliff:g> veces, tendrás que usar una cuenta de correo electrónico para desbloquear el tablet.\n\n Vuelve a intentarlo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Has fallado <xliff:g id="NUMBER_0">%1$d</xliff:g> veces al dibujar el patrón de desbloqueo. Si fallas otras <xliff:g id="NUMBER_1">%2$d</xliff:g> veces, tendrás que usar una cuenta de correo electrónico para desbloquear el teléfono.\n\n Vuelve a intentarlo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"El código PIN de la tarjeta SIM es incorrecto. Debes ponerte en contacto con tu operador para desbloquear el dispositivo."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">El código PIN de la tarjeta SIM es incorrecto. Quedan <xliff:g id="NUMBER_1">%d</xliff:g> intentos.</item>
+ <item quantity="one">El código PIN de la tarjeta SIM es incorrecto. Queda <xliff:g id="NUMBER_0">%d</xliff:g> intento para tener que ponerte en contacto con tu operador para desbloquear el dispositivo.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"La tarjeta SIM no se puede utilizar. Ponte en contacto con tu operador."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">El código PUK de la tarjeta SIM es incorrecto. Quedan <xliff:g id="NUMBER_1">%d</xliff:g> intentos paraa que la tarjeta SIM no se pueda utilizar de forma permanente.</item>
+ <item quantity="one">El código PUK de la tarjeta SIM es incorrecto. Queda <xliff:g id="NUMBER_0">%d</xliff:g> intento para que la tarjeta SIM no se pueda utilizar de forma permanente.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"No se ha podido desbloquear la tarjeta SIM con el código PIN."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"No se ha podido desbloquear la tarjeta SIM con el código PUK."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"El código es válido."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Sin servicio"</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Cambiar método de introducción"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Modo avión"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Debes introducir el patrón después de reiniciar el dispositivo"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Debes introducir el PIN después de reiniciar el dispositivo"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Debes introducir la contraseña después de reiniciar el dispositivo"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Debes introducir el patrón como medida de seguridad adicional"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Debes introducir el PIN como medida de seguridad adicional"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Debes introducir la contraseña como medida de seguridad adicional"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Debes introducir el patrón cuando cambies de perfil"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Debes introducir el PIN cuando cambies de perfil"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Debes introducir la contraseña cuando cambies de perfil"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Un administrador ha bloqueado el dispositivo"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"El dispositivo se ha bloqueado manualmente"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">El dispositivo no se ha desbloqueado durante <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirma el patrón.</item>
+ <item quantity="one">El dispositivo no se ha desbloqueado durante <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirma el patrón.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">El dispositivo no se ha desbloqueado durante <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirma el PIN.</item>
+ <item quantity="one">El dispositivo no se ha desbloqueado durante <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirma el PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">El dispositivo no se ha desbloqueado durante <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirma la contraseña.</item>
+ <item quantity="one">El dispositivo no se ha desbloqueado durante <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirma la contraseña.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"No reconocido"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml
index 4595504..6e23fe8 100644
--- a/packages/SystemUI/res-keyguard/values-et/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-et/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Sisestusmeetodi vahetamise nupp."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Klahvilukk"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Sisestage PIN-kood"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Sisestage SIM-kaardi PUK- ja uus PIN-kood"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM-kaardi PUK-kood"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"SIM-kaardi uus PIN-kood"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Puudut. parooli sisestamiseks"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Avamiseks sisestage parool"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Avamiseks sisestage PIN-kood"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Vale PIN-kood."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Laetud"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Laadimine"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Kiiresti laadimine"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Aeglaselt laadimine"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Ühendage laadija."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Vajutage avamiseks menüüklahvi."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Võrk on lukus"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"SIM-kaarti pole"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Tahvelarvutis pole SIM-kaarti."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Telefonis pole SIM-kaarti."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Sisestage SIM-kaart."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM-kaart puudub või on loetamatu. Sisestage SIM-kaart."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Kasutamiskõlbmatu SIM-kaart."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"SIM-kaart on jäädavalt keelatud.\n Uue SIM-kaardi saamiseks võtke ühendust oma traadita side teenusepakkujaga."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM-kaart on lukus."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM-kaart on PUK-koodiga lukus."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"SIM-kaardi avamine …"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN-koodi ala"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM-kaardi PIN-koodi ala"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"SIM-kaardi PUK-koodi ala"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Järgmine alarm on määratud ajaks <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Kustuta"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Sisesta"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Unustasin mustri"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Vale muster"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Vale parool"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Vale PIN-kood"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Proovige <xliff:g id="NUMBER">%d</xliff:g> sekundi pärast uuesti."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Joonistage oma muster"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Sisestage SIM-kaardi PIN-kood"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Sisestage operaatori „<xliff:g id="CARRIER">%1$s</xliff:g>” puhul SIM-kaardi PIN-kood"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Sisestage PIN-kood"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Sisestage parool"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Lisateabe saamiseks võtke ühendust operaatoriga."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM-kaart „<xliff:g id="CARRIER">%1$s</xliff:g>” on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Lisateabe saamiseks võtke ühendust operaatoriga."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Sisestage soovitud PIN-kood"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Kinnitage soovitud PIN-kood"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"SIM-kaardi avamine …"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Sisestage 4–8-numbriline PIN-kood."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK-koodi pikkus peab olema vähemalt kaheksa numbrit."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Sisestage uuesti õige PUK-kood. Korduvkatsete korral keelatakse SIM-kaart jäädavalt."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN-koodid ei ole vastavuses"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Liiga palju mustrikatseid"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Olete PIN-koodi <xliff:g id="NUMBER_0">%1$d</xliff:g> korda valesti sisestanud. \n\nProovige <xliff:g id="NUMBER_1">%2$d</xliff:g> sekundi pärast uuesti."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Olete parooli <xliff:g id="NUMBER_0">%1$d</xliff:g> korda valesti sisestanud. \n\nProovige <xliff:g id="NUMBER_1">%2$d</xliff:g> sekundi pärast uuesti."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Olete oma avamismustrit <xliff:g id="NUMBER_0">%1$d</xliff:g> korda valesti joonistanud. \n\nProovige <xliff:g id="NUMBER_1">%2$d</xliff:g> sekundi pärast uuesti."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Olete püüdnud <xliff:g id="NUMBER_0">%1$d</xliff:g> korda tahvelarvutit valesti avada. Pärast veel <xliff:g id="NUMBER_1">%2$d</xliff:g> ebaõnnestunud katset tahvelarvuti lähtestatakse ja kõik selle andmed kustutatakse."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Olete püüdnud <xliff:g id="NUMBER_0">%1$d</xliff:g> korda telefoni valesti avada. Pärast veel <xliff:g id="NUMBER_1">%2$d</xliff:g> ebaõnnestunud katset telefon lähtestatakse ja kõik selle andmed kustutatakse."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Olete püüdnud <xliff:g id="NUMBER">%d</xliff:g> korda tahvelarvutit valesti avada. Tahvelarvuti lähtestatakse ja kõik selle andmed kustutatakse."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Olete püüdnud <xliff:g id="NUMBER">%d</xliff:g> korda telefoni valesti avada. Telefon lähtestatakse ja kõik selle andmed kustutatakse."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Olete püüdnud <xliff:g id="NUMBER_0">%1$d</xliff:g> korda tahvelarvutit valesti avada. Pärast veel <xliff:g id="NUMBER_1">%2$d</xliff:g> ebaõnnestunud katset kasutaja eemaldatakse ja kõik kasutajaandmed kustutatakse."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Olete püüdnud <xliff:g id="NUMBER_0">%1$d</xliff:g> korda telefoni valesti avada. Pärast veel <xliff:g id="NUMBER_1">%2$d</xliff:g> ebaõnnestunud katset kasutaja eemaldatakse ja kõik kasutajaandmed kustutatakse."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Olete püüdnud <xliff:g id="NUMBER">%d</xliff:g> korda tahvelarvutit valesti avada. Kasutaja eemaldatakse ja kõik kasutajaandmed kustutatakse."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Olete püüdnud <xliff:g id="NUMBER">%d</xliff:g> korda telefoni valesti avada. Kasutaja eemaldatakse ja kõik kasutajaandmed kustutatakse."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Olete püüdnud <xliff:g id="NUMBER_0">%1$d</xliff:g> korda tahvelarvutit valesti avada. Pärast veel <xliff:g id="NUMBER_1">%2$d</xliff:g> ebaõnnestunud katset tööprofiil eemaldatakse ja kõik profiiliandmed kustutatakse."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Olete püüdnud <xliff:g id="NUMBER_0">%1$d</xliff:g> korda telefoni valesti avada. Pärast veel <xliff:g id="NUMBER_1">%2$d</xliff:g> ebaõnnestunud katset tööprofiil eemaldatakse ja kõik profiiliandmed kustutatakse."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Olete püüdnud <xliff:g id="NUMBER">%d</xliff:g> korda tahvelarvutit valesti avada. Tööprofiil eemaldatakse ja kõik profiiliandmed kustutatakse."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Olete püüdnud <xliff:g id="NUMBER">%d</xliff:g> korda telefoni valesti avada. Tööprofiil eemaldatakse ja kõik profiiliandmed kustutatakse."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%1$d</xliff:g> korda valesti. Pärast veel <xliff:g id="NUMBER_1">%2$d</xliff:g> ebaõnnestunud katset palutakse teil tahvelarvuti avada meilikontoga.\n\n Proovige uuesti <xliff:g id="NUMBER_2">%3$d</xliff:g> sekundi pärast."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%1$d</xliff:g> korda valesti. Pärast veel <xliff:g id="NUMBER_1">%2$d</xliff:g> ebaõnnestunud katset palutakse teil telefon avada meilikontoga.\n\n Proovige uuesti <xliff:g id="NUMBER_2">%3$d</xliff:g> sekundi pärast."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"SIM-kaardi vale PIN-kood. Seadme avamiseks peate nüüd ühendust võtma oma operaatoriga."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">SIM-kaardi vale PIN-kood. Teil on jäänud veel <xliff:g id="NUMBER_1">%d</xliff:g> katset.</item>
+ <item quantity="one">SIM-kaardi vale PIN-kood. Teil on jäänud veel <xliff:g id="NUMBER_0">%d</xliff:g> katse enne, kui peate seadme avamiseks operaatoriga ühendust võtma.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM-kaart on kasutamiskõlbmatu. Võtke ühendust operaatoriga."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">SIM-kaardi vale PUK-kood. Teil on jäänud veel <xliff:g id="NUMBER_1">%d</xliff:g> katset enne, kui SIM-kaart jäädavalt lukustatakse.</item>
+ <item quantity="one">SIM-kaardi vale PUK-kood. Teil on jäänud veel <xliff:g id="NUMBER_0">%d</xliff:g> katse enne, kui SIM-kaart jäädavalt lukustatakse.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"SIM-kaardi PIN-koodi toiming ebaõnnestus."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"SIM-kaardi PUK-koodi toiming ebaõnnestus."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kood on õige."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Teenus puudub."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Vaheta sisestusmeetodit"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Lennukirežiim"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Pärast seadme taaskäivitamist tuleb sisestada muster"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Pärast seadme taaskäivitamist tuleb sisestada PIN-kood"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Pärast seadme taaskäivitamist tuleb sisestada parool"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Lisaturvalisuse huvides tuleb sisestada muster"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Lisaturvalisuse huvides tuleb sisestada PIN-kood"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Lisaturvalisuse huvides tuleb sisestada parool"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Profiilide vahetamisel tuleb sisestada muster"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Profiilide vahetamisel tuleb sisestada PIN-kood"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Profiilide vahetamisel tuleb sisestada parool"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Seadme administraator lukustas seadme"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Seade lukustati käsitsi"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Seadet pole avatud <xliff:g id="NUMBER_1">%d</xliff:g> tundi. Kinnitage muster.</item>
+ <item quantity="one">Seadet pole avatud <xliff:g id="NUMBER_0">%d</xliff:g> tund. Kinnitage muster.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Seadet pole avatud <xliff:g id="NUMBER_1">%d</xliff:g> tundi. Kinnitage PIN-kood.</item>
+ <item quantity="one">Seadet pole avatud <xliff:g id="NUMBER_0">%d</xliff:g> tund. Kinnitage PIN-kood.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Seadet pole avatud <xliff:g id="NUMBER_1">%d</xliff:g> tundi. Kinnitage parool.</item>
+ <item quantity="one">Seadet pole avatud <xliff:g id="NUMBER_0">%d</xliff:g> tund. Kinnitage parool.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ei tuvastatud"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml
index 79f001f..0b580c9 100644
--- a/packages/SystemUI/res-keyguard/values-eu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Idazketa-metodoa aldatzeko botoia."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Teklatu-babeslea"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Idatzi PIN kodea"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Idatzi SIM txartelaren PUK kodea eta PIN kode berria"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM txartelaren PUK kodea"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"SIM txartelaren PIN kode berria"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Pasahitza idazteko, sakatu hau"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Idatzi desblokeatzeko pasahitza"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Idatzi desblokeatzeko PIN kodea"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"PIN kode hori ez da zuzena."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Kargatuta"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Kargatzen"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Bizkor kargatzen"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Motel kargatzen"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Konektatu kargagailua."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Desblokeatzeko, sakatu Menua."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Sarea blokeatuta dago"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Ez dago SIM txartelik"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Ez dago SIM txartelik tabletan."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Ez dago SIM txartelik telefonoan."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Sartu SIM txartela."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM txartela falta da edo ezin da irakurri. Sartu SIM txartel bat."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"SIM txartela erabilgaitza da."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Betiko desgaitu zaizu SIM txartela.\n Beste SIM txartel bat lortzeko, jarri zerbitzu-hornitzailearekin harremanetan."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"Blokeatuta dago SIM txartela."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"PUK bidez blokeatuta dago SIM txartela."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"SIM txartela desblokeatzen…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN kodearen eremua"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM txartelaren PIN kodearen eremua"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"SIM txartelaren PUK kodearen eremua"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Hurrengo alarmak ordu honetan joko du: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Ezabatu"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Sartu"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Eredua ahaztu zaizu"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Eredu hori ez da zuzena"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Pasahitz hori ez da zuzena"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"PIN kode hori ez da zuzena"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Saiatu berriro <xliff:g id="NUMBER">%d</xliff:g> segundo barru."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Marraztu eredua"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Idatzi SIM txartelaren PIN kodea"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Idatzi \"<xliff:g id="CARRIER">%1$s</xliff:g>\" operadorearen SIM txartelaren PIN kodea"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Idatzi PIN kodea"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Idatzi pasahitza"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Desgaitu egin da SIM txartela. Aurrera egiteko, idatzi PUK kodea. Xehetasunak lortzeko, jarri operadorearekin harremanetan."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"Desgaitu egin da \"<xliff:g id="CARRIER">%1$s</xliff:g>\" operadorearen SIM txartela. Aurrera egiteko, idatzi PUK kodea. Xehetasunak jakiteko, jarri operadorearekin harremanetan."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Idatzi erabili nahi duzun PIN kodea"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Berretsi erabili nahi duzun PIN kodea"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"SIM txartela desblokeatzen…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Idatzi 4 eta 8 zenbaki bitarteko PIN bat."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK kodeak 8 zenbaki izan behar ditu gutxienez."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Idatzi berriro PUK kode zuzena. Hainbat saiakera oker eginez gero, betiko desgaituko da SIM txartela."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN kodeak ez datoz bat"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Eredua marrazteko saiakera gehiegi egin dira"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"<xliff:g id="NUMBER_0">%1$d</xliff:g> aldiz idatzi duzu PIN kodea, baina huts egin duzu denetan. \n\nSaiatu berriro <xliff:g id="NUMBER_1">%2$d</xliff:g> segundo barru."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"<xliff:g id="NUMBER_0">%1$d</xliff:g> aldiz idatzi duzu pasahitza, baina huts egin duzu denetan. \n\nSaiatu berriro <xliff:g id="NUMBER_1">%2$d</xliff:g> segundo barru."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"<xliff:g id="NUMBER_0">%1$d</xliff:g> aldiz marraztu duzu desblokeatzeko eredua, baina huts egin duzu denetan. \n\nSaiatu berriro <xliff:g id="NUMBER_1">%2$d</xliff:g> segundo barru."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"<xliff:g id="NUMBER_0">%1$d</xliff:g> aldiz saiatu zara tableta desblokeatzen, baina huts egin duzu denetan. Beste <xliff:g id="NUMBER_1">%2$d</xliff:g> aldiz huts egiten baduzu, berrezarri egingo da tableta eta, ondorioz, bertako datu guztiak ezabatuko dira."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"<xliff:g id="NUMBER_0">%1$d</xliff:g> aldiz saiatu zara telefonoa desblokeatzen, baina huts egin duzu denetan. Beste <xliff:g id="NUMBER_1">%2$d</xliff:g> aldiz huts egiten baduzu, berrezarri egingo da telefonoa eta, ondorioz, bertako datu guztiak ezabatuko dira."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"<xliff:g id="NUMBER">%d</xliff:g> aldiz saiatu zara tableta desblokeatzen, baina huts egin duzu denetan. Tableta berrezarri egingo da eta, ondorioz, bertako datu guztiak ezabatuko dira."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"<xliff:g id="NUMBER">%d</xliff:g> aldiz saiatu zara telefonoa desblokeatzen, baina huts egin duzu denetan. Telefonoa berrezarri egingo da eta, ondorioz, bertako datu guztiak ezabatuko dira."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"<xliff:g id="NUMBER_0">%1$d</xliff:g> aldiz saiatu zara tableta desblokeatzen, baina huts egin duzu denetan. Beste <xliff:g id="NUMBER_1">%2$d</xliff:g> aldiz huts egiten baduzu, kendu egingo da erabiltzailea eta, ondorioz, haren datu guztiak ezabatuko dira."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"<xliff:g id="NUMBER_0">%1$d</xliff:g> aldiz saiatu zara telefonoa desblokeatzen, baina huts egin duzu denetan. Beste <xliff:g id="NUMBER_1">%2$d</xliff:g> aldiz huts egiten baduzu, kendu egingo da erabiltzailea eta, ondorioz, haren datu guztiak ezabatuko dira."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"<xliff:g id="NUMBER">%d</xliff:g> aldiz saiatu zara tableta desblokeatzen, baina huts egin duzu denetan. Erabiltzailea kendu egingo da eta, ondorioz, haren datu guztiak ezabatuko dira."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"<xliff:g id="NUMBER">%d</xliff:g> aldiz saiatu zara telefonoa desblokeatzen, baina huts egin duzu denetan. Erabiltzailea kendu egingo da eta, ondorioz, haren datu guztiak ezabatuko dira."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"<xliff:g id="NUMBER_0">%1$d</xliff:g> aldiz saiatu zara tableta desblokeatzen, baina huts egin duzu denetan. Beste <xliff:g id="NUMBER_1">%2$d</xliff:g> aldiz huts egiten baduzu, kendu egingo da laneko profila eta, ondorioz, profileko datu guztiak ezabatuko dira."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"<xliff:g id="NUMBER_0">%1$d</xliff:g> aldiz saiatu zara telefonoa desblokeatzen, baina huts egin duzu denetan. Beste <xliff:g id="NUMBER_1">%2$d</xliff:g> aldiz huts egiten baduzu, kendu egingo da laneko profila eta, ondorioz, profileko datu guztiak ezabatuko dira."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"<xliff:g id="NUMBER">%d</xliff:g> aldiz saiatu zara tableta desblokeatzen, baina huts egin duzu denetan. Laneko profila kendu egingo da eta, ondorioz, profileko datu guztiak ezabatuko dira."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"<xliff:g id="NUMBER">%d</xliff:g> aldiz saiatu zara telefonoa desblokeatzen, baina huts egin duzu denetan. Laneko profila kendu egingo da eta, ondorioz, profileko datu guztiak ezabatuko dira."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"<xliff:g id="NUMBER_0">%1$d</xliff:g> aldiz marraztu duzu desblokeatzeko eredua, baina huts egin duzu denetan. Beste <xliff:g id="NUMBER_1">%2$d</xliff:g> aldiz huts egiten baduzu, tableta posta-kontu baten bidez desblokeatzeko eskatuko dizugu.\n\n Saiatu berriro <xliff:g id="NUMBER_2">%3$d</xliff:g> segundo barru."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"<xliff:g id="NUMBER_0">%1$d</xliff:g> aldiz marraztu duzu desblokeatzeko eredua, baina huts egin duzu denetan. Beste <xliff:g id="NUMBER_1">%2$d</xliff:g> aldiz huts egiten baduzu, telefonoa posta-kontu baten bidez desblokeatzeko eskatuko dizugu.\n\n Saiatu berriro <xliff:g id="NUMBER_2">%3$d</xliff:g> segundo barru."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"SIM txartelaren PIN kodea ez da zuzena. Gailua desblokeatzeko, operadorearekin jarri beharko duzu harremanetan."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Ez da zuzena SIM txartelaren PIN kodea. <xliff:g id="NUMBER_1">%d</xliff:g> saiakera geratzen zaizkizu gailua desblokeatzeko.</item>
+ <item quantity="one">Ez da zuzena SIM txartelaren PIN kodea. <xliff:g id="NUMBER_0">%d</xliff:g> saiakera geratzen zaizu gailua desblokeatzeko.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM txartela erabilgaitza da. Jarri operadorearekin harremanetan."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Ez da zuzena SIM txartelaren PUK kodea. <xliff:g id="NUMBER_1">%d</xliff:g> saiakera geratzen zaizkizu SIM txartela betiko erabilgaitz geratu aurretik.</item>
+ <item quantity="one">Ez da zuzena SIM txartelaren PUK kodea. <xliff:g id="NUMBER_0">%d</xliff:g> saiakera geratzen zaizu SIM txartela betiko erabilgaitz geratu aurretik.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Huts egin du SIM txartelaren PIN kodearen eragiketak!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Huts egin du SIM txartelaren PUK kodearen eragiketak!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Onartu da kodea!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Ez dago konektatuta inongo saretara."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Aldatu idazketa-metodoa"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Hegaldi modua"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Eredua marraztu beharko duzu gailua berrabiarazten denean"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"PIN kodea idatzi beharko duzu gailua berrabiarazten denean"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Pasahitza idatzi beharko duzu gailua berrabiarazten denean"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Eredua behar da gailua babestuago izateko"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"PIN kodea behar da gailua babestuago izateko"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Pasahitza behar da gailua babestuago izateko"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Eredua marraztu beharko duzu profilez aldatzen baduzu"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"PIN kodea idatzi beharko duzu profilez aldatzen baduzu"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Pasahitza idatzi beharko duzu profilez aldatzen baduzu"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Administratzaileak gailua blokeatu du"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Eskuz blokeatu da gailua"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Gailua ez da desblokeatu <xliff:g id="NUMBER_1">%d</xliff:g> orduz. Berretsi eredua.</item>
+ <item quantity="one">Gailua ez da desblokeatu <xliff:g id="NUMBER_0">%d</xliff:g> orduz. Berretsi eredua.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Gailua ez da desblokeatu <xliff:g id="NUMBER_1">%d</xliff:g> orduz. Berretsi PIN kodea.</item>
+ <item quantity="one">Gailua ez da desblokeatu <xliff:g id="NUMBER_0">%d</xliff:g> orduz. Berretsi PIN kodea.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Gailua ez da desblokeatu <xliff:g id="NUMBER_1">%d</xliff:g> orduz. Berretsi pasahitza.</item>
+ <item quantity="one">Gailua ez da desblokeatu <xliff:g id="NUMBER_0">%d</xliff:g> orduz. Berretsi pasahitza.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ez da ezagutu"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml
index f730352..7a335d2 100644
--- a/packages/SystemUI/res-keyguard/values-fa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"کلید تغییر روش ورود متن."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"کد پین را وارد کنید"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"PUK سیمکارت و کد پین جدید را تایپ کنید"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"کد PUK سیمکارت"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"کد پین سیم جدید"</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">"برای بازکردن قفل، پین را تایپ کنید"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"کد پین اشتباه است."</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_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">"سیمکارت موجود نیست"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"سیمکارت درون رایانهٔ لوحی نیست."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"سیمکارت درون تلفن نیست."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"سیمکارت را وارد کنید."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"سیمکارت موجود نیست یا قابل خواندن نیست. یک سیمکارت وارد کنید."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"سیمکارت غیرقابل استفاده است."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"سیمکارت شما بهطور دائم غیرفعال شده است. \nبرای داشتن سیمکارت دیگر با ارائهدهنده سرویس بیسیم خود تماس بگیرید."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"سیمکارت قفل شد."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"سیمکارت با PUK قفل شده است."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"درحال باز کردن قفل سیمکارت..."</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"قسمت پین"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"قسمت پین سیمکارت"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"قسمت 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="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</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">"پین اشتباه"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"پس از <xliff:g id="NUMBER">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"الگوی خود را رسم کنید"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"پین سیمکارت را وارد کنید"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"پین سیمکارت «<xliff:g id="CARRIER">%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">"اکنون سیمکارت غیرفعال است. کد پین را برای ادامه وارد کنید. برای جزئیات با شرکت مخابراتی خود تماس بگیرید."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"اکنون سیمکارت «<xliff:g id="CARRIER">%1$s</xliff:g>» غیرفعال شده است. برای ادامه دادن، کد PUK را وارد کنید. برای اطلاع از جزئیات با شرکت مخابراتی تماس بگیرید."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"کد پین دلخواه را وارد کنید"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"تأیید کد پین دلخواه"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"درحال باز کردن قفل سیمکارت..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"یک پین ۴ تا ۸ رقمی را تایپ کنید."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"کد پین باید ۸ عدد یا بیشتر باشد."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"کد پین صحیح را دوباره وارد کنید. تلاشهای مکرر بهطور دائم سیمکارت را غیرفعال خواهد کرد."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"کدهای پین منطبق نیستند"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"تلاشهای زیادی برای کشیدن الگو صورت گرفته است"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"پین خود را <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">"کد پین سیمکارت اشتباه است، اکنون برای باز کردن قفل دستگاهتان باید با شرکت مخابراتی تماس بگیرید."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">کد پین سیمکارت اشتباه است، <xliff:g id="NUMBER_1">%d</xliff:g> بار دیگر میتوانید تلاش کنید.</item>
+ <item quantity="other">کد پین سیمکارت اشتباه است، <xliff:g id="NUMBER_1">%d</xliff:g> بار دیگر میتوانید تلاش کنید.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"سیمکارت غیرقابل استفاده است. با شرکت مخابراتیتان تماس بگیرید."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">کد PUK سیمکارت اشتباه است، <xliff:g id="NUMBER_1">%d</xliff:g> بار دیگر میتوانید تلاش کنید و پس از آن سیمکارت برای همیشه غیرقابل استفاده میشود.</item>
+ <item quantity="other">کد PUK سیمکارت اشتباه است، <xliff:g id="NUMBER_1">%d</xliff:g> بار دیگر میتوانید تلاش کنید و پس از آن سیمکارت برای همیشه غیرقابل استفاده میشود.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"عملیات پین سیمکارت ناموفق بود!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"عملیات 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">"برای ایمنی بیشتر باید پین وارد شود"</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">"بعد از تغییر نمایهها باید پین وارد شود"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"بعد از تغییر نمایهها باید گذرواژه وارد شود"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"سرپرست دستگاه آن را قفل کرده است"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"دستگاه بهصورت دستی قفل شده است"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">قفل دستگاه <xliff:g id="NUMBER_1">%d</xliff:g> ساعت باز نشده است. الگو را تأیید کنید.</item>
+ <item quantity="other">قفل دستگاه <xliff:g id="NUMBER_1">%d</xliff:g> ساعت باز نشده است. الگو را تأیید کنید.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">قفل دستگاه <xliff:g id="NUMBER_1">%d</xliff:g> ساعت باز نشده است. پین را تأیید کنید.</item>
+ <item quantity="other">قفل دستگاه <xliff:g id="NUMBER_1">%d</xliff:g> ساعت باز نشده است. پین را تأیید کنید.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">قفل دستگاه <xliff:g id="NUMBER_1">%d</xliff:g> ساعت باز نشده است. گذرواژه را تأیید کنید.</item>
+ <item quantity="other">قفل دستگاه <xliff:g id="NUMBER_1">%d</xliff:g> ساعت باز نشده است. گذرواژه را تأیید کنید.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"شناسایی نشد"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml
index 2c3876f..e1c3af8 100644
--- a/packages/SystemUI/res-keyguard/values-fi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Syöttötavan vaihtopainike."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Näppäinvahti"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Anna PIN-koodi."</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Anna SIM-kortin PUK-koodi ja uusi PIN-koodi."</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM-kortin PUK-koodi"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Uusi SIM-kortin PIN-koodi"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Kosketa ja anna salasana"</font>"."</string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Poista lukitus antamalla salasana."</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Poista lukitus antamalla PIN-koodi."</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Väärä PIN-koodi"</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Ladattu"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Ladataan"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Nopea lataus käynnissä"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Hidas lataus käynnissä"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Kytke laturi."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Poista lukitus painamalla Valikkoa."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Verkko lukittu"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Ei SIM-korttia"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Tabletissa ei ole SIM-korttia."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Puhelimessa ei ole SIM-korttia."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Aseta SIM-kortti."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM-korttia ei löydy tai ei voi lukea. Aseta SIM-kortti."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"SIM-kortti ei käytettävissä"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"SIM-kortti on poistettu pysyvästi käytöstä.\n Ota yhteyttä operaattoriisi ja hanki uusi SIM-kortti."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM-kortti on lukittu."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM-kortti on PUK-lukittu."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"SIM-kortin lukitusta avataan…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN-koodin alue"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM-kortin PIN-koodin alue"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"SIM-kortin PUK-koodin alue"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Seuraava hälytys asetettu: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Poista"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Unohtunut kuvio"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Väärä kuvio"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Väärä salasana"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Väärä PIN-koodi"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Yritä uudelleen <xliff:g id="NUMBER">%d</xliff:g> sekunnin kuluttua."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Piirrä kuvio"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Anna SIM-kortin PIN-koodi"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Anna operaattorin <xliff:g id="CARRIER">%1$s</xliff:g> SIM-kortin PIN-koodi."</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Anna PIN-koodi."</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Anna salasana"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kortti on nyt poistettu käytöstä. Jatka antamalla PUK-koodi. Saat lisätietoja ottamalla yhteyttä operaattoriin."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"Operaattorin <xliff:g id="CARRIER">%1$s</xliff:g> SIM-kortti on nyt lukittu. Jatka antamalla PUK-koodi. Saat lisätietoja operaattoriltasi."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Anna haluamasi PIN-koodi."</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Vahvista haluamasi PIN-koodi."</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"SIM-kortin lukitusta avataan…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Anna 4–8-numeroinen PIN-koodi."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK-koodissa tulee olla vähintään 8 numeroa."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Anna uudelleen oikea PUK-koodi. Jos teet liian monta yritystä, SIM-kortti poistetaan käytöstä pysyvästi."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN-koodit eivät täsmää"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Liikaa kuvionpiirtoyrityksiä"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Olet kirjoittanut PIN-koodin väärin <xliff:g id="NUMBER_0">%1$d</xliff:g> kertaa. \n\nYritä uudelleen <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunnin kuluttua."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Olet kirjoittanut salasanan väärin <xliff:g id="NUMBER_0">%1$d</xliff:g> kertaa. \n\nYritä uudelleen <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunnin kuluttua."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Olet piirtänyt lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%1$d</xliff:g> kertaa. \n\nYritä uudelleen <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunnin kuluttua."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Yritit avata tabletin lukituksen virheellisillä tiedoilla <xliff:g id="NUMBER_0">%1$d</xliff:g> kertaa. Jos <xliff:g id="NUMBER_1">%2$d</xliff:g> seuraavaa yritystä epäonnistuu, tämä puhelin nollataan ja kaikki sen tiedot poistetaan."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Yritit avata puhelimen lukituksen virheellisillä tiedoilla <xliff:g id="NUMBER_0">%1$d</xliff:g> kertaa. Jos <xliff:g id="NUMBER_1">%2$d</xliff:g> seuraavaa yritystä epäonnistuu, tämä puhelin nollataan ja kaikki sen tiedot poistetaan."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Yritit avata tabletin lukituksen virheellisillä tiedoilla <xliff:g id="NUMBER">%d</xliff:g> kertaa. Tämä tabletti nollataan ja kaikki sen tiedot poistetaan."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Yritit avata puhelimen lukituksen virheellisillä tiedoilla <xliff:g id="NUMBER">%d</xliff:g> kertaa. Tämä puhelin nollataan ja kaikki sen tiedot poistetaan."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Yritit avata tabletin lukituksen virheellisillä tiedoilla <xliff:g id="NUMBER_0">%1$d</xliff:g> kertaa. Jos <xliff:g id="NUMBER_1">%2$d</xliff:g> seuraavaa yritystä epäonnistuu, tämä käyttäjä ja kaikki sen käyttäjätiedot poistetaan."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Yritit avata puhelimen lukituksen virheellisillä tiedoilla <xliff:g id="NUMBER_0">%1$d</xliff:g> kertaa. Jos <xliff:g id="NUMBER_1">%2$d</xliff:g> seuraavaa yritystä epäonnistuu, tämä käyttäjä ja kaikki käyttäjän tiedot poistetaan."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Yritit avata tabletin lukituksen virheellisillä tiedoilla <xliff:g id="NUMBER">%d</xliff:g> kertaa. Tämä käyttäjä ja kaikki sen käyttäjätiedot poistetaan."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Yritit avata puhelimen lukituksen virheellisillä tiedoilla <xliff:g id="NUMBER">%d</xliff:g> kertaa. Tämä käyttäjä ja kaikki sen käyttäjätiedot poistetaan."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Yritit avata tabletin lukituksen virheellisillä tiedoilla <xliff:g id="NUMBER_0">%1$d</xliff:g> kertaa. Jos <xliff:g id="NUMBER_1">%2$d</xliff:g> seuraavaa yritystä epäonnistuu, työprofiili ja kaikki sen tiedot poistetaan."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Yritit avata puhelimen lukituksen virheellisillä tiedoilla <xliff:g id="NUMBER_0">%1$d</xliff:g> kertaa. Jos <xliff:g id="NUMBER_1">%2$d</xliff:g> seuraavaa yritystä epäonnistuu, työprofiili ja kaikki sen tiedot poistetaan."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Yritit avata tabletin lukituksen virheellisillä tiedoilla <xliff:g id="NUMBER">%d</xliff:g> kertaa. Työprofiili ja kaikki sen tiedot poistetaan."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Yritit avata puhelimen lukituksen virheellisillä tiedoilla <xliff:g id="NUMBER">%d</xliff:g> kertaa. Työprofiili ja kaikki sen tiedot poistetaan."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Piirsit lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%1$d</xliff:g> kertaa. Jos piirrät kuvion väärin vielä <xliff:g id="NUMBER_1">%2$d</xliff:g> kertaa, sinua pyydetään avaamaan tabletin lukitus sähköpostitilin avulla.\n\n Yritä uudelleen <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunnin kuluttua."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Piirsit lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%1$d</xliff:g> kertaa. Jos piirrät kuvion väärin vielä <xliff:g id="NUMBER_1">%2$d</xliff:g> kertaa, sinua pyydetään avaamaan puhelimesi lukitus sähköpostitilin avulla.\n\n Yritä uudelleen <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunnin kuluttua."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Virheellinen SIM-kortin PIN-koodi. Sinun on nyt otettava yhteys operaattoriin laitteen lukituksen avaamiseksi."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Virheellinen SIM-kortin PIN-koodi. Sinulla on <xliff:g id="NUMBER_1">%d</xliff:g> yritystä jäljellä.</item>
+ <item quantity="one">Virheellinen SIM-kortin PIN-koodi. Sinulla on <xliff:g id="NUMBER_0">%d</xliff:g> yritys jäljellä, ennen kuin sinun on otettava yhteys operaattoriin laitteen lukituksen avaamiseksi.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM-korttia ei voi käyttää. Ota yhteys operaattoriin."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Virheellinen SIM-kortin PUK-koodi. Sinulla on <xliff:g id="NUMBER_1">%d</xliff:g> yritystä jäljellä, ennen kuin SIM-kortista tulee pysyvästi käyttökelvoton.</item>
+ <item quantity="one">Virheellinen SIM-kortin PUK-koodi. Sinulla on <xliff:g id="NUMBER_0">%d</xliff:g> yritys jäljellä, ennen kuin SIM-kortista tulee pysyvästi käyttökelvoton.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"SIM-kortin PIN-toiminto epäonnistui."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"SIM-kortin PUK-toiminto epäonnistui."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Koodi hyväksytty"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Ei yhteyttä"</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Vaihda syöttötapaa."</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Lentokonetila"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Kuvio vaaditaan laitteen uudelleenkäynnistyksen jälkeen."</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"PIN-koodi vaaditaan laitteen uudelleenkäynnistyksen jälkeen."</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Salasana vaaditaan laitteen uudelleenkäynnistyksen jälkeen."</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Kuvio vaaditaan suojauksen parantamiseksi."</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"PIN-koodi vaaditaan suojauksen parantamiseksi."</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Salasana vaaditaan suojauksen parantamiseksi."</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Kuvio vaaditaan profiilia vaihdettaessa."</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"PIN-koodi vaaditaan profiilia vaihdettaessa."</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Salasana vaaditaan profiilia vaihdettaessa."</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Laitteen järjestelmänvalvoja on lukinnut laitteen."</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Laite lukittiin manuaalisesti"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Laitteen lukitusta ei ole avattu <xliff:g id="NUMBER_1">%d</xliff:g> tuntiin. Vahvista kuvio.</item>
+ <item quantity="one">Laitteen lukitusta ei ole avattu <xliff:g id="NUMBER_0">%d</xliff:g> tuntiin. Vahvista kuvio.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Laitteen lukitusta ei ole avattu <xliff:g id="NUMBER_1">%d</xliff:g> tuntiin. Vahvista PIN-koodi.</item>
+ <item quantity="one">Laitteen lukitusta ei ole avattu <xliff:g id="NUMBER_0">%d</xliff:g> tuntiin. Vahvista PIN-koodi.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Laitteen lukitusta ei ole avattu <xliff:g id="NUMBER_1">%d</xliff:g> tuntiin. Vahvista salasana.</item>
+ <item quantity="one">Laitteen lukitusta ei ole avattu <xliff:g id="NUMBER_0">%d</xliff:g> tuntiin. Vahvista salasana.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ei tunnistettu"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
index 5a535f7..8a7c6fc 100644
--- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Bouton \"Changer le mode de saisie\""</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Verrouillage du clavier"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Entrez le NIP."</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Entrez le code PUK et le nouveau NIP de la carte SIM"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Code PUK de la carte SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Nouveau NIP de la carte SIM"</string>
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"NIP erroné."</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_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>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Aucune carte SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Aucune carte SIM n\'est insérée dans la tablette."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Aucune carte SIM n\'est insérée dans le téléphone."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Insérez une carte SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Carte SIM absente ou illisible. Veuillez insérer une carte SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Carte SIM inutilisable."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Votre carte SIM a été définitivement désactivée.\n Veuillez communiquer avec votre fournisseur de services pour en obtenir une autre."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"La carte SIM est verrouillée."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"La carte SIM est verrouillée par un code PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Déblocage de la carte SIM en cours…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Zone du NIP"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Zone du NIP de la carte SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Zone du code PUK de la carte SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Heure de la prochaine alarme : <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Supprimer"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Entrée"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"J\'ai oublié le schéma"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Schéma incorrect"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Mot de passe incorrect"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"NIP incorrect"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Veuillez réessayer dans <xliff:g id="NUMBER">%d</xliff:g> secondes."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Dessinez votre schéma"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Entrez le NIP de la carte SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Entrez le NIP de la carte SIM pour « <xliff:g id="CARRIER">%1$s</xliff:g> »"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Entrez le NIP"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Entrez votre mot de passe."</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Pour obtenir plus de détails, communiquez avec votre fournisseur de services."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"Le carte SIM « <xliff:g id="CARRIER">%1$s</xliff:g> » est maintenant désactivée. Entrez le code PUK pour continuer. Pour obtenir plus de détails, communiquez avec votre fournisseur de services."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Entrez le NIP que vous souhaitez utiliser"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Confirmez le NIP que vous souhaitez utiliser"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Déblocage de la carte SIM en cours…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Veuillez entrer un NIP comprenant entre quatre et huit chiffres."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"Le code PUK doit contenir au moins 8 chiffres."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Veuillez entrer de nouveau le code PUK correct. Trop de tentatives répétées désactiveront définitivement la carte SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Les NIP ne correspondent pas."</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Trop de tentatives."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Vous avez entré un NIP incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. \n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Vous avez entré un mot de passe incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Vous avez tenté de déverrouiller cette tablette à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Après <xliff:g id="NUMBER_1">%2$d</xliff:g> tentative(s) infructueuse(s) supplémentaire(s), cette tablette sera réinitialisée, ce qui entraînera la suppression de toutes les données qu\'elle contient."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Vous avez tenté de déverrouiller ce téléphone à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Après <xliff:g id="NUMBER_1">%2$d</xliff:g> tentative(s) infructueuse(s) supplémentaire(s), le téléphone sera réinitialisé, ce qui entraînera la suppression de toutes les données qu\'il contient."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Vous avez tenté de déverrouiller cette tablette à <xliff:g id="NUMBER">%d</xliff:g> reprises. Cette tablette sera réinitialisée, ce qui entraîne la suppression de toutes les données qu\'elle contient."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Vous avez tenté de déverrouiller ce téléphone à <xliff:g id="NUMBER">%d</xliff:g> reprises. Ce téléphone sera réinitialisé, ce qui entraîne la suppression de toutes les données qu\'il contient."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Vous avez tenté de déverrouiller cette tablette à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Après <xliff:g id="NUMBER_1">%2$d</xliff:g> tentative(s) infructueuse(s) supplémentaire(s), cet utilisateur sera supprimé, ce qui entraînera la suppression de toutes ses données."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Vous avez tenté de déverrouiller ce téléphone à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Après <xliff:g id="NUMBER_1">%2$d</xliff:g> tentative(s) infructueuse(s) supplémentaire(s), cet utilisateur sera supprimé, ce qui entraînera la suppression de toutes ses données."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Vous avez tenté de déverrouiller cette tablette à <xliff:g id="NUMBER">%d</xliff:g> reprises. Cet utilisateur sera supprimé, ce qui entraîne la suppression de toutes ses données."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Vous avez tenté de déverrouiller ce téléphone à <xliff:g id="NUMBER">%d</xliff:g> reprises. Cet utilisateur sera supprimé, ce qui entraîne la suppression de toutes ses données."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Vous avez tenté de déverrouiller cette tablette à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Après <xliff:g id="NUMBER_1">%2$d</xliff:g> tentative(s) infructueuse(s) supplémentaire(s), le profil professionnel sera supprimé, ce qui entraînera la suppression de toutes ses données."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Vous avez tenté de déverrouiller ce téléphone à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Après <xliff:g id="NUMBER_1">%2$d</xliff:g> tentative(s) infructueuse(s) supplémentaire(s), le profil professionnel sera supprimé, ce qui entraînera la suppression de toutes ses données."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Vous avez tenté de déverrouiller cette tablette à <xliff:g id="NUMBER">%d</xliff:g> reprises. Le profil professionnel sera supprimé, ce qui entraîne la suppression de toutes ses données."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Vous avez tenté de déverrouiller ce téléphone à <xliff:g id="NUMBER">%d</xliff:g> reprises. Le profil professionnel sera supprimé, ce qui entraîne la suppression de toutes ses données."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, vous devrez déverrouiller votre tablette à l\'aide d\'un compte de courriel.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, vous devrez déverrouiller votre téléphone à l\'aide d\'un compte de courriel.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"NIP de carte SIM incorrect. Vous devez maintenant communiquer avec votre fournisseur de services pour déverrouiller votre appareil."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Le NIP de la carte SIM incorrect. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative.</item>
+ <item quantity="other">Le NIP de la carte SIM incorrect. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"La carte SIM est inutilisable. Communiquez avec votre fournisseur de services."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">Le code PUK de la carte SIM est incorrect. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM devienne définitivement inutilisable.</item>
+ <item quantity="other">Le code PUK de la carte SIM est incorrect. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM devienne définitivement inutilisable.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Le déverrouillage par NIP de la carte SIM a échoué."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Le déverrouillage de la carte SIM par code PUK a échoué."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Code accepté"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Aucun service"</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Changer de méthode d\'entrée"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Mode Avion"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Le schéma est exigé après le redémarrage de l\'appareil"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Le NIP est exigé après le redémarrage de l\'appareil"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Le mot de passe est exigé après le redémarrage de l\'appareil"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Le schéma est exigé pour plus de sécurité"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Le NIP est exigé pour plus de sécurité"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Le mot de passe est exigé pour plus de sécurité"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Le schéma est exigé lorsque vous changez de profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Le NIP est exigé lorsque vous changez de profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Le mot de passe est exigé lorsque vous changez de profil"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"L\'administrateur de l\'appareil l\'a verrouillé"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"L\'appareil a été verrouillé manuellement"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le schéma.</item>
+ <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le schéma.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le NIP.</item>
+ <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le NIP.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le mot de passe.</item>
+ <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le mot de passe.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Doigt non reconnu"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index 5a535f7..409b61e 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Bouton \"Changer le mode de saisie\""</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Protection des touches"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Saisissez le code PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Saisissez la clé PUK et le nouveau code PIN de la carte SIM"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Clé PUK de la carte SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Nouveau code PIN de la carte SIM"</string>
+ <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>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Le code est incorrect."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Chargé"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"En charge…"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Chargement rapide…"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Chargement lent…"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Branchez votre chargeur."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Appuyez sur \"Menu\" pour déverrouiller le clavier."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Réseau verrouillé"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Pas de carte SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Aucune carte SIM n\'est insérée dans la tablette."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Aucune carte SIM n\'est insérée dans le téléphone."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Insérez une carte SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Carte SIM absente ou illisible. Insérez une carte SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"La carte SIM est inutilisable."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Votre carte SIM a été définitivement désactivée.\nVeuillez contacter votre opérateur de téléphonie mobile pour en obtenir une autre."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"La carte SIM est verrouillée."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"La carte SIM est verrouillée par clé PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Déblocage de la carte SIM…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Champ du code"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Champ du code PIN de la carte SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Champ de la clé PUK de la carte SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Date et heure de la prochaine alarme : <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Supprimer"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Entrée"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"J\'ai oublié le schéma"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Schéma incorrect"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Mot de passe incorrect"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Code incorrect"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Dessinez votre schéma"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Saisissez le code PIN de la carte SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Saisissez le code PIN de la carte SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Saisissez le code"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Saisissez le mot de passe"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La carte SIM est maintenant désactivée. Pour continuer, saisissez la clé PUK. Contactez votre opérateur pour en savoir plus."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"La carte SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" est maintenant désactivée. Pour continuer, saisissez la clé PUK. Contactez votre opérateur pour en savoir plus."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Saisissez le code PIN de votre choix"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Confirmez le code PIN souhaité"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Déblocage de la carte SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Saisissez un code PIN comprenant 4 à 8 chiffres."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"La clé PUK doit contenir au moins 8 chiffres."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Veuillez saisir de nouveau la clé PUK. Après plusieurs tentatives, la carte SIM sera définitivement désactivée."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Les codes PIN ne correspondent pas"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Trop de tentatives"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Vous avez saisi un code incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises.\n\nRéessayez dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Vous avez saisi un mot de passe incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises.\n\nRéessayez dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises.\n\nRéessayez dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Vous avez tenté de déverrouiller la tablette à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, elle sera réinitialisée et toutes les données qu\'elle contient seront supprimées."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Vous avez tenté de déverrouiller le téléphone à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, il sera réinitialisé et toutes les données qu\'il contient seront supprimées."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Vous avez tenté de déverrouiller la tablette à <xliff:g id="NUMBER">%d</xliff:g> reprises. Elle va être réinitialisée et toutes les données qu\'elle contient seront supprimées."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Vous avez tenté de déverrouiller le téléphone à <xliff:g id="NUMBER">%d</xliff:g> reprises. Il va être réinitialisé et toutes les données qu\'il contient seront supprimées."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Vous avez tenté de déverrouiller la tablette à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, ce compte utilisateur et toutes les données associées seront supprimés."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Vous avez tenté de déverrouiller le téléphone à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, ce compte utilisateur et toutes les données associées seront supprimés."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Vous avez tenté de déverrouiller la tablette à <xliff:g id="NUMBER">%d</xliff:g> reprises. Cet utilisateur et toutes les données associées vont être supprimés."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Vous avez tenté de déverrouiller le téléphone à <xliff:g id="NUMBER">%d</xliff:g> reprises. Cet utilisateur et toutes les données associées vont être supprimés."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Vous avez tenté de déverrouiller la tablette à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, le profil professionnel et toutes les données associées seront supprimés."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Vous avez tenté de déverrouiller le téléphone à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, le profil professionnel et toutes les données associées seront supprimés."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Vous avez tenté de déverrouiller la tablette à <xliff:g id="NUMBER">%d</xliff:g> reprises. Le profil professionnel et toutes les données associées vont être supprimés."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Vous avez tenté de déverrouiller le téléphone à <xliff:g id="NUMBER">%d</xliff:g> reprises. Le profil professionnel et toutes les données associées vont être supprimés."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, vous devrez déverrouiller votre tablette à l\'aide d\'un compte de messagerie électronique.\n\nRéessayez dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, vous devrez déverrouiller votre téléphone à l\'aide d\'un compte de messagerie électronique.\n\nRéessayez dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Code PIN de la carte SIM incorrect. Vous devez désormais contacter votre opérateur pour déverrouiller votre appareil."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Code PIN de la carte SIM incorrect. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative.</item>
+ <item quantity="other">Code PIN de la carte SIM incorrect. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"La carte SIM est inutilisable. Contactez votre opérateur."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">Clé PUK de la carte SIM incorrecte. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM ne devienne définitivement inutilisable.</item>
+ <item quantity="other">Clé PUK de la carte SIM incorrecte. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM ne devienne définitivement inutilisable.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Échec du déverrouillage à l\'aide du code PIN de la carte SIM."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Échec du déverrouillage à l\'aide de la clé PUK de la carte SIM."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Code accepté."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Aucun service."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Changer le mode de saisie"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Mode Avion"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Veuillez dessiner le schéma après le redémarrage de l\'appareil"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Veuillez saisir le code après le redémarrage de l\'appareil"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Veuillez saisir le mot de passe après le redémarrage de l\'appareil"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Veuillez dessiner le schéma pour renforcer la sécurité"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Veuillez saisir le code pour renforcer la sécurité"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Veuillez saisir le mot de passe pour renforcer la sécurité"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Veuillez dessiner le schéma lorsque vous changez de profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Veuillez saisir le code lorsque vous changez de profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Veuillez saisir le mot de passe lorsque vous changez de profil"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Appareil verrouillé par l\'administrateur"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Appareil verrouillé manuellement"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le schéma.</item>
+ <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le schéma.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le code.</item>
+ <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le code.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le mot de passe.</item>
+ <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le mot de passe.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Non reconnu"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml
index 858ac79..30e34b4 100644
--- a/packages/SystemUI/res-keyguard/values-gl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Cambiar o botón do método de entrada."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Bloqueo de teclado"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Escribe o código PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Escribe o PUK da SIM e o código PIN novo"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Código PUK da SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Código PIN da SIM novo"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Toca e escribe o contrasinal"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Escribe o contrasinal para desbloquear"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Escribe o PIN para desbloquear"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Código PIN incorrecto"</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Cargada"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Cargando"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Cargando rapidamente"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Cargando lentamente"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Conecta o cargador."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Preme Menú para desbloquear."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Bloqueada pola rede"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Non hai ningunha tarxeta SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Non hai ningunha tarxeta SIM na tableta."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Non hai ningunha tarxeta SIM no teléfono."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Insire unha tarxeta SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Falta a tarxeta SIM ou non se pode ler. Insire unha tarxeta SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Tarxeta SIM inutilizable"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"A túa tarxeta SIM desactivouse permanentemente.\n Ponte en contacto co fornecedor de servizo sen fíos para conseguir outra tarxeta SIM."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"A tarxeta SIM está bloqueada."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"A tarxeta SIM está bloqueada con código PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Desbloqueando tarxeta SIM…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Área do PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Área do PIN da tarxeta SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Área do PUK da tarxeta SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Próxima alarma definida para: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Eliminar"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Intro"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Esqueciches o padrón"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Padrón incorrecto"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Contrasinal incorrecto"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"PIN incorrecto"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Téntao de novo en <xliff:g id="NUMBER">%d</xliff:g> segundos."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Debuxa o teu padrón"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Introduce o PIN da SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Introduce o PIN da SIM para \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Introduce o PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Insire o teu contrasinal"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Agora a tarxeta SIM está desactivada. Introduce o código PUK para continuar. Ponte en contacto co operador para obter máis información."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"Agora a SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" está desactivada. Introduce o código PUK para continuar. Ponte en contacto co operador para obter máis información."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Introduce o código PIN desexado"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Confirma o código PIN desexado"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Desbloqueando tarxeta SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Escribe un PIN que teña entre 4 e 8 números."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"O código PUK debe ter 8 números como mínimo."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Volve introducir o código PUK correcto. Se realizas intentos repetidos é posible que se desactive a tarxeta SIM permanentemente."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Os códigos PIN non coinciden"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Tentaches debuxar o padrón moitas veces"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Introduciches o PIN incorrectamente <xliff:g id="NUMBER_0">%1$d</xliff:g> veces. \n\nTéntao de novo en <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Introduciches o contrasinal incorrectamente <xliff:g id="NUMBER_0">%1$d</xliff:g> veces. \n\nTéntao de novo en <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Debuxaches incorrectamente o padrón de desbloqueo <xliff:g id="NUMBER_0">%1$d</xliff:g> veces. \n\nTéntao de novo en <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Tentaches desbloquear a tableta <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de forma incorrecta. Se realizas <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos máis, restablecerase a tableta e, por conseguinte, eliminaranse todos os seus datos."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Tentaches desbloquear o teléfono <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de forma incorrecta. Se realizas <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos máis, restablecerase o teléfono e, por conseguinte, eliminaranse todos os seus datos."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Tentaches desbloquear a tableta <xliff:g id="NUMBER">%d</xliff:g> veces de forma incorrecta. Restablecerase a tableta e, por conseguinte, eliminaranse todos os seus datos."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Tentaches desbloquear o teléfono <xliff:g id="NUMBER">%d</xliff:g> veces de forma incorrecta. Restablecerase o teléfono e, por conseguinte, eliminaranse todos os seus datos."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Tentaches desbloquear a tableta <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de forma incorrecta. Se realizas <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos máis, quitarase este usuario e, por conseguinte, todos os datos do usuario."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Tentaches desbloquear o teléfono <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de forma incorrecta. Se realizas <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos máis, quitarase este usuario e, por conseguinte, todos os datos do usuario."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Tentaches desbloquear a tableta <xliff:g id="NUMBER">%d</xliff:g> veces de forma incorrecta. Quitarase este usuario e, por conseguinte, todos os datos do usuario."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Tentaches desbloquear o teléfono <xliff:g id="NUMBER">%d</xliff:g> veces de forma incorrecta. Quitarase este usuario e, por conseguinte, todos os datos do usuario."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Tentaches desbloquear a tableta <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de forma incorrecta. Se realizas <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos máis, quitarase o perfil de traballo e, por conseguinte, todos os datos do perfil."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Tentaches desbloquear o teléfono <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de forma incorrecta. Se realizas <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos máis, quitarase o perfil de traballo e, por conseguinte, todos os datos do perfil."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Tentaches desbloquear a tableta <xliff:g id="NUMBER">%d</xliff:g> veces de forma incorrecta. Quitarase o perfil de traballo e, por conseguinte, todos os datos do perfil."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Tentaches desbloquear o teléfono <xliff:g id="NUMBER">%d</xliff:g> veces de forma incorrecta. Quitarase o perfil de traballo e, por conseguinte, todos os datos do perfil."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Debuxaches o padrón de desbloqueo incorrectamente <xliff:g id="NUMBER_0">%1$d</xliff:g> veces. Se realizas <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos máis, terás que desbloquear a tableta a través dunha conta de correo electrónico.\n\n Téntao de novo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Debuxaches o padrón de desbloqueo incorrectamente <xliff:g id="NUMBER_0">%1$d</xliff:g> veces. Se realizas <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos máis, terás que desbloquear o teléfono a través dunha conta de correo electrónico.\n\n Téntao de novo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"O código PIN da SIM non é correcto. Agora debes contactar co operador para desbloquear o dispositivo."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">O código PIN da SIM é incorrecto. Quédanche <xliff:g id="NUMBER_1">%d</xliff:g> intentos.</item>
+ <item quantity="one">O código PIN da SIM é incorrecto. Quédache <xliff:g id="NUMBER_0">%d</xliff:g> intento antes de que teñas que contactar co operador para desbloquear o dispositivo.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"A SIM está inutilizable. Contacta co operador."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">O código PUK da SIM é incorrecto. Quédanche <xliff:g id="NUMBER_1">%d</xliff:g> intentos antes de que a SIM quede inutilizable para sempre.</item>
+ <item quantity="one">O código PUK da SIM non é correcto. Quédache <xliff:g id="NUMBER_0">%d</xliff:g> intento antes de que a SIM quede inutilizable para sempre.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Produciuse un erro no funcionamento do PIN da SIM"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Produciuse un erro ao tentar desbloquear a tarxeta SIM co código PUK."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Código válido"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Non hai servizo."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Cambia o método de entrada"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Modo avión"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"É necesario o padrón despois do reinicio do dispositivo"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"É necesario o PIN despois do reinicio do dispositivo"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"É necesario o contrasinal despois do reinicio do dispositivo"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"É necesario o padrón para obter seguranza adicional"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"É necesario o PIN para obter seguranza adicional"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"É necesario o contrasinal para obter seguranza adicional"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"É necesario o padrón para cambiar os perfís"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"É necesario o PIN para cambiar os perfís"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"É necesario o contrasinal para cambiar os perfís"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"O administrador do dispositivo bloqueouno"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"O dispositivo bloqueouse manualmente"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">O dispositivo non se desbloqueou durante <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirma o padrón.</item>
+ <item quantity="one">O dispositivo non se desbloqueou durante <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirma o padrón.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">O dispositivo non se desbloqueou durante <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirma o PIN.</item>
+ <item quantity="one">O dispositivo non se desbloqueou durante <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirma o PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">O dispositivo non se desbloqueou durante <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirma o contrasinal.</item>
+ <item quantity="one">O dispositivo non se desbloqueou durante <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirma o contrasinal.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Non se recoñece"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml
index 37cd1ab..18e55d1 100644
--- a/packages/SystemUI/res-keyguard/values-gu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"ઇનપુટ પદ્ધતિ બટન સ્વિચ કરો."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"ખોટો PIN કોડ."</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_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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> સેકંડમાં ફરીથી પ્રયાસ કરો."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"તમારી પેટર્ન દોરો"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM PIN દાખલ કરો"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" માટે SIM PIN દાખલ કરો"</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="one">ખોટો SIM PIN કોડ, તમારી પાસે <xliff:g id="NUMBER_1">%d</xliff:g> પ્રયાસ બાકી છે.</item>
+ <item quantity="other">ખોટો SIM PIN કોડ, તમારી પાસે <xliff:g id="NUMBER_1">%d</xliff:g> પ્રયાસ બાકી છે.</item>
+ </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="one">ખોટો SIM PUK કોડ, SIM કાયમી રૂપે અનુપયોગી બની જાય તે પહેલા તમારી પાસે <xliff:g id="NUMBER_1">%d</xliff:g> પ્રયાસ બાકી છે.</item>
+ <item quantity="other">ખોટો SIM PUK કોડ, SIM કાયમી રૂપે અનુપયોગી બની જાય તે પહેલા તમારી પાસે <xliff:g id="NUMBER_1">%d</xliff:g> પ્રયાસ બાકી છે.</item>
+ </plurals>
+ <string name="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">"ઉપકરણનો પુનઃપ્રારંભ થાય તે પછી PIN જરૂરી છે"</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="2438626748767361010">"ઉપકરણ વ્યવસ્થાપકે ઉપકરણ લૉક કર્યું"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"ઉપકરણ મેન્યુઅલી લૉક કર્યું હતું"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">ઉપકરણને <xliff:g id="NUMBER_1">%d</xliff:g> કલાક માટે અનલૉક કરવામાં આવ્યું નથી. પેટર્નની પુષ્ટિ કરો.</item>
+ <item quantity="other">ઉપકરણને <xliff:g id="NUMBER_1">%d</xliff:g> કલાક માટે અનલૉક કરવામાં આવ્યું નથી. પેટર્નની પુષ્ટિ કરો.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">ઉપકરણને <xliff:g id="NUMBER_1">%d</xliff:g> કલાક માટે અનલૉક કરવામાં આવ્યું નથી. PIN ની પુષ્ટિ કરો.</item>
+ <item quantity="other">ઉપકરણને <xliff:g id="NUMBER_1">%d</xliff:g> કલાક માટે અનલૉક કરવામાં આવ્યું નથી. PIN ની પુષ્ટિ કરો.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">ઉપકરણને <xliff:g id="NUMBER_1">%d</xliff:g> કલાક માટે અનલૉક કરવામાં આવ્યું નથી. પાસવર્ડની પુષ્ટિ કરો.</item>
+ <item quantity="other">ઉપકરણને <xliff:g id="NUMBER_1">%d</xliff:g> કલાક માટે અનલૉક કરવામાં આવ્યું નથી. પાસવર્ડની પુષ્ટિ કરો.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"ઓળખાયેલ નથી"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml
index cbd7715..327dfdb 100644
--- a/packages/SystemUI/res-keyguard/values-hi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"इनपुट पद्धति बटन स्विच करें."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"कीगार्ड"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"पिन कोड लिखें"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"SIM PUK और नया पिन कोड लिखें"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM PUK कोड"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"नया SIM पिन कोड"</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">"अनलॉक करने के लिए पिन लिखें"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"गलत पिन कोड."</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_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">"पिन क्षेत्र"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM पिन क्षेत्र"</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="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</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">"गलत पिन"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> सेकंड में फिर से कोशिश करें."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"अपना पैटर्न बनाएं"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM पिन डालें"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" का SIM पिन डालें"</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">"SIM अब अक्षम हो गया है. जारी रखने के लिए PUK कोड डालें. विवरण के लिए वाहक से संपर्क करें."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" का SIM अब अक्षम हो गया है. जारी रखने के लिए PUK कोड डालें. विवरण के लिए वाहक से संपर्क करें."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"मनचाहा पिन कोड डालें"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"मनचाहे पिन कोड की पुष्टि करें"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"SIM कार्ड अनलॉक हो रहा है…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"कोई ऐसा पिन लिखें, जिसमें 4 से 8 अंक हों."</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">"पिन कोड का मिलान नहीं हो रहा है"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"पैटर्न के लिए बहुत ज़्यादा बार कोशिश की गई है"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"आप अपना पिन <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 पिन कोड, अपने डिवाइस को अनलॉक करने के लिए अब आपको अपने वाहक से संपर्क करना होगा."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">SIM पिन कोड गलत है, आप <xliff:g id="NUMBER_1">%d</xliff:g> बार और कोशिश कर सकते हैं.</item>
+ <item quantity="other">SIM पिन कोड गलत है, आप <xliff:g id="NUMBER_1">%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="one">SIM PUK कोड गलत है, SIM के हमेशा के लिए बेकार हो जाने से पहले आप <xliff:g id="NUMBER_1">%d</xliff:g> बार और कोशिश कर सकते हैं.</item>
+ <item quantity="other">SIM PUK कोड गलत है, SIM के हमेशा के लिए बेकार हो जाने से पहले आप <xliff:g id="NUMBER_1">%d</xliff:g> बार और कोशिश कर सकते हैं.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"SIM पिन की कार्यवाही विफल रही!"</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">"अतिरिक्त सुरक्षा के लिए पिन ज़रूरी है"</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">"प्रोफ़ाइल स्विच करते समय पिन ज़रूरी है"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"प्रोफ़ाइल स्विच करते समय पासवर्ड ज़रूरी है"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"डिवाइस व्यवस्थापक ने डिवाइस को लॉक कर दिया है"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"डिवाइस को मैन्युअल रूप से लॉक किया गया था"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">डिवाइस को <xliff:g id="NUMBER_1">%d</xliff:g> घंटों से अनलॉक नहीं किया गया है. पैटर्न की पुष्टि करें.</item>
+ <item quantity="other">डिवाइस को <xliff:g id="NUMBER_1">%d</xliff:g> घंटों से अनलॉक नहीं किया गया है. पैटर्न की पुष्टि करें.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">डिवाइस को <xliff:g id="NUMBER_1">%d</xliff:g> घंटों से अनलॉक नहीं किया गया है. पिन की पुष्टि करें.</item>
+ <item quantity="other">डिवाइस को <xliff:g id="NUMBER_1">%d</xliff:g> घंटों से अनलॉक नहीं किया गया है. पिन की पुष्टि करें.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">डिवाइस को <xliff:g id="NUMBER_1">%d</xliff:g> घंटों से अनलॉक नहीं किया गया है. पासवर्ड की पुष्टि करें.</item>
+ <item quantity="other">डिवाइस को <xliff:g id="NUMBER_1">%d</xliff:g> घंटों से अनलॉक नहीं किया गया है. पासवर्ड की पुष्टि करें.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"अंगुली की पहचान नहीं हो सकी"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml
index 85330d0..10d01af 100644
--- a/packages/SystemUI/res-keyguard/values-hr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml
@@ -20,186 +20,118 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Gumb za promjenu načina unosa."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Zaštita tipkovnice"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Unesite PIN kôd"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Unesite PUK i novi PIN kôd SIM kartice"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK kôd SIM kartice"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Novi PIN za SIM"</string>
+ <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>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"PIN kôd nije točan."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Napunjeno"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Punjenje"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Brzo punjenje"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Sporo punjenje"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Priključite punjač."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Pritisnite Izbornik da biste otključali."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Mreža je zaključana"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Nema SIM kartice"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"U tabletu nema SIM kartice."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"U telefonu nema SIM kartice."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Umetnite SIM karticu."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM kartica nedostaje ili nije čitljiva. Umetnite SIM karticu."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"SIM kartica nije upotrebljiva."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Vaša SIM kartica trajno je onemogućena.\n Zatražite drugu SIM karticu od svog davatelja bežičnih usluga."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM kartica je zaključana."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM kartica je zaključana PUK-om."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Otključavanje SIM kartice…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Područje PIN-a"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Područje PIN-a za SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Područje PUK-a za SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Sljedeći alarm postavljen za <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Izbriši"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Unos"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Zaboravili ste uzorak"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Pogrešan uzorak"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Pogrešna zaporka"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Pogrešan PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> s."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Iscrtajte svoj uzorak"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Unesite PIN za SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Unesite PIN za SIM mobilnog operatera \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Unesite PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Unesite zaporku"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM je sad onemogućen. Unesite PUK kôd da biste nastavili. Obratite se mobilnom operateru za više pojedinosti."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM mobilnog operatera \"<xliff:g id="CARRIER">%1$s</xliff:g>\" sada je onemogućen. Unesite PUK kôd da biste nastavili. Obratite se mobilnom operateru za više pojedinosti."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Unesite željeni PIN kôd"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Potvrdite željeni PIN kôd"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Otključavanje SIM kartice…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Unesite PIN koji ima od 4 do 8 brojeva."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK kôd treba imati 8 brojeva ili više."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Ponovo unesite ispravan PUK kôd. Ponovljeni pokušaji trajno će onemogućiti SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN kodovi nisu jednaki"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Previše pokušaja iscrtavanja uzorka"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Netočno ste unijeli PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> put/a. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> s."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Netočno ste unijeli zaporku <xliff:g id="NUMBER_0">%1$d</xliff:g> put/a. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> s."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Netočno ste iscrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> put/a. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> s."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Neuspješno ste pokušali otključati tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> put/a. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja tablet će se vratiti na zadano, a time će se izbrisati i svi podaci na njemu."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Neuspješno ste pokušali otključati telefon <xliff:g id="NUMBER_0">%1$d</xliff:g> put/a. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja telefon će se vratiti na zadano, a time će se izbrisati i svi podaci na njemu."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Neuspješno ste pokušali otključati tablet <xliff:g id="NUMBER">%d</xliff:g> put/a. Tablet će se vratiti na zadano, a time će se izbrisati i svi podaci na njemu."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Neuspješno ste pokušali otključati telefon <xliff:g id="NUMBER">%d</xliff:g> put/a. Telefon će se vratiti na zadano, a time će se izbrisati i svi podaci na njemu."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Neuspješno ste pokušali otključati tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> put/a. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja taj će se korisnik ukloniti, a time će se izbrisati i svi njegovi podaci."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Neuspješno ste pokušali otključati telefon <xliff:g id="NUMBER_0">%1$d</xliff:g> put/a. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja taj će se korisnik ukloniti, a time će se izbrisati i svi njegovi podaci."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Neuspješno ste pokušali otključati tablet <xliff:g id="NUMBER">%d</xliff:g> put/a. Taj će se korisnik ukloniti, a time će se izbrisati i svi njegovi podaci."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Neuspješno ste pokušali otključati telefon <xliff:g id="NUMBER">%d</xliff:g> put/a. Taj će se korisnik ukloniti, a time će se izbrisati i svi njegovi podaci."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Neuspješno ste pokušali otključati tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> put/a. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja radni će se profil ukloniti, a time će se izbrisati i svi njegovi podaci."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Neuspješno ste pokušali otključati telefon <xliff:g id="NUMBER_0">%1$d</xliff:g> put/a. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja radni će se profil ukloniti, a time će se izbrisati i svi njegovi podaci."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Neuspješno ste pokušali otključati tablet <xliff:g id="NUMBER">%d</xliff:g> put/a. Radni će se profil ukloniti, a time će se izbrisati i svi njegovi podaci."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Neuspješno ste pokušali otključati telefon <xliff:g id="NUMBER">%d</xliff:g> put/a. Radni će se profil ukloniti, a time će se izbrisati i svi njegovi podaci."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Netočno ste iscrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> put/a. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja morat ćete otključati tablet pomoću računa e-pošte.\n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Netočno ste iscrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> put/a. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja morat ćete otključati telefon pomoću računa e-pošte.\n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Netočan PIN kôd SIM kartice; sada morate kontaktirati svog mobilnog operatera da bi otključao vaš uređaj."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">PIN kôd SIM-a nije točan. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item>
+ <item quantity="few">PIN kôd SIM-a nije točan. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item>
+ <item quantity="other">PIN kôd SIM-a nije točan. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM kartica nije upotrebljiva. Kontaktirajte svog mobilnog operatera."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">PUK kôd SIM-a nije točan. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj, a ako ne uspijete, SIM će postati trajno neupotrebljiv.</item>
+ <item quantity="few">PUK kôd SIM-a nije točan. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja, a ako ne uspijete, SIM će postati trajno neupotrebljiv.</item>
+ <item quantity="other">PUK kôd SIM-a nije točan. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja, a ako ne uspijete, SIM će postati trajno neupotrebljiv.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Operacija PIN-a SIM kartice nije uspjela!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Operacija PUK-a SIM kartice nije uspjela!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kôd je prihvaćen!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Nema usluge."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Promjena načina unosa"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Način rada u zrakoplovu"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Nakon ponovnog pokretanja uređaja morate unijeti uzorak"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Nakon ponovnog pokretanja uređaja morate unijeti PIN"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Nakon ponovnog pokretanja uređaja morate unijeti zaporku"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Unesite uzorak radi dodatne sigurnosti"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Unesite PIN radi dodatne sigurnosti"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Unesite zaporku radi dodatne sigurnosti"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Za promjenu profila morate unijeti uzorak"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Za promjenu profila morate unijeti PIN"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Za promjenu profila morate unijeti zaporku"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Administrator uređaja zaključao je uređaj"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Uređaj je ručno zaključan"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Uređaj nije bio otključan <xliff:g id="NUMBER_1">%d</xliff:g> sat. Potvrdite uzorak.</item>
+ <item quantity="few">Uređaj nije bio otključan <xliff:g id="NUMBER_1">%d</xliff:g> sata. Potvrdite uzorak.</item>
+ <item quantity="other">Uređaj nije bio otključan <xliff:g id="NUMBER_1">%d</xliff:g> sati. Potvrdite uzorak.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Uređaj nije bio otključan <xliff:g id="NUMBER_1">%d</xliff:g> sat. Potvrdite PIN.</item>
+ <item quantity="few">Uređaj nije bio otključan <xliff:g id="NUMBER_1">%d</xliff:g> sata. Potvrdite PIN.</item>
+ <item quantity="other">Uređaj nije bio otključan <xliff:g id="NUMBER_1">%d</xliff:g> sati. Potvrdite PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Uređaj nije bio otključan <xliff:g id="NUMBER_1">%d</xliff:g> sat. Potvrdite zaporku.</item>
+ <item quantity="few">Uređaj nije bio otključan <xliff:g id="NUMBER_1">%d</xliff:g> sata. Potvrdite zaporku.</item>
+ <item quantity="other">Uređaj nije bio otključan <xliff:g id="NUMBER_1">%d</xliff:g> sati. Potvrdite zaporku.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nije prepoznat"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml
index fea195e..54c07e9 100644
--- a/packages/SystemUI/res-keyguard/values-hu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Beviteli mód váltása gomb."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Billentyűzár"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Írja be a PIN-kódot"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Írja be a SIM-kártya PUK-kódját, majd az új PIN-kódot"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM-kártya PUK-kódja"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Új PIN-kód a SIM-kártyához"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Érintse meg jelszó megadásához"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"A feloldáshoz írja be a jelszót"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"A feloldáshoz írja be a PIN-kódot"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Helytelen PIN-kód."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Feltöltve"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Töltés folyamatban"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Gyors töltés folyamatban"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Lassú töltés folyamatban"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Csatlakoztassa a töltőt."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"A feloldáshoz nyomja meg a Menü gombot."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Hálózat zárolva"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Nincs SIM-kártya"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Nincs SIM-kártya a táblagépben."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Nincs SIM-kártya a telefonban."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Helyezzen be SIM-kártyát."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"A SIM-kártya hiányzik vagy nem olvasható. Helyezzen be SIM-kártyát."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"A SIM-kártya nem használható."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"SIM-kártyája véglegesen le van tiltva.\nMásik SIM-kártya beszerzése érdekében, kérjük, forduljon vezeték nélküli szolgáltatójához."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"A SIM-kártya zárolva van."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"A SIM-kártya PUK-kóddal van zárolva."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"SIM-kártya zárolásának feloldása…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN-kód területe"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"A SIM-kártyához tartozó PIN-kód mezője"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"A SIM-kártyához tartozó PUK-kód mezője"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"A következő ébresztés beállított ideje: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Törlés"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Elfelejtettem a mintát"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Helytelen minta"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Helytelen jelszó"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Helytelen PIN-kód"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Próbálja újra <xliff:g id="NUMBER">%d</xliff:g> másodperc múlva."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Rajzolja le a mintát"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Adja meg a SIM-kártya PIN-kódját"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Adja meg a(z) „<xliff:g id="CARRIER">%1$s</xliff:g>” SIM-kártya PIN-kódját"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Adja meg a PIN-kódot"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Írja be a jelszót"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. A részletekért vegye fel a kapcsolatot szolgáltatójával."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"A(z) „<xliff:g id="CARRIER">%1$s</xliff:g>” SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. A részletekért vegye fel a kapcsolatot szolgáltatójával."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Adja meg a kívánt PIN-kódot"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Erősítse meg a kívánt PIN-kódot"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"SIM-kártya zárolásának feloldása…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Írjon be egy 4-8 számjegyű PIN-kódot."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"A PUK-kódnak legalább nyolc számjegyből kell állnia."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Adja meg újra a helyes PUK-kódot. Az ismételt próbálkozásokkal véglegesen letiltja a SIM-kártyát."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"A PIN-kódok nem egyeznek"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Túl sok mintarajzolási próbálkozás"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalommal helytelenül adta meg a PIN-kódot.\n\nPróbálja újra <xliff:g id="NUMBER_1">%2$d</xliff:g> másodperc múlva."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalommal helytelenül adta meg a jelszót.\n\nPróbálja újra <xliff:g id="NUMBER_1">%2$d</xliff:g> másodperc múlva."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalommal rosszul rajzolta le a feloldási mintát.\n\nPróbálja újra <xliff:g id="NUMBER_1">%2$d</xliff:g> másodperc múlva."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalommal próbálkozott sikertelenül a táblagép zárolásának feloldásával. További <xliff:g id="NUMBER_1">%2$d</xliff:g> sikertelen kísérlet után a rendszer visszaállítja a táblagépet, és ezzel az összes adat törlődik róla."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalommal próbálkozott sikertelenül a telefon zárolásának feloldásával. További <xliff:g id="NUMBER_1">%2$d</xliff:g> sikertelen kísérlet után a rendszer visszaállítja a telefont, és ezzel az összes adat törlődik róla."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"<xliff:g id="NUMBER">%d</xliff:g> alkalommal próbálkozott sikertelenül a táblagép zárolásának feloldásával. A rendszer visszaállítja a táblagépet, és ezzel a rajta lévő összes adat törlődik."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"<xliff:g id="NUMBER">%d</xliff:g> alkalommal próbálkozott sikertelenül a telefon zárolásának feloldásával. A rendszer visszaállítja a telefont, és ezzel a rajta lévő összes adat törlődik."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalommal próbálkozott sikertelenül a táblagép zárolásának feloldásával. További <xliff:g id="NUMBER_1">%2$d</xliff:g> sikertelen kísérlet után a rendszer eltávolítja a felhasználót, és ezzel a felhasználó összes adata törlődik majd."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalommal próbálkozott sikertelenül a telefon zárolásának feloldásával. További <xliff:g id="NUMBER_1">%2$d</xliff:g> sikertelen kísérlet után a rendszer eltávolítja a felhasználót, és ezzel a felhasználó összes adata törlődik majd."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"<xliff:g id="NUMBER">%d</xliff:g> alkalommal próbálkozott sikertelenül a táblagép zárolásának feloldásával. A rendszer eltávolítja a felhasználót, és ezzel a felhasználó összes adata törlődik."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"<xliff:g id="NUMBER">%d</xliff:g> alkalommal próbálkozott sikertelenül a telefon zárolásának feloldásával. A rendszer eltávolítja a felhasználót, és ezzel a felhasználó összes adata törlődik."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalommal próbálkozott sikertelenül a táblagép zárolásának feloldásával. További <xliff:g id="NUMBER_1">%2$d</xliff:g> sikertelen kísérlet után a rendszer eltávolítja a munkaprofilt, és ezzel a profil összes adata törlődik majd."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalommal próbálkozott sikertelenül a telefon zárolásának feloldásával. További <xliff:g id="NUMBER_1">%2$d</xliff:g> sikertelen kísérlet után a rendszer eltávolítja a munkaprofilt, és ezzel a profil összes adata törlődik majd."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"<xliff:g id="NUMBER">%d</xliff:g> alkalommal próbálkozott sikertelenül a táblagép zárolásának feloldásával. A rendszer eltávolítja a munkaprofilt, és ezzel a profil összes adata törlődik."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"<xliff:g id="NUMBER">%d</xliff:g> alkalommal próbálkozott sikertelenül a telefon zárolásának feloldásával. A rendszer eltávolítja a munkaprofilt, és ezzel a profil összes adata törlődik."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalommal helytelenül rajzolta le a feloldási mintát. További <xliff:g id="NUMBER_1">%2$d</xliff:g> sikertelen kísérlet után e-mail-fiók használatával kell feloldania táblagépét.\n\nPróbálja újra <xliff:g id="NUMBER_2">%3$d</xliff:g> másodperc múlva."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalommal helytelenül rajzolta le a feloldási mintát. További <xliff:g id="NUMBER_1">%2$d</xliff:g> sikertelen kísérlet után e-mail-fiók használatával kell feloldania telefonját.\n\nPróbálja újra <xliff:g id="NUMBER_2">%3$d</xliff:g> másodperc múlva."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Helytelen PIN-kód a SIM-kártyához. Az eszköz feloldása érdekében, kérjük, vegye fel a kapcsolatot szolgáltatójával."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Helytelen PIN-kód a SIM-kártyához. Még <xliff:g id="NUMBER_1">%d</xliff:g> próbálkozása maradt.</item>
+ <item quantity="one">Helytelen PIN-kód a SIM-kártyához. Még <xliff:g id="NUMBER_0">%d</xliff:g> próbálkozása maradt, az eszköz feloldásához azt követően fel kell vennie a kapcsolatot szolgáltatójával.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"A SIM-kártya használhatatlan. Vegye fel a kapcsolatot szolgáltatójával."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Helytelen PUK-kód a SIM-kártyához. Még <xliff:g id="NUMBER_1">%d</xliff:g> próbálkozása maradt, mielőtt a SIM-kártya végleg használhatatlanná válik.</item>
+ <item quantity="one">Helytelen PUK-kód a SIM-kártyához. Még <xliff:g id="NUMBER_0">%d</xliff:g> próbálkozása maradt, mielőtt a SIM-kártya végleg használhatatlanná válik.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"A SIM-kártya PIN-művelete sikertelen!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"A SIM-kártya PUK-művelete sikertelen!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kód elfogadva."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Nincs szolgáltatás."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Beviteli módszer váltása"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Repülős üzemmód"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Az eszköz újraindítását követően meg kell adni a mintát"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Az eszköz újraindítását követően meg kell adni a PIN-kódot"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Az eszköz újraindítását követően meg kell adni a jelszót"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"A nagyobb biztonság érdekében minta szükséges"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"A nagyobb biztonság érdekében PIN-kód szükséges"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"A nagyobb biztonság érdekében jelszó szükséges"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Ha vált a profilok között, meg kell adni a mintát"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Ha vált a profilok között, meg kell adni a PIN-kódot"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Ha vált a profilok között, meg kell adni a jelszót"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Az eszközadminisztrátor lezárta az eszközt"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Az eszközt manuálisan lezárták"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Az eszköz zárolása <xliff:g id="NUMBER_1">%d</xliff:g> órája nem lett feloldva. Erősítse meg a mintát.</item>
+ <item quantity="one">Az eszköz zárolása <xliff:g id="NUMBER_0">%d</xliff:g> órája nem lett feloldva. Erősítse meg a mintát.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Az eszköz zárolása <xliff:g id="NUMBER_1">%d</xliff:g> órája nem lett feloldva. Erősítse meg a PIN-kódot.</item>
+ <item quantity="one">Az eszköz zárolása <xliff:g id="NUMBER_0">%d</xliff:g> órája nem lett feloldva. Erősítse meg a PIN-kódot.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Az eszköz zárolása <xliff:g id="NUMBER_1">%d</xliff:g> órája nem lett feloldva. Erősítse meg a jelszót.</item>
+ <item quantity="one">Az eszköz zárolása <xliff:g id="NUMBER_0">%d</xliff:g> órája nem lett feloldva. Erősítse meg a jelszót.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nem sikerült felismerni"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml
index bed77a9..a335ebc 100644
--- a/packages/SystemUI/res-keyguard/values-hy/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Միացնել մուտքագրման եղանակի կոճակը:"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</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_password_wrong_pin_code" msgid="6535018036285012028">"PIN կոդը սխալ է։"</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_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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Փորձեք կրկին <xliff:g id="NUMBER">%d</xliff:g> վայրկյանից:"</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Մուտքագրեք նախշը"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Մուտքագրեք SIM քարտի PIN կոդը"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Մուտքագրեք SIM քարտի PIN կոդը «<xliff:g id="CARRIER">%1$s</xliff:g>»-ի համար"</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">"«<xliff:g id="CARRIER">%1$s</xliff:g>» SIM քարտն այժմ անջատված է: Շարունակելու համար մուտքագրեք 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="one">Incorrect SIM PIN code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
+ <item quantity="other">SIM PIN կոդը սխալ է: Մնաց <xliff:g id="NUMBER_1">%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="one">Incorrect SIM PUK code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable.</item>
+ <item quantity="other">SIM PUK կոդը սխալ է: Մնաց <xliff:g id="NUMBER_1">%d</xliff:g> փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել:</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">"Սարքը վերագործարկելուց հետո անհրաժեշտ է մուտքագրել PIN կոդը"</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="2438626748767361010">"Սարքի ադմինիստրատորը կողպել է սարքը"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Սարքը կողպվել է ձեռքով"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm pattern.</item>
+ <item quantity="other">Սարքը չի ապակողպվել <xliff:g id="NUMBER_1">%d</xliff:g> ժամվա ընթացքում: Հաստատեք նախշը:</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm PIN.</item>
+ <item quantity="other">Սարքը չի ապակողպվել <xliff:g id="NUMBER_1">%d</xliff:g> ժամվա ընթացքում: Հաստատեք PIN կոդը:</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm password.</item>
+ <item quantity="other">Սարքը չի ապակողպվել <xliff:g id="NUMBER_1">%d</xliff:g> ժամվա ընթացքում: Հաստատեք գաղտնաբառը:</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Չճանաչվեց"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml
index ea98d73..49bd0b6 100644
--- a/packages/SystemUI/res-keyguard/values-in/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-in/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Tombol beralih metode masukan."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Ketik kode PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Ketik kode PIN baru dan PUK SIM"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Kode PUK SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Kode PIN SIM baru"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Sentuh untuk mengetik sandi"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Ketik sandi untuk membuka kunci"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Ketik PIN untuk membuka kunci"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Kode PIN salah."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Terisi"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Mengisi daya"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Mengisi daya dengan cepat"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Mengisi daya dengan lambat"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Hubungkan pengisi daya."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Tekan Menu untuk membuka kunci."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Jaringan terkunci"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Tidak ada kartu SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Tidak ada kartu SIM dalam tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Tidak ada Kartu SIM di dalam ponsel."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Masukkan kartu SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Kartu SIM tidak ada atau tidak dapat dibaca. Masukkan kartu SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Kartu SIM tidak dapat digunakan."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Kartu SIM Anda telah dinonaktifkan secara permanen.\n Hubungi penyedia layanan nirkabel Anda untuk kartu SIM lain."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"Kartu SIM terkunci."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"Kartu SIM terkunci PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Membuka kunci kartu SIM…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Bidang PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Bidang PIN SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Bidang PUK SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Alarm berikutnya disetel untuk <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Hapus"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Masukkan"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Lupa Pola?"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Pola Salah"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Sandi Salah"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"PIN Salah"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Coba lagi dalam <xliff:g id="NUMBER">%d</xliff:g> detik."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Gambar pola Anda"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Masukkan PIN SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Masukkan PIN SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Masukkan PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Masukkan Sandi"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM telah dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Hubungi operator untuk keterangan selengkapnya."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" kini dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Hubungi operator untuk mengetahui detailnya."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Masukkan kode PIN yang diinginkan"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Konfirmasi kode PIN yang diinginkan"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Membuka kunci kartu SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Ketikkan PIN berupa 4 sampai 8 angka."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"Kode PUK harus terdiri dari 8 angka atau lebih."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Masukkan kembali kode PUK yang benar. Jika berulang kali gagal, SIM akan dinonaktifkan secara permanen."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Kode PIN tidak cocok"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Terlalu banyak upaya pola"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Anda telah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali salah mengetik PIN. \n\nCoba lagi dalam <xliff:g id="NUMBER_1">%2$d</xliff:g> detik."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Anda telah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali salah mengetik sandi. \n\nCoba lagi dalam <xliff:g id="NUMBER_1">%2$d</xliff:g> detik."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Anda telah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali salah menggambar pola pembuka kunci. \n\nCoba lagi dalam <xliff:g id="NUMBER_1">%2$d</xliff:g> detik."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Sudah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali Anda berupaya membuka kunci tablet dengan tidak benar. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, tablet ini akan disetel ulang, sehingga semua datanya akan dihapus."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Sudah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali Anda berupaya membuka kunci ponsel dengan tidak benar. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, ponsel ini akan disetel ulang, sehingga semua datanya akan dihapus."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Sudah <xliff:g id="NUMBER">%d</xliff:g> kali Anda berupaya membuka kunci tablet dengan tidak benar. Tablet ini akan disetel ulang, sehingga menghapus semua datanya."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Sudah <xliff:g id="NUMBER">%d</xliff:g> kali Anda berupaya membuka kunci ponsel dengan tidak benar. Ponsel ini akan disetel ulang, sehingga menghapus semua datanya."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Sudah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali Anda berupaya membuka kunci tablet dengan tidak benar. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, pengguna ini akan dihapus, sehingga semua data pengguna akan dihapus."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Sudah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali Anda berupaya membuka kunci ponsel dengan tidak benar. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, pengguna ini akan dihapus, sehingga semua data pengguna akan dihapus."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Sudah <xliff:g id="NUMBER">%d</xliff:g> kali Anda berupaya membuka kunci tablet dengan tidak benar. Pengguna ini akan dihapus, sehingga menghapus semua data pengguna."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Sudah <xliff:g id="NUMBER">%d</xliff:g> kali Anda berupaya membuka kunci ponsel dengan tidak benar. Pengguna ini akan dihapus, sehingga menghapus semua data pengguna."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Sudah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali Anda berupaya membuka kunci tablet dengan tidak benar. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, profil kerja akan dihapus, sehingga semua data pengguna akan dihapus."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Sudah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali Anda berupaya membuka kunci ponsel dengan tidak benar. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, profil kerja akan dihapus, sehingga semua data pengguna akan dihapus."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Sudah <xliff:g id="NUMBER">%d</xliff:g> kali Anda berupaya membuka kunci tablet dengan tidak benar. Profil kerja akan dihapus, sehingga menghapus semua data profil."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Sudah <xliff:g id="NUMBER">%d</xliff:g> kali Anda berupaya membuka kunci ponsel dengan tidak benar. Profil kerja akan dihapus, sehingga menghapus semua data profil."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Anda telah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali salah menggambar pola pembuka. Setelah gagal <xliff:g id="NUMBER_1">%2$d</xliff:g> kali lagi, Anda akan diminta membuka kunci tablet menggunakan akun email.\n\n Coba lagi dalam <xliff:g id="NUMBER_2">%3$d</xliff:g> detik."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Anda telah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali salah menggambar pola pembuka. Setelah gagal <xliff:g id="NUMBER_1">%2$d</xliff:g> kali lagi, Anda akan diminta membuka kunci ponsel menggunakan akun email.\n\n Coba lagi dalam <xliff:g id="NUMBER_2">%3$d</xliff:g> detik."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Kode PIN SIM salah. Hubungi operator untuk membuka kunci perangkat."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Kode PIN SIM salah, sisa, sisa <xliff:g id="NUMBER_1">%d</xliff:g> percobaan.</item>
+ <item quantity="one">Kode PIN SIM salah, sisa <xliff:g id="NUMBER_0">%d</xliff:g> percobaan sebelum Anda harus menghubungi operator untuk membuka kunci perangkat.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM tidak dapat digunakan. Hubungi operator Anda."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Kode PUK SIM salah, sisa <xliff:g id="NUMBER_1">%d</xliff:g> percobaan sebelum SIM tidak dapat digunakan selamanya.</item>
+ <item quantity="one">Kode PUK SIM salah, sisa <xliff:g id="NUMBER_0">%d</xliff:g> percobaan sebelum SIM tidak dapat digunakan selamanya.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Operasi PIN SIM gagal!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Operasi PUK SIM gagal!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kode Diterima!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Tidak ada layanan."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Beralih metode masukan"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Mode pesawat"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Pola diperlukan setelah perangkat dimulai ulang"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"PIN diperlukan setelah perangkat dimulai ulang"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Sandi diperlukan setelah perangkat dimulai ulang"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Pola diperlukan untuk keamanan tambahan"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"PIN diperlukan untuk keamanan tambahan"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Sandi diperlukan untuk keamanan tambahan"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Pola diperlukan jika Anda beralih profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"PIN diperlukan jika Anda beralih profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Sandi diperlukan jika Anda beralih profil"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Perangkat dikunci oleh administrator"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Perangkat dikunci secara manual"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Perangkat belum dibuka kuncinya selama <xliff:g id="NUMBER_1">%d</xliff:g> jam. Konfirmasi pola.</item>
+ <item quantity="one">Perangkat belum dibuka kuncinya selama <xliff:g id="NUMBER_0">%d</xliff:g> jam. Konfirmasi pola.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Perangkat belum dibuka kuncinya selama <xliff:g id="NUMBER_1">%d</xliff:g> jam. Konfirmasi PIN.</item>
+ <item quantity="one">Perangkat belum dibuka kuncinya selama <xliff:g id="NUMBER_0">%d</xliff:g> jam. Konfirmasi PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Perangkat belum dibuka kuncinya selama <xliff:g id="NUMBER_1">%d</xliff:g> jam. Konfirmasi sandi.</item>
+ <item quantity="one">Perangkat belum dibuka kuncinya selama <xliff:g id="NUMBER_0">%d</xliff:g> jam. Konfirmasi sandi.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Tidak dikenali"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml
index faa92ce..17756a3 100644
--- a/packages/SystemUI/res-keyguard/values-is/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-is/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Hnappur til að skipta um innsláttaraðferð."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Takkavörn"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Sláðu inn PIN-númer"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Sláðu inn PUK-númer SIM-korts og nýtt PIN-númer"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK-númer SIM-korts"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Nýtt PIN-númer SIM-korts"</string>
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"Rangt PIN-númer."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Fullhlaðin"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Í hleðslu"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Hröð hleðsla"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Hæg hleðsla"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Tengdu hleðslutækið."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Ýttu á valmyndarhnappinn til að taka úr lás."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Net læst"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Ekkert SIM-kort"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Ekkert SIM-kort í spjaldtölvunni."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Ekkert SIM-kort í símanum."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Settu SIM-kort í."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM-kort vantar eða það er ekki læsilegt. Settu SIM-kort í."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Ónothæft SIM-kort."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"SIM-kortið hefur verið gert varanlega óvirkt.\n Hafðu samband við símafyrirtækið þitt til að fá annað SIM-kort."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM-kortið er læst."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM-kortið er PUK-læst."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Tekur SIM-kort úr lás…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN-svæði"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"PIN-svæði SIM-korts"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"PUK-svæði SIM-korts"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Næsti vekjari stilltur á <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Eyða"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Færa inn"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Man ekki mynstrið"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Rangt mynstur"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Rangt aðgangsorð"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Rangt PIN-númer"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Reyndu aftur eftir <xliff:g id="NUMBER">%d</xliff:g> sekúndur."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Teiknaðu mynstrið þitt"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Sláðu inn PIN-númer SIM-kortsins"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Sláðu inn PIN-númer SIM-korts fyrir „<xliff:g id="CARRIER">%1$s</xliff:g>“"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Sláðu inn PIN-númer"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Sláðu inn aðgangsorð"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kortið hefur verið gert óvirkt. Sláðu inn PUK-númerið til að halda áfram. Hafðu samband við símafyrirtækið til að fá frekari upplýsingar."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM-kortið „<xliff:g id="CARRIER">%1$s</xliff:g>“ hefur verið gert óvirkt. Sláðu inn PUK-númerið til að halda áfram. Hafðu samband við símafyrirtækið til að fá frekari upplýsingar."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Sláðu inn nýtt PIN-númer"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Staðfestu nýja PIN-númerið"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Tekur SIM-kort úr lás…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Sláðu in PIN-númer sem er 4 til 8 tölustafir."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK-númerið verður að vera 8 tölustafir eða lengra."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Prófaðu aftur að setja inn rétt PUK-númer. Endurteknar tilraunir gera SIM-kortið varanlega óvirkt."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN-númerin stemma ekki"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Of margar tilraunir til að teikna mynstur"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Þú hefur slegið inn rangt PIN-númer <xliff:g id="NUMBER_0">%1$d</xliff:g> sinnum. \n\nReyndu aftur eftir <xliff:g id="NUMBER_1">%2$d</xliff:g> sekúndur."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Þú hefur slegið inn rangt aðgangsorð <xliff:g id="NUMBER_0">%1$d</xliff:g> sinnum. \n\nReyndu aftur eftir <xliff:g id="NUMBER_1">%2$d</xliff:g> sekúndur."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Þú hefur teiknað rangt opnunarmynstur <xliff:g id="NUMBER_0">%1$d</xliff:g> sinnum. \n\nReyndu aftur eftir <xliff:g id="NUMBER_1">%2$d</xliff:g> sekúndur."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Þú hefur gert <xliff:g id="NUMBER_0">%1$d</xliff:g> árangurslausar tilraunir til að opna spjaldtölvuna. Eftir <xliff:g id="NUMBER_1">%2$d</xliff:g> árangurslausar tilraunir í viðbót verður spjaldtölvan endurstillt, með þeim afleiðingum að öllum gögnum hennar verður eytt."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Þú hefur gert <xliff:g id="NUMBER_0">%1$d</xliff:g> árangurslausar tilraunir til að opna símann. Eftir <xliff:g id="NUMBER_1">%2$d</xliff:g> árangurslausar tilraunir í viðbót verður síminn endurstilltur, með þeim afleiðingum að öllum gögnum hans verður eytt."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Þú hefur gert <xliff:g id="NUMBER">%d</xliff:g> árangurslausar tilraunir til að opna spjaldtölvuna. Spjaldtölvan verður endurstillt, með þeim afleiðingum að öllum gögnum hennar verður eytt."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Þú hefur gert <xliff:g id="NUMBER">%d</xliff:g> árangurslausar tilraunir til að opna símann. Síminn verður endurstilltur, með þeim afleiðingum að öllum gögnum hans verður eytt."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Þú hefur gert <xliff:g id="NUMBER_0">%1$d</xliff:g> árangurslausar tilraunir til að opna spjaldtölvuna. Eftir <xliff:g id="NUMBER_1">%2$d</xliff:g> árangurslausar tilraunir í viðbót verður notandinn fjarlægður með þeim afleiðingum að öllum notandagögnum verður eytt."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Þú hefur gert <xliff:g id="NUMBER_0">%1$d</xliff:g> árangurslausar tilraunir til að opna símann. Eftir <xliff:g id="NUMBER_1">%2$d</xliff:g> árangurslausar tilraunir í viðbót verður notandinn fjarlægður með þeim afleiðingum að öllum notandagögnum verður eytt."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Þú hefur gert <xliff:g id="NUMBER">%d</xliff:g> árangurslausar tilraunir til að opna spjaldtölvuna. Notandinn verður fjarlægður, með þeim afleiðingum að öllum notandagögnum verður eytt."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Þú hefur gert <xliff:g id="NUMBER">%d</xliff:g> árangurslausar tilraunir til að opna símann. Notandinn verður fjarlægður, með þeim afleiðingum að öllum notandagögnum verður eytt."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Þú hefur gert <xliff:g id="NUMBER_0">%1$d</xliff:g> árangurslausar tilraunir til að opna spjaldtölvuna. Eftir <xliff:g id="NUMBER_1">%2$d</xliff:g> árangurslausar tilraunir í viðbót verður vinnusniðið fjarlægt með þeim afleiðingum að öllum gögnum þess verður eytt."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Þú hefur gert <xliff:g id="NUMBER_0">%1$d</xliff:g> árangurslausar tilraunir til að opna símann. Eftir <xliff:g id="NUMBER_1">%2$d</xliff:g> árangurslausar tilraunir í viðbót verður vinnusniðið fjarlægt með þeim afleiðingum að öllum gögnum þess verður eytt."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Þú hefur gert <xliff:g id="NUMBER">%d</xliff:g> árangurslausar tilraunir til að opna spjaldtölvuna. Vinnusniðið verður fjarlægt, með þeim afleiðingum að öllum gögnum þess verður eytt."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Þú hefur gert <xliff:g id="NUMBER">%d</xliff:g> árangurslausar tilraunir til að opna símann. Vinnusniðið verður fjarlægt, með þeim afleiðingum að öllum gögnum þess verður eytt."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Þú hefur teiknað rangt opnunarmynstur <xliff:g id="NUMBER_0">%1$d</xliff:g> sinnum. Eftir <xliff:g id="NUMBER_1">%2$d</xliff:g> árangurslausar tilraunir í viðbót verður þú beðin(n) um að opna spjaldtölvuna með tölvupóstreikningi.\n\n Reyndu aftur eftir <xliff:g id="NUMBER_2">%3$d</xliff:g> sekúndur."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Þú hefur teiknað rangt opnunarmynstur <xliff:g id="NUMBER_0">%1$d</xliff:g> sinnum. Eftir <xliff:g id="NUMBER_1">%2$d</xliff:g> árangurslausar tilraunir í viðbót verðurðu beðin(n) um að opna símann með tölvupóstreikningi.\n\n Reyndu aftur eftir <xliff:g id="NUMBER_2">%3$d</xliff:g> sekúndur."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Rangt PIN-númer SIM-korts. Nú þarftu að hafa samband við símafyrirtækið til að opna fyrir tækið."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Rangt PIN-númer SIM-korts. Þú átt <xliff:g id="NUMBER_1">%d</xliff:g> tilraun eftir.</item>
+ <item quantity="other">Rangt PIN-númer SIM-korts. Þú átt <xliff:g id="NUMBER_1">%d</xliff:g> tilraunir eftir.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM-kortið er ónothæft. Hafðu samband við símafyrirtækið þitt."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">Rangt PUK-númer SIM-korts. Þú átt <xliff:g id="NUMBER_1">%d</xliff:g> tilraun eftir áður en SIM-kortið verður ónothæft til frambúðar.</item>
+ <item quantity="other">Rangt PUK-númer SIM-korts. Þú átt <xliff:g id="NUMBER_1">%d</xliff:g> tilraunir eftir áður en SIM-kortið verður ónothæft til frambúðar.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"PIN-aðgerð SIM-korts mistókst!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"PUK-aðgerð SIM-korts mistókst!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Númer samþykkt!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Ekkert símasamband."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Skipta um innsláttaraðferð"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Flugstilling"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Mynsturs er krafist þegar tækið er endurræst"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"PIN-númers er krafist þegar tækið er endurræst"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Aðgangsorðs er krafist þegar tækið er endurræst"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Mynsturs er krafist af öryggisástæðum"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"PIN-númers er krafist af öryggisástæðum"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Aðgangsorðs er krafist af öryggisástæðum"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Mynsturs er krafist þegar þú skiptir um snið"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"PIN-númers er krafist þegar þú skiptir um snið"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Aðgangsorðs er krafist þegar þú skiptir um snið"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Stjórnandi tækis hefur læst tækinu"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Tækinu var læst handvirkt"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Tækið hefur ekki verið tekið úr lás í <xliff:g id="NUMBER_1">%d</xliff:g> klukkustund. Staðfestu mynstrið.</item>
+ <item quantity="other">Tækið hefur ekki verið tekið úr lás í <xliff:g id="NUMBER_1">%d</xliff:g> klukkustundir. Staðfestu mynstrið.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Tækið hefur ekki verið tekið úr lás í <xliff:g id="NUMBER_1">%d</xliff:g> klukkustund. Staðfestu PIN-númerið.</item>
+ <item quantity="other">Tækið hefur ekki verið tekið úr lás í <xliff:g id="NUMBER_1">%d</xliff:g> klukkustundir. Staðfestu PIN-númerið.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Tækið hefur ekki verið tekið úr lás í <xliff:g id="NUMBER_1">%d</xliff:g> klukkustund. Staðfestu aðgangsorðið.</item>
+ <item quantity="other">Tækið hefur ekki verið tekið úr lás í <xliff:g id="NUMBER_1">%d</xliff:g> klukkustundir. Staðfestu aðgangsorðið.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Þekktist ekki"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml
index ebd15cd..1ff751c 100644
--- a/packages/SystemUI/res-keyguard/values-it/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-it/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Pulsante per cambiare metodo di immissione."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Inserisci il codice PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Digita il PUK della SIM e il nuovo codice PIN"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Codice PUK della SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Nuovo PIN della SIM"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Tocca per inserire la password"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Inserisci password per sbloccare"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Inserisci PIN per sbloccare"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Codice PIN errato."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Carico"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"In carica"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Ricarica veloce"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Ricarica lenta"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Collega il caricabatterie."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Premi Menu per sbloccare."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Rete bloccata"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Nessuna scheda SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Nessuna scheda SIM presente nel tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Nessuna scheda SIM presente nel telefono."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Inserisci una scheda SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Scheda SIM mancante o non leggibile. Inserisci una scheda SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Scheda SIM inutilizzabile."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"La scheda SIM è stata disattivata definitivamente.\n Contatta il fornitore del tuo servizio wireless per ricevere un\'altra scheda SIM."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"La SIM è bloccata."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"La SIM è bloccata tramite PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Sblocco SIM..."</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Area PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Area PIN SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Area PUK SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Prossima sveglia impostata a: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Elimina"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Invio"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Sequenza dimenticata"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Sequenza sbagliata"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Password sbagliata"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"PIN errato"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Riprova fra <xliff:g id="NUMBER">%d</xliff:g> secondi."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Inserisci la sequenza"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Inserisci il PIN della SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Inserisci il PIN della scheda SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Inserisci PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Inserisci la password"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La scheda SIM è disattivata. Inserisci il codice PUK per continuare. Contatta l\'operatore per avere informazioni dettagliate."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"La SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" non è attiva al momento. Inserisci il codice PUK per continuare. Contatta l\'operatore per avere informazioni dettagliate."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Inserisci il codice PIN desiderato"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Conferma il codice PIN desiderato"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Sblocco SIM..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Il PIN deve essere di 4-8 numeri."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"Il codice PUK dovrebbe avere almeno otto numeri."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Inserisci di nuovo il codice PUK corretto. Ripetuti tentativi comportano la disattivazione definitiva della scheda SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"I codici PIN non corrispondono"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Troppi tentativi di inserimento della sequenza"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Hai digitato il tuo PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> volte in modo errato. \n\nRiprova tra <xliff:g id="NUMBER_1">%2$d</xliff:g> secondi."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Hai digitato la tua password <xliff:g id="NUMBER_0">%1$d</xliff:g> volte in modo errato. \n\nRiprova tra <xliff:g id="NUMBER_1">%2$d</xliff:g> secondi."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"<xliff:g id="NUMBER_0">%1$d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. \n\nRiprova tra <xliff:g id="NUMBER_1">%2$d</xliff:g> secondi."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Hai tentato di sbloccare il tablet senza riuscirci per <xliff:g id="NUMBER_0">%1$d</xliff:g> volte. Dopo altri <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativi falliti, il tablet verrà ripristinato e verranno quindi eliminati tutti i relativi dati."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Hai tentato di sbloccare il telefono senza riuscirci per <xliff:g id="NUMBER_0">%1$d</xliff:g> volte. Dopo altri <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativi falliti, il telefono verrà ripristinato e verranno quindi eliminati tutti i relativi dati."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Hai tentato di sbloccare il tablet senza riuscirci per <xliff:g id="NUMBER">%d</xliff:g> volte. Il tablet verrà ripristinato e verranno quindi eliminati tutti i relativi dati."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Hai tentato di sbloccare il telefono senza riuscirci per <xliff:g id="NUMBER">%d</xliff:g> volte. Il telefono verrà ripristinato e verranno quindi eliminati tutti i relativi dati."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Hai tentato di sbloccare il tablet senza riuscirci per <xliff:g id="NUMBER_0">%1$d</xliff:g> volte. Dopo altri <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativi falliti, questo utente verrà rimosso e verranno quindi eliminati tutti i dati associati."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Hai tentato di sbloccare il telefono senza riuscirci per <xliff:g id="NUMBER_0">%1$d</xliff:g> volte. Dopo altri <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativi falliti, questo utente verrà rimosso e verranno quindi eliminati tutti i dati associati."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Hai tentato di sbloccare il tablet senza riuscirci per <xliff:g id="NUMBER">%d</xliff:g> volte. Questo utente verrà rimosso e verranno quindi eliminati tutti i dati associati."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Hai tentato di sbloccare il telefono senza riuscirci per <xliff:g id="NUMBER">%d</xliff:g> volte. Questo utente verrà rimosso e verranno quindi eliminati tutti i dati associati."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Hai tentato di sbloccare il tablet senza riuscirci per <xliff:g id="NUMBER_0">%1$d</xliff:g> volte. Dopo altri <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativi falliti, il profilo di lavoro verrà rimosso e verranno quindi eliminati tutti i dati associati."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Hai tentato di sbloccare il telefono senza riuscirci per <xliff:g id="NUMBER_0">%1$d</xliff:g> volte. Dopo altri <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativi falliti, il profilo di lavoro verrà rimosso e verranno quindi eliminati tutti i dati associati."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Hai tentato di sbloccare il tablet senza riuscirci per <xliff:g id="NUMBER">%d</xliff:g> volte. Il profilo di lavoro verrà rimosso e verranno quindi eliminati tutti i dati associati."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Hai tentato di sbloccare il telefono senza riuscirci per <xliff:g id="NUMBER">%d</xliff:g> volte. Il profilo di lavoro verrà rimosso e verranno quindi eliminati tutti i dati associati."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"<xliff:g id="NUMBER_0">%1$d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. Dopo altri <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativi falliti, ti verrà chiesto di sbloccare il tablet con un account email.\n\n Riprova tra <xliff:g id="NUMBER_2">%3$d</xliff:g> secondi."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"<xliff:g id="NUMBER_0">%1$d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. Dopo altri <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativi falliti, ti verrà chiesto di sbloccare il telefono con un account email.\n\n Riprova tra <xliff:g id="NUMBER_2">%3$d</xliff:g> secondi."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Codice PIN della SIM errato. Devi contattare l\'operatore per sbloccare il dispositivo."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Codice PIN della SIM errato. Hai ancora <xliff:g id="NUMBER_1">%d</xliff:g> tentativi a disposizione.</item>
+ <item quantity="one">Codice PIN della SIM errato. Hai ancora <xliff:g id="NUMBER_0">%d</xliff:g> tentativo a disposizione, dopodiché dovrai contattare l\'operatore per sbloccare il dispositivo.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM inutilizzabile. Contatta il tuo operatore."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Codice PUK della SIM errato. Hai ancora <xliff:g id="NUMBER_1">%d</xliff:g> tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile.</item>
+ <item quantity="one">Codice PUK della SIM errato. Hai ancora <xliff:g id="NUMBER_0">%d</xliff:g> tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Operazione con PIN della SIM non riuscita."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Operazione con PUK della SIM non riuscita."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Codice accettato."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Nessun servizio."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Cambia metodo di immissione"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Modalità aereo"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Sequenza obbligatoria dopo il riavvio del dispositivo"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"PIN obbligatorio dopo il riavvio del dispositivo"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Password obbligatoria dopo il riavvio del dispositivo"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Sequenza obbligatoria per maggiore sicurezza"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"PIN obbligatorio per maggiore sicurezza"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Password obbligatoria per maggiore sicurezza"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Sequenza obbligatoria dopo aver cambiato profilo"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"PIN obbligatorio dopo aver cambiato profilo"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Password obbligatoria dopo aver cambiato profilo"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"L\'amministratore del dispositivo lo ha bloccato"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Il dispositivo è stato bloccato manualmente"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Il dispositivo non viene sbloccato da <xliff:g id="NUMBER_1">%d</xliff:g> ore. Conferma la sequenza.</item>
+ <item quantity="one">Il dispositivo non viene sbloccato da <xliff:g id="NUMBER_0">%d</xliff:g> ora. Conferma la sequenza.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Il dispositivo non viene sbloccato da <xliff:g id="NUMBER_1">%d</xliff:g> ore. Conferma il PIN.</item>
+ <item quantity="one">Il dispositivo non viene sbloccato da <xliff:g id="NUMBER_0">%d</xliff:g> ora. Conferma il PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Il dispositivo non viene sbloccato da <xliff:g id="NUMBER_1">%d</xliff:g> ore. Conferma la password.</item>
+ <item quantity="one">Il dispositivo non viene sbloccato da <xliff:g id="NUMBER_0">%d</xliff:g> ora. Conferma la password.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Non riconosciuta"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index 7d0d2b8..1325e9b 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -20,186 +20,123 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"לחצן החלפת שיטת קלט."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"מגן מקלדת"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"הזן את קוד הגישה"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"הזן את קוד ה-PUK של כרטיס ה-SIM ולאחר מכן הזן קוד גישה חדש"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"קוד PUK של כרטיס SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"קוד גישה חדש לכרטיס ה-SIM"</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">"הזן את קוד הגישה לביטול הנעילה"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"קוד הגישה שגוי"</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_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">"אזור לקוד הגישה"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"אזור לקוד הגישה של כרטיס ה-SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"אזור לקוד הגישה של כרטיס ה-SIM"</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">"Delete"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</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">"קוד הגישה שגוי"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"נסה שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"שרטט את קו ביטול הנעילה"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"הזן את קוד הגישה של כרטיס ה-SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"הזן את קוד הגישה של כרטיס ה-SIM של \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</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">"הזן את קוד הגישה הרצוי"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"אשר את קוד הגישה הרצוי"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"מבטל את הנעילה של כרטיס ה-SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"הקלד PIN שאורכו 4 עד 8 ספרות."</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">"קודי הגישה אינם תואמים"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"ניסית לשרטט את קו ביטול הנעילה יותר מדי פעמים"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"הקלדת קוד גישה שגוי <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 שגוי. צור קשר עם הספק כדי לבטל את נעילת המכשיר."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="two">קוד הגישה של כרטיס ה-SIM שגוי. נותרו לך עוד <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות.</item>
+ <item quantity="many">קוד הגישה של כרטיס ה-SIM שגוי. נותרו לך עוד <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות.</item>
+ <item quantity="other">קוד הגישה של כרטיס ה-SIM שגוי. נותרו לך עוד <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות.</item>
+ <item quantity="one">קוד הגישה של כרטיס ה-SIM שגוי. נותר לך עוד ניסיון <xliff:g id="NUMBER_0">%d</xliff:g> לפני שיהיה עליך ליצור קשר עם הספק כדי לבטל את נעילת המכשיר.</item>
+ </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="two">קוד ה-PUK של כרטיס ה-SIM שגוי. נותרו לך עוד <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות לפני שכרטיס ה-SIM יינעל לצמיתות.</item>
+ <item quantity="many">קוד ה-PUK של כרטיס ה-SIM שגוי. נותרו לך עוד <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות לפני שכרטיס ה-SIM יינעל לצמיתות.</item>
+ <item quantity="other">קוד ה-PUK של כרטיס ה-SIM שגוי. נותרו לך עוד <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות לפני שכרטיס ה-SIM יינעל לצמיתות.</item>
+ <item quantity="one">קוד ה-PUK של כרטיס ה-SIM שגוי. נותר לך ניסיון <xliff:g id="NUMBER_0">%d</xliff:g> נוסף לפני שכרטיס ה-SIM יינעל לצמיתות.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"פעולת קוד הגישה של כרטיס ה-SIM נכשלה!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"פעולת קוד ה-PUK של כרטיס ה-SIM נכשלה!"</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">"יש להזין קוד גישה כדי להגביר את רמת האבטחה"</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">"יש להזין את קוד הגישה בזמן מעבר בין פרופילים"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"יש להזין את הסיסמה בזמן מעבר בין פרופילים"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"מנהל המכשיר נעל אותו"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"המכשיר ננעל באופן ידני"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="two">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_1">%d</xliff:g> שעות. הזן את קו ביטול הנעילה.</item>
+ <item quantity="many">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_1">%d</xliff:g> שעות. הזן את קו ביטול הנעילה.</item>
+ <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="two">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_1">%d</xliff:g> שעות. הזן את קוד הגישה.</item>
+ <item quantity="many">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_1">%d</xliff:g> שעות. הזן את קוד הגישה.</item>
+ <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_password" formatted="false" msgid="257297696215346527">
+ <item quantity="two">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_1">%d</xliff:g> שעות. הזן את הסיסמה.</item>
+ <item quantity="many">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_1">%d</xliff:g> שעות. הזן את הסיסמה.</item>
+ <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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml
index 5e0178b..be438ce 100644
--- a/packages/SystemUI/res-keyguard/values-ja/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"入力方法の切り替えボタン。"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"PIN コードが無効です。"</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_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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> 秒後にもう一度お試しください。"</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"パターンを入力してください"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM PIN を入力してください"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"「<xliff:g id="CARRIER">%1$s</xliff:g>」の SIM PIN を入力してください"</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">"PIN は 4~8 桁の数字で入力してください。"</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 コードが無効です。入力できるのはあと <xliff:g id="NUMBER_1">%d</xliff:g> 回です。この回数を超えると SIM は完全に使用できなくなります。</item>
+ <item quantity="one">SIM PUK コードが無効です。入力できるのはあと <xliff:g id="NUMBER_0">%d</xliff:g> 回です。この回数を超えると SIM は完全に使用できなくなります。</item>
+ </plurals>
+ <string name="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">"端末の再起動後は PIN の入力が必要となります"</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="2438626748767361010">"端末管理アプリが端末をロックしました"</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml
index 00c4592..c188333 100644
--- a/packages/SystemUI/res-keyguard/values-ka/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"შეყვანის მეთოდის გადართვის ღილაკი."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</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_password_wrong_pin_code" msgid="6535018036285012028">"PIN-კოდი არასწორია."</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_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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"ცადეთ ხელახლა <xliff:g id="NUMBER">%d</xliff:g> წამში."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"დახატეთ თქვენი ნიმუში"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"შეიყვანეთ SIM ბარათის PIN-კოდი"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"შეიყვანეთ SIM ბარათის PIN-კოდი „<xliff:g id="CARRIER">%1$s</xliff:g>“-სთვის"</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-კოდი არასწორია. თქვენ დაგრჩათ <xliff:g id="NUMBER_1">%d</xliff:g> მცდელობა, რომელთა შემდეგაც თქვენი SIM სამუდამოდ გამოუსადეგარი გახდება.</item>
+ <item quantity="one">SIM ბარათის PUK-კოდი არასწორია. თქვენ დაგრჩათ <xliff:g id="NUMBER_0">%d</xliff:g> მცდელობა, რომლის შემდეგაც თქვენი SIM სამუდამოდ გამოუსადეგარი გახდება.</item>
+ </plurals>
+ <string name="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">"მოწყობილობის გადატვირთვის შემდეგ საჭიროა PIN-კოდის შეყვანა"</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="2438626748767361010">"მოწყობილობა ადმინისტრატორის მიერ ჩაიკეტა"</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml
index dd2622f..ba2b1fc 100644
--- a/packages/SystemUI/res-keyguard/values-kk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Енгізу әдісі түймесін ауыстыру."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"PIN коды қате"</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_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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> секундтан кейін әрекетті қайталаңыз."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Өрнекті енгізіңіз"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM PIN кодын енгізіңіз"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" үшін SIM PIN кодын енгізіңіз"</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">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" SIM картасы қазір өшірулі. Жалғастыру үшін 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 коды дұрыс емес. <xliff:g id="NUMBER_1">%d</xliff:g> әрекет қалды. Одан кейін SIM біржола қолданыстан шығады.</item>
+ <item quantity="one">SIM PUK коды дұрыс емес. <xliff:g id="NUMBER_0">%d</xliff:g> әрекет қалды. Одан кейін SIM біржола қолданыстан шығады.</item>
+ </plurals>
+ <string name="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">"Құрылғы қайта іске қосылғаннан кейін, PIN кодын енгізу қажет"</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="2438626748767361010">"Құрылғы әкімшісі құрылғыны құлыптады"</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml
index c9f38b1..fb313bf 100644
--- a/packages/SystemUI/res-keyguard/values-km/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-km/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"ប្ដូរប៊ូតុងវិធីសាស្ត្របញ្ចូល។"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"វាយបញ្ចូលកូដ PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"វាយបញ្ចូលកូដ PIN ថ្មី និងកូដ PUK របស់ស៊ីម"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"កូដ PUK របស់ស៊ីម"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"កូដ 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_password_wrong_pin_code" msgid="6535018036285012028">"កូដ PIN មិនត្រឹមត្រូវទេ។"</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_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">"គ្មានស៊ីមកាតទេ"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"គ្មានស៊ីមកាតនៅក្នុងថេប្លេតទេ។"</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"គ្មានស៊ីមកាតនៅក្នុងទូរសព្ទទេ។"</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"ស៊កបញ្ចូលស៊ីមកាត។"</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"ស៊ីមកាតបានបាត់ ឬមិនអាចអានបាន។ សូមស៊កបញ្ចូលស៊ីមកាត។"</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"ស៊ីមកាតមិនអាចប្រើបានទេ។"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"ស៊ីមកាតរបស់អ្នកត្រូវបានបិទដំណើរការជាអចិន្ត្រៃយ៍។\n សូមទាក់ទងទៅក្រុមហ៊ុនផ្ដល់សេវាកម្មទំនាក់ទំនងឥតខ្សែ ដើម្បីទទួលបានស៊ីមកាតផ្សេង។"</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"ស៊ីមកាតជាប់សោ។"</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"ស៊ីមកាតជាប់កូដ PUK ។"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"កំពុងដោះសោស៊ីមកាត..."</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"ប្រអប់បំពេញកូដ PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"ប្រអប់បំពេញកូដ PIN របស់ស៊ីម"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"ប្រអប់បំពេញកូដ 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="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"សូមព្យាយាមម្ដងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER">%d</xliff:g> វិនាទីទៀត។"</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"គូរលំនាំរបស់អ្នក"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"បញ្ចូលកូដ PIN របស់ស៊ីម"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"បញ្ចូលកូដ PIN របស់ស៊ីមសម្រាប់ \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</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">"ឥឡូវនេះ ស៊ីមត្រូវបានបិទដំណើរការហើយ។ បញ្ចូលកូដ PUK ដើម្បីបន្ត។ សូមទាក់ទងទៅក្រុមហ៊ុនបម្រើសេវាទូរសព្ទរបស់អ្នក ដើម្បីទទួលបានព័ត៌មានលម្អិត។"</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"ឥឡូវនេះ ស៊ីម \"<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">"កំពុងដោះសោស៊ីមកាត..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"វាយបញ្ចូលកូដ PIN ចន្លោះពី 4 ទៅ 8 ខ្ទង់"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"កូដ PUK គួរតែមានលេខ 8 ខ្ទង់ ឬច្រើនជាងនេះ។"</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"សូមបញ្ចូលកូដ PUK ម្ដងទៀត។ ការព្យាយាមដដែលច្រើនដងនឹងបិទដំណើរការស៊ីមនេះជាអចិន្ត្រៃយ៍។"</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">"កូដ PIN របស់ស៊ីមមិនត្រឹមត្រូវទេ អ្នកត្រូវទាក់ទងទៅក្រុមហ៊ុនបម្រើសេវាទូរសព្ទរបស់អ្នកឥឡូវនេះ ដើម្បីដោះសោឧបករណ៍របស់អ្នក។"</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">កូដ PIN របស់ស៊ីមមិនត្រឹមត្រូវទេ អ្នកអាចព្យាយាមបាន <xliff:g id="NUMBER_1">%d</xliff:g> ដងទៀត។</item>
+ <item quantity="one">កូដ PIN របស់ស៊ីមមិនត្រឹមត្រូវទេ ប្រសិនបើអ្នកបញ្ចូលកូដខុស <xliff:g id="NUMBER_0">%d</xliff:g> ដងទៀត អ្នកត្រូវទាក់ទងទៅក្រុមហ៊ុនបម្រើសេវាទូរសព្ទរបស់អ្នក ដើម្បីដោះសោឧបករណ៍របស់អ្នក។</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"ស៊ីមមិនអាចប្រើបានទេ។ សូមទាក់ទងទៅក្រុមហ៊ុនបម្រើសេវាទូរសព្ទរបស់អ្នក។"</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">កូដ PUK របស់ស៊ីមមិនត្រឹមត្រូវទេ ប្រសិនបើអ្នកបញ្ចូលកូដខុស <xliff:g id="NUMBER_1">%d</xliff:g> ដងទៀត ស៊ីមនឹងមិនអាចប្រើបានជាអចិន្ត្រៃយ៍។</item>
+ <item quantity="one">កូដ PUK របស់ស៊ីមមិនត្រឹមត្រូវទេ ប្រសិនបើអ្នកបញ្ចូលកូដខុស <xliff:g id="NUMBER_0">%d</xliff:g> ដងទៀត ស៊ីមនឹងមិនអាចប្រើបានជាអចិន្ត្រៃយ៍។</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"មិនអាចដោះសោដោយប្រើកូដ PIN របស់ស៊ីមបានទេ!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"មិនអាចដោះសោដោយប្រើកូដ 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">"តម្រូវឲ្យបញ្ចូលកូដ PIN បន្ទាប់ពីឧបករណ៍ចាប់ផ្តើមឡើងវិញ"</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="2438626748767361010">"អ្នកគ្រប់គ្រងឧបករណ៍បានចាក់សោឧបករណ៍"</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index 429a835..e85236d 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"ಇನ್ಪುಟ್ ವಿಧಾನ ಬದಲಿಸು ಬಟನ್."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"ಕೀಗಾರ್ಡ್"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"ಪಿನ್ ಕೋಡ್ ಟೈಪ್ ಮಾಡಿ"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"ಸಿಮ್ PUK ಮತ್ತು ಹೊಸ ಪಿನ್ ಕೋಡ್ ಟೈಪ್ ಮಾಡಿ"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"ಸಿಮ್ PUK ಕೋಡ್"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"ಹೊಸ ಸಿಮ್ ಪಿನ್ ಕೋಡ್"</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">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಪಿನ್ ಟೈಪ್ ಮಾಡಿ"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"ತಪ್ಪಾದ ಪಿನ್ ಕೋಡ್."</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_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">"ಯಾವುದೇ ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"ಪೋನ್ನಲ್ಲಿ ಯಾವುದೇ ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"ಸಿಮ್ ಕಾರ್ಡ್ ಸೇರಿಸಿ."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ ಅಥವಾ ಗುರುತಿಸಲು ಅಸಾಧ್ಯ. ಒಂದು ಸಿಮ್ ಕಾರ್ಡ್ ಸೇರಿಸಿ."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"ನಿಷ್ಪ್ರಯೋಜಕ ಸಿಮ್ ಕಾರ್ಡ್."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"ನಿಮ್ಮ ಸಿಮ್ ಕಾರ್ಡ್ ಅನ್ನು ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.\n ಮತ್ತೊಂದು ಸಿಮ್ ಕಾರ್ಡ್ಗಾಗಿ ನಿಮ್ಮ ವೈರ್ಲೆಸ್ ಸೇವೆ ಪೂರೈಕೆದಾರರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"ಸಿಮ್ ಕಾರ್ಡ್ ಲಾಕ್ ಆಗಿದೆ."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"ಸಿಮ್ ಕಾರ್ಡ್ PUK-ಲಾಕ್ ಆಗಿದೆ."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"ಸಿಮ್ ಕಾರ್ಡ್ ಅನ್ಲಾಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"ಪಿನ್ ಪ್ರದೇಶ"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"ಸಿಮ್ ಪಿನ್ ಪ್ರದೇಶ"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"ಸಿಮ್ 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="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">"ಪಿನ್ ತಪ್ಪಾಗಿದೆ"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ನಿಮ್ಮ ಪ್ಯಾಟರ್ನ್ ಚಿತ್ರಿಸಿ"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%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>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"ಈಗ \"<xliff:g id="CARRIER">%1$s</xliff:g>\" ಸಿಮ್ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ. ಮುಂದುವರೆಯಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ಮಾಹಿತಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"ಬಯಸಿರುವ ಪಿನ್ ಕೋಡ್ ನಮೂದಿಸಿ"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"ಬಯಸಿರುವ ಪಿನ್ ಕೋಡ್ ದೃಢೀಕರಿಸಿ"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"ಸಿಮ್ ಕಾರ್ಡ್ ಅನ್ಲಾಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"4 ರಿಂದ 8 ಸಂಖ್ಯೆಗಳಿರುವ ಪಿನ್ ಟೈಪ್ ಮಾಡಿ."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK ಕೋಡ್ 8 ಅಥವಾ ಹೆಚ್ಚು ಸಂಖ್ಯೆಗಳನ್ನು ಹೊಂದಿರಬೇಕು."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"ಸರಿಯಾದ PUK ಕೋಡ್ ಮರು-ನಮೂದಿಸಿ. ಸತತ ಪ್ರಯತ್ನಗಳು ಸಿಮ್ ಅನ್ನು ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"ಪಿನ್ ಕೋಡ್ಗಳು ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತಿಲ್ಲ"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"ಪ್ಯಾಟರ್ನ್ ಪ್ರಯತ್ನಗಳ ಮಿತಿ ಮುಗಿದಿದೆ"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"ನಿಮ್ಮ ಪಿನ್ ಅನ್ನು ನೀವು <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">"ಸಿಮ್ ಪಿನ್ ಕೋಡ್ ತಪ್ಪಾಗಿದೆ, ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು ನೀವು ಈ ಕೂಡಲೇ ನಿಮ್ಮ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಬೇಕು."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">ಸಿಮ್ ಪಿನ್ ಕೋಡ್ ತಪ್ಪಾಗಿದೆ, ನಿಮಗೆ <xliff:g id="NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ.</item>
+ <item quantity="other">ಸಿಮ್ ಪಿನ್ ಕೋಡ್ ತಪ್ಪಾಗಿದೆ, ನಿಮಗೆ <xliff:g id="NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"ಸಿಮ್ ನಿಷ್ಪ್ರಯೋಜಕವಾಗಿದೆ. ನಿಮ್ಮ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">ಸಿಮ್ PUK ಕೋಡ್ ತಪ್ಪಾಗಿದೆ, <xliff:g id="NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳ ನಂತರ ಸಿಮ್ ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಪ್ರಯೋಜಕವಾಗುತ್ತದೆ.</item>
+ <item quantity="other">ಸಿಮ್ PUK ಕೋಡ್ ತಪ್ಪಾಗಿದೆ, <xliff:g id="NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳ ನಂತರ ಸಿಮ್ ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಪ್ರಯೋಜಕವಾಗುತ್ತದೆ.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"ಸಿಮ್ ಪಿನ್ ಕಾರ್ಯಾಚರಣೆ ವಿಫಲಗೊಂಡಿದೆ!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"ಸಿಮ್ 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">"ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗೆ ಪಿನ್ ಅಗತ್ಯವಿದೆ"</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">"ನೀವು ಪ್ರೊಫೈಲ್ಗಳನ್ನು ಬದಲಾಯಿಸಿದಾಗ ಪಿನ್ ಅಗತ್ಯವಿರುತ್ತದೆ"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"ನೀವು ಪ್ರೊಫೈಲ್ಗಳನ್ನು ಬದಲಾಯಿಸಿದಾಗ ಪಾಸ್ವರ್ಡ್ ಅಗತ್ಯವಿರುತ್ತದೆ"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"ಸಾಧನ ನಿರ್ವಾಹಕರು ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಿದ್ದಾರೆ"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"ಸಾಧನವನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">ಸಾಧನವನ್ನು <xliff:g id="NUMBER_1">%d</xliff:g> ಗಂಟೆಗಳವರೆಗೆ ಅನ್ಲಾಕ್ ಮಾಡಿರಲಿಲ್ಲ. ಪ್ಯಾಟರ್ನ್ ಖಚಿತಪಡಿಸಿ.</item>
+ <item quantity="other">ಸಾಧನವನ್ನು <xliff:g id="NUMBER_1">%d</xliff:g> ಗಂಟೆಗಳವರೆಗೆ ಅನ್ಲಾಕ್ ಮಾಡಿರಲಿಲ್ಲ. ಪ್ಯಾಟರ್ನ್ ಖಚಿತಪಡಿಸಿ.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">ಸಾಧನವನ್ನು <xliff:g id="NUMBER_1">%d</xliff:g> ಗಂಟೆಗಳವರೆಗೆ ಅನ್ಲಾಕ್ ಮಾಡಿರಲಿಲ್ಲ. ಪಿನ್ ದೃಢೀಕರಿಸಿ.</item>
+ <item quantity="other">ಸಾಧನವನ್ನು <xliff:g id="NUMBER_1">%d</xliff:g> ಗಂಟೆಗಳವರೆಗೆ ಅನ್ಲಾಕ್ ಮಾಡಿರಲಿಲ್ಲ. ಪಿನ್ ದೃಢೀಕರಿಸಿ.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">ಸಾಧನವನ್ನು <xliff:g id="NUMBER_1">%d</xliff:g> ಗಂಟೆಗಳವರೆಗೆ ಅನ್ಲಾಕ್ ಮಾಡಿರಲಿಲ್ಲ. ಪಾಸ್ವರ್ಡ್ ಖಚಿತಪಡಿಸಿ.</item>
+ <item quantity="other">ಸಾಧನವನ್ನು <xliff:g id="NUMBER_1">%d</xliff:g> ಗಂಟೆಗಳವರೆಗೆ ಅನ್ಲಾಕ್ ಮಾಡಿರಲಿಲ್ಲ. ಪಾಸ್ವರ್ಡ್ ಖಚಿತಪಡಿಸಿ.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml
index dfdcaf6..80b0a94 100644
--- a/packages/SystemUI/res-keyguard/values-ko/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"입력 방법 버튼을 전환합니다."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"잘못된 PIN 코드입니다."</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_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="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter 키"</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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g>초 후에 다시 시도하세요."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"패턴 그리기"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM PIN 입력"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\'<xliff:g id="CARRIER">%1$s</xliff:g>\'의 SIM PIN 입력"</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 코드입니다. 입력에 <xliff:g id="NUMBER_1">%d</xliff:g>번 더 실패할 경우 SIM이 영구적으로 사용 중지됩니다.</item>
+ <item quantity="one">잘못된 SIM PUK 코드입니다. 입력에 <xliff:g id="NUMBER_0">%d</xliff:g>번 더 실패할 경우 SIM이 영구적으로 사용 중지됩니다.</item>
+ </plurals>
+ <string name="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">"기기가 다시 시작되면 PIN이 필요합니다."</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="2438626748767361010">"기기 관리자가 기기를 잠금 설정했습니다."</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml
index 3ab2348..436c7b0 100644
--- a/packages/SystemUI/res-keyguard/values-ky/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Киргизүү ыкмасын которуу баскычы."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"PIN-код туура эмес."</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_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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> секунддан кийин кайталаңыз."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Графикалык ачкычты тартыңыз"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM-картанын PIN-кодун киргизиңиз"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" байланыш операторунун SIM-картасынын PIN-кодун киргизиңиз"</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">"Түзмөк кайра күйгүзүлгөндөн кийин PIN-кодду киргизүү талап кылынат"</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="2438626748767361010">"Түзмөктүн администратору аны кулпулап койду"</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml
index 0810c2c..6ab471a 100644
--- a/packages/SystemUI/res-keyguard/values-lo/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"ປຸ່ມສະລັບຮູບແບບການປ້ອນຂໍ້ມູນ."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"ພິມລະຫັດ PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"ປະເພດ PUK ຂອງ SIM ແລະລະຫັດ PIN ໃໝ່"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"ລະຫັດ PUK ຂອງ SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"ລະຫັດ PIN ໃໝ່ຂອງ SIM"</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_password_wrong_pin_code" msgid="6535018036285012028">"ລະຫັດ PIN ບໍ່ຖືກຕ້ອງ."</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_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">"ບໍ່ມີຊິມກາດ"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"ບໍ່ມີຊິມກາດໃນແທັບເລັດ."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"ບໍ່ມີ SIM card ໃນໂທລະສັບ."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"ໃສ່ຊິມກາດ."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"ບໍ່ພົບເຫັນຊິມກາດ ຫຼືບໍ່ສາມາດອ່ານຊິມກາດໄດ້. ກະລຸນາໃສ່ຊິມກາດໃໝ່."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"SIM card ບໍ່ສາມາດໃຊ້ໄດ້."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"ຊິມກາດຂອງທ່ານຖືກປິດການນຳໃຊ້ຢ່າງຖາວອນແລ້ວ.\n ກະລຸນາຕິດຕໍ່ຜູ່ໃຫ້ບໍລິການໂທລະສັບຂອງທ່ານ ເພື່ອຂໍເອົາຊິມກາດໃໝ່."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM card ຖືກລັອກ."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"ຊິມກາດຖືກລັອກດ້ວຍລະຫັດ PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"ປົດລັອກ SIM card..."</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"ພື້ນທີ່ PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"ພື້ນທີ່ PIN ຂອງ SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"ພື້ນທີ່ PUK ຂອງ SIM"</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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"ລອງໃໝ່ໃນອີກ <xliff:g id="NUMBER">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ແຕ້ມຮູບແບບປົດລັອກຂອງທ່ານ"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"ໃສ່ລະຫັດ PIN ຂອງຊິມ"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"ປ້ອນ SIM PIN ສຳລັບ \"<xliff:g id="CARRIER">%1$s</xliff:g>\" ເຂົ້າໄປ"</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">"ຊິມຖືກປິດການນຳໃຊ້ແລ້ວ. ປ້ອນລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ຕິດຕໍ່ຜູ່ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"ດຽວນີ້ \"<xliff:g id="CARRIER">%1$s</xliff:g>\" SIM ປິດນຳໃຊ້. ປ້ອນລະຫັດ 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 card..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"ພິມລະຫັດ PIN ທີ່ມີ 4 ຫາ 8 ໂຕເລກ."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"ລະຫັດ PUK ຄວນມີຢ່າງໜ້ອຍ 8 ໂຕເລກ."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"ປ້ອນລະຫັດ PUK ທີ່ຖືກຕ້ອງຄືນໃໝ່. ການພະຍາຍາມໃສ່ຫຼາຍເທື່ອຈະເຮັດໃຫ້ຊິມກາດໃຊ້ບໍ່ໄດ້ຖາວອນ."</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">"ລະຫັດ PIN ຂອງ SIM ບໍ່ຖືກຕ້ອງທ່ານຕ້ອງຕິດຕໍ່ຫາຜູ່ໃຫ້ບໍລິການ ເພື່ອປົດລັອກອຸປະກອນຂອງທ່ານ."</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">ລະຫັດ PIN ຂອງ SIM ບໍ່ຖືກຕ້ອງ, ທ່ານສາມາດລອງໄດ້ອີກ <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">ລະຫັດ PUK ຂອງ SIM ບໍ່ຖືກຕ້ອງ, ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອກ່ອນທີ່ SIM ຂອງທ່ານຈະໃຊ້ບໍ່ໄດ້ຢ່າງຖາວອນ.</item>
+ <item quantity="one">ລະຫັດ PUK ຂອງ SIM ບໍ່ຖືກຕ້ອງ, ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອກ່ອນທີ່ SIM ຂອງທ່ານຈະໃຊ້ບໍ່ໄດ້ຢ່າງຖາວອນ.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"PIN ຂອງ SIM ເຮັດວຽກລົ້ມເຫຼວ!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"PUK ຂອງ SIM ເຮັດວຽກລົ້ມເຫຼວ!"</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">"ຈຳເປັນຕ້ອງມີ PIN ຫຼັງຈາກອຸປະກອນເລີ່ມລະບົບໃໝ່"</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="2438626748767361010">"ອຸປະກອນຖືກລັອກໂດຍຜູ້ເບິ່ງແຍງລະບົບ"</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml
index 7db550f..3ac078d 100644
--- a/packages/SystemUI/res-keyguard/values-lt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml
@@ -20,186 +20,123 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Perjungti įvesties metodo mygtuką."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Klaviatūros apsauga"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Įveskite PIN kodą"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Įveskite SIM kortelės PUK kodą ir naują PIN kodą"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM kortelės PUK kodas"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Naujas SIM kortelės PIN kodas"</string>
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"Netinkamas PIN kodas."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Įkrauta"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Įkraunama"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Greitai įkraunama"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Lėtai įkraunama"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Prijunkite kroviklį."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Paspauskite meniu, jei norite atrakinti."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Tinklas užrakintas"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Nėra SIM kortelės"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Planšetiniame kompiuteryje nėra SIM kortelės."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Telefone nėra SIM kortelės."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Įdėkite SIM kortelę."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Nėra SIM kortelės arba ji neskaitoma. Įdėkite SIM kortelę."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Negalima naudoti SIM kortelės."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"SIM kortelė visam laikui išjungta.\n Jei norite gauti kitą SIM kortelę, susisiekite su belaidžio ryšio paslaugos teikėju."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM kortelė užrakinta."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM kortelė užrakinta PUK kodu."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Atrakinama SD kortelė..."</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN kodo sritis"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM kortelės PIN kodo sritis"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"SIM kortelės PUK kodo sritis"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Kitas nustatytas signalas: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Ištrinti"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Pamiršau atrakinimo piešinį"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Netinkamas atrakinimo piešinys"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Netinkamas slaptažodis"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Netinkamas PIN kodas"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sek."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Nupieškite atrakinimo piešinį"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Įveskite SIM kortelės PIN kodą"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Įveskite „<xliff:g id="CARRIER">%1$s</xliff:g>“ SIM kortelės PIN kodą"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Įveskite PIN kodą"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Įveskite slaptažodį"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Dabar SIM neleidžiama. Jei norite tęsti, įveskite PUK kodą. Jei reikia išsamios informacijos, susisiekite su operatoriumi."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"„<xliff:g id="CARRIER">%1$s</xliff:g>“ SIM kortelė išjungta. Jei norite tęsti, įveskite PUK kodą. Jei reikia išsamios informacijos, susisiekite su operatoriumi."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Įveskite pageidaujamą PIN kodą"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Patvirtinkite pageidaujamą PIN kodą"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Atrakinama SD kortelė..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Įveskite PIN kodą, sudarytą iš 4–8 skaičių."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK kodas turėtų būti sudarytas iš 8 ar daugiau skaitmenų."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Pakartotinai įveskite tinkamą PUK kodą. Pakartotinai bandant SIM kortelė bus išjungta visam laikui."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN kodai nesutampa"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Per daug atrakinimo piešinių bandymų"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kart. netinkamai įvedėte PIN kodą. \n\nBandykite dar kartą po <xliff:g id="NUMBER_1">%2$d</xliff:g> sek."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kart. netinkamai įvedėte slaptažodį. \n\nBandykite dar kartą po <xliff:g id="NUMBER_1">%2$d</xliff:g> sek."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kart. netinkamai nupiešėte atrakinimo piešinį. \n\nBandykite dar kartą po <xliff:g id="NUMBER_1">%2$d</xliff:g> sek."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kart. nesėkmingai bandėte atrakinti planšetinį kompiuterį. Po dar <xliff:g id="NUMBER_1">%2$d</xliff:g> nesėkm. band. šis planšetinis kompiuteris bus nustatytas iš naujo ir visi jo duomenys bus ištrinti."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kart. nesėkmingai bandėte atrakinti telefoną. Po dar <xliff:g id="NUMBER_1">%2$d</xliff:g> nesėkm. band. šis telefonas bus nustatytas iš naujo ir visi jo duomenys bus ištrinti."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"<xliff:g id="NUMBER">%d</xliff:g> kart. nesėkmingai bandėte atrakinti planšetinį kompiuterį. Šis planšetinis kompiuteris bus nustatytas iš naujo ir visi jo duomenys bus ištrinti."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"<xliff:g id="NUMBER">%d</xliff:g> kart. nesėkmingai bandėte atrakinti telefoną. Šis telefonas bus nustatytas iš naujo ir visi jo duomenys bus ištrinti."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kart. nesėkmingai bandėte atrakinti planšetinį kompiuterį. Po dar <xliff:g id="NUMBER_1">%2$d</xliff:g> nesėkm. band. šis naudotojas bus pašalintas ir visi naudotojo duomenys bus ištrinti."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kart. nesėkmingai bandėte atrakinti telefoną. Po dar <xliff:g id="NUMBER_1">%2$d</xliff:g> nesėkm. band. šis naudotojas bus pašalintas ir visi naudotojo duomenys bus ištrinti."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"<xliff:g id="NUMBER">%d</xliff:g> kart. nesėkmingai bandėte atrakinti planšetinį kompiuterį. Šis naudotojas bus pašalintas ir visi naudotojo duomenys bus ištrinti."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"<xliff:g id="NUMBER">%d</xliff:g> kart. nesėkmingai bandėte atrakinti telefoną. Šis naudotojas bus pašalintas ir visi naudotojo duomenys bus ištrinti."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kart. nesėkmingai bandėte atrakinti planšetinį kompiuterį. Po dar <xliff:g id="NUMBER_1">%2$d</xliff:g> nesėkm. band. darbo profilis bus pašalintas ir visi profilio duomenys bus ištrinti."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kart. nesėkmingai bandėte atrakinti telefoną. Po dar <xliff:g id="NUMBER_1">%2$d</xliff:g> nesėkm. band. darbo profilis bus pašalintas ir visi profilio duomenys bus ištrinti."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"<xliff:g id="NUMBER">%d</xliff:g> kart. nesėkmingai bandėte atrakinti planšetinį kompiuterį. Darbo profilis bus pašalintas ir visi profilio duomenys bus ištrinti."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"<xliff:g id="NUMBER">%d</xliff:g> kart. nesėkmingai bandėte atrakinti telefoną. Darbo profilis bus pašalintas ir visi profilio duomenys bus ištrinti."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kart. netinkamai nupiešėte atrakinimo piešinį. Po dar <xliff:g id="NUMBER_1">%2$d</xliff:g> nesėkm. band. būsite paprašyti atrakinti planšetinį kompiuterį naudodami el. pašto paskyrą.\n\n Bandykite dar kartą po <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kart. netinkamai nupiešėte atrakinimo piešinį. Po dar <xliff:g id="NUMBER_1">%2$d</xliff:g> nesėkm. band. būsite paprašyti atrakinti telefoną naudodami el. pašto paskyrą.\n\n Bandykite dar kartą po <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Netinkamas SIM kortelės PIN kodas. Reikės susisiekti su operatoriumi, kad atrakintų įrenginį."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Netinkamas SIM kortelės PIN kodas. Liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymas.</item>
+ <item quantity="few">Netinkamas SIM kortelės PIN kodas. Liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymai.</item>
+ <item quantity="many">Netinkamas SIM kortelės PIN kodas. Liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymo.</item>
+ <item quantity="other">Netinkamas SIM kortelės PIN kodas. Liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymų.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM kortelės naudoti nebegalima. Susisiekite su operatoriumi."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">Netinkamas SIM kortelės PUK kodas. Liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymas. Paskui visiškai nebegalėsite naudoti SIM kortelės.</item>
+ <item quantity="few">Netinkamas SIM kortelės PUK kodas. Liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymai. Paskui visiškai nebegalėsite naudoti SIM kortelės.</item>
+ <item quantity="many">Netinkamas SIM kortelės PUK kodas. Liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymo. Paskui visiškai nebegalėsite naudoti SIM kortelės.</item>
+ <item quantity="other">Netinkamas SIM kortelės PUK kodas. Liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymų. Paskui visiškai nebegalėsite naudoti SIM kortelės.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Nepavyko atlikti SIM kortelės PIN kodo operacijos."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Nepavyko atlikti SIM kortelės PUK kodo operacijos."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kodas priimtas!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Nėra paslaugos."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Perjungti įvesties metodą"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Lėktuvo režimas"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Iš naujo paleidus įrenginį būtinas atrakinimo piešinys"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Iš naujo paleidus įrenginį būtinas PIN kodas"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Iš naujo paleidus įrenginį būtinas slaptažodis"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Norint užtikrinti papildomą saugą būtinas atrakinimo piešinys"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Norint užtikrinti papildomą saugą būtinas PIN kodas"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Norint užtikrinti papildomą saugą būtinas slaptažodis"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Perjungiant profilius būtinas atrakinimo piešinys"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Perjungiant profilius būtinas PIN kodas"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Perjungiant profilius būtinas slaptažodis"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Įrenginio administratorius užrakino įrenginį"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Įrenginys užrakintas neautomatiškai"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Įrenginys nebuvo atrakintas <xliff:g id="NUMBER_1">%d</xliff:g> valandą. Patvirtinkite atrakinimo piešinį.</item>
+ <item quantity="few">Įrenginys nebuvo atrakintas <xliff:g id="NUMBER_1">%d</xliff:g> valandas. Patvirtinkite atrakinimo piešinį.</item>
+ <item quantity="many">Įrenginys nebuvo atrakintas <xliff:g id="NUMBER_1">%d</xliff:g> valandos. Patvirtinkite atrakinimo piešinį.</item>
+ <item quantity="other">Įrenginys nebuvo atrakintas <xliff:g id="NUMBER_1">%d</xliff:g> valandų. Patvirtinkite atrakinimo piešinį.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Įrenginys nebuvo atrakintas <xliff:g id="NUMBER_1">%d</xliff:g> valandą. Patvirtinkite PIN kodą.</item>
+ <item quantity="few">Įrenginys nebuvo atrakintas <xliff:g id="NUMBER_1">%d</xliff:g> valandas. Patvirtinkite PIN kodą.</item>
+ <item quantity="many">Įrenginys nebuvo atrakintas <xliff:g id="NUMBER_1">%d</xliff:g> valandos. Patvirtinkite PIN kodą.</item>
+ <item quantity="other">Įrenginys nebuvo atrakintas <xliff:g id="NUMBER_1">%d</xliff:g> valandų. Patvirtinkite PIN kodą.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Įrenginys nebuvo atrakintas <xliff:g id="NUMBER_1">%d</xliff:g> valandą. Patvirtinkite slaptažodį.</item>
+ <item quantity="few">Įrenginys nebuvo atrakintas <xliff:g id="NUMBER_1">%d</xliff:g> valandas. Patvirtinkite slaptažodį.</item>
+ <item quantity="many">Įrenginys nebuvo atrakintas <xliff:g id="NUMBER_1">%d</xliff:g> valandos. Patvirtinkite slaptažodį.</item>
+ <item quantity="other">Įrenginys nebuvo atrakintas <xliff:g id="NUMBER_1">%d</xliff:g> valandų. Patvirtinkite slaptažodį.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Neatpažinta"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml
index 99709a1..64311a9 100644
--- a/packages/SystemUI/res-keyguard/values-lv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml
@@ -20,186 +20,118 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Ievades metodes maiņas poga."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Taustiņslēgs"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Ievadiet PIN kodu."</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Ievadiet SIM kartes PUK kodu un jauno PIN kodu."</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM kartes PUK kods"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Jaunais SIM kartes PIN kods"</string>
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"PIN kods nav pareizs."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Akumulators uzlādēts"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Notiek uzlāde"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Notiek ātrā uzlāde"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Notiek lēnā uzlāde"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Pievienojiet uzlādes ierīci."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Lai atbloķētu, nospiediet izvēlnes ikonu."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Tīkls ir bloķēts."</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Nav SIM kartes."</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Planšetdatorā nav SIM kartes."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Tālrunī nav SIM kartes."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Ievietojiet SIM karti."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Nav SIM kartes, vai arī to nevar nolasīt. Ievietojiet SIM karti."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Nelietojama SIM karte."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Jūsu SIM karte ir neatgriezeniski atspējota.\nSazinieties ar savu bezvadu pakalpojumu sniedzēju, lai iegūtu citu SIM karti."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM karte ir bloķēta."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM karte ir bloķēta ar PUK kodu."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Notiek SIM kartes atbloķēšana..."</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN apgabals"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM kartes PIN apgabals"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"SIM kartes PUK apgabals"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Nākamā signāla atskaņošanas laiks: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Dzēšanas taustiņš"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Ievadīšanas taustiņš"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Aizmirsu kombināciju"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Nepareiza kombinācija."</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Nepareiza parole."</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Nepareizs PIN kods."</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundes(-ēm)."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Zīmējiet savu kombināciju."</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Ievadiet SIM kartes PIN kodu"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Ievadiet SIM kartes “<xliff:g id="CARRIER">%1$s</xliff:g>” PIN kodu"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Ievadiet PIN."</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Ievadiet paroli"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM karte ir atspējota. Lai turpinātu, ievadiet PUK kodu. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM karte “<xliff:g id="CARRIER">%1$s</xliff:g>” ir atspējota. Lai turpinātu, ievadiet PUK kodu. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Ievadiet vēlamo PIN kodu."</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Apstipriniet vēlamo PIN kodu."</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Notiek SIM kartes atbloķēšana..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Ievadiet PIN kodu, kas sastāv no 4 līdz 8 cipariem."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK kodam ir jābūt vismaz 8 ciparus garam."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Atkārtoti ievadiet pareizo PUK kodu. Ja vairākas reizes ievadīsiet to nepareizi, SIM karte tiks neatgriezeniski atspējota."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN kodi neatbilst."</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Pārāk daudz kombinācijas mēģinājumu"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Jūs <xliff:g id="NUMBER_0">%1$d</xliff:g> reizi(-es) esat ievadījis nepareizu PIN kodu.\n\nMēģiniet vēlreiz pēc <xliff:g id="NUMBER_1">%2$d</xliff:g> sekundes(-ēm)."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Jūs <xliff:g id="NUMBER_0">%1$d</xliff:g> reizi(-es) esat ievadījis nepareizu paroli.\n\nMēģiniet vēlreiz pēc <xliff:g id="NUMBER_1">%2$d</xliff:g> sekundes(-ēm)."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Jūs <xliff:g id="NUMBER_0">%1$d</xliff:g> reizi(-es) esat nepareizi uzzīmējis atbloķēšanas kombināciju.\n\nMēģiniet vēlreiz pēc <xliff:g id="NUMBER_1">%2$d</xliff:g> sekundes(-ēm)."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Jūs <xliff:g id="NUMBER_0">%1$d</xliff:g> reizi(-es) nesekmīgi mēģinājāt atbloķēt planšetdatoru. Pēc vēl <xliff:g id="NUMBER_1">%2$d</xliff:g> nesekmīga(-iem) mēģinājuma(-iem) šis planšetdators tiks atiestatīts, kā arī visi planšetdatora dati tiks dzēsti."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Jūs <xliff:g id="NUMBER_0">%1$d</xliff:g> reizi(-es) nesekmīgi mēģinājāt atbloķēt tālruni. Pēc vēl <xliff:g id="NUMBER_1">%2$d</xliff:g> nesekmīga(-iem) mēģinājuma(-iem) šis tālrunis tiks atiestatīts, kā arī visi tālruņa dati tiks dzēsti."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Jūs <xliff:g id="NUMBER">%d</xliff:g> reizi(-es) nesekmīgi mēģinājāt atbloķēt planšetdatoru. Šis planšetdators tiks atiestatīts, kā arī visi planšetdatora dati tiks dzēsti."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Jūs <xliff:g id="NUMBER">%d</xliff:g> reizi(-es) nesekmīgi mēģinājāt atbloķēt tālruni. Šis tālrunis tiks atiestatīts, kā arī visi tālruņa dati tiks dzēsti."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Jūs <xliff:g id="NUMBER_0">%1$d</xliff:g> reizi(-es) nesekmīgi mēģinājāt atbloķēt planšetdatoru. Pēc vēl <xliff:g id="NUMBER_1">%2$d</xliff:g> nesekmīga(-iem) mēģinājuma(-iem) šis lietotājs tiks noņemts, kā arī visi lietotāja dati tiks dzēsti."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Jūs <xliff:g id="NUMBER_0">%1$d</xliff:g> reizi(-es) nesekmīgi mēģinājāt atbloķēt tālruni. Pēc vēl <xliff:g id="NUMBER_1">%2$d</xliff:g> nesekmīga(-iem) mēģinājuma(-iem) šis lietotājs tiks noņemts, kā arī visi lietotāja dati tiks dzēsti."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Jūs <xliff:g id="NUMBER">%d</xliff:g> reizi(-es) nesekmīgi mēģinājāt atbloķēt planšetdatoru. Šis lietotājs tiks noņemts, kā arī visi lietotāja dati tiks dzēsti."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Jūs <xliff:g id="NUMBER">%d</xliff:g> reizi(-es) nesekmīgi mēģinājāt atbloķēt tālruni. Šis lietotājs tiks noņemts, kā arī visi lietotāja dati tiks dzēsti."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Jūs <xliff:g id="NUMBER_0">%1$d</xliff:g> reizi(-es) nesekmīgi mēģinājāt atbloķēt planšetdatoru. Pēc vēl <xliff:g id="NUMBER_1">%2$d</xliff:g> nesekmīga(-iem) mēģinājuma(-iem) darba profils tiks noņemts, kā arī visi profila dati tiks dzēsti."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Jūs <xliff:g id="NUMBER_0">%1$d</xliff:g> reizi(-es) nesekmīgi mēģinājāt atbloķēt tālruni. Pēc vēl <xliff:g id="NUMBER_1">%2$d</xliff:g> nesekmīga(-iem) mēģinājuma(-iem) darba profils tiks noņemts, kā arī visi profila dati tiks dzēsti."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Jūs <xliff:g id="NUMBER">%d</xliff:g> reizi(-es) nesekmīgi mēģinājāt atbloķēt planšetdatoru. Darba profils tiks noņemts, kā arī visi profila dati tiks dzēsti."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Jūs <xliff:g id="NUMBER">%d</xliff:g> reizi(-es) nesekmīgi mēģinājāt atbloķēt tālruni. Darba profils tiks noņemts, kā arī visi profila dati tiks dzēsti."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Jūs <xliff:g id="NUMBER_0">%1$d</xliff:g> reizi(-es) nepareizi norādījāt atbloķēšanas kombināciju. Pēc vēl <xliff:g id="NUMBER_1">%2$d</xliff:g> nesekmīga(-iem) mēģinājuma(-iem) planšetdators būs jāatbloķē, izmantojot e-pasta kontu.\n\nMēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%3$d</xliff:g> sekundes(-ēm)."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Jūs <xliff:g id="NUMBER_0">%1$d</xliff:g> reizi(-es) nepareizi norādījāt atbloķēšanas kombināciju. Pēc vēl <xliff:g id="NUMBER_1">%2$d</xliff:g> nesekmīga(-iem) mēģinājuma(-iem) tālrunis būs jāatbloķē, izmantojot e-pasta kontu.\n\nMēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%3$d</xliff:g> sekundes(-ēm)."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Nepareizs SIM kartes PIN kods. Lai atbloķētu ierīci, sazinieties ar mobilo sakaru operatoru."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="zero">Nepareizs SIM kartes PIN kods. Varat mēģināt vēl <xliff:g id="NUMBER_1">%d</xliff:g> reizes.</item>
+ <item quantity="one">Nepareizs SIM kartes PIN kods. Varat mēģināt vēl <xliff:g id="NUMBER_1">%d</xliff:g> reizi.</item>
+ <item quantity="other">Nepareizs SIM kartes PIN kods. Varat mēģināt vēl <xliff:g id="NUMBER_1">%d</xliff:g> reizes.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM karte nav lietojama. Sazinieties ar mobilo sakaru operatoru."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="zero">Nepareizs SIM kartes PUK kods. Varat mēģināt vēl <xliff:g id="NUMBER_1">%d</xliff:g> reizes. Ja pēdējais mēģinājums būs kļūdains, SIM karti vairs nevarēs izmantot.</item>
+ <item quantity="one">Nepareizs SIM kartes PUK kods. Varat mēģināt vēl <xliff:g id="NUMBER_1">%d</xliff:g> reizi. Ja pēdējais mēģinājums būs kļūdains, SIM karti vairs nevarēs izmantot.</item>
+ <item quantity="other">Nepareizs SIM kartes PUK kods. Varat mēģināt vēl <xliff:g id="NUMBER_1">%d</xliff:g> reizes. Ja pēdējais mēģinājums būs kļūdains, SIM karti vairs nevarēs izmantot.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"SIM kartes PIN koda ievadīšana neizdevās!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"SIM kartes PUK koda ievadīšana neizdevās!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kods ir pieņemts!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Nav pakalpojuma."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Pārslēgt ievades metodi"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Lidojuma režīms"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Pēc ierīces restartēšanas ir jāievada atbloķēšanas kombinācija."</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Pēc ierīces restartēšanas ir jāievada PIN kods."</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Pēc ierīces restartēšanas ir jāievada parole."</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Papildu drošībai ir jāievada atbloķēšanas kombinācija."</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Papildu drošībai ir jāievada PIN kods."</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Papildu drošībai ir jāievada parole."</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Pārslēdzot profilus, ir jāievada atbloķēšanas kombinācija."</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Pārslēdzot profilus, ir jāievada PIN kods."</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Pārslēdzot profilus, ir jāievada parole."</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Ierīci bloķēja ierīces administrators."</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Ierīce tika bloķēta manuāli."</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="zero">Ierīce nav tikusi atbloķēta <xliff:g id="NUMBER_1">%d</xliff:g> stundas. Apstipriniet kombināciju.</item>
+ <item quantity="one">Ierīce nav tikusi atbloķēta <xliff:g id="NUMBER_1">%d</xliff:g> stundu. Apstipriniet kombināciju.</item>
+ <item quantity="other">Ierīce nav tikusi atbloķēta <xliff:g id="NUMBER_1">%d</xliff:g> stundas. Apstipriniet kombināciju.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="zero">Ierīce nav tikusi atbloķēta <xliff:g id="NUMBER_1">%d</xliff:g> stundas. Apstipriniet PIN.</item>
+ <item quantity="one">Ierīce nav tikusi atbloķēta <xliff:g id="NUMBER_1">%d</xliff:g> stundu. Apstipriniet PIN.</item>
+ <item quantity="other">Ierīce nav tikusi atbloķēta <xliff:g id="NUMBER_1">%d</xliff:g> stundas. Apstipriniet PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="zero">Ierīce nav tikusi atbloķēta <xliff:g id="NUMBER_1">%d</xliff:g> stundas. Apstipriniet paroli.</item>
+ <item quantity="one">Ierīce nav tikusi atbloķēta <xliff:g id="NUMBER_1">%d</xliff:g> stundu. Apstipriniet paroli.</item>
+ <item quantity="other">Ierīce nav tikusi atbloķēta <xliff:g id="NUMBER_1">%d</xliff:g> stundas. Apstipriniet paroli.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nav atpazīts"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml
index c9fcb29..affebcc 100644
--- a/packages/SystemUI/res-keyguard/values-mk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Копче за префрање метод на внес."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Напишете го PIN-кодот"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Внесете PUK-код за SIM и нов PIN-код"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK-код за SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Нов PIN-код за SIM"</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_password_wrong_pin_code" msgid="6535018036285012028">"Погрешен PIN-код."</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_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">"Поле за PIN на SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Поле за PUK на SIM"</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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Обидете се повторно за <xliff:g id="NUMBER">%d</xliff:g> секунди."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Нацртајте ја шемата"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Внесете PIN на SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Внесете PIN на SIM за „<xliff:g id="CARRIER">%1$s</xliff:g>“"</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">"Внесете PIN што содржи 4 - 8 броеви."</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">"Погрешен PIN-код за SIM, сега мора да контактирате со вашиот оператор за да го отклучите уредот."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Погрешен PIN-код за SIM, ви преостанува уште <xliff:g id="NUMBER_1">%d</xliff:g> обид.</item>
+ <item quantity="other">Погрешен PIN-код за SIM, ви преостануваат уште <xliff:g id="NUMBER_1">%d</xliff:g> обиди.</item>
+ </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="one">Погрешен PUK-код за SIM, ви преостанува уште <xliff:g id="NUMBER_1">%d</xliff:g> обид пред SIM-картичката да стане трајно неупотреблива.</item>
+ <item quantity="other">Погрешен PUK-код за SIM, ви преостануваат уште <xliff:g id="NUMBER_1">%d</xliff:g> обиди пред SIM-картичката да стане трајно неупотреблива.</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">"Потребен е PIN-код по рестартирање на уредот"</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="2438626748767361010">"Администраторот на уредот го заклучил уредот"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Уредот е заклучен рачно"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Уредот не е отклучен веќе <xliff:g id="NUMBER_1">%d</xliff:g> час. Потврдете ја шемата.</item>
+ <item quantity="other">Уредот не е отклучен веќе <xliff:g id="NUMBER_1">%d</xliff:g> часа. Потврдете ја шемата.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Уредот не е отклучен веќе <xliff:g id="NUMBER_1">%d</xliff:g> час. Потврдете го PIN-кодот.</item>
+ <item quantity="other">Уредот не е отклучен веќе <xliff:g id="NUMBER_1">%d</xliff:g> часа. Потврдете го PIN-кодот.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Уредот не е отклучен веќе <xliff:g id="NUMBER_1">%d</xliff:g> час. Потврдете ја лозинката.</item>
+ <item quantity="other">Уредот не е отклучен веќе <xliff:g id="NUMBER_1">%d</xliff:g> часа. Потврдете ја лозинката.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Непознат"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml
index cce277f..9c3170b 100644
--- a/packages/SystemUI/res-keyguard/values-ml/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"ടൈപ്പുചെയ്യൽ രീതി ബട്ടൺ മാറുക."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"കീഗാർഡ്"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"പിൻ കോഡ് ടൈപ്പുചെയ്യുക"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"സിം PUK-യും പുതിയ പിൻ കോഡും ടൈപ്പുചെയ്യുക"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"സിം PUK കോഡ്"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"പുതിയ സിം പിൻ കോഡ്"</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">"അൺലോക്കുചെയ്യുന്നതിന് പിൻ ടൈപ്പുചെയ്യുക"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"പിൻ കോഡ് തെറ്റാണ്."</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_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">"സിം കാർഡില്ല"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"ടാബ്ലെറ്റിൽ സിം കാർഡൊന്നുമില്ല."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"ഫോണിൽ സിം കാർഡൊന്നുമില്ല."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"ഒരു സിം കാർഡ് ഇടുക."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"സിം കാർഡ് കാണുന്നില്ല, അല്ലെങ്കിൽ റീഡുചെയ്യാനായില്ല. ഒരു സിം കാർഡ് ഇടുക."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"ഉപയോഗയോഗ്യമല്ലാത്ത സിം കാർഡ്."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"നിങ്ങളുടെ സിം കാർഡ് ശാശ്വതമായി പ്രവർത്തനരഹിതമാക്കി.\n മറ്റൊരു സിം കാർഡിനായി നിങ്ങളുടെ വയർലെസ് സേവന ദാതാവിനെ ബന്ധപ്പെടുക."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"സിം കാർഡ് ലോക്കുചെയ്തു."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"സിം കാർഡ് PUK-ലോക്ക് ചെയ്തതാണ്."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"സിം കാർഡ് അൺലോക്കുചെയ്യുന്നു…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"പിൻ ഏരിയ"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"സിം പിൻ ഏരിയ"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"സിം 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="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">"പിൻ തെറ്റാണ്"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> സെക്കന്റിനുശേഷം വീണ്ടും ശ്രമിക്കുക."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"നിങ്ങളുടെ പാറ്റേൺ വരയ്ക്കുക"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"സിം പിൻ നൽകുക"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%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>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. വിശദാംശങ്ങൾക്ക് കാരിയറെ ബന്ധപ്പെടുക."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"താൽപ്പര്യപ്പെടുന്ന പിൻ കോഡ് നൽകുക"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"താൽപ്പര്യപ്പെടുന്ന പിൻകോഡ് സ്ഥിരീകരിക്കുക"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"സിം കാർഡ് അൺലോക്കുചെയ്യുന്നു…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"4 മുതൽ 8 വരെ അക്കങ്ങളുള്ള ഒരു പിൻ ടൈപ്പുചെയ്യുക."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK കോഡിൽ 8 അല്ലെങ്കിൽ അതിലധികം സംഖ്യകൾ ഉണ്ടായിരിക്കണം."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"ശരിയായ PUK കോഡ് വീണ്ടും നൽകുക. ആവർത്തിച്ചുള്ള ശ്രമങ്ങൾ സിം ശാശ്വതമായി പ്രവർത്തനരഹിതമാക്കും."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"പിൻ കോഡുകൾ പൊരുത്തപ്പെടുന്നില്ല"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"വളരെയധികം പാറ്റേൺ ശ്രമങ്ങൾ"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"നിങ്ങൾ <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">"സിം പിൻ കോഡ് തെറ്റാണ്, നിങ്ങളുടെ ഉപകരണം അൺലോക്കുചെയ്യാൻ ഇനി നിങ്ങളുടെ കാരിയറുമായി ബന്ധപ്പെടണം."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <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="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"സിം ഉപയോഗയോഗ്യമല്ല. നിങ്ങളുടെ കാരിയറെ ബന്ധപ്പെടുക."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">സിം PUK കോഡ് തെറ്റാണ്, സിം ശാശ്വതമായി ഉപയോഗശൂന്യമാകുന്നതിന് മുമ്പായി നിങ്ങൾക്ക് <xliff:g id="NUMBER_1">%d</xliff:g> ശ്രമങ്ങൾ കൂടി ശേഷിക്കുന്നു.</item>
+ <item quantity="one">സിം PUK കോഡ് തെറ്റാണ്, സിം ശാശ്വതമായി ഉപയോഗശൂന്യമാകുന്നതിന് മുമ്പായി നിങ്ങൾക്ക് <xliff:g id="NUMBER_0">%d</xliff:g> ശ്രമം കൂടി ശേഷിക്കുന്നു.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"പിൻ ഉപയോഗിച്ച് സിം അൺലോക്കുചെയ്യാനുള്ള ശ്രമം പരാജയപ്പെട്ടു!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"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">"അധിക സുരക്ഷയ്ക്ക് പിൻ ആവശ്യമാണ്"</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">"പ്രൊഫൈലുകൾ തമ്മിൽ മാറുമ്പോൾ പിൻ നൽകേണ്ടതുണ്ട്"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"പ്രൊഫൈലുകൾ തമ്മിൽ മാറുമ്പോൾ പാസ്വേഡ് നൽകേണ്ടതുണ്ട്"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"അഡ്മിനിസ്ട്രേറ്റർ ഉപകരണം ലോക്കുചെയ്തു"</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> മണിക്കൂറായി അൺലോക്ക് ചെയ്തിട്ടില്ല. പിൻ സ്ഥിരീകരിക്കുക.</item>
+ <item quantity="one">ഉപകരണം <xliff:g id="NUMBER_0">%d</xliff:g> മണിക്കൂറായി അൺലോക്ക് ചെയ്തിട്ടില്ല. പിൻ സ്ഥിരീകരിക്കുക.</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml
index 202dcb0..57fa965 100644
--- a/packages/SystemUI/res-keyguard/values-mn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Оруулах аргыг сэлгэх товч."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Түгжээний код"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"ПИН кодыг оруулна уу"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"SIM-н PUK код болон шинэ ПИН кодыг оруулна уу"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM-н PUK код"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Шинэ SIM-н ПИН код"</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">"Түгжээг тайлахын тулд ПИН кодыг оруулна уу"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"ПИН код буруу байна."</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_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 карт авах бол wi-fi үйлчилгээ үзүүлэгчтэй холбогдоно уу."</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">"ПИН кодын хэсэг"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM-н ПИН кодын хэсэг"</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="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">"ПИН код буруу байна"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Загварыг оруулна уу"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM-н ПИН-г оруулна уу"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"-н SIM-н ПИН-г оруулна уу"</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">"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">"Дурын ПИН код оруулна уу"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Хүссэн ПИН кодоо баталгаажуулна уу"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"SIM картын түгжээг тайлж байна…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"4-8 тооноос бүтэх ПИН-г оруулна уу."</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">"ПИН код тохирохгүй байна"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Загварыг хэт олон удаа буруу оруулсан байна"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Та ПИН кодоо <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-н ПИН кодыг буруу оруулсан тул та төхөөрөмжийнхөө түгжээг тайлахын тулд оператор компанитайгаа холбогдоно уу."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">SIM-н ПИН код буруу байна. Танд <xliff:g id="NUMBER_1">%d</xliff:g> оролдлого үлдлээ.</item>
+ <item quantity="one">SIM-н ПИН код буруу байна, танд мобайл оператортойгоо холбогдохгүйгээр төхөөрөмжийн түгжээг тайлахад <xliff:g id="NUMBER_0">%d</xliff:g> оролдлого хийх боломж үлдсэн байна.</item>
+ </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-н ПИН-г буруу орууллаа!"</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">"Аюулгүй байдлын үүднээс ПИН оруулах шаардлагатай"</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">"Профайлыг солиход ПИН оруулах шаардлагатай"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Профайлыг сэлгэхэд нууц үг оруулах шаардлагатай"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Төхөөрөмжийн админ төхөөрөмжийг түгжсэн"</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> цагийн турш тайлаагүй байна. ПИН кодоо баталгаажуулна уу.</item>
+ <item quantity="one">Төхөөрөмжийн түгжээг <xliff:g id="NUMBER_0">%d</xliff:g> цагийн турш тайлаагүй байна. ПИН кодоо баталгаажуулна уу.</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml
index 8648768..328ba80 100644
--- a/packages/SystemUI/res-keyguard/values-mr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"इनपुट पद्धत स्विच करा बटण."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"कीगार्ड"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"पिन कोड टाइप करा"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"सिम PUK आणि नवीन पिन कोड टाइप करा"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"सिम PUK कोड"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"नवीन सिम पिन कोड"</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">"अनलॉक करण्यासाठी पिन टाइप करा"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"चुकीचा पिन कोड."</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_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">"सिम कार्ड नाही"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"टॅबलेटमध्ये सिम कार्ड नाही."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"फोनमध्ये सिम कार्ड नाही."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"सिम कार्ड घाला."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"सिम कार्ड गहाळ झाले आहे किंवा ते वाचनीय नाही. सिम कार्ड घाला."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"निरुपयोगी सिम कार्ड."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"आपले सिम कार्ड कायमचे अक्षम केले गेले आहे.\n दुसर्या सिम कार्डसाठी आपल्या वायरलेस सेवा प्रदात्याशी संपर्क साधा."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"सिम कार्ड लॉक झाले आहे."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"सिम कार्ड PUK-लॉक केलेले आहे."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"सिम कार्ड अनलॉक करत आहे…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"पिन क्षेत्र"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"सिम पिन क्षेत्र"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"सिम 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="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">"चुकीचा पिन"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"आपला नमुना काढा"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"सिम पिन प्रविष्ट करा"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%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>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" सिम आता अक्षम केले आहे. सुरू ठेवण्यासाठी PUK कोड प्रविष्ट करा. तपशीलांसाठी वाहकाशी संपर्क साधा."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"इच्छित पिन कोड प्रविष्ट करा"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"इच्छित पिन कोड ची पुष्टी करा"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"सिम कार्ड अनलॉक करत आहे…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"4 ते 8 अंकांचा पिन टाईप करा."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK कोड 8 अंकी किंवा त्यापेक्षा अधिकचा असावा."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"योग्य PUK कोड पुन्हा प्रविष्ट करा. पुनःपुन्हा प्रयत्न करणे सिम कायमचे अक्षम करेल."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"पिन कोड जुळत नाहीत"</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">"सिम पिन कोड चुकीचा आहे आपण आता आपले डिव्हाइस अनलॉक करण्यासाठी आपल्या वाहकाशी संपर्क साधावा."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">चुकीचा सिम पिन कोड, आपल्याकडे <xliff:g id="NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहे.</item>
+ <item quantity="other">चुकीचा सिम पिन कोड, आपल्याकडे <xliff:g id="NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहेत.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"सिम निरुपयोगी आहे. आपल्या वाहकाशी संपर्क साधा."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">चुकीचा सिम PUK कोड, सिम कायमचे निरुपयोगी होण्यापूर्वी आपल्याकडे <xliff:g id="NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहे.</item>
+ <item quantity="other">चुकीचा सिम PUK कोड, सिम कायमचे निरुपयोगी होण्यापूर्वी आपल्याकडे <xliff:g id="NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहेत.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"सिम पिन ऑपरेशन अयशस्वी झाले!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"सिम 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">"अतिरिक्त सुरक्षिततेसाठी पिन आवश्यक आहे"</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">"आपण प्रोफाईल स्विच करता तेव्हा पिन आवश्यक आहे"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"आपण प्रोफाईल स्विच करता तेव्हा संकेतशब्द आवश्यक आहे"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"डिव्हाइस प्रशासकाने डिव्हाइस लॉक केले"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"डिव्हाइस व्यक्तिचलितरित्या लॉक केले होते"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">डिव्हाइस <xliff:g id="NUMBER_1">%d</xliff:g> तासासाठी अनलॉक केले गेले नाही. नमुन्याची पुष्टी करा.</item>
+ <item quantity="other">डिव्हाइस <xliff:g id="NUMBER_1">%d</xliff:g> तासांसाठी अनलॉक केले गेले नाही. नमुन्याची पुष्टी करा.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">डिव्हाइस <xliff:g id="NUMBER_1">%d</xliff:g> तासासाठी अनलॉक केले गेले नाही. पिन ची पुष्टी करा.</item>
+ <item quantity="other">डिव्हाइस <xliff:g id="NUMBER_1">%d</xliff:g> तासांसाठी अनलॉक केले गेले नाही. पिन ची पुष्टी करा.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">डिव्हाइस <xliff:g id="NUMBER_1">%d</xliff:g> तासासाठी अनलॉक केले गेले नाही. संकेतशब्दाची पुष्टी करा.</item>
+ <item quantity="other">डिव्हाइस <xliff:g id="NUMBER_1">%d</xliff:g> तासांसाठी अनलॉक केले गेले नाही. संकेतशब्दाची पुष्टी करा.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"ओळखले नाही"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml
index efb529e..d239346 100644
--- a/packages/SystemUI/res-keyguard/values-ms/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Butang tukar kaedah input."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Pengawal kekunci"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Taip kod PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Taip PUK SIM dan kod PIN baharu"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Kod PUK SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Kod PIN SIM baharu"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Sentuh untuk menaip kata laluan"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Taip kata laluan untuk membuka kunci"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Taip PIN untuk membuka kunci"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Kod PIN salah."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Sudah dicas"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Mengecas"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Mengecas dengan cepat"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Mengecas dengan perlahan"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Sambungkan pengecas anda."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Tekan Menu untuk membuka kunci."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Rangkaian dikunci"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Tiada kad SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Tiada kad SIM dalam tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Tiada kad SIM dalam telefon."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Masukkan kad SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Kad SIM tiada atau tidak dapat dibaca. Sila masukkan kad SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Kad SIM tidak boleh digunakan."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Kad SIM anda telah dilumpuhkan secara kekal.\n Hubungi pembekal perkhidmatan wayarles anda untuk mendapatkan kad SIM lain."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"Kad SIM dikunci."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"Kad SIM dikunci dengan PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Membuka kunci kad SIM…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Bahagian PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Bahagian PIN SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Bahagian PUK SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Penggera seterusnya ditetapkan pada <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Padam"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Kekunci Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Terlupa Corak"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Corak salah"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Kata Laluan salah"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"PIN salah"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Cuba lagi dalam <xliff:g id="NUMBER">%d</xliff:g> saat."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Lukis corak anda"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Masukkan PIN SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Masukkan PIN SIM untuk \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Masukkan PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Masukkan Kata Laluan"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM kini dilumpuhkan. Masukkan kod PUK untuk meneruskan. Hubungi pembawa untuk mendapatkan butiran."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" kini dilumpuhkan. Masukkan kod PUK untuk meneruskan. Hubungi pembawa untuk mendapatkan butiran."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Masukkan kod PIN yang diingini"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Sahkan kod PIN yang diingini"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Membuka kunci kad SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Taipkan PIN yang mengandungi 4 hingga 8 nombor."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"Kod PUK seharusnya 8 nombor atau lebih."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Masukkan semula kod PUK yang betul. Percubaan berulang akan melumpuhkan SIM secara kekal."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Kod PIN tidak sepadan"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Terlalu banyak percubaan melukis corak"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Anda telah tersilap taip PIN sebanyak <xliff:g id="NUMBER_0">%1$d</xliff:g> kali. \n\nCuba lagi dalam <xliff:g id="NUMBER_1">%2$d</xliff:g> saat."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Anda telah tersilap taip kata laluan sebanyak <xliff:g id="NUMBER_0">%1$d</xliff:g> kali. \n\nCuba lagi dalam <xliff:g id="NUMBER_1">%2$d</xliff:g> saat."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Anda telah tersilap lukis corak buka kunci sebanyak <xliff:g id="NUMBER_0">%1$d</xliff:g> kali. \n\nCuba lagi dalam <xliff:g id="NUMBER_1">%2$d</xliff:g> saat."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Anda telah salah membuka kunci tablet sebanyak <xliff:g id="NUMBER_0">%1$d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi percubaan yang gagal, tablet ini akan ditetapkan semula sekali gus memadamkan semua data."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Anda telah salah membuka kunci telefon sebanyak <xliff:g id="NUMBER_0">%1$d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi percubaan yang gagal, telefon ini akan ditetapkan semula sekali gus memadamkan semua data."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Anda telah salah membuka kunci tablet sebanyak <xliff:g id="NUMBER">%d</xliff:g> kali. Tablet ini akan ditetapkan semula sekali gus memadamkan semua data."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Anda telah salah membuka kunci telefon sebanyak <xliff:g id="NUMBER">%d</xliff:g> kali. Telefon ini akan ditetapkan semula sekali gus memadamkan semua data."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Anda telah salah membuka kunci tablet sebanyak <xliff:g id="NUMBER_0">%1$d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi percubaan yang gagal, pengguna ini akan dialih keluar sekali gus memadamkan semua data pengguna."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Anda telah salah membuka kunci telefon sebanyak <xliff:g id="NUMBER_0">%1$d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi percubaan yang gagal, pengguna ini akan dialih keluar sekali gus memadamkan semua data pengguna."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Anda telah salah membuka kunci tablet sebanyak <xliff:g id="NUMBER">%d</xliff:g> kali. Pengguna ini akan dialih keluar sekali gus memadamkan semua data pengguna."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Anda telah salah membuka kunci telefon sebanyak <xliff:g id="NUMBER">%d</xliff:g> kali. Pengguna ini akan dialih keluar sekali gus memadamkan semua data pengguna."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Anda telah salah membuka kunci tablet sebanyak <xliff:g id="NUMBER_0">%1$d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi percubaan yang gagal, profil kerja anda akan dialih keluar sekali gus memadamkan semua data profil."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Anda telah salah membuka kunci telefon sebanyak <xliff:g id="NUMBER_0">%1$d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi percubaan yang gagal, profil kerja ini akan dialih keluar sekali gus memadamkan semua data profil."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Anda telah salah membuka kunci tablet sebanyak <xliff:g id="NUMBER">%d</xliff:g> kali. Profil kerja ini akan dialih keluar sekali gus memadamkan semua data profil."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Anda telah salah membuka kunci telefon sebanyak <xliff:g id="NUMBER">%d</xliff:g> kali. Profil kerja ini akan dialih keluar sekali gus memadamkan semua data profil."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Anda telah tersilap melukis corak buka kunci sebanyak <xliff:g id="NUMBER_0">%1$d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi percubaan yang gagal, anda akan diminta membuka kunci tablet anda menggunakan akaun e-mel.\n\n Cuba lagi dalam <xliff:g id="NUMBER_2">%3$d</xliff:g> saat."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Anda telah tersilap lukis corak buka kunci sebanyak <xliff:g id="NUMBER_0">%1$d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi percubaan yang gagal, anda akan diminta membuka kunci telefon anda menggunakan akaun e-mel.\n\n Cuba lagi dalam <xliff:g id="NUMBER_2">%3$d</xliff:g> saat."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Kod PIN SIM salah. Anda mesti menghubungi pembawa anda untuk membuka kunci peranti."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Kod PIN SIM salah, tinggal <xliff:g id="NUMBER_1">%d</xliff:g> percubaan.</item>
+ <item quantity="one">Kod PIN SIM salah. Tinggal <xliff:g id="NUMBER_0">%d</xliff:g> percubaan sebelum anda perlu menghubungi pembawa anda untuk membuka kunci peranti.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM tidak boleh digunakan. Hubungi pembawa anda."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Kod PUK SIM salah. Tinggal <xliff:g id="NUMBER_1">%d</xliff:g> percubaan sebelum SIM tidak boleh digunakan secara kekal.</item>
+ <item quantity="one">Kod PUK SIM salah. Tinggal <xliff:g id="NUMBER_0">%d</xliff:g> percubaan sebelum SIM tidak boleh digunakan secara kekal.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Pengendalian PIN SIM gagal!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Pengendalian PUK SIM gagal!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kod Diterima!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Tiada perkhidmatan."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Tukar kaedah masukan"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Mod Pesawat"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Corak diperlukan setelah peranti dimulakan semula"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"PIN diperlukan setelah peranti dimulakan semula"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Kata laluan diperlukan setelah peranti dimulakan semula"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Corak diperlukan untuk keselamatan tambahan"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"PIN diperlukan untuk keselamatan tambahan"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Kata laluan diperlukan untuk keselamatan tambahan"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Corak diperlukan apabila anda menukar profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"PIN diperlukan apabila anda menukar profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Kata laluan diperlukan apabila anda menukar profil"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Pentadbir peranti mengunci peranti"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Peranti telah dikunci secara manual"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Peranti tidak dibuka kuncinya selama <xliff:g id="NUMBER_1">%d</xliff:g> jam. Sahkan corak.</item>
+ <item quantity="one">Peranti tidak dibuka kuncinya selama <xliff:g id="NUMBER_0">%d</xliff:g> jam. Sahkan corak.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Peranti tidak dibuka kuncinya selama <xliff:g id="NUMBER_1">%d</xliff:g> jam. Sahkan PIN.</item>
+ <item quantity="one">Peranti tidak dibuka kuncinya selama <xliff:g id="NUMBER_0">%d</xliff:g> jam. Sahkan PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Peranti tidak dibuka kuncinya selama <xliff:g id="NUMBER_1">%d</xliff:g> jam. Sahkan kata laluan.</item>
+ <item quantity="one">Peranti tidak dibuka kuncinya selama <xliff:g id="NUMBER_0">%d</xliff:g> jam. Sahkan kata laluan.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Tidak dikenali"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml
index 364a647..6d35630 100644
--- a/packages/SystemUI/res-keyguard/values-my/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-my/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"ထည့်သွင်းခြင်းခလုတ်အား ပြောင်းခြင်း"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"လုံခြုံရေးကီး"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"ပင်နံပါတ်ထည့်ပါ"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"ဆင်းမ် ပင်နံပါတ် ပြန်ဖွင့်သည့်ကုဒ်နှင့် ပင်နံပါတ်အသစ် ထည့်ပါ"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"ဆင်းမ် ပင်နံပါတ် ပြန်ဖွင့်သည့်ကုဒ်"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"ဆင်းမ် ပင်နံပါတ်အသစ်"</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">"လော့ခ်ဖွင့်ရန် ပင်နံပါတ်ထည့်ပါ"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"ပင်နံပါတ် မှားနေသည်။"</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_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">"ဆင်းမ်ကဒ် မရှိပါ"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"တက်ဘလက်ထဲတွင် ဆင်းမ်ကဒ် မရှိပါ။"</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"ဖုန်းထဲတွင် ဆင်းမ်ကဒ် မရှိပါ။"</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"ဆင်းမ်ကဒ် ထည့်ပါ။"</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"ဆင်းမ်ကဒ်မရှိပါ သို့မဟုတ် အသုံးပြု၍မရပါ။ ဆင်းမ်ကဒ်တစ်ခု ထည့်ပါ။"</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"အသုံးပြု၍ မရတော့သော ဆင်းမ်ကဒ်။"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"သင့်ဆင်းမ်ကဒ်ကို အပြီးအပိုင် ပိတ်လိုက်ပါပြီ။\n နောက်ထပ်ဆင်းမ်ကဒ်တစ်ခု ရယူရန်အတွက် သင်၏ ကြိုးမဲ့ဝန်ဆောင်မှုပေးသူထံ ဆက်သွယ်ပါ။"</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"ဆင်းမ်ကဒ် လော့ခ်ကျနေပါသည်။"</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"ဆင်းမ်ကဒ်သည် ပင်နံပါတ် ပြန်ဖွင့်သည့်ကုဒ် လော့ခ်ကျနေပါသည်။"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"ဆင်းမ်ကဒ်ကို လော့ခ်ဖွင့်နေပါသည်…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"ပင်နံပါတ်နေရာ"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"ဆင်းမ်ပင်နံပါတ်နေရာ"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"ဆင်းမ် ပင်နံပါတ် ပြန်ဖွင့်သည့်ကုဒ် နေရာ"</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="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter ခလုတ်"</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">"ပင်နံပါတ် မမှန်ကန်ပါ"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> စက္ကန့်အကြာတွင် ထပ်လုပ်ကြည့်ပါ။"</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ပုံစံကို ဆွဲပါ"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"ဆင်းမ်ကဒ် ပင်နံပါတ်ကို ထည့်ပါ"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%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">"ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် ပင်နံပါတ် ပြန်ဖွင့်သည့် ကုဒ်ကို ထည့်ပါ။ ပိုမိုလေ့လာရန် မိုဘိုင်းဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်နိုင်ပါသည်။"</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ဆင်းမ်ကို ယခု ပိတ်လိုက်ပါပြီ။ ရှေ့ဆက်ရန် ပင်နံပါတ် ပြန်ဖွင့်သည့်ကုဒ်ကို ထည့်ပါ။ အသေးစိတ် အချက်အလက်များအတွက် မိုဘိုင်းဝန်ဆောင်မှုပေးသူထံ ဆက်သွယ်ပါ။"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"မိမိလိုလားသော ပင်နံပါတ်ကို ထည့်ပါ"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"မိမိလိုလားသော ပင်နံပါတ်ကို အတည်ပြုပါ"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"ဆင်းမ်ကဒ်ကို လော့ခ်ဖွင့်နေပါသည်…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"ဂဏန်း ၄ လုံးမှ ၈ လုံးအထိ ရှိသော ပင်နံပါတ်ကို ထည့်ပါ။"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"ပင်နံပါတ် ပြန်ဖွင့်သည့်ကုဒ်သည် ဂဏန်း ၈ လုံးနှင့် အထက် ဖြစ်ရပါမည်။"</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"မှန်ကန်သည့် ပင်နံပါတ် ပြန်ဖွင့်သည့်ကုဒ်ကို ပြန်ထည့်ပါ။ ထပ်ခါထပ်ခါမှားယွင်းနေလျှင် ဆင်းမ်ကဒ်ကို အပြီးအပိုင် ပိတ်လိုက်ပါမည်။"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"ပင်နံပါတ် ကိုက်ညီမှုမရှိပါ"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"ပုံစံထည့်သွင်းရန် ကြိုးစားသည့် အကြိမ်အရေအတွက် အလွန်များနေပါပြီ"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"သင်သည် ပင်နံပါတ်ကို <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">"ဆင်းမ်ကဒ်ပင်နံပါတ် မှားယွင်းနေသောကြောင့် ယခုအခါ သင့်စက်ပစ္စည်းအား လော့ခ်ဖွင့်ရန် ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ရပါမည်။"</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <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="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"ဆင်းမ်ကဒ်ကို အသုံးပြု၍ မရတော့ပါ။ ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။"</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <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="kg_password_pin_failed" msgid="8769990811451236223">"ဆင်းမ်ကဒ်ပင်နံပါတ် လုပ်ဆောင်ချက် မအောင်မြင်ပါ။"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"ဆင်းမ်ကဒ် ပင်နံပါတ် ပြန်ဖွင့်သည့်ကုဒ် လုပ်ဆောင်ချက် မအောင်မြင်ပါ။"</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">"ပိုမို၍ လုံခြုံမှု ရှိစေရန် ပင်နံပါတ် လိုအပ်ပါသည်"</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">"ပရိုဖိုင်များကို ပြောင်းသည့်အခါ ပင်နံပါတ် လိုအပ်ပါသည်"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"ပရိုဖိုင်များကို ပြောင်းသည့်အခါ စကားဝှက် လိုအပ်ပါသည်"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"စက်ပစ္စည်းစီမံခန့်ခွဲသူသည် စက်ပစ္စည်းကို လော့ခ်ချထားသည်"</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> နာရီကြာ လော့ခ်ဖွင့်ခဲ့ခြင်း မရှိပါ။ ပင်နံပါတ်အား အတည်ပြုပါ။</item>
+ <item quantity="one">စက်ပစ္စည်းကို <xliff:g id="NUMBER_0">%d</xliff:g> နာရီကြာ လော့ခ်ဖွင့်ခဲ့ခြင်း မရှိပါ။ ပင်နံပါတ်အား အတည်ပြုပါ။</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml
index 507b2a3..f3e15d0 100644
--- a/packages/SystemUI/res-keyguard/values-nb/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Bytt knapp for inndatametode."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Tastaturlås"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Skriv inn PIN-koden"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Skriv inn PUK-koden for SIM-kortet og en ny PIN-kode"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK-koden for SIM-kortet"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Ny PIN-kode for SIM-kortet"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Trykk for å skrive inn passord"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Skriv inn passordet for å låse opp"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Skriv inn PIN-koden for å låse opp"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Feil PIN-kode."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Oppladet"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Lader"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Lader raskt"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Lader sakte"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Koble til en batterilader."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Trykk på menyknappen for å låse opp."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Nettverket er låst"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"SIM-kortet mangler"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Nettbrettet mangler SIM-kort."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Telefonen mangler SIM-kort."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Sett inn et SIM-kort."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM-kort mangler eller er uleselig. Sett inn et SIM-kort."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Ubrukelig SIM-kort."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"SIM-kortet er deaktivert permanent.\nTa kontakt med leverandøren av trådløstjenesten for å få et nytt SIM-kort."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM-kortet er låst."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM-kortet er PUK-låst."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Låser opp SIM-kortet …"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN-området"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"PIN-området for SIM-kortet"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"PUK-området for SIM-kortet"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Neste alarm er stilt inn for <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Slett"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Har du glemt mønsteret?"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Feil mønster"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Feil passord"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Feil PIN-kode"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Prøv på nytt om <xliff:g id="NUMBER">%d</xliff:g> sekunder."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Tegn mønsteret ditt"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Skriv inn PIN-koden for SIM-kortet"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Skriv inn PIN-koden for SIM-kortet «<xliff:g id="CARRIER">%1$s</xliff:g>»"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Skriv inn PIN-koden"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Skriv inn passordet"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kortet er nå deaktivert. Skriv inn PUK-koden for å fortsette. Ta kontakt med operatøren for mer informasjon."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM-kortet «<xliff:g id="CARRIER">%1$s</xliff:g>» er nå deaktivert. Skriv inn PUK-koden for å fortsette. Ta kontakt med operatøren for mer informasjon."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Tast inn ønsket PIN-kode"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Bekreft ønsket PIN-kode"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Låser opp SIM-kortet …"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Skriv inn en PIN-kode på fire til åtte sifre."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK-koden skal være på åtte eller flere sifre."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Skriv inn den riktige PUK-koden på nytt. Gjentatte forsøk deaktiverer SIM-kortet permanent."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN-kodene stemmer ikke overens"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"For mange forsøk på tegning av mønster"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Du har oppgitt feil PIN-kode <xliff:g id="NUMBER_0">%1$d</xliff:g> ganger. \n\nPrøv på nytt om <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunder."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Du har tastet inn passordet ditt feil <xliff:g id="NUMBER_0">%1$d</xliff:g> ganger. \n\nPrøv på nytt om <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunder."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Du har tegnet opplåsningsmønsteret ditt feil <xliff:g id="NUMBER_0">%1$d</xliff:g> ganger. \n\nPrøv på nytt om <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunder."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Du har gjort feil i forsøket på å låse opp nettbrettet <xliff:g id="NUMBER_0">%1$d</xliff:g> ganger. Nettbrettet tilbakestilles etter <xliff:g id="NUMBER_1">%2$d</xliff:g> nye mislykkede forsøk, noe som sletter alle dataene på nettbrettet."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Du har gjort feil i forsøket på å låse opp telefonen <xliff:g id="NUMBER_0">%1$d</xliff:g> ganger. Telefonen tilbakestilles etter <xliff:g id="NUMBER_1">%2$d</xliff:g> nye mislykkede forsøk, noe som sletter alle dataene på telefonen."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Du har gjort feil i forsøket på å låse opp nettbrettet <xliff:g id="NUMBER">%d</xliff:g> ganger. Dette nettbrettet blir tilbakestilt, og alle dataene blir slettet."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Du har gjort feil i forsøket på å låse opp telefonen <xliff:g id="NUMBER">%d</xliff:g> ganger. Denne telefonen blir tilbakestilt, og alle dataene blir slettet."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Du har gjort feil i forsøket på å låse opp nettbrettet <xliff:g id="NUMBER_0">%1$d</xliff:g> ganger. Brukeren fjernes etter <xliff:g id="NUMBER_1">%2$d</xliff:g> nye mislykkede forsøk, noe som sletter alle brukerdataene."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Du har gjort feil i forsøket på å låse opp telefonen <xliff:g id="NUMBER_0">%1$d</xliff:g> ganger. Brukeren fjernes etter <xliff:g id="NUMBER_1">%2$d</xliff:g> nye mislykkede forsøk, noe som sletter alle brukerdataene."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Du har gjort feil i forsøket på å låse opp nettbrettet <xliff:g id="NUMBER">%d</xliff:g> ganger. Denne brukeren blir fjernet, og alle brukerdataene blir slettet."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Du har gjort feil i forsøket på å låse opp telefonen <xliff:g id="NUMBER">%d</xliff:g> ganger. Denne brukeren blir fjernet, og alle brukerdataene blir slettet."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Du har gjort feil i forsøket på å låse opp nettbrettet <xliff:g id="NUMBER_0">%1$d</xliff:g> ganger. Jobbprofilen fjernes etter <xliff:g id="NUMBER_1">%2$d</xliff:g> nye mislykkede forsøk, noe som sletter alle profildataene."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Du har gjort feil i forsøket på å låse opp telefonen <xliff:g id="NUMBER_0">%1$d</xliff:g> ganger. Jobbprofilen fjernes etter <xliff:g id="NUMBER_1">%2$d</xliff:g> nye mislykkede forsøk, noe som sletter alle profildataene."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Du har gjort feil i forsøket på å låse opp nettbrettet <xliff:g id="NUMBER">%d</xliff:g> ganger. Jobbprofilen blir fjernet, og alle profildataene blir slettet."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Du har gjort feil i forsøket på å låse opp telefonen <xliff:g id="NUMBER">%d</xliff:g> ganger. Jobbprofilen blir fjernet, og alle profildataene blir slettet."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Du har tegnet opplåsingsmønsteret feil <xliff:g id="NUMBER_0">%1$d</xliff:g> ganger. Etter ytterligere <xliff:g id="NUMBER_1">%2$d</xliff:g> feil forsøk blir du bedt om å låse opp nettbrettet via en e-postkonto.\n\n Prøv på nytt om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Du har tegnet opplåsingsmønsteret feil <xliff:g id="NUMBER_0">%1$d</xliff:g> ganger. Etter ytterligere <xliff:g id="NUMBER_1">%2$d</xliff:g> feil forsøk blir du bedt om å låse opp telefonen via en e-postkonto.\n\n Prøv på nytt om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Feil PIN-kode for SIM-kortet. Du må nå kontakte operatøren din for å låse opp enheten."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Feil PIN-kode for SIM-kortet. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøk igjen.</item>
+ <item quantity="one">Feil PIN-kode for SIM-kortet. Du har <xliff:g id="NUMBER_0">%d</xliff:g> forsøk igjen før du må kontakte operatøren din for å låse opp enheten.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM-kortet er ubrukelig. Ta kontakt med operatøren din."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Feil PUK-kode for SIM-kortet. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøk igjen før SIM-kortet blir permanent ubrukelig.</item>
+ <item quantity="one">Feil PUK-kode for SIM-kortet. Du har <xliff:g id="NUMBER_0">%d</xliff:g> forsøk igjen før SIM-kortet blir permanent ubrukelig.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"PIN-koden for SIM-kortet ble avvist."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"PUK-koden for SIM-kortet ble avvist."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Koden er godkjent."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Ingen tilkobling."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Bytt inndatametode"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Flymodus"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Du må tegne mønsteret etter at enheten har startet på nytt"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Du må skrive inn PIN-koden etter at enheten har startet på nytt"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Du må skrive inn passordet etter at enheten har startet på nytt"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Du må tegne mønsteret for ekstra sikkerhet"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Du må skrive inn PIN-koden for ekstra sikkerhet"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Du må skrive inn passordet for ekstra sikkerhet"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Du må tegne mønsteret når du bytter profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Du må skrive inn PIN-koden når du bytter profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Du må skrive inn passordet når du bytter profil"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Enhetsadministratoren har låst enheten"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Enheten ble låst manuelt"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Enheten har ikke blitt låst opp de siste <xliff:g id="NUMBER_1">%d</xliff:g> timene. Bekreft mønsteret.</item>
+ <item quantity="one">Enheten har ikke blitt låst opp på <xliff:g id="NUMBER_0">%d</xliff:g> time. Bekreft mønsteret.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Enheten har ikke blitt låst opp de siste <xliff:g id="NUMBER_1">%d</xliff:g> timene. Bekreft PIN-koden.</item>
+ <item quantity="one">Enheten har ikke blitt låst opp på <xliff:g id="NUMBER_0">%d</xliff:g> time. Bekreft PIN-koden.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Enheten har ikke blitt låst opp de siste <xliff:g id="NUMBER_1">%d</xliff:g> timene. Bekreft passordet.</item>
+ <item quantity="one">Enheten har ikke blitt låst opp på <xliff:g id="NUMBER_0">%d</xliff:g> time. Bekreft passordet.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ikke gjenkjent"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index b73db1d..b23909b 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"इनपुट विधि बटन स्विच गर्नुहोस्।"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"PIN कोड गलत छ।"</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_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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> सेकेन्डमा फेरि प्रयास गर्नुहोस्।"</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"आफ्नो ढाँचा कोर्नुहोस्"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM को PIN प्रविष्टि गर्नुहोस्"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"<xliff:g id="CARRIER">%1$s</xliff:g> को SIM PIN प्रविष्ट गर्नुहोस्"</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">"४ देखि ८ वटा नम्बर भएको एउटा PIN टाइप गर्नुहोस्।"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK कोड ८ वा सो भन्दा बढी नम्बरको हुनुपर्छ।"</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">"तपाईंले <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक गलत तरिकाले आफ्नो PIN प्रविष्ट गर्नुभएको छ। \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">"यन्त्र पुनः सुरु भएपछि PIN आवश्यक पर्दछ"</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="2438626748767361010">"यन्त्रको प्रशासकले यन्त्रलाई लक गरेको छ"</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml
index 5a16a77..0c37baf 100644
--- a/packages/SystemUI/res-keyguard/values-nl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Knop voor wijzigen invoermethode."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Toetsblokkering"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Typ pincode"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Typ de pukcode voor de simkaart en de nieuwe pincode"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Pukcode voor simkaart"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Nieuwe pincode voor simkaart"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Tik om wachtwoord te typen"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Typ het wachtwoord om te ontgrendelen"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Typ pincode om te ontgrendelen"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Onjuiste pincode."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Opgeladen"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Opladen"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Snel opladen"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Langzaam opladen"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Sluit de oplader aan."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Druk op Menu om te ontgrendelen."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Netwerk vergrendeld"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Geen simkaart"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Geen simkaart in tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Geen simkaart in telefoon."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Plaats een simkaart."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"De simkaart ontbreekt of kan niet worden gelezen. Plaats een simkaart."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Onbruikbare simkaart."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Je simkaart is definitief uitgeschakeld.\n Neem contact op met je mobiele serviceprovider voor een nieuwe simkaart."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"Simkaart is vergrendeld."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"Simkaart is vergrendeld met pukcode."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Simkaart ontgrendelen…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Gebied voor pincode"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Gebied voor pincode van simkaart"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Gebied voor pukcode van simkaart"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Volgende alarm ingesteld voor <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Patroon vergeten"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Onjuist patroon"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Onjuist wachtwoord"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Onjuiste pincode"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Probeer het over <xliff:g id="NUMBER">%d</xliff:g> seconden opnieuw."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Teken je patroon"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Geef de pincode van de simkaart op"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Geef de pincode op voor de simkaart van \'<xliff:g id="CARRIER">%1$s</xliff:g>\'"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Geef je pincode op"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Geef je wachtwoord op"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Neem contact op met de provider voor informatie."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"Simkaart van \'<xliff:g id="CARRIER">%1$s</xliff:g>\' is nu uitgeschakeld. Geef de pukcode op om door te gaan. Neem contact op met je provider voor meer informatie."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Geef de gewenste pincode op"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Gewenste pincode bevestigen"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Simkaart ontgrendelen…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Geef een pincode van vier tot acht cijfers op."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"De pukcode is minimaal acht cijfers lang."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Geef de juiste pukcode opnieuw op. Bij herhaalde pogingen wordt de simkaart definitief uitgeschakeld."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Pincodes komen niet overeen"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Te veel patroonpogingen"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Je hebt je pincode <xliff:g id="NUMBER_0">%1$d</xliff:g> keer onjuist getypt. \n\nProbeer het over <xliff:g id="NUMBER_1">%2$d</xliff:g> seconden opnieuw."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Je hebt je wachtwoord <xliff:g id="NUMBER_0">%1$d</xliff:g> keer onjuist getypt. \n\nProbeer het over <xliff:g id="NUMBER_1">%2$d</xliff:g> seconden opnieuw."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Je hebt je ontgrendelingspatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer onjuist getekend. \n\nProbeer het over <xliff:g id="NUMBER_1">%2$d</xliff:g> seconden opnieuw."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Je hebt <xliff:g id="NUMBER_0">%1$d</xliff:g> mislukte pogingen ondernomen om de tablet te ontgrendelen. Na nog eens <xliff:g id="NUMBER_1">%2$d</xliff:g> mislukte pogingen wordt deze tablet gereset, waardoor alle gegevens worden verwijderd."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Je hebt <xliff:g id="NUMBER_0">%1$d</xliff:g> mislukte pogingen ondernomen om de telefoon te ontgrendelen. Na nog eens <xliff:g id="NUMBER_1">%2$d</xliff:g> mislukte pogingen wordt deze telefoon gereset, waardoor alle gegevens worden verwijderd."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Je hebt <xliff:g id="NUMBER">%d</xliff:g> mislukte pogingen ondernomen om de tablet te ontgrendelen. Deze tablet wordt gereset, waardoor alle gegevens worden verwijderd."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Je hebt <xliff:g id="NUMBER">%d</xliff:g> mislukte pogingen ondernomen om de telefoon te ontgrendelen. Deze telefoon wordt gereset, waardoor alle gegevens worden verwijderd."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Je hebt <xliff:g id="NUMBER_0">%1$d</xliff:g> mislukte pogingen ondernomen om de tablet te ontgrendelen. Na nog eens <xliff:g id="NUMBER_1">%2$d</xliff:g> mislukte pogingen wordt deze gebruiker verwijderd, waardoor alle gebruikersgegevens worden verwijderd."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Je hebt <xliff:g id="NUMBER_0">%1$d</xliff:g> mislukte pogingen ondernomen om de telefoon te ontgrendelen. Na nog eens <xliff:g id="NUMBER_1">%2$d</xliff:g> mislukte pogingen wordt deze gebruiker verwijderd, waardoor alle gebruikersgegevens worden verwijderd."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Je hebt <xliff:g id="NUMBER">%d</xliff:g> mislukte pogingen ondernomen om de tablet te ontgrendelen. Deze gebruiker wordt verwijderd, waardoor alle gebruikersgegevens worden verwijderd."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Je hebt <xliff:g id="NUMBER">%d</xliff:g> mislukte pogingen ondernomen om de telefoon te ontgrendelen. Deze gebruiker wordt verwijderd, waardoor alle gebruikersgegevens worden verwijderd."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Je hebt <xliff:g id="NUMBER_0">%1$d</xliff:g> mislukte pogingen ondernomen om de tablet te ontgrendelen. Na nog eens <xliff:g id="NUMBER_1">%2$d</xliff:g> mislukte pogingen wordt het werkprofiel verwijderd, waardoor alle profielgegevens worden verwijderd."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Je hebt <xliff:g id="NUMBER_0">%1$d</xliff:g> mislukte pogingen ondernomen om de telefoon te ontgrendelen. Na nog eens <xliff:g id="NUMBER_1">%2$d</xliff:g> mislukte pogingen wordt het werkprofiel verwijderd, waardoor alle profielgegevens worden verwijderd."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Je hebt <xliff:g id="NUMBER">%d</xliff:g> mislukte pogingen ondernomen om de tablet te ontgrendelen. Het werkprofiel wordt verwijderd, waardoor alle profielgegevens worden verwijderd."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Je hebt <xliff:g id="NUMBER">%d</xliff:g> mislukte pogingen ondernomen om de telefoon te ontgrendelen. Het werkprofiel wordt verwijderd, waardoor alle profielgegevens worden verwijderd."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Je hebt je ontgrendelingspatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer onjuist getekend. Na nog eens <xliff:g id="NUMBER_1">%2$d</xliff:g> mislukte pogingen wordt je gevraagd je tablet te ontgrendelen via een e-mailaccount.\n\n Probeer het over <xliff:g id="NUMBER_2">%3$d</xliff:g> seconden opnieuw."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Je hebt je ontgrendelingspatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer onjuist getekend. Na nog eens <xliff:g id="NUMBER_1">%2$d</xliff:g> mislukte pogingen wordt je gevraagd je telefoon te ontgrendelen via een e-mailaccount.\n\n Probeer het over <xliff:g id="NUMBER_2">%3$d</xliff:g> seconden opnieuw."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Onjuiste pincode voor simkaart. Je moet nu contact opnemen met je provider om je apparaat te ontgrendelen."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Onjuiste pincode voor simkaart. Je hebt nog <xliff:g id="NUMBER_1">%d</xliff:g> pogingen over.</item>
+ <item quantity="one">Onjuiste pincode voor simkaart. Je hebt nog <xliff:g id="NUMBER_0">%d</xliff:g> poging over voordat je contact met je provider moet opnemen om je apparaat te ontgrendelen.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"Simkaart is onbruikbaar. Neem contact op met je provider."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Onjuiste pukcode voor simkaart. Je hebt nog <xliff:g id="NUMBER_1">%d</xliff:g> pogingen over voordat de simkaart definitief onbruikbaar wordt.</item>
+ <item quantity="one">Onjuiste pukcode voor simkaart. Je hebt nog <xliff:g id="NUMBER_0">%d</xliff:g> poging over voordat de simkaart definitief onbruikbaar wordt.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Bewerking met pincode voor simkaart is mislukt."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Bewerking met pukcode voor simkaart is mislukt."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Code geaccepteerd."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Geen service."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Invoermethode wijzigen"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Vliegtuigmodus"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Patroon vereist nadat het apparaat opnieuw is opgestart"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Pincode vereist nadat het apparaat opnieuw is opgestart"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Wachtwoord vereist nadat het apparaat opnieuw is opgestart"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Patroon vereist voor extra beveiliging"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Pincode vereist voor extra beveiliging"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Wachtwoord vereist voor extra beveiliging"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Patroon is vereist wanneer je schakelt tussen profielen"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Pincode is vereist wanneer je schakelt tussen profielen"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Wachtwoord is vereist wanneer je schakelt tussen profielen"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Apparaatbeheerder heeft apparaat vergrendeld"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Apparaat is handmatig vergrendeld"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Apparaat is al <xliff:g id="NUMBER_1">%d</xliff:g> uur niet ontgrendeld. Bevestig het patroon.</item>
+ <item quantity="one">Apparaat is al <xliff:g id="NUMBER_0">%d</xliff:g> uur niet ontgrendeld. Bevestig het patroon.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Apparaat is al <xliff:g id="NUMBER_1">%d</xliff:g> uur niet ontgrendeld. Bevestig de pincode.</item>
+ <item quantity="one">Apparaat is al <xliff:g id="NUMBER_0">%d</xliff:g> uur niet ontgrendeld. Bevestig de pincode.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Apparaat is al <xliff:g id="NUMBER_1">%d</xliff:g> uur niet ontgrendeld. Bevestig het wachtwoord.</item>
+ <item quantity="one">Apparaat is al <xliff:g id="NUMBER_0">%d</xliff:g> uur niet ontgrendeld. Bevestig het wachtwoord.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Niet herkend"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index 00e472c..6a4c80b 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"ਇਨਪੁਟ ਵਿਧੀ ਬਟਨ ਸਵਿਚ ਕਰੋ।"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"ਗਲਤ PIN ਕੋਡ।"</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_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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ਆਪਣਾ ਪੈਟਰਨ ਉਲੀਕੋ"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM PIN ਦਾਖਲ ਕਰੋ"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ਲਈ SIM PIN ਦਾਖਲ ਕਰੋ"</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">"ਕੋਈ PIN ਟਾਈਪ ਕਰੋ ਜੋ 4 ਤੋਂ 8 ਨੰਬਰਾਂ ਦਾ ਹੋਵੇ।"</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="one">ਗਲਤ SIM PIN ਕੋਡ, ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ ਬਾਕੀ ਹੈ।</item>
+ <item quantity="other">ਗਲਤ SIM PIN ਕੋਡ, ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਕੀ ਹਨ।</item>
+ </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="one">ਗਲਤ SIM PUK ਕੋਡ, ਇਸਤੋਂ ਪਹਿਲਾਂ ਕਿ SIM ਸਥਾਈ ਤੌਰ \'ਤੇ ਵਰਤਣਯੋਗ ਨਾ ਰਹੇ, ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ ਬਾਕੀ ਹੈ।</item>
+ <item quantity="other">ਗਲਤ SIM PUK ਕੋਡ, ਇਸਤੋਂ ਪਹਿਲਾਂ ਕਿ SIM ਸਥਾਈ ਤੌਰ \'ਤੇ ਵਰਤਣਯੋਗ ਨਾ ਰਹੇ, ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਕੀ ਹਨ।</item>
+ </plurals>
+ <string name="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">"ਡੀਵਾਈਸ ਦੇ ਮੁੜ-ਚਾਲੂ ਹੋਣ \'ਤੇ PIN ਦੀ ਲੋੜ ਹੈ"</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="2438626748767361010">"ਡੀਵਾਈਸ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਡੀਵਾਈਸ ਨੂੰ ਲੌਕ ਕੀਤਾ"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"ਡੀਵਾਈਸ ਨੂੰ ਹੱਥੀਂ ਲੌਕ ਕੀਤਾ ਗਿਆ"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">ਡੀਵਾਈਸ <xliff:g id="NUMBER_1">%d</xliff:g> ਘੰਟੇ ਤੋਂ ਅਨਲੌਕ ਨਹੀਂ ਕੀਤੀ ਗਈ ਹੈ। ਪੈਟਰਨ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ।</item>
+ <item quantity="other">ਡੀਵਾਈਸ <xliff:g id="NUMBER_1">%d</xliff:g> ਘੰਟਿਆਂ ਤੋਂ ਅਨਲੌਕ ਨਹੀਂ ਕੀਤੀ ਗਈ ਹੈ। ਪੈਟਰਨ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ।</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">ਡੀਵਾਈਸ <xliff:g id="NUMBER_1">%d</xliff:g> ਘੰਟੇ ਤੋਂ ਅਨਲੌਕ ਨਹੀਂ ਕੀਤੀ ਗਈ ਹੈ। PIN ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ।</item>
+ <item quantity="other">ਡੀਵਾਈਸ <xliff:g id="NUMBER_1">%d</xliff:g> ਘੰਟਿਆਂ ਤੋਂ ਅਨਲੌਕ ਨਹੀਂ ਕੀਤੀ ਗਈ ਹੈ। PIN ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ।</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">ਡੀਵਾਈਸ <xliff:g id="NUMBER_1">%d</xliff:g> ਘੰਟੇ ਤੋਂ ਅਨਲੌਕ ਨਹੀਂ ਕੀਤੀ ਗਈ ਹੈ। ਪਾਸਵਰਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ।</item>
+ <item quantity="other">ਡੀਵਾਈਸ <xliff:g id="NUMBER_1">%d</xliff:g> ਘੰਟਿਆਂ ਤੋਂ ਅਨਲੌਕ ਨਹੀਂ ਕੀਤੀ ਗਈ ਹੈ। ਪਾਸਵਰਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ।</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml
index 1b8f6f0..a5204ac 100644
--- a/packages/SystemUI/res-keyguard/values-pl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml
@@ -20,186 +20,123 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Przycisk przełączania metody wprowadzania."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Blokada klawiszy"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Wpisz kod PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Wpisz kod PUK i nowy kod PIN karty SIM"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Kod PUK karty SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Nowy kod PIN karty SIM"</string>
+ <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>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Nieprawidłowy kod PIN."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Naładowana"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Ładowanie"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Szybkie ładowanie"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Wolne ładowanie"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Podłącz ładowarkę."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Naciśnij Menu, aby odblokować."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Sieć zablokowana"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Brak karty SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Brak karty SIM w tablecie."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Brak karty SIM w telefonie."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Włóż kartę SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Brak karty SIM lub nie można jej odczytać. Włóż kartę SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Karta SIM jest zablokowana."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Karta SIM jest trwale wyłączona.\n Skontaktuj się z dostawcą usług bezprzewodowych, by otrzymać inną kartę SIM."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"Karta SIM jest zablokowana."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"Karta SIM jest zablokowana kodem PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Odblokowuję kartę SIM…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Miejsce na kod PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Miejsce na kod PIN karty SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Miejsce na kod PUK karty SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Następny alarm ustawiony na: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Usuwanie"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Nie pamiętam wzoru"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Nieprawidłowy wzór"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Nieprawidłowe hasło"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Nieprawidłowy kod PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> s."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Narysuj wzór"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Wpisz kod PIN karty SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Wpisz kod PIN karty SIM „<xliff:g id="CARRIER">%1$s</xliff:g>”"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Wpisz kod PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Wpisz hasło"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Skontaktuj się z operatorem, by uzyskać więcej informacji."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"Karta SIM „<xliff:g id="CARRIER">%1$s</xliff:g>” została wyłączona. Wpisz kod PUK, by przejść dalej. Skontaktuj się z operatorem, by uzyskać więcej informacji."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Podaj wybrany kod PIN"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Potwierdź wybrany kod PIN"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Odblokowuję kartę SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Wpisz kod PIN o długości od 4 do 8 cyfr."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"Kod PUK musi mieć co najmniej 8 cyfr."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Wpisz poprawny kod PUK. Kolejne próby spowodują trwałe wyłączenie karty SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Kody PIN nie pasują"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Zbyt wiele prób narysowania wzoru"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> wpisałeś nieprawidłowy kod PIN. \n\nSpróbuj ponownie za <xliff:g id="NUMBER_1">%2$d</xliff:g> s."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> wpisałeś nieprawidłowe hasło. \n\nSpróbuj ponownie za <xliff:g id="NUMBER_1">%2$d</xliff:g> s."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> nieprawidłowo narysowałeś wzór odblokowania. \n\nSpróbuj ponownie za <xliff:g id="NUMBER_1">%2$d</xliff:g> s."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach tablet zostanie zresetowany, co spowoduje skasowanie wszystkich jego danych."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach telefon zostanie zresetowany, co spowoduje skasowanie wszystkich jego danych."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Tablet zostanie zresetowany, co spowoduje skasowanie wszystkich jego danych."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Telefon zostanie zresetowany, co spowoduje skasowanie wszystkich jego danych."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach użytkownik zostanie usunięty, co spowoduje skasowanie wszystkich danych użytkownika."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach użytkownik zostanie usunięty, co spowoduje skasowanie wszystkich danych użytkownika."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Użytkownik zostanie usunięty, co spowoduje skasowanie wszystkich danych użytkownika."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Użytkownik zostanie usunięty, co spowoduje skasowanie wszystkich danych użytkownika."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> nieprawidłowo narysowałeś wzór odblokowania. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach konieczne będzie odblokowanie tabletu przy użyciu konta e-mail.\n\n Spróbuj ponownie za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> nieprawidłowo narysowałeś wzór odblokowania. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach konieczne będzie odblokowanie telefonu przy użyciu konta e-mail.\n\n Spróbuj ponownie za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Nieprawidłowy kod PIN karty SIM. Musisz teraz skontaktować się z operatorem, by odblokował Twoje urządzenie."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="few">Nieprawidłowy kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER_1">%d</xliff:g> próby.</item>
+ <item quantity="many">Nieprawidłowy kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER_1">%d</xliff:g> prób.</item>
+ <item quantity="other">Nieprawidłowy kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER_1">%d</xliff:g> próby.</item>
+ <item quantity="one">Nieprawidłowy kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER_0">%d</xliff:g> próbę, zanim będziesz musiał skontaktować się z operatorem, by odblokował Twoje urządzenie.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"Karta SIM została trwale zablokowana. Skontaktuj się z operatorem."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="few">Nieprawidłowy kod PUK karty SIM. Masz jeszcze <xliff:g id="NUMBER_1">%d</xliff:g> próby, zanim karta SIM zostanie trwale zablokowana.</item>
+ <item quantity="many">Nieprawidłowy kod PUK karty SIM. Masz jeszcze <xliff:g id="NUMBER_1">%d</xliff:g> prób, zanim karta SIM zostanie trwale zablokowana.</item>
+ <item quantity="other">Nieprawidłowy kod PUK karty SIM. Masz jeszcze <xliff:g id="NUMBER_1">%d</xliff:g> próby, zanim karta SIM zostanie trwale zablokowana.</item>
+ <item quantity="one">Nieprawidłowy kod PUK karty SIM. Masz jeszcze <xliff:g id="NUMBER_0">%d</xliff:g> próbę, zanim karta SIM zostanie trwale zablokowana.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Operacja z kodem PIN karty SIM nie udała się."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Operacja z kodem PUK karty SIM nie udała się."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kod został zaakceptowany."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Brak usługi."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Przełączanie metody wprowadzania"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Tryb samolotowy"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Po ponownym uruchomieniu urządzenia wymagany jest wzór"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Po ponownym uruchomieniu urządzenia wymagany jest kod PIN"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Po ponownym uruchomieniu urządzenia wymagane jest hasło"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Dla większego bezpieczeństwa musisz narysować wzór"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Dla większego bezpieczeństwa musisz podać kod PIN"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Dla większego bezpieczeństwa musisz podać hasło"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Po przełączeniu profili wymagany jest wzór"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Po przełączeniu profili wymagany jest kod PIN"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Po przełączeniu profili wymagane jest hasło"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Urządzenie zostało zablokowane przez administratora"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Urządzenie zostało zablokowane ręcznie"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="few">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_1">%d</xliff:g> godzin. Potwierdź wzór.</item>
+ <item quantity="many">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_1">%d</xliff:g> godzin. Potwierdź wzór.</item>
+ <item quantity="other">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_1">%d</xliff:g> godziny. Potwierdź wzór.</item>
+ <item quantity="one">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_0">%d</xliff:g> godziny. Potwierdź wzór.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="few">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_1">%d</xliff:g> godzin. Potwierdź kod PIN.</item>
+ <item quantity="many">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_1">%d</xliff:g> godzin. Potwierdź kod PIN.</item>
+ <item quantity="other">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_1">%d</xliff:g> godziny. Potwierdź kod PIN.</item>
+ <item quantity="one">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_0">%d</xliff:g> godziny. Potwierdź kod PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="few">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_1">%d</xliff:g> godzin. Potwierdź hasło.</item>
+ <item quantity="many">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_1">%d</xliff:g> godzin. Potwierdź hasło.</item>
+ <item quantity="other">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_1">%d</xliff:g> godziny. Potwierdź hasło.</item>
+ <item quantity="one">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_0">%d</xliff:g> godziny. Potwierdź hasło.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nie rozpoznano"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
index f274be3..13f5ff9 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Alterar botão do método de entrada."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Bloqueio do teclado"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Insira o código PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Digite o PUK do SIM e o novo código PIN."</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Código PUK do SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Novo código PIN do SIM"</string>
+ <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>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Código PIN incorreto."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Carregada"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Carregando"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Carregando rapidamente"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Carregando lentamente"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Conecte o seu carregador."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Pressione Menu para desbloquear."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Rede bloqueada"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Sem cartão SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Não há um cartão SIM no tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Não há um cartão SIM no smartphone."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Insira um cartão SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"O cartão SIM não foi inserido ou não é possível lê-lo. Insira um cartão SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Cartão SIM inutilizável."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"O cartão SIM foi desativado permanentemente.\nEntre em contato com seu provedor de serviços sem fio para receber outro cartão SIM."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"O cartão SIM está bloqueado."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"O cartão SIM está bloqueado pelo PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Desbloqueando o cartão SIM…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Área do PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Área do PIN SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Área do PUK SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Próximo alarme definido para <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Excluir"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Inserir"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Esqueci o padrão"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Padrão incorreto"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Senha incorreta"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"PIN incorreto"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundos."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Desenhe seu padrão"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Digite o PIN do cartão SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Informe o PIN do SIM para \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Digite o PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Digite a senha"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"O SIM foi desativado. Insira o código PUK para continuar. Entre em contato com a operadora para mais detalhes."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"O SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" foi desativado. Informe o código PUK para continuar. Entre em contato com a operadora para saber mais detalhes."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Digite o código PIN desejado"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Confirme o código PIN desejado"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Desbloqueando o cartão SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Digite um PIN com 4 a 8 números."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"O código PUK deve ter oito números ou mais."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Introduza novamente o código PUK correto. Muitas tentativas malsucedidas desativarão permanentemente o SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Os códigos PIN não coincidem"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Muitas tentativas de padrão"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Você digitou seu PIN incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente em <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Você digitou sua senha incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente em <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Você desenhou sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente em <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Você tentou desbloquear o tablet incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, este smartphone será redefinido, o que excluirá todos os dados dele."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, este smartphone será redefinido, o que excluirá todos os dados dele."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Você tentou desbloquear o tablet incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. Este tablet será redefinido, o que excluirá todos os dados dele."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. Este smartphone será redefinido, o que excluirá todos os dados dele."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Você tentou desbloquear o tablet incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, este usuário será removido, o que excluirá todos os dados do usuário."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, este usuário será removido, o que excluirá todos os dados do usuário."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Você tentou desbloquear o tablet incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. Este usuário será removido, o que excluirá todos os dados do usuário."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. Este usuário será removido, o que excluirá todos os dados do usuário."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Você tentou desbloquear o tablet incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, o perfil de trabalho será removido, o que excluirá todos os dados do perfil."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, o perfil de trabalho será removido, o que excluirá todos os dados do perfil."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Você tentou desbloquear o tablet incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que excluirá todos os dados do perfil."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que excluirá todos os dados do perfil."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Você desenhou sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, será solicitado que você use o login do Google para desbloquear seu tablet.\n\n Tente novamente em <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Você desenhou sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, será solicitado que você use o login do Google para desbloquear.\n\n Tente novamente em <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Código PIN do SIM incorreto. Entre em contato com a operadora para desbloquear o dispositivo."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Código PIN do SIM incorreto. Tentativas restantes: <xliff:g id="NUMBER_1">%d</xliff:g>.</item>
+ <item quantity="other">Código PIN do SIM incorreto. Tentativas restantes: <xliff:g id="NUMBER_1">%d</xliff:g>.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"O SIM está inutilizável. Entre em contato com a operadora."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">Código PUK do SIM incorreto. Tentativas restantes: <xliff:g id="NUMBER_1">%d</xliff:g>. Caso o código correto não seja digitado, o SIM se tornará permanentemente inutilizável.</item>
+ <item quantity="other">Código PUK do SIM incorreto. Tentativas restantes: <xliff:g id="NUMBER_1">%d</xliff:g>. Caso o código correto não seja digitado, o SIM se tornará permanentemente inutilizável.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Falha na operação de PIN do SIM."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Falha na operação de PUK do SIM."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Código aceito."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Sem serviço."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Alterar o método de entrada"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Modo avião"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"O padrão é exigido após a reinicialização do dispositivo"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"O PIN é exigido após a reinicialização do dispositivo"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"A senha é exigida após a reinicialização do dispositivo"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"O padrão é necessário para aumentar a segurança"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"O PIN é necessário para aumentar a segurança"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"A senha é necessária para aumentar a segurança"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"O padrão é exigido quando você troca de perfil"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"O PIN é exigido quando você troca de perfil"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"A senha é exigida quando você troca de perfil"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"O dispositivo foi bloqueado pelo administrador"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"O dispositivo foi bloqueado manualmente"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> hora. Confirme o padrão.</item>
+ <item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o padrão.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> hora. Confirme o PIN.</item>
+ <item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> hora. Confirme a senha.</item>
+ <item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme a senha.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Não reconhecido"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
index bb724ba..14cf00f 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Alternar botão de método de introdução."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Introduza o código PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Introduza o PUK do cartão SIM e o novo código PIN"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Código PUK do cartão SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Novo código PIN do cartão SIM"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Toque p/ introd. palavra-passe"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Introduza a palavra-passe para desbloquear"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Introduza o PIN para desbloquear"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Código PIN incorreto."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Carregada"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"A carregar…"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"A carregar rapidamente…"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"A carregar lentamente…"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Ligue o carregador."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Prima Menu para desbloquear."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Rede bloqueada"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Nenhum cartão SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Nenhum cartão SIM no tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Nenhum cartão SIM no telemóvel."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Insira um cartão SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"O cartão SIM está em falta ou não é legível. Insira um cartão SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Cartão SIM inutilizável."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"O cartão SIM foi desativado definitivamente.\n Contacte o seu fornecedor de serviços de rede sem fios para obter outro cartão SIM."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"O cartão SIM está bloqueado."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"O cartão SIM está bloqueado pelo PUK"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"A desbloquear o cartão SIM…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Área do PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Área do PIN do cartão SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Área do PUK do cartão SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Próximo alarme definido para <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Eliminar"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Tecla Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Esqueceu-se do padrão"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Padrão incorreto"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Palavra-passe incorreta"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"PIN incorreto"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Tente novamente dentro de <xliff:g id="NUMBER">%d</xliff:g> segundos."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Desenhe o seu padrão"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Introduza o PIN do cartão SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Introduza o PIN do cartão SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Introduza o PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Introduza a palavra-passe"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"O cartão SIM está agora desativado. Introduza o código PUK para continuar. Contacte o operador para obter mais detalhes."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"O cartão SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" está agora desativado. Introduza o código PUK para continuar. Contacte o operador para obter mais detalhes."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Introduza o código PIN pretendido"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Confirme o código PIN pretendido"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"A desbloquear o cartão SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Introduza um PIN com 4 a 8 números."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"O código PUK deve ter 8 ou mais números."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Volte a introduzir o código PUK correto. Demasiadas tentativas consecutivas irão desativar permanentemente o cartão SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Os códigos PIN não coincidem"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Demasiadas tentativas para desenhar o padrão"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Introduziu o PIN incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Introduziu a palavra-passe incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Desenhou a sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Tentou desbloquear incorretamente o tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, este tablet será reposto, o que eliminará todos os dados do mesmo."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Tentou desbloquear incorretamente o telemóvel <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, este telemóvel será reposto, o que eliminará todos os dados do mesmo."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Tentou desbloquear incorretamente o tablet <xliff:g id="NUMBER">%d</xliff:g> vezes. Este tablet será reposto, o que eliminará todos os dados do mesmo."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Tentou desbloquear incorretamente o telemóvel <xliff:g id="NUMBER">%d</xliff:g> vezes. Este telemóvel será reposto, o que eliminará todos os dados do mesmo."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Tentou desbloquear incorretamente o tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, este utilizador será removido, o que eliminará todos os dados do mesmo."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Tentou desbloquear incorretamente o telemóvel <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, este utilizador será removido, o que eliminará todos os dados do mesmo."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Tentou desbloquear incorretamente o tablet <xliff:g id="NUMBER">%d</xliff:g> vezes. Este utilizador será removido, o que eliminará todos os dados do mesmo."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Tentou desbloquear incorretamente o telemóvel <xliff:g id="NUMBER">%d</xliff:g> vezes. Este utilizador será removido, o que eliminará todos os dados do mesmo."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Tentou desbloquear incorretamente o tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, o perfil de trabalho será removido, o que eliminará todos os dados do mesmo."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Tentou desbloquear incorretamente o telemóvel <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, o perfil de trabalho será removido, o que eliminará todos os dados do mesmo."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Tentou desbloquear incorretamente o tablet <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que eliminará todos os dados do mesmo."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Tentou desbloquear incorretamente o telemóvel <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que eliminará todos os dados do mesmo."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Código PIN do cartão SIM incorreto. Tem de contactar o seu operador para desbloquear o dispositivo."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Código PIN do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas.</item>
+ <item quantity="one">Código PIN do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_0">%d</xliff:g> tentativa antes de precisar de contactar o seu operador para desbloquear o dispositivo.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"Cartão SIM inutilizável. Contacte o seu operador."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Código PUK do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar permanentemente inutilizável.</item>
+ <item quantity="one">Código PUK do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_0">%d</xliff:g> tentativa antes de o cartão SIM ficar permanentemente inutilizável.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Falha ao introduzir o PIN do cartão SIM!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Falha ao introduzir o PUK do cartão SIM!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Código aceite!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Sem serviço."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Alternar o método de introdução"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Modo de avião"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"É necessário um padrão após reiniciar o dispositivo"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"É necessário um PIN após reiniciar o dispositivo"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"É necessária uma palavra-passe após reiniciar o dispositivo"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Para segurança adicional, é necessário um padrão"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Para segurança adicional, é necessário um PIN"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Para segurança adicional, é necessária uma palavra-passe"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"É necessário um padrão quando muda de perfil"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"É necessário um PIN quando muda de perfil"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"É necessária uma palavra-passe quando muda de perfil"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Dispositivo bloqueado pelo respetivo administrador"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"O dispositivo foi bloqueado manualmente"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o padrão.</item>
+ <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirme o padrão.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o PIN.</item>
+ <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirme o PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme a palavra-passe.</item>
+ <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirme a palavra-passe.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Não reconhecido"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml
index f274be3..13f5ff9 100644
--- a/packages/SystemUI/res-keyguard/values-pt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Alterar botão do método de entrada."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Bloqueio do teclado"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Insira o código PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Digite o PUK do SIM e o novo código PIN."</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Código PUK do SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Novo código PIN do SIM"</string>
+ <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>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Código PIN incorreto."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Carregada"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Carregando"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Carregando rapidamente"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Carregando lentamente"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Conecte o seu carregador."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Pressione Menu para desbloquear."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Rede bloqueada"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Sem cartão SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Não há um cartão SIM no tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Não há um cartão SIM no smartphone."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Insira um cartão SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"O cartão SIM não foi inserido ou não é possível lê-lo. Insira um cartão SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Cartão SIM inutilizável."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"O cartão SIM foi desativado permanentemente.\nEntre em contato com seu provedor de serviços sem fio para receber outro cartão SIM."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"O cartão SIM está bloqueado."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"O cartão SIM está bloqueado pelo PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Desbloqueando o cartão SIM…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Área do PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Área do PIN SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Área do PUK SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Próximo alarme definido para <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Excluir"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Inserir"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Esqueci o padrão"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Padrão incorreto"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Senha incorreta"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"PIN incorreto"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundos."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Desenhe seu padrão"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Digite o PIN do cartão SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Informe o PIN do SIM para \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Digite o PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Digite a senha"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"O SIM foi desativado. Insira o código PUK para continuar. Entre em contato com a operadora para mais detalhes."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"O SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" foi desativado. Informe o código PUK para continuar. Entre em contato com a operadora para saber mais detalhes."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Digite o código PIN desejado"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Confirme o código PIN desejado"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Desbloqueando o cartão SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Digite um PIN com 4 a 8 números."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"O código PUK deve ter oito números ou mais."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Introduza novamente o código PUK correto. Muitas tentativas malsucedidas desativarão permanentemente o SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Os códigos PIN não coincidem"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Muitas tentativas de padrão"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Você digitou seu PIN incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente em <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Você digitou sua senha incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente em <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Você desenhou sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente em <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Você tentou desbloquear o tablet incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, este smartphone será redefinido, o que excluirá todos os dados dele."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, este smartphone será redefinido, o que excluirá todos os dados dele."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Você tentou desbloquear o tablet incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. Este tablet será redefinido, o que excluirá todos os dados dele."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. Este smartphone será redefinido, o que excluirá todos os dados dele."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Você tentou desbloquear o tablet incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, este usuário será removido, o que excluirá todos os dados do usuário."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, este usuário será removido, o que excluirá todos os dados do usuário."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Você tentou desbloquear o tablet incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. Este usuário será removido, o que excluirá todos os dados do usuário."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. Este usuário será removido, o que excluirá todos os dados do usuário."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Você tentou desbloquear o tablet incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, o perfil de trabalho será removido, o que excluirá todos os dados do perfil."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, o perfil de trabalho será removido, o que excluirá todos os dados do perfil."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Você tentou desbloquear o tablet incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que excluirá todos os dados do perfil."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que excluirá todos os dados do perfil."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Você desenhou sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, será solicitado que você use o login do Google para desbloquear seu tablet.\n\n Tente novamente em <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Você desenhou sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, será solicitado que você use o login do Google para desbloquear.\n\n Tente novamente em <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Código PIN do SIM incorreto. Entre em contato com a operadora para desbloquear o dispositivo."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Código PIN do SIM incorreto. Tentativas restantes: <xliff:g id="NUMBER_1">%d</xliff:g>.</item>
+ <item quantity="other">Código PIN do SIM incorreto. Tentativas restantes: <xliff:g id="NUMBER_1">%d</xliff:g>.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"O SIM está inutilizável. Entre em contato com a operadora."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">Código PUK do SIM incorreto. Tentativas restantes: <xliff:g id="NUMBER_1">%d</xliff:g>. Caso o código correto não seja digitado, o SIM se tornará permanentemente inutilizável.</item>
+ <item quantity="other">Código PUK do SIM incorreto. Tentativas restantes: <xliff:g id="NUMBER_1">%d</xliff:g>. Caso o código correto não seja digitado, o SIM se tornará permanentemente inutilizável.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Falha na operação de PIN do SIM."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Falha na operação de PUK do SIM."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Código aceito."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Sem serviço."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Alterar o método de entrada"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Modo avião"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"O padrão é exigido após a reinicialização do dispositivo"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"O PIN é exigido após a reinicialização do dispositivo"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"A senha é exigida após a reinicialização do dispositivo"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"O padrão é necessário para aumentar a segurança"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"O PIN é necessário para aumentar a segurança"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"A senha é necessária para aumentar a segurança"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"O padrão é exigido quando você troca de perfil"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"O PIN é exigido quando você troca de perfil"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"A senha é exigida quando você troca de perfil"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"O dispositivo foi bloqueado pelo administrador"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"O dispositivo foi bloqueado manualmente"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> hora. Confirme o padrão.</item>
+ <item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o padrão.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> hora. Confirme o PIN.</item>
+ <item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> hora. Confirme a senha.</item>
+ <item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme a senha.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Não reconhecido"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml
index 5b19f8c..af5c85da 100644
--- a/packages/SystemUI/res-keyguard/values-ro/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml
@@ -20,186 +20,118 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Buton pentru comutarea metodei de introducere."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Blocare tastatură"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Introduceți codul PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Introduceți codul PUK pentru cardul SIM și noul cod PIN"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Codul PUK pentru cardul SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Cod PIN nou pentru cardul SIM"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Atingeți și introduceți parola"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Introduceți parola pentru a debloca"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Introduceți codul PIN pentru a debloca"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Cod PIN incorect."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Încărcată"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Se încarcă"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Se încarcă rapid"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Se încarcă lent"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Conectați încărcătorul."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Apăsați pe Meniu pentru a debloca."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Rețea blocată"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Niciun card SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Nu există card SIM în tabletă."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Nu există card SIM în telefon."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Introduceți un card SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Cardul SIM lipsește sau nu poate fi citit. Introduceți un card SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Card SIM inutilizabil."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Cardul dvs. SIM este dezactivat definitiv.\n Contactați furnizorul de servicii wireless pentru a obține un alt card SIM."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"Cardul SIM este blocat."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"Cardul SIM este blocat cu codul PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Se deblochează cardul SIM…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Zona codului PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Zona codului PIN pentru cardul SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Zona codului PUK pentru cardul SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Următoarea alarmă este setată pentru <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Ștergeți"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Introduceți"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Ați uitat modelul"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Model greșit"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Parolă greșită"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Cod PIN greșit"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Încercați din nou peste <xliff:g id="NUMBER">%d</xliff:g> secunde."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Desenați modelul"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Introduceți codul PIN al cardului SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Introduceți codul PIN al cardului SIM pentru „<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Introduceți codul PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Introduceți parola"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Cardul SIM este acum dezactivat. Pentru a continua, introduceți codul PUK. Pentru detalii, contactați operatorul."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"Cardul SIM „<xliff:g id="CARRIER">%1$s</xliff:g>\" este acum dezactivat. Pentru a continua, introduceți codul PUK. Pentru detalii, contactați operatorul."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Introduceți codul PIN dorit"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Confirmați codul PIN dorit"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Se deblochează cardul SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Introduceți un cod PIN alcătuit din 4 până la 8 cifre."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"Codul PUK trebuie să aibă minimum 8 cifre."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Reintroduceți codul PUK corect. Încercările repetate vor dezactiva definitiv cardul SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Codurile PIN nu coincid"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Prea multe încercări de desenare a modelului"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Ați introdus incorect codul PIN de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori.\n\nÎncercați din nou peste <xliff:g id="NUMBER_1">%2$d</xliff:g> secunde."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Ați introdus incorect parola de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. \n\nÎncercați din nou peste <xliff:g id="NUMBER_1">%2$d</xliff:g> secunde."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Ați desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. \n\nÎncercați din nou peste <xliff:g id="NUMBER_1">%2$d</xliff:g> secunde."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Ați efectuat <xliff:g id="NUMBER_0">%1$d</xliff:g> încercări incorecte de deblocare a tabletei. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, această tabletă va fi resetată, iar toate datele acesteia vor fi șterse."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Ați efectuat <xliff:g id="NUMBER_0">%1$d</xliff:g> încercări incorecte de deblocare a telefonului. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, acest telefon va fi resetat, iar toate datele acestuia vor fi șterse."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Ați efectuat <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a tabletei. Această tabletă va fi resetată, iar toate datele acesteia vor fi șterse."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Ați efectuat <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a telefonului. Acest telefon va fi resetat, iar toate datele acestuia vor fi șterse."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Ați efectuat <xliff:g id="NUMBER_0">%1$d</xliff:g> încercări incorecte de deblocare a tabletei. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Ați efectuat <xliff:g id="NUMBER_0">%1$d</xliff:g> încercări incorecte de deblocare a telefonului. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Ați efectuat <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a tabletei. Acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Ați efectuat <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a telefonului. Acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Ați efectuat <xliff:g id="NUMBER_0">%1$d</xliff:g> încercări incorecte de deblocare a tabletei. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Ați efectuat <xliff:g id="NUMBER_0">%1$d</xliff:g> încercări incorecte de deblocare a telefonului. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Ați efectuat <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a tabletei. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Ați efectuat <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a telefonului. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Ați desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste <xliff:g id="NUMBER_2">%3$d</xliff:g> secunde."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Ați desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, vi se va solicita să deblocați telefonul cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste <xliff:g id="NUMBER_2">%3$d</xliff:g> secunde."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Codul PIN pentru cardul SIM este incorect. Contactați operatorul pentru a vă debloca dispozitivul."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="few">Codul PIN pentru cardul SIM este incorect. V-au mai rămas <xliff:g id="NUMBER_1">%d</xliff:g> încercări.</item>
+ <item quantity="other">Codul PIN pentru cardul SIM este incorect. V-au mai rămas <xliff:g id="NUMBER_1">%d</xliff:g> de încercări.</item>
+ <item quantity="one">Codul PIN pentru cardul SIM este incorect. V-a mai rămas <xliff:g id="NUMBER_0">%d</xliff:g> încercare, după care va trebui să contactați operatorul pentru a vă debloca dispozitivul.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"Cardul SIM nu poate fi utilizat. Contactați operatorul."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="few">Codul PUK pentru cardul SIM este incorect. V-au mai rămas <xliff:g id="NUMBER_1">%d</xliff:g> încercări până când cardul SIM va deveni inutilizabil definitiv.</item>
+ <item quantity="other">Codul PUK pentru cardul SIM este incorect. V-au mai rămas <xliff:g id="NUMBER_1">%d</xliff:g> de încercări până când cardul SIM va deveni inutilizabil definitiv.</item>
+ <item quantity="one">Codul PUK pentru cardul SIM este incorect. V-a mai rămas <xliff:g id="NUMBER_0">%d</xliff:g> încercare până când cardul SIM va deveni inutilizabil definitiv.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Deblocarea cu ajutorul codului PIN pentru cardul SIM nu a reușit!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Deblocarea cu ajutorul codului PUK pentru cardul SIM nu a reușit!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Cod acceptat!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Fără serviciu."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Comutați metoda de introducere"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Mod Avion"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Modelul este necesar după repornirea dispozitivului"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Codul PIN este necesar după repornirea dispozitivului"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Parola este necesară după repornirea dispozitivului"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Modelul este necesar pentru securitate suplimentară"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Codul PIN este necesar pentru securitate suplimentară"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Parola este necesară pentru securitate suplimentară"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Modelul este necesar când comutați între profiluri"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Codul PIN este necesar când comutați între profiluri"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Parola este necesară când comutați între profiluri"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Administratorul dispozitivului a blocat dispozitivul"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Dispozitivul a fost blocat manual"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="few">Dispozitivul nu a fost deblocat de <xliff:g id="NUMBER_1">%d</xliff:g> ore. Confirmați modelul.</item>
+ <item quantity="other">Dispozitivul nu a fost deblocat de <xliff:g id="NUMBER_1">%d</xliff:g> de ore. Confirmați modelul.</item>
+ <item quantity="one">Dispozitivul nu a fost deblocat de <xliff:g id="NUMBER_0">%d</xliff:g> oră. Confirmați modelul.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="few">Dispozitivul nu a fost deblocat de <xliff:g id="NUMBER_1">%d</xliff:g> ore. Confirmați codul PIN.</item>
+ <item quantity="other">Dispozitivul nu a fost deblocat de <xliff:g id="NUMBER_1">%d</xliff:g> de ore. Confirmați codul PIN.</item>
+ <item quantity="one">Dispozitivul nu a fost deblocat de <xliff:g id="NUMBER_0">%d</xliff:g> oră. Confirmați codul PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="few">Dispozitivul nu a fost deblocat de <xliff:g id="NUMBER_1">%d</xliff:g> ore. Confirmați parola.</item>
+ <item quantity="other">Dispozitivul nu a fost deblocat de <xliff:g id="NUMBER_1">%d</xliff:g> de ore. Confirmați parola.</item>
+ <item quantity="one">Dispozitivul nu a fost deblocat de <xliff:g id="NUMBER_0">%d</xliff:g> oră. Confirmați parola.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nu este recunoscută"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml
index 0ebb831..dd84788 100644
--- a/packages/SystemUI/res-keyguard/values-ru/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml
@@ -20,186 +20,123 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Кнопка переключения способа ввода."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Введите PIN-код"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Введите PUK-код и новый PIN-код"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK-код SIM-карты"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Новый PIN-код SIM-карты"</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_password_wrong_pin_code" msgid="6535018036285012028">"Неверный PIN-код."</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_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Чтобы получить новую, обратитесь к своему оператору."</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">"PIN-код SIM-карты"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"PUK-код SIM-карты"</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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> сек."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Введите графический ключ"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Введите PIN-код SIM-карты"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Введите PIN-код SIM-карты \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</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">"Введите PIN-код (от 4 до 8 цифр)."</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">"Неверный PIN-код. Обратитесь к оператору связи, чтобы разблокировать SIM-карту."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Неверный PIN-код. Осталась <xliff:g id="NUMBER_1">%d</xliff:g> попытка.</item>
+ <item quantity="few">Неверный PIN-код. Осталось <xliff:g id="NUMBER_1">%d</xliff:g> попытки.</item>
+ <item quantity="many">Неверный PIN-код. Осталось <xliff:g id="NUMBER_1">%d</xliff:g> попыток.</item>
+ <item quantity="other">Неверный PIN-код. Осталось <xliff:g id="NUMBER_1">%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="one">Неверный PUK-код. Осталась <xliff:g id="NUMBER_1">%d</xliff:g> попытка. После этого SIM-карта будет заблокирована навсегда.</item>
+ <item quantity="few">Неверный PUK-код. Осталось <xliff:g id="NUMBER_1">%d</xliff:g> попытки. После этого SIM-карта будет заблокирована навсегда.</item>
+ <item quantity="many">Неверный PUK-код. Осталось <xliff:g id="NUMBER_1">%d</xliff:g> попыток. После этого SIM-карта будет заблокирована навсегда.</item>
+ <item quantity="other">Неверный PUK-код. Осталось <xliff:g id="NUMBER_1">%d</xliff:g> попытки. После этого SIM-карта будет заблокирована навсегда.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Не удалось разблокировать SIM-карту"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Не удалось разблокировать SIM-карту"</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">"После перезагрузки устройства необходимо ввести PIN-код"</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="2438626748767361010">"Устройство заблокировано администратором"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Устройство было заблокировано вручную"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Устройство не разблокировалось в течение <xliff:g id="NUMBER_1">%d</xliff:g> часа. Подтвердите графический ключ.</item>
+ <item quantity="few">Устройство не разблокировалось в течение <xliff:g id="NUMBER_1">%d</xliff:g> часов. Подтвердите графический ключ.</item>
+ <item quantity="many">Устройство не разблокировалось в течение <xliff:g id="NUMBER_1">%d</xliff:g> часов. Подтвердите графический ключ.</item>
+ <item quantity="other">Устройство не разблокировалось в течение <xliff:g id="NUMBER_1">%d</xliff:g> часа. Подтвердите графический ключ.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Устройство не разблокировалось в течение <xliff:g id="NUMBER_1">%d</xliff:g> часа. Введите PIN-код ещё раз.</item>
+ <item quantity="few">Устройство не разблокировалось в течение <xliff:g id="NUMBER_1">%d</xliff:g> часов. Введите PIN-код ещё раз.</item>
+ <item quantity="many">Устройство не разблокировалось в течение <xliff:g id="NUMBER_1">%d</xliff:g> часов. Введите PIN-код ещё раз.</item>
+ <item quantity="other">Устройство не разблокировалось в течение <xliff:g id="NUMBER_1">%d</xliff:g> часа. Введите PIN-код ещё раз.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Устройство не разблокировалось в течение <xliff:g id="NUMBER_1">%d</xliff:g> часа. Введите пароль ещё раз.</item>
+ <item quantity="few">Устройство не разблокировалось в течение <xliff:g id="NUMBER_1">%d</xliff:g> часов. Введите пароль ещё раз.</item>
+ <item quantity="many">Устройство не разблокировалось в течение <xliff:g id="NUMBER_1">%d</xliff:g> часов. Введите пароль ещё раз.</item>
+ <item quantity="other">Устройство не разблокировалось в течение <xliff:g id="NUMBER_1">%d</xliff:g> часа. Введите пароль ещё раз.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Не распознано"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml
index f217d4b..2a7958f 100644
--- a/packages/SystemUI/res-keyguard/values-si/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-si/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"ආදාන ක්රමය මාරු කිරීමේ බොත්තම."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"වැරදි PIN කේතයකි."</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_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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"තත්පර <xliff:g id="NUMBER">%d</xliff:g> කින් නැවත උත්සහ කරන්න."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ඔබගේ රටාව අඳින්න"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM PIN ඇතුලු කරන්න"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" සඳහා SIM PIN ඇතුළත් කරන්න"</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="one">වැරදී SIM PIN කේතයකි, ඔබගේ දුරකථනයේ අඟුල හැරීමට ඔබගේ වාහකයා සම්බන්ධ කරගැනීමට පෙර ඔබ සතුව තවත් උත්සාහයන් <xliff:g id="NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත.</item>
+ <item quantity="other">වැරදී SIM PIN කේතයකි, ඔබගේ දුරකථනයේ අගුල හැරීමට ඔබගේ වාහකයා සම්බන්ධ කරගැනීමට පෙර ඔබ සතුව තවත් උත්සාහයන් <xliff:g id="NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත.</item>
+ </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="one">වැරදි SIM PUK කේතයකි, SIM කාඩ්පත ස්ථිරවම භාවිත කළ නොහැකි බවට පත්වීමට පෙර ඔබට තවත් උත්සාහයන් <xliff:g id="NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත.</item>
+ <item quantity="other">වැරදි SIM PUK කේතයකි, SIM කාඩ්පත ස්ථිරවම භාවිත කළ නොහැකි බවට පත්වීමට පෙර ඔබට තවත් උත්සාහයන් <xliff:g id="NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත.</item>
+ </plurals>
+ <string name="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">"උපාංගය නැවත ආරම්භ වූ පසු PIN අංකය අවශ්යයි"</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="2438626748767361010">"උපාංග පරිපාලක උපාංගය අගුලු දමන ලදී"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"උපාංගය හස්තීයව අගුලු දමන ලදී"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">උපාංගය පැය <xliff:g id="NUMBER_1">%d</xliff:g>ක් අගුලු හැර නැත. රටාව තහවුරු කරන්න.</item>
+ <item quantity="other">උපාංගය පැය <xliff:g id="NUMBER_1">%d</xliff:g>ක් අගුලු හැර නැත. රටාව තහවුරු කරන්න.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">උපාංගය පැය <xliff:g id="NUMBER_1">%d</xliff:g>ක් අගුලු හැර නැත. PIN අංකය තහවුරු කරන්න.</item>
+ <item quantity="other">උපාංගය පැය <xliff:g id="NUMBER_1">%d</xliff:g>ක් අගුලු හැර නැත. PIN අංකය තහවුරු කරන්න.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">උපාංගය පැය <xliff:g id="NUMBER_1">%d</xliff:g>ක් අගුලු හැර නැත. මුරපදය තහවුරු කරන්න.</item>
+ <item quantity="other">උපාංගය පැය <xliff:g id="NUMBER_1">%d</xliff:g>ක් අගුලු හැර නැත. මුරපදය තහවුරු කරන්න.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"හඳුනා නොගන්නා ලදී"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml
index 88ee590..d39ec34 100644
--- a/packages/SystemUI/res-keyguard/values-sk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml
@@ -20,186 +20,123 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Tlačidlo prepnutia metódy vstupu."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Zámka klávesnice"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Zadajte kód PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Zadajte kód PUK SIM karty a nový kód PIN"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Kód PUK SIM karty"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Nový kód PIN SIM karty"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Heslo zadajte po klepnutí"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Zadajte heslo na odomknutie"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Zadajte kód PIN na odomknutie"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Nesprávny kód PIN."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Nabité"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Nabíja sa"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Rýchle nabíjanie"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Pomalé nabíjanie"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Pripojte nabíjačku."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Odomknete stlačením tlačidla ponuky."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Sieť je zablokovaná"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Nie je vložená SIM karta"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"V tablete nie je žiadna SIM karta."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"V telefóne nie je žiadna SIM karta."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Vložte SIM kartu."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM karta chýba alebo sa z nej nedá čítať. Vložte SIM kartu."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"SIM karta je nepoužiteľná."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Vaša SIM karta bola natrvalo zakázaná.\nAk chcete získať inú SIM kartu, kontaktujte svojho poskytovateľa bezdrôtových služieb."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM karta je uzamknutá."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM karta je uzamknutá pomocou kódu PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Prebieha odomykanie SIM karty…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Oblasť kódu PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Oblasť kódu PIN SIM karty"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Oblasť kódu PUK SIM karty"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Nasledujúci budík je nastavený na <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Odstrániť"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Nepamätám si vzor"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Nesprávny vzor"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Nesprávne heslo"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Nesprávny kód PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Skúste to znova o <xliff:g id="NUMBER">%d</xliff:g> s."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Nakreslite svoj vzor"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Zadajte PIN SIM karty"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Zadajte kód PIN pre SIM kartu operátora <xliff:g id="CARRIER">%1$s</xliff:g>"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Zadajte kód PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Zadajte heslo"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM karta je teraz zakázaná. Ak chcete pokračovať, zadajte kód PUK. Podrobné informácie získate od operátora."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM karta operátora <xliff:g id="CARRIER">%1$s</xliff:g> bola zakázaná. Ak chcete pokračovať, zadajte kód PUK. Podrobnosti získate od svojho operátora."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Zadajte požadovaný kód PIN"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Potvrďte požadovaný kód PIN"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Prebieha odomykanie SIM karty…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Zadajte kód PIN s dĺžkou 4 až 8 číslic."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"Kód PUK musí obsahovať 8 alebo viac číslic."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Znova zadajte správny kód PUK. Opakované pokusy zakážu SIM kartu natrvalo."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Kódy PIN sa nezhodujú"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Príliš veľa pokusov o nakreslenie vzoru"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Už <xliff:g id="NUMBER_0">%1$d</xliff:g>-krát ste zadali nesprávny kód PIN. \n\nSkúste to znova o <xliff:g id="NUMBER_1">%2$d</xliff:g> s."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Už <xliff:g id="NUMBER_0">%1$d</xliff:g>-krát ste zadali nesprávne heslo. \n\nSkúste to znova o <xliff:g id="NUMBER_1">%2$d</xliff:g> s."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Už <xliff:g id="NUMBER_0">%1$d</xliff:g>-krát ste použili nesprávny bezpečnostný vzor. \n\nSkúste to znova o <xliff:g id="NUMBER_1">%2$d</xliff:g> s."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Tablet ste sa pokúsili <xliff:g id="NUMBER_0">%1$d</xliff:g>-krát nesprávne odomknúť. Po ďalších neúspešných pokusoch (počet: <xliff:g id="NUMBER_1">%2$d</xliff:g>) bude tento tablet obnovený a všetky údaje, ktoré sú v ňom uložené, budú odstránené."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Telefón ste sa pokúsili <xliff:g id="NUMBER_0">%1$d</xliff:g>-krát nesprávne odomknúť. Po ďalších neúspešných pokusoch (počet: <xliff:g id="NUMBER_1">%2$d</xliff:g>) bude tento telefón obnovený a všetky údaje, ktoré sú v ňom uložené, budú odstránené."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Tablet ste sa pokúsili <xliff:g id="NUMBER">%d</xliff:g>-krát nesprávne odomknúť. Tablet bude obnovený a všetky údaje, ktoré sú v ňom uložené, budú odstránené."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Telefón ste sa pokúsili <xliff:g id="NUMBER">%d</xliff:g>-krát nesprávne odomknúť. Telefón bude obnovený a všetky údaje, ktoré sú v ňom uložené, budú odstránené."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Tablet ste sa pokúsili <xliff:g id="NUMBER_0">%1$d</xliff:g>-krát nesprávne odomknúť. Po ďalších neúspešných pokusoch (počet: <xliff:g id="NUMBER_1">%2$d</xliff:g>) bude tento používateľ odstránený a spolu s ním všetky jeho údaje."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Telefón ste sa pokúsili <xliff:g id="NUMBER_0">%1$d</xliff:g>-krát nesprávne odomknúť. Po ďalších neúspešných pokusoch (počet: <xliff:g id="NUMBER_1">%2$d</xliff:g>) bude tento používateľ odstránený a spolu s ním všetky jeho údaje."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Tablet ste sa pokúsili <xliff:g id="NUMBER">%d</xliff:g>-krát nesprávne odomknúť. Používateľ bude odstránený a spolu s ním všetky jeho údaje."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Telefón ste sa pokúsili <xliff:g id="NUMBER">%d</xliff:g>-krát nesprávne odomknúť. Používateľ bude odstránený a spolu s ním všetky jeho údaje."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Tablet ste sa pokúsili <xliff:g id="NUMBER_0">%1$d</xliff:g>-krát nesprávne odomknúť. Po ďalších neúspešných pokusoch (počet: <xliff:g id="NUMBER_1">%2$d</xliff:g>) bude pracovný profil odstránený a spolu s ním všetky údaje profilu."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Telefón ste sa pokúsili <xliff:g id="NUMBER_0">%1$d</xliff:g>-krát nesprávne odomknúť. Po ďalších neúspešných pokusoch (počet: <xliff:g id="NUMBER_1">%2$d</xliff:g>) bude pracovný profil odstránený a spolu s ním všetky údaje profilu."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Tablet ste sa pokúsili <xliff:g id="NUMBER">%d</xliff:g>-krát nesprávne odomknúť. Pracovný profil bude odstránený spolu so všetkými údajmi."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Telefón ste sa pokúsili <xliff:g id="NUMBER">%d</xliff:g>-krát nesprávne odomknúť. Pracovný profil bude odstránený spolu so všetkými údajmi."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Už ste <xliff:g id="NUMBER_0">%1$d</xliff:g>-krát nesprávne nakreslili svoj bezpečnostný vzor. Po ďalších <xliff:g id="NUMBER_1">%2$d</xliff:g> neúspešných pokusoch sa zobrazí výzva na odomknutie tabletu pomocou e-mailového účtu.\n\n Skúste to znova o <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Už ste <xliff:g id="NUMBER_0">%1$d</xliff:g>-krát nesprávne nakreslili svoj bezpečnostný vzor. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> ďalších neúspešných pokusoch sa zobrazí výzva na odomknutie telefónu pomocou e-mailového účtu.\n\n Skúste to znova o <xliff:g id="NUMBER_2">%3$d</xliff:g>} s."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Nesprávny kód PIN SIM karty. Teraz musíte kontaktovať svojho operátora, aby vám odomkol zariadenie."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="few">Nesprávny kód PIN SIM karty. Zostávajú vám <xliff:g id="NUMBER_1">%d</xliff:g> pokusy.</item>
+ <item quantity="many">Nesprávny kód PIN SIM karty. Zostáva vám <xliff:g id="NUMBER_1">%d</xliff:g> pokusu.</item>
+ <item quantity="other">Nesprávny kód PIN SIM karty. Zostáva vám <xliff:g id="NUMBER_1">%d</xliff:g> pokusov.</item>
+ <item quantity="one">Nesprávny kód PIN SIM karty. Zostáva vám <xliff:g id="NUMBER_0">%d</xliff:g> pokus. Potom budete musieť kontaktovať operátora, aby vám odomkol zariadenie.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM karta je nepoužiteľná. Kontaktujte svojho operátora."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="few">Nesprávny kód PUK SIM karty. Zostávajú vám <xliff:g id="NUMBER_1">%d</xliff:g> pokusy. Potom sa SIM karta natrvalo zablokuje.</item>
+ <item quantity="many">Nesprávny kód PUK SIM karty. Zostáva vám <xliff:g id="NUMBER_1">%d</xliff:g> pokusu. Potom sa SIM karta natrvalo zablokuje.</item>
+ <item quantity="other">Nesprávny kód PUK SIM karty. Zostáva vám <xliff:g id="NUMBER_1">%d</xliff:g> pokusov. Potom sa SIM karta natrvalo zablokuje.</item>
+ <item quantity="one">Nesprávny kód PUK SIM karty. Zostáva vám <xliff:g id="NUMBER_0">%d</xliff:g> pokus. Potom sa vaša SIM karta natrvalo zablokuje.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Operácia kódu PIN SIM karty zlyhala!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Operácia kódu PUK SIM karty zlyhala!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kód bol prijatý."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Žiadny signál."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Prepnúť metódu vstupu"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Režim v lietadle"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Po reštartovaní zariadenia musíte zadať bezpečnostný vzor"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Po reštartovaní zariadenia musíte zadať kód PIN"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Po reštartovaní zariadenia musíte zadať heslo"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Na ďalšie zabezpečenie musíte zadať bezpečnostný vzor"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Na ďalšie zabezpečenie musíte zadať kód PIN"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Na ďalšie zabezpečenie musíte zadať heslo"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Po prepnutí profilov musíte zadať bezpečnostný vzor"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Po prepnutí profilov musíte zadať kód PIN"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Po prepnutí profilov musíte zadať heslo"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Zariadenie uzamkol správca"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Zariadenie bolo uzamknuté ručne"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="few">Zariadenie nebolo odomknuté <xliff:g id="NUMBER_1">%d</xliff:g> hodiny. Potvrďte vzor.</item>
+ <item quantity="many">Zariadenie nebolo odomknuté <xliff:g id="NUMBER_1">%d</xliff:g> hodiny. Potvrďte vzor.</item>
+ <item quantity="other">Zariadenie nebolo odomknuté <xliff:g id="NUMBER_1">%d</xliff:g> hodín. Potvrďte vzor.</item>
+ <item quantity="one">Zariadenie nebolo odomknuté <xliff:g id="NUMBER_0">%d</xliff:g> hodinu. Potvrďte vzor.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="few">Zariadenie nebolo odomknuté <xliff:g id="NUMBER_1">%d</xliff:g> hodiny. Potvrďte kód PIN.</item>
+ <item quantity="many">Zariadenie nebolo odomknuté <xliff:g id="NUMBER_1">%d</xliff:g> hodiny. Potvrďte kód PIN.</item>
+ <item quantity="other">Zariadenie nebolo odomknuté <xliff:g id="NUMBER_1">%d</xliff:g> hodín. Potvrďte kód PIN.</item>
+ <item quantity="one">Zariadenie nebolo odomknuté <xliff:g id="NUMBER_0">%d</xliff:g> hodinu. Potvrďte kód PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="few">Zariadenie nebolo odomknuté <xliff:g id="NUMBER_1">%d</xliff:g> hodiny. Potvrďte heslo.</item>
+ <item quantity="many">Zariadenie nebolo odomknuté <xliff:g id="NUMBER_1">%d</xliff:g> hodiny. Potvrďte heslo.</item>
+ <item quantity="other">Zariadenie nebolo odomknuté <xliff:g id="NUMBER_1">%d</xliff:g> hodín. Potvrďte heslo.</item>
+ <item quantity="one">Zariadenie nebolo odomknuté <xliff:g id="NUMBER_0">%d</xliff:g> hodinu. Potvrďte heslo.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nerozpoznané"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml
index 98689a5..84c52e7 100644
--- a/packages/SystemUI/res-keyguard/values-sl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml
@@ -20,186 +20,123 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Gumb za preklop načina vnosa."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Vnesite kodo PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Vnesite kodo PUK in novo kodo PIN kartice SIM"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Koda PUK kartice SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Nova koda PIN kartice SIM"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Dotaknite se za vnos gesla"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Vnesite geslo za odklepanje"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Vnesite kodo PIN za odklepanje"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Napačna koda PIN."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Akumulator napolnjen"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Polnjenje"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Hitro polnjenje"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Počasno polnjenje"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Priključite napajalnik."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Če želite odkleniti, pritisnite meni."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Omrežje je zaklenjeno"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Ni kartice SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"V tabličnem računalniku ni kartice SIM."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"V telefonu ni kartice SIM."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Vstavite kartico SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Ni kartice SIM ali je ni mogoče prebrati. Vstavite kartico SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Neuporabna kartica SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Kartica SIM je trajno onemogočena.\n Obrnite se na operaterja za drugo."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"Kartica SIM je zaklenjena."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"Kartica SIM je zaklenjena s kodo PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Odklepanje kartice SIM …"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Območje za kodo PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Območje za kodo PIN kartice SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Območje za kodo PUK kartice SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Naslednji alarm je nastavljen za <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Izbris"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Tipka Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Pozabljen vzorec"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Napačen vzorec"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Napačno geslo"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Napačna koda PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> s."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Narišite vzorec"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Vnesite kodo PIN kartice SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Vnesite kodo PIN kartice SIM operaterja »<xliff:g id="CARRIER">%1$s</xliff:g>«"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Vnesite kodo PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Vnesite geslo"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Kartica SIM je onemogočena. Če želite nadaljevati, vnesite kodo PUK. Za dodatne informacije se obrnite na operaterja."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"Kartica SIM operaterja »<xliff:g id="CARRIER">%1$s</xliff:g>« je onemogočena. Če želite nadaljevati, vnesite kodo PUK. Za podrobnosti se obrnite na operaterja."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Vnesite želeno kodo PIN"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Potrdite želeno kodo PIN"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Odklepanje kartice SIM …"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Vnesite kodo PIN, ki vsebuje od štiri do osem številk."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"Koda PUK mora biti 8- ali večmestno število."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Znova vnesite pravilno kodo PUK. Večkratni poskusi bodo trajno onemogočili kartico SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Kodi PIN se ne ujemata"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Preveč poskusov vnosa vzorca"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Kodo PIN ste <xliff:g id="NUMBER_0">%1$d</xliff:g>-krat vnesli napačno. \n\nPoskusite znova čez <xliff:g id="NUMBER_1">%2$d</xliff:g> s."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Geslo ste <xliff:g id="NUMBER_0">%1$d</xliff:g>-krat vnesli napačno. \n\nPoskusite znova čez <xliff:g id="NUMBER_1">%2$d</xliff:g> s."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Vzorec za odklepanje ste <xliff:g id="NUMBER_0">%1$d</xliff:g>-krat nepravilno narisali. \n\nPoskusite znova čez <xliff:g id="NUMBER_1">%2$d</xliff:g> s."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Tablični računalnik ste neuspešno poskusili odkleniti <xliff:g id="NUMBER_0">%1$d</xliff:g>-krat. Če ga neuspešno poskusite odkleniti še <xliff:g id="NUMBER_1">%2$d</xliff:g>-krat, bo ponastavljen in vsi podatki v njem bodo izbrisani."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Telefon ste neuspešno poskusili odkleniti <xliff:g id="NUMBER_0">%1$d</xliff:g>-krat. Če ga neuspešno poskusite odkleniti še <xliff:g id="NUMBER_1">%2$d</xliff:g>-krat, bo ponastavljen in vsi podatki v njem bodo izbrisani."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Tablični računalnik ste neuspešno poskusili odkleniti <xliff:g id="NUMBER">%d</xliff:g>-krat, zato bo ponastavljen, vsi podatki v njem pa bodo izbrisani."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Telefon ste neuspešno poskusili odkleniti <xliff:g id="NUMBER">%d</xliff:g>-krat, zato bo ponastavljen, vsi podatki v njem pa bodo izbrisani."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Tablični računalnik ste neuspešno poskusili odkleniti <xliff:g id="NUMBER_0">%1$d</xliff:g>-krat. Če ga neuspešno poskusite odkleniti še <xliff:g id="NUMBER_1">%2$d</xliff:g>-krat, bo ta uporabnik odstranjen in vsi podatki uporabnika bodo izbrisani."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Telefon ste neuspešno poskusili odkleniti <xliff:g id="NUMBER_0">%1$d</xliff:g>-krat. Če ga neuspešno poskusite odkleniti še <xliff:g id="NUMBER_1">%2$d</xliff:g>-krat, bo ta uporabnik odstranjen in vsi podatki uporabnika bodo izbrisani."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Tablični računalnik ste neuspešno poskusili odkleniti <xliff:g id="NUMBER">%d</xliff:g>-krat. Ta uporabnik bo odstranjen in vsi podatki uporabnika bodo izbrisani."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Telefon ste neuspešno poskusili odkleniti <xliff:g id="NUMBER">%d</xliff:g>-krat. Ta uporabnik bo odstranjen in vsi podatki uporabnika bodo izbrisani."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Tablični računalnik ste neuspešno poskusili odkleniti <xliff:g id="NUMBER_0">%1$d</xliff:g>-krat. Če ga neuspešno poskusite odkleniti še <xliff:g id="NUMBER_1">%2$d</xliff:g>-krat, bo delovni profil odstranjen in vsi podatki profila bodo izbrisani."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Telefon ste neuspešno poskusili odkleniti <xliff:g id="NUMBER_0">%1$d</xliff:g>-krat. Če ga neuspešno poskusite odkleniti še <xliff:g id="NUMBER_1">%2$d</xliff:g>-krat, bo delovni profil odstranjen in vsi podatki profila bodo izbrisani."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Tablični računalnik ste neuspešno poskusili odkleniti <xliff:g id="NUMBER">%d</xliff:g>-krat. Delovni profil bo odstranjen in vsi podatki profila bodo izbrisani."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Telefon ste neuspešno poskusili odkleniti <xliff:g id="NUMBER">%d</xliff:g>-krat. Delovni profil bo odstranjen in vsi podatki profila bodo izbrisani."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Vzorec za odklepanje ste <xliff:g id="NUMBER_0">%1$d</xliff:g>-krat napačno vnesli. Če ga neuspešno poskusite vnesti še <xliff:g id="NUMBER_1">%2$d</xliff:g>-krat, boste pozvani, da tablični računalnik odklenete z e-poštnim računom.\n\n Poskusite znova čez <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Vzorec za odklepanje ste <xliff:g id="NUMBER_0">%1$d</xliff:g>-krat napačno vnesli. Če ga neuspešno poskusite vnesti še <xliff:g id="NUMBER_1">%2$d</xliff:g>-krat, boste pozvani, da telefon odklenete z Googlovimi podatki za prijavo.\n\nPoskusite znova čez <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Napačna koda PIN kartice SIM. Zdaj se boste morali za odklenitev naprave obrniti na operaterja."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Napačna koda PIN kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskus.</item>
+ <item quantity="two">Napačna koda PIN kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskusa.</item>
+ <item quantity="few">Napačna koda PIN kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskuse.</item>
+ <item quantity="other">Napačna koda PIN kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskusov.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"Kartica SIM ni več uporabna. Obrnite se na operaterja."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">Napačna koda PUK kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskus. Potem bo kartica SIM postala trajno neuporabna.</item>
+ <item quantity="two">Napačna koda PUK kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskusa. Potem bo kartica SIM postala trajno neuporabna.</item>
+ <item quantity="few">Napačna koda PUK kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskuse. Potem bo kartica SIM postala trajno neuporabna.</item>
+ <item quantity="other">Napačna koda PUK kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskusov. Potem bo kartica SIM postala trajno neuporabna.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Postopek za odklepanje s kodo PIN kartice SIM ni uspel."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Postopek za odklepanje s kodo PUK kartice SIM ni uspel."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Koda je sprejeta."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Ni storitve."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Preklop načina vnosa"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Način za letalo"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Po vnovičnem zagonu naprave je treba vnesti vzorec"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Po vnovičnem zagonu naprave je treba vnesti kodo PIN"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Po vnovičnem zagonu naprave je treba vnesti geslo"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Zaradi dodatne varnosti morate vnesti vzorec"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Zaradi dodatne varnosti morate vnesti kodo PIN"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Zaradi dodatne varnosti morate vnesti geslo"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Po preklopu profilov je treba vnesti vzorec"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Po preklopu profilov je treba vnesti kodo PIN"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Po preklopu profilov je treba vnesti geslo"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Skrbnik naprave je zaklenil napravo"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Naprava je bila ročno zaklenjena"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Naprava ni bila odklenjena <xliff:g id="NUMBER_1">%d</xliff:g> uro. Potrdite vzorec.</item>
+ <item quantity="two">Naprava ni bila odklenjena <xliff:g id="NUMBER_1">%d</xliff:g> uri. Potrdite vzorec.</item>
+ <item quantity="few">Naprava ni bila odklenjena <xliff:g id="NUMBER_1">%d</xliff:g> ure. Potrdite vzorec.</item>
+ <item quantity="other">Naprava ni bila odklenjena <xliff:g id="NUMBER_1">%d</xliff:g> ur. Potrdite vzorec.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Naprava ni bila odklenjena <xliff:g id="NUMBER_1">%d</xliff:g> uro. Potrdite kodo PIN.</item>
+ <item quantity="two">Naprava ni bila odklenjena <xliff:g id="NUMBER_1">%d</xliff:g> uri. Potrdite kodo PIN.</item>
+ <item quantity="few">Naprava ni bila odklenjena <xliff:g id="NUMBER_1">%d</xliff:g> ure. Potrdite kodo PIN.</item>
+ <item quantity="other">Naprava ni bila odklenjena <xliff:g id="NUMBER_1">%d</xliff:g> ur. Potrdite kodo PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Naprava ni bila odklenjena <xliff:g id="NUMBER_1">%d</xliff:g> uro. Potrdite geslo.</item>
+ <item quantity="two">Naprava ni bila odklenjena <xliff:g id="NUMBER_1">%d</xliff:g> uri. Potrdite geslo.</item>
+ <item quantity="few">Naprava ni bila odklenjena <xliff:g id="NUMBER_1">%d</xliff:g> ure. Potrdite geslo.</item>
+ <item quantity="other">Naprava ni bila odklenjena <xliff:g id="NUMBER_1">%d</xliff:g> ur. Potrdite geslo.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ni prepoznano"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml
index 3bf8912..b6cc044 100644
--- a/packages/SystemUI/res-keyguard/values-sq/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Butoni i metodës së ndërrimit të hyrjeve."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Mbrojtësi i tasteve"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Shkruaj kodin PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Shkruaj kodin e ri PUK dhe PIN të kartës SIM"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Kodi PUK i kartës SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Kodi i ri PIN i kartës SIM"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Prek për të shkruar fjalëkalimin"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Shkruaj fjalëkalimin për të shkyçur"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Shkruaj kodin PIN për ta shkyçur"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Kodi PIN është i pasaktë."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"I ngarkuar"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Po ngarkon"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Po ngarkon me shpejtësi"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Po ngarkon me ngadalë"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Lidh ngarkuesin."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Shtyp \"Meny\" për të shkyçur."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Rrjeti është i kyçur"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Nuk ka kartë SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Nuk ka kartë SIM në tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Në telefon nuk ka kartë SIM."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Fut një kartë SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Karta SIM mungon ose është e palexueshme. Fut një kartë të re SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Kartë SIM është e papërdorshme."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Karta jote SIM është çaktivizuar përgjithnjë.\n Kontakto ofruesin e shërbimit me valë për një tjetër kartë SIM."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"Karta SIM është e kyçur."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"Karta SIM është e kyçur me PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Po shkyç kartën SIM…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Zona PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Zona PIN e kartës SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Zona e kodit PUK të kartës SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Alarmi tjetër i caktuar: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Fshi"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Dërgo"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Harrova motivin"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Motivi është i gabuar"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Fjalëkalim i gabuar"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Kod PIN i gabuar"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Provo përsëri për <xliff:g id="NUMBER">%d</xliff:g> sekonda."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Vizato motivin tënd"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Fut kodin PIN të kartës SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Fut kodin PIN të kartës SIM të \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Fut kodin PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Fut fjalëkalimin"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Karta SIM tani është e çaktivizuar. Fut kodin PUK për të vazhduar. Kontakto me operatorin për detaje."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"Karta SIM e \"<xliff:g id="CARRIER">%1$s</xliff:g>\" tani është e çaktivizuar. Fut kodin PUK për të vazhduar. Kontakto me operatorin për detaje."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Fut kodin PIN të dëshiruar"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Konfirmo kodin e dëshiruar PIN"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Po shkyç kartën SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Shkruaj një PIN me 4 deri në 8 numra."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"Kodi PUK duhet të jetë me 8 numra ose më shumë."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Fut kodin e saktë PUK. Provat e përsëritura do ta çaktivizojnë përgjithmonë kartën SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Kodet PIN nuk përputhen"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Shumë tentativa për motivin"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"E ke shkruar <xliff:g id="NUMBER_0">%1$d</xliff:g> herë gabimisht kodin PIN.\n\nProvo sërish për <xliff:g id="NUMBER_1">%2$d</xliff:g> sekonda."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"E ke shkruar <xliff:g id="NUMBER_0">%1$d</xliff:g> herë gabimisht fjalëkalimin.\n\nProvo sërish për <xliff:g id="NUMBER_1">%2$d</xliff:g> sekonda."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Ke tentuar <xliff:g id="NUMBER_0">%1$d</xliff:g> herë pa sukses për të vizatuar motivin tënd. \n\nProvo sërish për <xliff:g id="NUMBER_1">%2$d</xliff:g> sekonda."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Ke tentuar <xliff:g id="NUMBER_0">%1$d</xliff:g> herë gabimisht për ta shkyçur tabletin. Pas <xliff:g id="NUMBER_1">%2$d</xliff:g> përpjekjeve të tjera të pasuksesshme, tableti do të rivendoset, gjë që do të rivendosë të gjitha të dhënat e tij."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Ke tentuar <xliff:g id="NUMBER_0">%1$d</xliff:g> herë gabimisht për ta shkyçur telefonin. Pas <xliff:g id="NUMBER_1">%2$d</xliff:g> përpjekjeve të tjera të pasuksesshme, telefoni do të rivendoset, gjë që do të fshijë të gjitha të dhënat e tij."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Ke tentuar <xliff:g id="NUMBER">%d</xliff:g> herë pa sukses për ta shkyçur tabletin. Ky tablet do të rivendoset, gjë që do të fshijë të gjitha të dhënat e tij."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Ke tentuar <xliff:g id="NUMBER">%d</xliff:g> herë pa sukses për ta shkyçur telefonin. Ky telefon do të rivendoset, gjë që do të fshijë të gjitha të dhënat e tij."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Ke tentuar <xliff:g id="NUMBER_0">%1$d</xliff:g> herë pa sukses për ta shkyçur telefonin. Pas <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativave të tjera të pasuksesshme, përdoruesi do të hiqet dhe të gjitha të dhënat e përdoruesit në të, do të fshihen."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Ke tentuar <xliff:g id="NUMBER_0">%1$d</xliff:g> herë pa sukses për ta shkyçur telefonin. Pas <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativave të tjera të pasuksesshme, përdoruesi do të hiqet dhe të gjitha të dhënat e përdoruesit në të, do të fshihen."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Ke tentuar <xliff:g id="NUMBER">%d</xliff:g> herë pa sukses për ta shkyçur tabletin. Përdoruesi do të hiqet, gjë që do të fshijë të gjitha të dhënat e përdoruesit."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Ke tentuar <xliff:g id="NUMBER">%d</xliff:g> herë pa sukses për ta shkyçur telefonin. Përdoruesi do të hiqet, gjë që do të fshijë të gjitha të dhënat e përdoruesit."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Ke tentuar <xliff:g id="NUMBER_0">%1$d</xliff:g> herë pa sukses për ta shkyçur tabletin. Pas <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativave të tjera të pasuksesshme, profili i punës do të hiqet dhe të gjitha të dhënat në të do të fshihen."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Ke tentuar <xliff:g id="NUMBER_0">%1$d</xliff:g> herë pa sukses për ta shkyçur telefonin. Pas <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativave të tjera të pasuksesshme, profili i punës do të hiqet dhe të gjitha të dhënat në të do të fshihen."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Ke tentuar <xliff:g id="NUMBER">%d</xliff:g> herë pa sukses për ta shkyçur tabletin. Profili i punës do të hiqet, gjë që do të fshijë të gjitha të dhënat e profilit."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Ke tentuar <xliff:g id="NUMBER">%d</xliff:g> herë pa sukses për ta shkyçur telefonin. Profili i punës do të hiqet, gjë që do të fshijë të gjitha të dhënat e profilit."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Ke vizatuar <xliff:g id="NUMBER_0">%1$d</xliff:g> herë pa sukses motivin tënd të shkyçjes. Pas <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativave të tjera të pasuksesshme, do të të duhet ta shkyçësh tabletin duke përdorur një llogari mail-i.\n\n Provo sërish për <xliff:g id="NUMBER_2">%3$d</xliff:g> sekonda."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Ke vizatuar <xliff:g id="NUMBER_0">%1$d</xliff:g> herë pa sukses motivin tënd të shkyçjes. Pas <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativave të tjera të pasuksesshme, do të të duhet ta shkyçësh telefonin duke përdorur një llogari mail-i.\n\n Provo sërish për <xliff:g id="NUMBER_2">%3$d</xliff:g> sekonda."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Kodi PIN i kartës SIM është i pasaktë. Tani duhet të kontaktosh me operatorin për ta shkyçur pajisjen tënde."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Kodi PIN i kartës SIM është i pasaktë. Të kanë mbetur edhe <xliff:g id="NUMBER_1">%d</xliff:g> tentativa.</item>
+ <item quantity="one">Kodi PIN i kartës SIM është i pasaktë. Të ka mbetur edhe <xliff:g id="NUMBER_0">%d</xliff:g> tentativë para se të duhet të kontaktosh me operatorin tënd celular për të shkyçur pajisjen.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"Karta SIM është e papërdorshme. Kontakto me operatorin."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">PUK-u i kartës SIM është i pasaktë. Të kanë mbetur edhe <xliff:g id="NUMBER_1">%d</xliff:g> tentativa para se karta SIM të bëhet e papërdorshme përgjithmonë.</item>
+ <item quantity="one">PUK-u i kartës SIM është i pasaktë. Të ka mbetur edhe <xliff:g id="NUMBER_0">%d</xliff:g> tentativë para se karta SIM të bëhet e papërdorshme përgjithmonë.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Operacioni i kodit PIN të kartës SIM dështoi!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Operacioni i kodit PUK të kartës SIM dështoi!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kodi u pranua!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Nuk ka shërbim."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Ndërro metodën e hyrjes"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Modaliteti i aeroplanit"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Kërkohet motivi pas rinisjes së pajisjes"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Kërkohet kodi PIN pas rinisjes së pajisjes"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Kërkohet fjalëkalimi pas rinisjes së pajisjes"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Kërkohet motivi për më shumë siguri"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Kërkohet kodi PIN për më shumë siguri"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Kërkohet fjalëkalimi për më shumë siguri"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Kërkohet motivi kur ndryshon profilet"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Kërkohet kodi PIN kur ndryshon profilet"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Kërkohet fjalëkalimi kur ndryshon profilet"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Administratori i pajisjes e kyçi pajisjen"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Pajisja është kyçur manualisht"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Pajisja nuk është shkyçur për <xliff:g id="NUMBER_1">%d</xliff:g> orë. Konfirmo motivin.</item>
+ <item quantity="one">Pajisja nuk është shkyçur për <xliff:g id="NUMBER_0">%d</xliff:g> orë. Konfirmo motivin.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Pajisja nuk është shkyçur për <xliff:g id="NUMBER_1">%d</xliff:g> orë. Konfirmo kodin PIN.</item>
+ <item quantity="one">Pajisja nuk është shkyçur për <xliff:g id="NUMBER_0">%d</xliff:g> orë. Konfirmo kodin PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Pajisja nuk është shkyçur për <xliff:g id="NUMBER_1">%d</xliff:g> orë. Konfirmo fjalëkalimin.</item>
+ <item quantity="one">Pajisja nuk është shkyçur për <xliff:g id="NUMBER_0">%d</xliff:g> orë. Konfirmo fjalëkalimin.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nuk njihet"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml
index be91a69..e420632 100644
--- a/packages/SystemUI/res-keyguard/values-sr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml
@@ -20,186 +20,118 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Дугме Промени метод уноса."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <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">"Унесите PUK за SIM и нови PIN кôд"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK кôд за SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Нови PIN кôд за SIM"</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_password_wrong_pin_code" msgid="6535018036285012028">"PIN кôд је нетачан."</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_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">"Област за PIN за SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Област за PUK за SIM"</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="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> сек."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Нацртајте шаблон"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Унесите PIN за SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Унесите PIN за SIM „<xliff:g id="CARRIER">%1$s</xliff:g>“"</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">"Унесите PIN који има 4–8 бројева."</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> пута, уклонићемо профил за Work, чиме се бришу сви подаци са профила."</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> пута, уклонићемо профил за Work, чиме се бришу сви подаци са профила."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Погрешно сте покушали да откључате таблет <xliff:g id="NUMBER">%d</xliff:g> пута. Уклонићемо профил за Work, чиме се бришу сви подаци са профила."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Погрешно сте покушали да откључате телефон <xliff:g id="NUMBER">%d</xliff:g> пута. Уклонићемо профил за Work, чиме се бришу сви подаци са профила."</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">"Нетачан PIN кôд за SIM. Сада морате да контактирате мобилног оператера да бисте откључали уређај."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Нетачан PIN кôд за SIM. Имате још <xliff:g id="NUMBER_1">%d</xliff:g> покушај.</item>
+ <item quantity="few">Нетачан PIN кôд за SIM. Имате још <xliff:g id="NUMBER_1">%d</xliff:g> покушаја.</item>
+ <item quantity="other">Нетачан PIN кôд за SIM. Имате још <xliff:g id="NUMBER_1">%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="one">Нетачан PUK кôд за SIM. Имате још <xliff:g id="NUMBER_1">%d</xliff:g> покушај пре него што SIM картица постане трајно неупотребљива.</item>
+ <item quantity="few">Нетачан PUK кôд за SIM. Имате још <xliff:g id="NUMBER_1">%d</xliff:g> покушаја пре него што SIM картица постане трајно неупотребљива.</item>
+ <item quantity="other">Нетачан PUK кôд за SIM. Имате још <xliff:g id="NUMBER_1">%d</xliff:g> покушаја пре него што SIM картица постане трајно неупотребљива.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Радња са PIN кодом за SIM није успела!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Радња са PUK кодом за SIM није успела!"</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">"Треба да унесете PIN када се уређај поново покрене"</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="2438626748767361010">"Администратор уређаја је закључао уређај"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Уређај је ручно закључан"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Нисте откључали уређај <xliff:g id="NUMBER_1">%d</xliff:g> сат. Потврдите шаблон.</item>
+ <item quantity="few">Нисте откључали уређај <xliff:g id="NUMBER_1">%d</xliff:g> сата. Потврдите шаблон.</item>
+ <item quantity="other">Нисте откључали уређај <xliff:g id="NUMBER_1">%d</xliff:g> сати. Потврдите шаблон.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Нисте откључали уређај <xliff:g id="NUMBER_1">%d</xliff:g> сат. Потврдите PIN.</item>
+ <item quantity="few">Нисте откључали уређај <xliff:g id="NUMBER_1">%d</xliff:g> сата. Потврдите PIN.</item>
+ <item quantity="other">Нисте откључали уређај <xliff:g id="NUMBER_1">%d</xliff:g> сати. Потврдите PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Нисте откључали уређај <xliff:g id="NUMBER_1">%d</xliff:g> сат. Потврдите лозинку.</item>
+ <item quantity="few">Нисте откључали уређај <xliff:g id="NUMBER_1">%d</xliff:g> сата. Потврдите лозинку.</item>
+ <item quantity="other">Нисте откључали уређај <xliff:g id="NUMBER_1">%d</xliff:g> сати. Потврдите лозинку.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Није препознат"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml
index 2334132..5e923c0 100644
--- a/packages/SystemUI/res-keyguard/values-sv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Knapp för byte av inmatningsmetod."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Ange pinkod"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Ange PUK-koden och en ny pinkod för SIM-kortet"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK-kod för SIM-kortet"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Ny pinkod för SIM-kortet"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Tryck om du vill ange lösenord"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Lås upp med lösenordet"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Lås upp med pinkoden"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Fel pinkod."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Laddat"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Laddas"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Laddas snabbt"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Laddas långsamt"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Anslut laddaren."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Lås upp genom att trycka på Meny."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Nätverk låst"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Inget SIM-kort"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Inget SIM-kort i surfplattan."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Inget SIM-kort i mobilen."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Sätt i ett SIM-kort."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM-kort saknas eller kan inte läsas. Sätt i ett SIM-kort."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Oanvändbart SIM-kort."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"SIM-kortet har inaktiverats permanent.\n Beställ ett nytt SIM-kort från din operatör."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM-kortet är låst."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM-kortet är PUK-låst."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Låser upp SIM-kort …"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Pinkodsområde"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Pinkodsområde för SIM-kort"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"PUK-kodsområde för SIM-kort"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Nästa alarm är inställt på <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Radera"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Retur"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Har du glömt ditt grafiska lösenord?"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Fel grafiskt lösenord"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Fel lösenord"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Fel pinkod"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Försök igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Rita ditt grafiska lösenord"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Ange pinkod för SIM-kortet"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Ange pinkod för SIM-kortet för <xliff:g id="CARRIER">%1$s</xliff:g>"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Ange pinkod"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Ange lösenord"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kortet har inaktiverats. Du måste ange en PUK-kod innan du kan fortsätta. Kontakta operatören för mer information."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM-kortet för <xliff:g id="CARRIER">%1$s</xliff:g> har inaktiverats. Du måste ange en PUK-kod innan du kan fortsätta. Kontakta operatören för mer information."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Ange önskad pinkod"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Bekräfta önskad pinkod"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Låser upp SIM-kort …"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Ange en pinkod med fyra till åtta siffror."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK-koden ska vara minst åtta siffror."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Ange rätt PUK-kod. Om försöken upprepas inaktiveras SIM-kortet permanent."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Pinkoderna stämmer inte överens"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"För många försök med grafiskt lösenord"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Du har angett fel pinkod <xliff:g id="NUMBER_0">%1$d</xliff:g> gånger. \n\nFörsök igen om <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunder."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Du har angett fel lösenord <xliff:g id="NUMBER_0">%1$d</xliff:g> gånger. \n\nFörsök igen om <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunder."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%1$d</xliff:g> gånger. \n\nFörsök igen om <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunder."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Du har försökt låsa upp surfplattan på ett felaktigt sätt <xliff:g id="NUMBER_0">%1$d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%2$d</xliff:g> försök återställs surfplattan och all data raderas."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Du har försökt låsa upp mobilen på ett felaktigt sätt <xliff:g id="NUMBER_0">%1$d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%2$d</xliff:g> försök återställs mobilen och all data raderas."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Du har försökt låsa upp surfplattan på ett felaktigt sätt <xliff:g id="NUMBER">%d</xliff:g> gånger. Surfplattan återställs och all data raderas."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Du har försökt låsa upp mobilen på ett felaktigt sätt <xliff:g id="NUMBER">%d</xliff:g> gånger. Mobilen återställs och all data raderas."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Du har försökt låsa upp surfplattan på ett felaktigt sätt <xliff:g id="NUMBER_0">%1$d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%2$d</xliff:g> försök tas användaren bort och all användardata raderas."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Du har försökt låsa upp mobilen på ett felaktigt sätt <xliff:g id="NUMBER_0">%1$d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%2$d</xliff:g> försök tas användaren bort och all användardata raderas."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Du har försökt låsa upp surfplattan på ett felaktigt sätt <xliff:g id="NUMBER">%d</xliff:g> gånger. Användaren tas bort och all användardata raderas."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Du har försökt låsa upp mobilen på ett felaktigt sätt <xliff:g id="NUMBER">%d</xliff:g> gånger. Användaren tas bort och all användardata raderas."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Du har försökt låsa upp surfplattan på ett felaktigt sätt <xliff:g id="NUMBER_0">%1$d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%2$d</xliff:g> försök tas jobbprofilen bort och all profildata raderas."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Du har försökt låsa upp mobilen på ett felaktigt sätt <xliff:g id="NUMBER_0">%1$d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%2$d</xliff:g> försök tas jobbprofilen bort och all profildata raderas."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Du har försökt låsa upp surfplattan på ett felaktigt sätt <xliff:g id="NUMBER">%d</xliff:g> gånger. Jobbprofilen tas bort och all profildata raderas."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Du har försökt låsa upp mobilen på ett felaktigt sätt <xliff:g id="NUMBER">%d</xliff:g> gånger. Jobbprofilen tas bort och all profildata raderas."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%1$d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%2$d</xliff:g> försök måste du låsa upp surfplattan med hjälp av ett e-postkonto.\n\n Försök igen om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%1$d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%2$d</xliff:g> försök måste du låsa upp mobilen med hjälp av ett e-postkonto.\n\n Försök igen om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Du angav fel pinkod för SIM-kortet och måste nu kontakta operatören för att låsa upp enheten."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Du angav fel pinkod för SIM-kortet. <xliff:g id="NUMBER_1">%d</xliff:g> försök återstår.</item>
+ <item quantity="one">Du angav fel pinkod för SIM-kortet. <xliff:g id="NUMBER_0">%d</xliff:g> försök återstår innan du måste kontakta operatören för att låsa upp enheten.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM-kortet är obrukbart. Kontakta operatören."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Du angav fel PUK-kod för SIM-kortet. <xliff:g id="NUMBER_1">%d</xliff:g> försök återstår innan SIM-kortet blir obrukbart.</item>
+ <item quantity="one">Du angav fel PUK-kod för SIM-kortet. <xliff:g id="NUMBER_0">%d</xliff:g> försök återstår innan SIM-kortet blir obrukbart.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Det gick inte att låsa upp med pinkoden för SIM-kortet."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Det gick inte att låsa upp med PUK-koden för SIM-kortet."</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Koden godkändes."</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Ingen tjänst."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Byt inmatningsmetod"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Flygplansläge"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Du måste ange grafiskt lösenord när du har startat om enheten"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Du måste ange pinkod när du har startat om enheten"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Du måste ange lösenord när du har startat om enheten"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Du måste ange grafiskt lösenord för ytterligare säkerhet"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Du måste ange pinkod för ytterligare säkerhet"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Du måste ange lösenord för ytterligare säkerhet"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Du måste ange grafiskt lösenord när du byter profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Du måste ange pinkod när du byter profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Du måste ange lösenord när du byter profil"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Enhetsadministratören har låst enheten"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Enheten har låsts manuellt"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Enheten har inte låsts upp på <xliff:g id="NUMBER_1">%d</xliff:g> timmar. Bekräfta det grafiska lösenordet.</item>
+ <item quantity="one">Enheten har inte låsts upp på <xliff:g id="NUMBER_0">%d</xliff:g> timme. Bekräfta det grafiska lösenordet.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Enheten har inte låsts upp på <xliff:g id="NUMBER_1">%d</xliff:g> timmar. Bekräfta pinkoden.</item>
+ <item quantity="one">Enheten har inte låsts upp på <xliff:g id="NUMBER_0">%d</xliff:g> timme. Bekräfta pinkoden.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Enheten har inte låsts upp på <xliff:g id="NUMBER_1">%d</xliff:g> timmar. Bekräfta lösenordet.</item>
+ <item quantity="one">Enheten har inte låsts upp på <xliff:g id="NUMBER_0">%d</xliff:g> timme. Bekräfta lösenordet.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Identifierades inte"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml
index 01ce3c3..057f852 100644
--- a/packages/SystemUI/res-keyguard/values-sw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Swichi kitufe cha mbinu ingizi."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Kilinda vitufe"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Weka nambari ya PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Weka PUK na nambari mpya ya PIN ya SIM"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Nambari ya PUK ya SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Nambari mpya ya PIN ya SIM"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Gusa ili uandike nenosiri"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Andika nenosiri ili ufungue"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Andika PIN ili ufungue"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Nambari ya PIN si sahihi."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Betri imejaa"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Inachaji"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Inachaji kwa kasi"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Inachaji pole pole"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Unganisha chaja yako."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Bonyeza Menyu ili kufungua."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Mtandao umefungwa"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Hakuna SIM kadi"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Hakuna SIM kadi katika kompyuta kibao."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Hakuna SIM kadi kwenye simu."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Weka SIM kadi."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM kadi haiko au haisomeki. Weka SIM kadi."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"SIM kadi isiyotumika."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"SIM kadi yako imefungwa kabisa.\n Wasiliana na mtoa huduma za mtandao ili upate SIM kadi nyingine."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM kadi imefungwa."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM kadi imefungwa kwa PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Inafungua SIM kadi..."</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Eneo la PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Eneo la PIN ya SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Eneo la PUK ya SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Kengele inayofuata italia saa <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Futa"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Weka"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Umesahau Mchoro"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Mchoro si Sahihi"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Nenosiri si Sahihi"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Nambari ya PIN si sahihi"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Jaribu tena baada ya sekunde <xliff:g id="NUMBER">%d</xliff:g>."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Chora mchoro wako"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Weka PIN ya SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Weka PIN ya SIM ya \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Weka PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Weka Nenosiri"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM sasa imefungwa. Weka nambari ya PUK ili uendelee. Wasiliana na mtoa huduma za mtandao kwa maelezo."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM ya \"<xliff:g id="CARRIER">%1$s</xliff:g>\" sasa imezimwa. Weka nambari ya PUK ili uendelee. Wasiliana na mtoa huduma kwa maelezo."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Weka nambari ya PIN unayopendelea"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Thibitisha nambari ya PIN unayopendelea"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Inafungua SIM kadi..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Andika PIN ya tarakimu 4 hadi 8."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"Nambari ya PUK inafaa kuwa na tarakimu 8 au zaidi."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Weka tena nambari sahihi wa PUK. Ukirudia mara nyingi utafunga SIM kabisa."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Nambari za PIN hazifanani"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Umejaribu kuchora mchoro mara nyingi mno"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Umeandika vibaya PIN mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. \n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Umeandika vibaya nenosiri lako mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. \n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Umechora vibaya mchoro wako wa kufungua mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. \n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Umejaribu kufungua kompyuta kibao mara <xliff:g id="NUMBER_0">%1$d</xliff:g> bila mafanikio. Ukikosea mara nyingine <xliff:g id="NUMBER_1">%2$d</xliff:g>, kompyuta hii kibao itarejeshwa katika hali iliyotoka nayo kiwandani, hatua itakayofuta data yake yote."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Umejaribu kufungua simu mara <xliff:g id="NUMBER_0">%1$d</xliff:g> bila mafanikio. Ukikosea mara nyingine <xliff:g id="NUMBER_1">%2$d</xliff:g>, simu hii itarejeshwa katika hali iliyotoka nayo kiwandani, hatua itakayofuta data yake yote."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Umejaribu kufungua simu mara <xliff:g id="NUMBER">%d</xliff:g> bila mafanikio. Kompyuta hii kibao itarejeshwa katika hali iliyotoka nayo kiwandani, hatua itakayofuta data yake yote."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Umejaribu kufungua simu mara <xliff:g id="NUMBER">%d</xliff:g> bila mafanikio. Simu hii itarejeshwa katika hali iliyotoka nayo kiwandani, hatua itakayofuta data yake yote."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Umejaribu kufungua kompyuta kibao mara <xliff:g id="NUMBER_0">%1$d</xliff:g> bila mafanikio. Ukikosea mara nyingine <xliff:g id="NUMBER_1">%2$d</xliff:g>, mtumiaji huyu ataondolewa, hatua itakayofuta data yake yote."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Umejaribu kufungua simu mara <xliff:g id="NUMBER_0">%1$d</xliff:g> bila mafanikio. Ukikosea mara nyingine <xliff:g id="NUMBER_1">%2$d</xliff:g>, mtumiaji huyu ataondolewa, hatua itakayofuta data yake yote."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Umejaribu kufungua kompyuta kibao mara <xliff:g id="NUMBER">%d</xliff:g> bila mafanikio. Mtumiaji huyu ataondolewa, hatua itakayofuta data yote ya mtumiaji."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Umejaribu kufungua simu mara <xliff:g id="NUMBER">%d</xliff:g> bila mafanikio. Mtumiaji huyu ataondolewa, hatua itakayofuta data yote ya mtumiaji."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Umejaribu kufungua kompyuta kibao mara <xliff:g id="NUMBER_0">%1$d</xliff:g> bila mafanikio. Ukikosea mara nyingine <xliff:g id="NUMBER_1">%2$d</xliff:g>, wasifu wa kazini utaondolewa, hatua itakayofuta data yote ya wasifu."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Umejaribu kufungua simu mara <xliff:g id="NUMBER_0">%1$d</xliff:g> bila mafanikio. Ukikosea mara nyingine <xliff:g id="NUMBER_1">%2$d</xliff:g>, wasifu wa kazini utaondolewa, hatua itakayofuta data yote ya wasifu."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Umejaribu kufungua kompyuta kibao mara <xliff:g id="NUMBER">%d</xliff:g> bila mafanikio. Wasifu wa kazini utaondolewa, hatua itakayofuta data yote ya wasifu."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Umejaribu kufungua simu mara <xliff:g id="NUMBER">%d</xliff:g> bila mafanikio. Wasifu wa kazini utaondolewa, hatua itakayofuta data yote ya wasifu."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Umekosea kuchora mchoro wako wa kufungua mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Ukikosea mara nyingine <xliff:g id="NUMBER_1">%2$d</xliff:g>, utaombwa kufungua kompyuta yako kibao kwa kutumia akaunti yako ya barua pepe.\n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%3$d</xliff:g>."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Umekosea kuchora mchoro wako wa kufungua mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Ukikosea mara nyingine <xliff:g id="NUMBER_1">%2$d</xliff:g>, utaombwa kufungua simu yako kwa kutumia akaunti ya barua pepe.\n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%3$d</xliff:g>."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Nambari ya PIN ya SIM si sahihi, sasa lazima uwasiliane na mtoa huduma za mtandao ndipo ufungue kifaa chako."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Nambari ya PIN ya SIM si sahihi. Una nafasi zingine <xliff:g id="NUMBER_1">%d</xliff:g> za kujaribu.</item>
+ <item quantity="one">Nambari ya PIN ya SIM si sahihi. Una nafasi zingine <xliff:g id="NUMBER_0">%d</xliff:g> za kujaribu kabla ulazimike kuwasiliana na mtoa huduma wako ili akufungulie kifaa chako.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM haiwezi kutumika. Wasiliana na mtoa huduma wako."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Nambari ya PUK ya SIM si sahihi, bado unaweza kujaribu mara <xliff:g id="NUMBER_1">%d</xliff:g> kabla ya SIM kuacha kutumika kabisa.</item>
+ <item quantity="one">Nambari ya PUK ya SIM si sahihi, bado unaweza kujaribu mara <xliff:g id="NUMBER_0">%d</xliff:g> kabla ya SIM kuacha kutumika kabisa.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Utendakazi wa PIN ya SIM haujafanikiwa!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Utendakazi wa PUK ya SIM haujafanikiwa!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Nambari Imekubaliwa!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Hakuna mtandao."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Badilisha mbinu ya kuingiza data"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Hali ya ndegeni"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Unafaa kuchora mchoro baada ya kuwasha kifaa upya"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Unafaa kuweka PIN baada ya kuwasha kifaa upya"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Unafaa kuweka nenosiri baada ya kuwasha kifaa upya"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Mchoro unahitajika ili kuongeza usalama"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"PIN inahitajika ili kuongeza usalama"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Nenosiri linahitajika ili kuongeza usalama."</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Mchoro unahitajika unapobadili wasifu"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"PIN inahitajika unapobadili wasifu"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Nenosiri linahitajika unapobadili wasifu"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Msimamizi wa kifaa amekifunga"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Umefunga kifaa mwenyewe"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Hujafungua kifaa kwa saa <xliff:g id="NUMBER_1">%d</xliff:g>. Thibitisha mchoro.</item>
+ <item quantity="one">Hujafungua kifaa kwa saa <xliff:g id="NUMBER_0">%d</xliff:g>. Thibitisha mchoro.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Hujafungua kifaa kwa saa <xliff:g id="NUMBER_1">%d</xliff:g>. Thibitisha PIN.</item>
+ <item quantity="one">Hujafungua kifaa kwa saa <xliff:g id="NUMBER_0">%d</xliff:g>. Thibitisha PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Hujafungua kifaa kwa saa <xliff:g id="NUMBER_1">%d</xliff:g>. Thibitisha nenosiri.</item>
+ <item quantity="one">Hujafungua kifaa kwa saa <xliff:g id="NUMBER_0">%d</xliff:g>. Thibitisha nenosiri.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Haikutambua alama ya kidole"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index 9c25e5d..8876750 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"உள்ளீட்டு முறையை மாற்றும் பொத்தான்."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"பின் குறியீட்டை உள்ளிடவும்"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"சிம் PUK மற்றும் புதிய பின் குறியீட்டை உள்ளிடவும்"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"சிம் PUK குறியீடு"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"புதிய சிம் பின் குறியீடு"</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">"திறக்க, பின்னை உள்ளிடவும்"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"தவறான பின் குறியீடு."</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_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">"சிம் கார்டு இல்லை"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"டேப்லெட்டில் சிம் கார்டு இல்லை."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"மொபைலில் சிம் கார்டு இல்லை."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"சிம் கார்டைச் செருகவும்."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"சிம் கார்டு செருகப்படவில்லை அல்லது படிக்கக்கூடியதாக இல்லை. சிம் கார்டைச் செருகவும்."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"பயன்படுத்த முடியாத சிம் கார்டு."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"சிம் கார்டு நிரந்தரமாக முடக்கப்பட்டது.\n வேறு சிம் கார்டைப் பெற, உங்கள் வயர்லெஸ் சேவை வழங்குநரைத் தொடர்புகொள்ளவும்."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"சிம் கார்டு பூட்டப்பட்டுள்ளது."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"சிம் கார்டு PUK ஆல் பூட்டப்பட்டது."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"சிம் கார்டைத் திறக்கிறது…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"பின்னுக்கான பகுதி"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"சிம் பின்னுக்கான பகுதி"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"சிம் 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="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">"தவறான பின்"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"பேட்டர்னை வரையவும்"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"சிம் பின்னை உள்ளிடவும்"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%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>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர, PUK குறியீட்டை உள்ளிடவும். விவரங்களுக்கு, தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்புகொள்ளவும்."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"பின் குறியீட்டை உள்ளிடவும்"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"பின் குறியீட்டை உறுதிப்படுத்தவும்"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"சிம் கார்டைத் திறக்கிறது…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"4 இலிருந்து 8 எண்கள் உள்ள பின்னை உள்ளிடவும்."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK குறியீட்டில் 8 அல்லது அதற்கும் அதிகமான எண்கள் இருக்க வேண்டும்."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"சரியான PUK குறியீட்டை மீண்டும் உள்ளிடவும். தொடர் முயற்சிகள் சிம்மை நிரந்தரமாக முடக்கிவிடும்."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"பின் குறியீடுகள் பொருந்தவில்லை"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"பேட்டர்னை அதிக முறை தவறாக வரைந்துவிட்டீர்கள்"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"உங்கள் பின்னை <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">"சிம்மின் பின் குறியீடு தவறானது. இனி சாதனத்தைத் திறக்க, உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்புகொள்ள வேண்டும்."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <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="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"பயன்படுத்த முடியாத சிம். உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்புகொள்ளவும்."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">சிம்மின் PUK குறியீடு தவறானது, மேலும் <xliff:g id="NUMBER_1">%d</xliff:g> முறை முயலலாம். தொடர்ந்து தவறான குறியீடு உள்ளிடப்பட்டால், அதன் பிறகு சிம்மை நிரந்தரமாகப் பயன்படுத்த முடியாமல் போகும்.</item>
+ <item quantity="one">சிம்மின் PUK குறியீடு தவறானது, மேலும் <xliff:g id="NUMBER_0">%d</xliff:g> முறை முயலலாம். தொடர்ந்து தவறான குறியீடு உள்ளிடப்பட்டால், அதன் பிறகு சிம்மை நிரந்தரமாகப் பயன்படுத்த முடியாமல் போகும்.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"சிம் பின் செயல்பாடு தோல்வியடைந்தது!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"சிம் 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">"கூடுதல் பாதுகாப்பிற்கு, பின்னை உள்ளிட வேண்டும்"</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">"சுயவிவரங்களுக்கு இடையே மாறும் போது, பின்னை உள்ளிட வேண்டும்"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"சுயவிவரங்களுக்கு இடையே மாறும் போது, கடவுச்சொல்லை உள்ளிட வேண்டும்"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"சாதன நிர்வாகி சாதனத்தைப் பூட்டியுள்ளார்"</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> மணிநேரமாகச் சாதனம் திறக்கப்படவில்லை. பின்னை உறுதிப்படுத்தவும்.</item>
+ <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> மணிநேரமாகச் சாதனம் திறக்கப்படவில்லை. பின்னை உறுதிப்படுத்தவும்.</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml
index eb47024..ae79089 100644
--- a/packages/SystemUI/res-keyguard/values-te/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-te/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"ఇన్పుట్ పద్ధతి మార్చే బటన్."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"PIN కోడ్ తప్పు."</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_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="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"మీ నమూనాను గీయండి"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM PINను నమోదు చేయండి"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" కోసం SIM PINను నమోదు చేయండి"</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 కోడ్ తప్పు, మీకు మరో <xliff:g id="NUMBER_1">%d</xliff:g> ప్రయత్నాలు మిగిలి ఉన్నాయి, ఆ తర్వాత SIM శాశ్వతంగా నిరుపయోగకరంగా మారుతుంది.</item>
+ <item quantity="one">SIM PUK కోడ్ తప్పు, మీకు మరో <xliff:g id="NUMBER_0">%d</xliff:g> ప్రయత్నం మిగిలి ఉంది, ఆ తర్వాత SIM శాశ్వతంగా నిరుపయోగకరంగా మారుతుంది.</item>
+ </plurals>
+ <string name="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">"పరికరాన్ని పునఃప్రారంభించిన తర్వాత PINని నమోదు చేయాలి"</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="2438626748767361010">"పరికర నిర్వాహకులు పరికరాన్ని లాక్ చేసారు"</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml
index 0f55a44..6e8f965 100644
--- a/packages/SystemUI/res-keyguard/values-th/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-th/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"ปุ่มสลับวิธีการป้อนข้อมูล"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <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">"พิมพ์ PUK ของซิมและรหัส PIN ใหม่"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"รหัส PUK ของซิม"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"รหัส 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_password_wrong_pin_code" msgid="6535018036285012028">"รหัส PIN ไม่ถูกต้อง"</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_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">"ไม่มีซิมการ์ด"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"ไม่มีซิมการ์ดในแท็บเล็ต"</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"ไม่มีซิมการ์ดในโทรศัพท์"</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"ใส่ซิมการ์ด"</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"ไม่มีซิมการ์ดหรือไม่สามารถอ่านได้ โปรดใส่ซิมการ์ด"</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"ซิมการ์ดใช้ไม่ได้"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"ซิมการ์ดถูกปิดใช้อย่างถาวร\nติดต่อผู้ให้บริการระบบไร้สายของคุณเพื่อขอซิมการ์ดใหม่"</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"ซิมการ์ดถูกล็อก"</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"ซิมการ์ดถูกล็อกด้วย PUK"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"กำลังปลดล็อกซิมการ์ด…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"พื้นที่ PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"พื้นที่ PIN ของซิม"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"พื้นที่ 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="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"ลองอีกครั้งในอีก <xliff:g id="NUMBER">%d</xliff:g> วินาที"</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"วาดรูปแบบของคุณ"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"ป้อน PIN ของซิม"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"ป้อน PIN ของซิมสำหรับ \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</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">"ซิมการ์ดถูกปิดใช้แล้ว ป้อนรหัส PUK เพื่อดำเนินการต่อ โปรดสอบถามรายละเอียดจากผู้ให้บริการ"</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"ปิดใช้ซิม \"<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">"กำลังปลดล็อกซิมการ์ด…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"พิมพ์ PIN ซึ่งเป็นเลข 4-8 หลัก"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"รหัส PUK ต้องเป็นตัวเลขอย่างน้อย 8 หลัก"</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"ใส่รหัส PUK ที่ถูกต้องอีกครั้ง การพยายามซ้ำหลายครั้งจะทำให้ซิมการ์ดถูกปิดใช้งานอย่างถาวร"</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">"รหัส PIN ของซิมไม่ถูกต้อง ตอนนี้คุณต้องติดต่อผู้ให้บริการเพื่อปลดล็อกอุปกรณ์ของคุณ"</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">รหัส PIN ของซิมไม่ถูกต้อง คุณพยายามได้อีก <xliff:g id="NUMBER_1">%d</xliff:g> ครั้ง</item>
+ <item quantity="one">รหัส PIN ของซิมไม่ถูกต้อง คุณพยายามได้อีก <xliff:g id="NUMBER_0">%d</xliff:g> ครั้งก่อนที่จะต้องติดต่อผู้ให้บริการเพื่อปลดล็อกอุปกรณ์ของคุณ</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"ซิมไม่สามารถใช้งานได้ โปรดติดต่อผู้ให้บริการ"</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">รหัส PUK ของซิมไม่ถูกต้อง คุณพยายามได้อีก <xliff:g id="NUMBER_1">%d</xliff:g> ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร</item>
+ <item quantity="one">รหัส PUK ของซิมไม่ถูกต้อง คุณพยายามได้อีก <xliff:g id="NUMBER_0">%d</xliff:g> ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"การปลดล็อกด้วย PIN ของซิมล้มเหลว!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"การปลดล็อกด้วย 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">"ต้องระบุ PIN หลังจากอุปกรณ์รีสตาร์ท"</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="2438626748767361010">"ผู้ดูแลอุปกรณ์ล็อกอุปกรณ์ไว้"</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml
index c587b94..b914c8b 100644
--- a/packages/SystemUI/res-keyguard/values-tl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Ilipat ang button na pamamaraan ng pag-input."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"I-type ang PIN code"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"I-type ang PUK ng SIM at ang bagong PIN code"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK code ng SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Bagong PIN code ng SIM"</string>
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"Mali ang PIN code."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Tapos nang mag-charge"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Nagcha-charge"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Mabilis na nagcha-charge"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Mabagal na nagcha-charge"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Ikonekta ang iyong charger."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Pindutin ang Menu upang i-unlock."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Naka-lock ang network"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Walang SIM card"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Walang SIM card sa tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Walang SIM card sa telepono."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Maglagay ng SIM card."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Wala o hindi nababasa ang SIM card. Maglagay ng SIM card."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Hindi na magagamit na SIM card."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Permanenteng na-disable ang iyong SIM card.\n Makipag-ugnayan sa iyong wireless service provider para sa isa pang SIM card."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"Naka-lock ang SIM card."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"Naka-PUK-lock ang SIM card."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Ina-unlock ang SIM card…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Lugar ng PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Lugar ng PIN ng SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Lugar ng PUK ng SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Nakatakda ang susunod na alarm sa <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"I-delete"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Nakalimutan ang Pattern"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Mali ang Pattern"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Mali ang Password"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Mali ang PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Subukang muli sa loob ng <xliff:g id="NUMBER">%d</xliff:g> (na) segundo."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Iguhit ang iyong pattern"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Ilagay ang PIN ng SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Ilagay ang PIN ng SIM para sa \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Ilagay ang PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Ilagay ang Password"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Naka-disable na ngayon ang SIM. Ilagay ang PUK code upang magpatuloy. Makipag-ugnayan sa carrier para sa mga detalye."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"Naka-disable na ngayon ang SIM na \"<xliff:g id="CARRIER">%1$s</xliff:g>.\" Ilagay ang PUK code upang magpatuloy. Makipag-ugnayan sa carrier para sa mga detalye."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Ilagay ang gustong PIN code"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Kumpirmahin ang gustong PIN code"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Ina-unlock ang SIM card…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Mag-type ng PIN na 4 hanggang 8 numero."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"Dapat ay 8 numero o higit pa ang PUK code."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Muling ilagay ang tamang PUK code. Permanenteng madi-disable ang SIM dahil sa paulit-ulit na pagsubok."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Hindi nagtutugma ang mga PIN code"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Masyadong maraming pagsubok sa pattern"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Na-type mo nang mali ang iyong PIN nang <xliff:g id="NUMBER_0">%1$d</xliff:g> (na) beses. \n\nSubukang muli sa loob ng <xliff:g id="NUMBER_1">%2$d</xliff:g> (na) segundo."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Na-type mo nang hindi tama ang iyong password nang <xliff:g id="NUMBER_0">%1$d</xliff:g> (na) beses. \n\nSubukang muli sa loob ng <xliff:g id="NUMBER_1">%2$d</xliff:g> (na) segundo."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Naguhit mo nang hindi tama ang iyong pattern sa pag-unlock nang <xliff:g id="NUMBER_0">%1$d</xliff:g> (na) beses. \n\nSubukang muli sa loob ng <xliff:g id="NUMBER_1">%2$d</xliff:g> (na) segundo."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"<xliff:g id="NUMBER_0">%1$d</xliff:g> (na) beses mo nang sinubukang i-unlock ang tablet gamit ang maling password. Pagkatapos ng <xliff:g id="NUMBER_1">%2$d</xliff:g> pang hindi matagumpay na pagsubok, ire-reset ang tablet na ito, na magiging dahilan upang ma-delete ang lahat ng data nito."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"<xliff:g id="NUMBER_0">%1$d</xliff:g> (na) beses mo nang sinubukang i-unlock ang telepono gamit ang maling password. Pagkatapos ng <xliff:g id="NUMBER_1">%2$d</xliff:g> pang hindi matagumpay na pagsubok, ire-reset ang teleponong ito, na magiging dahilan upang ma-delete ang lahat ng data nito."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"<xliff:g id="NUMBER">%d</xliff:g> (na) beses mo nang sinubukang i-unlock ang tablet gamit ang maling password. Ire-reset ang tablet na ito, na magiging dahilan upang ma-delete ang lahat ng data nito."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"<xliff:g id="NUMBER">%d</xliff:g> (na) beses mo nang sinubukang i-unlock ang telepono gamit ang maling password. Ire-reset ang teleponong ito, na magiging dahilan upang ma-delete ang lahat ng data nito."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"<xliff:g id="NUMBER_0">%1$d</xliff:g> (na) beses mo nang sinubukang i-unlock ang tablet gamit ang maling password. Pagkatapos ng <xliff:g id="NUMBER_1">%2$d</xliff:g> pang hindi matagumpay na pagsubok, aalisin ang user na ito, na magiging dahilan upang ma-delete ang lahat ng data ng user."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"<xliff:g id="NUMBER_0">%1$d</xliff:g> (na) beses mo nang sinubukang i-unlock ang telepono gamit ang maling password. Pagkatapos ng <xliff:g id="NUMBER_1">%2$d</xliff:g> pang hindi matagumpay na pagsubok, aalisin ang user na ito, na magiging dahilan upang ma-delete ang lahat ng data ng user."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"<xliff:g id="NUMBER">%d</xliff:g> (na) beses mo nang sinubukang i-unlock ang tablet gamit ang maling password. Aalisin ang user na ito, na magiging dahilan upang ma-delete ang lahat ng data ng user."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"<xliff:g id="NUMBER">%d</xliff:g> (na) beses mo nang sinubukang i-unlock ang telepono gamit ang maling password. Aalisin ang user na ito, na magiging dahilan upang ma-delete ang lahat ng data ng user."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"<xliff:g id="NUMBER_0">%1$d</xliff:g> (na) beses mo nang sinubukang i-unlock ang tablet gamit ang maling password. Pagkatapos ng <xliff:g id="NUMBER_1">%2$d</xliff:g> pang hindi matagumpay na pagsubok, aalisin ang profile sa trabaho, na magiging dahilan upang ma-delete ang lahat ng data sa profile."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"<xliff:g id="NUMBER_0">%1$d</xliff:g> (na) beses mo nang sinubukang i-unlock ang telepono gamit ang maling password. Pagkatapos ng <xliff:g id="NUMBER_1">%2$d</xliff:g> pang hindi matagumpay na pagsubok, aalisin ang profile sa trabaho, na magiging dahilan upang ma-delete ang lahat ng data sa profile."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"<xliff:g id="NUMBER">%d</xliff:g> (na) beses mo nang sinubukang i-unlock ang tablet gamit ang maling password. Aalisin ang profile sa trabaho, na magiging dahilan upang ma-delete ang lahat ng data sa profile."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"<xliff:g id="NUMBER">%d</xliff:g> (na) beses mo nang sinubukang i-unlock ang telepono gamit ang maling password. Aalisin ang profile sa trabaho, na magiging dahilan upang ma-delete ang lahat ng data sa profile."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Naguhit mo nang hindi tama ang iyong pattern sa pag-unlock nang <xliff:g id="NUMBER_0">%1$d</xliff:g> (na) beses. Pagkatapos ng <xliff:g id="NUMBER_1">%2$d</xliff:g> pang hindi matagumpay na pagsubok, hihilingin sa iyong i-unlock ang tablet mo gamit ang isang email account.\n\n Subukang muli sa loob ng <xliff:g id="NUMBER_2">%3$d</xliff:g> (na) segundo."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Naguhit mo nang hindi tama ang iyong pattern sa pag-unlock nang <xliff:g id="NUMBER_0">%1$d</xliff:g> (na) beses. Pagkatapos ng <xliff:g id="NUMBER_1">%2$d</xliff:g> pang hindi matagumpay na pagsubok, hihilingin sa iyong i-unlock ang telepono mo gamit ang isang email account.\n\n Subukang muli sa loob ng <xliff:g id="NUMBER_2">%3$d</xliff:g> (na) segundo."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Mali ang PIN code ng SIM, dapat ka nang makipag-ugnayan sa iyong carrier upang i-unlock ang iyong device."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Mali ang PIN code ng SIM, mayroon kang <xliff:g id="NUMBER_1">%d</xliff:g> natitirang pagsubok.</item>
+ <item quantity="other">Mali ang PIN code ng SIM, mayroon kang <xliff:g id="NUMBER_1">%d</xliff:g> na natitirang pagsubok.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"Hindi magagamit ang SIM. Makipag-ugnayan sa iyong carrier."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">Mali ang PUK code ng SIM, mayroon kang <xliff:g id="NUMBER_1">%d</xliff:g> natitirang pagsubok bago tuluyang hindi magamit ang SIM.</item>
+ <item quantity="other">Mali ang PUK code ng SIM, mayroon kang <xliff:g id="NUMBER_1">%d</xliff:g> na natitirang pagsubok bago tuluyang hindi magamit ang SIM.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Nabigo ang operasyon ng PIN ng SIM!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Nabigo ang operasyon ng PUK ng SIM!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Tinanggap ang Code!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Walang serbisyo."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Magpalit ng pamamaraan ng pag-input"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Airplane mode"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Kailangan ng pattern pagkatapos mag-restart ng device"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Kailangan ng PIN pagkatapos mag-restart ng device"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Kailangan ng password pagkatapos mag-restart ng device"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Kinakailangan ang pattern para sa karagdagang seguridad"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Kinakailangan ang PIN para sa karagdagang seguridad"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Kinakailangan ang password para sa karagdagang seguridad"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Kinakailangan ang pattern kapag nagpalit ka ng profile"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Kinakailangan ang PIN kapag nagpalit ka ng profile"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Kinakailangan ang password kapag nagpalit ka ng profile"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Na-lock ang device ng administrator ng device"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Manual na na-lock ang device"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Hindi na-unlock ang device sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> oras. Kumpirmahin ang pattern.</item>
+ <item quantity="other">Hindi na-unlock ang device sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> na oras. Kumpirmahin ang pattern.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Hindi na-unlock ang device sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> oras. Kumpirmahin ang PIN.</item>
+ <item quantity="other">Hindi na-unlock ang device sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> na oras. Kumpirmahin ang PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Hindi na-unlock ang device sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> oras. Kumpirmahin ang password.</item>
+ <item quantity="other">Hindi na-unlock ang device sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> na oras. Kumpirmahin ang password.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Hindi nakilala"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml
index 3e2bd22..32de44b 100644
--- a/packages/SystemUI/res-keyguard/values-tr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Giriş yöntemini değiştirme düğmesi."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"PIN kodunu yazın"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"SIM PUK kodunu ve yeni bir PIN kodu yazın."</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM PUK kodu"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Yeni SIM PIN kodu"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Şifre yazmak için dokunun"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Kilidi açmak için şifreyi yazın"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Kilidi açmak için PIN kodunu yazın"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Yanlış PIN kodu."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Ödeme alındı"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Şarj oluyor"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Hızlı şarj oluyor"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Yavaş şarj oluyor"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Şarj cihazınızı takın."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Kilidi açmak için Menü\'ye basın."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Ağ kilitli"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"SIM kart yok"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Tablette SIM kart yok."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Telefonda SIM kart yok."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"SIM kart takın."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM kart yok veya okunamıyor. Bir SIM kart takın."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Kullanılamayan SIM kartı"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"SIM kartınız kalıcı olarak devre dışı bırakıldı.\n Başka bir SIM kart için kablosuz servis sağlayıcınıza başvurun."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM kart kilitli."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM kart PUK kilidi devrede."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"SIM kart kilidi açılıyor…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN alanı"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM PIN alanı"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"SIM PUK alanı"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Sonraki alarm <xliff:g id="ALARM">%1$s</xliff:g> olarak ayarlandı"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Deseni unuttunuz mu?"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Yanlış Desen"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Yanlış Şifre"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Yanlış PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> saniye içinde yeniden deneyin."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Deseninizi çizin"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM PIN kodunu girin"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" için SIM PIN\'ini kodunu girin"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN\'i girin"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Şifreyi Girin"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM kart artık devre dışı bırakıldı. Devam etmek için PUK kodunu girin. Ayrıntılı bilgi için operatörle bağlantı kurun."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"\"<xliff:g id="CARRIER">%1$s</xliff:g>1 SIM artık devre dışı. Devam etmek için PUK kodunu girin. Ayrıntılar için operatör ile iletişim kurun."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"İstenen PIN kodunu girin"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"İstenen PIN kodunu onaylayın"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"SIM kart kilidi açılıyor…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"4 ila 8 haneli bir PIN yazın."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK kodu 8 veya daha çok basamaklı bir sayı olmalıdır."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Doğru PUK kodunu tekrar girin. Çok sayıda deneme yapılırsa SIM kart kalıcı olarak devre dışı bırakılır."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN kodları eşleşmiyor"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Çok fazla sayıda desen denemesi yapıldı"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"PIN kodunuzu <xliff:g id="NUMBER_0">%1$d</xliff:g> kez yanlış girdiniz. \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> saniye içinde tekrar deneyin."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Şifrenizi <xliff:g id="NUMBER_0">%1$d</xliff:g> kez yanlış yazdınız. \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> saniye içinde tekrar deneyin."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%1$d</xliff:g> kez yanlış çizdiniz. \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> saniye içinde tekrar deneyin."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Tabletin kilidini <xliff:g id="NUMBER_0">%1$d</xliff:g> kez hatalı bir şekilde açmayı denediniz. <xliff:g id="NUMBER_1">%2$d</xliff:g> başarısız deneme daha yaparsanız bu tablet sıfırlanacak ve tüm verileri silinecektir."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Telefonun kilidini <xliff:g id="NUMBER_0">%1$d</xliff:g> kez hatalı bir şekilde açmayı denediniz. <xliff:g id="NUMBER_1">%2$d</xliff:g> başarısız deneme daha yaparsanız bu telefon sıfırlanacak ve tüm verileri silinecektir."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Tabletin kilidini <xliff:g id="NUMBER">%d</xliff:g> kez hatalı bir şekilde açmayı denediniz. Bu tablet sıfırlanacak ve tüm verileri silinecektir."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Telefonun kilidini <xliff:g id="NUMBER">%d</xliff:g> kez hatalı bir şekilde açmayı denediniz. Bu telefon sıfırlanacak ve tüm verileri silinecektir."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Tabletin kilidini <xliff:g id="NUMBER_0">%1$d</xliff:g> kez hatalı bir şekilde açmayı denediniz. <xliff:g id="NUMBER_1">%2$d</xliff:g> başarısız deneme daha yaparsanız bu kullanıcı kaldırılacak ve tüm kullanıcı verileri silinecektir."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Telefonun kilidini <xliff:g id="NUMBER_0">%1$d</xliff:g> kez hatalı bir şekilde açmayı denediniz. <xliff:g id="NUMBER_1">%2$d</xliff:g> başarısız deneme daha yaparsanız bu kullanıcı kaldırılacak ve tüm kullanıcı verileri silinecektir."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Tabletin kilidini <xliff:g id="NUMBER">%d</xliff:g> kez hatalı bir şekilde açmayı denediniz. Bu kullanıcı kaldırılacak ve tüm kullanıcı verileri silinecektir."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Telefonun kilidini <xliff:g id="NUMBER">%d</xliff:g> kez hatalı bir şekilde açmayı denediniz. Bu kullanıcı kaldırılacak ve tüm kullanıcı verileri silinecektir."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Tabletin kilidini <xliff:g id="NUMBER_0">%1$d</xliff:g> kez hatalı bir şekilde açmayı denediniz. <xliff:g id="NUMBER_1">%2$d</xliff:g> başarısız deneme daha yaparsanız iş profili kaldırılacak ve tüm profil verileri silinecektir."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Telefonun kilidini <xliff:g id="NUMBER_0">%1$d</xliff:g> kez hatalı bir şekilde açmayı denediniz. <xliff:g id="NUMBER_1">%2$d</xliff:g> başarısız deneme daha yaparsanız iş profili kaldırılacak ve tüm profil verileri silinecektir."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Tabletin kilidini <xliff:g id="NUMBER">%d</xliff:g> kez hatalı bir şekilde açmayı denediniz. İş profili kaldırılacak ve tüm profil verileri silinecektir."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Telefonun kilidini <xliff:g id="NUMBER">%d</xliff:g> kez hatalı bir şekilde açmayı denediniz. İş profili kaldırılacak ve tüm profil verileri silinecektir."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%1$d</xliff:g> defa yanlış çizdiniz. <xliff:g id="NUMBER_1">%2$d</xliff:g> başarısız denemeden sonra, tabletinizin kilidini bir e-posta hesabı kullanarak açmanız istenir.\n<xliff:g id="NUMBER_2">%3$d</xliff:g>\n saniye içinde tekrar deneyin."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%1$d</xliff:g> kez yanlış çizdiniz. <xliff:g id="NUMBER_1">%2$d</xliff:g> başarısız denemeden sonra telefonunuzun kilidini bir e-posta hesabı kullanarak açmanız istenir.\n<xliff:g id="NUMBER_2">%3$d</xliff:g>\n saniye içinde tekrar deneyin."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Yanlış SIM PIN kodu. Cihazınızın kilidini açmak için artık operatörünüzle bağlantı kurmanız gerekiyor."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Yanlış SIM PIN kodu, <xliff:g id="NUMBER_1">%d</xliff:g> deneme hakkınız kaldı.</item>
+ <item quantity="one">Yanlış SIM PIN kodu. Cihazının kilidini açmak için operatörünüzle bağlantı kurmak zorunda kalmadan önce <xliff:g id="NUMBER_0">%d</xliff:g> deneme hakkınız kaldı.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM kullanılamaz. Operatörünüzle bağlantı kurun."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Yanlış SIM PUK kodu, SIM kalıcı olarak kullanılmaz hale gelmeden önce <xliff:g id="NUMBER_1">%d</xliff:g> deneme hakkınız kaldı.</item>
+ <item quantity="one">Yanlış SIM PUK kodu. SIM kalıcı olarak kullanılmaz hale gelmeden önce <xliff:g id="NUMBER_0">%d</xliff:g> deneme hakkınız kaldı.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"SIM PIN işlemi başarısız oldu!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"SIM PUK işlemi başarısız oldu!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kod Kabul Edildi!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Hizmet yok."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Giriş yöntemini değiştir"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Uçak modu"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Cihaz yeniden başladıktan sonra desen gerekir"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Cihaz yeniden başladıktan sonra PIN gerekir"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Cihaz yeniden başladıktan sonra şifre gerekir"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Ek güvenlik için desen gerekir"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Ek güvenlik için PIN gerekir"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Ek güvenlik için şifre gerekir"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Profil değiştirdiğinizde desen gerekir"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Profil değiştirdiğinizde PIN gerekir"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Profil değiştirdiğinizde şifre gerekir"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Cihaz yöneticisi cihazı kilitledi"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Cihazın manuel olarak kilitlendi"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Cihazın kilidi son <xliff:g id="NUMBER_1">%d</xliff:g> saattir açılmadı. Deseni doğrulayın.</item>
+ <item quantity="one">Cihazın kilidi son <xliff:g id="NUMBER_0">%d</xliff:g> saattir açılmadı. Deseni doğrulayın.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Cihazın kilidi son <xliff:g id="NUMBER_1">%d</xliff:g> saattir açılmadı. PIN\'i doğrulayın.</item>
+ <item quantity="one">Cihazın kilidi son <xliff:g id="NUMBER_0">%d</xliff:g> saattir açılmadı. PIN\'i doğrulayın.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Cihazın kilidi son <xliff:g id="NUMBER_1">%d</xliff:g> saattir açılmadı. Şifreyi doğrulayın.</item>
+ <item quantity="one">Cihazın kilidi son <xliff:g id="NUMBER_0">%d</xliff:g> saattir açılmadı. Şifreyi doğrulayın.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Tanınmadı"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml
index b1c82ce..ff0bc38 100644
--- a/packages/SystemUI/res-keyguard/values-uk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml
@@ -20,186 +20,123 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Кнопка перемикання методу введення."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Введіть PIN-код"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Введіть PUK-код і новий PIN-код SIM-карти"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK-код SIM-карти"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Новий PIN-код SIM-карти"</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_password_wrong_pin_code" msgid="6535018036285012028">"Неправильний PIN-код."</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_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">"PIN-код SIM-карти"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"PUK-код SIM-карти"</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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> с."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Намалюйте ключ"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Введіть PIN-код SIM-карти"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Введіть PIN-код SIM-карти для оператора \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</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">"Введіть PIN-код із 4–8 цифр."</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">"Неправильний PIN-код SIM-карти. Зв’яжіться зі своїм оператором, щоб розблокувати пристрій."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Неправильний PIN-код SIM-карти. У вас залишилася <xliff:g id="NUMBER_1">%d</xliff:g> спроба.</item>
+ <item quantity="few">Неправильний PIN-код SIM-карти. У вас залишилося <xliff:g id="NUMBER_1">%d</xliff:g> спроби.</item>
+ <item quantity="many">Неправильний PIN-код SIM-карти. У вас залишилося <xliff:g id="NUMBER_1">%d</xliff:g> спроб.</item>
+ <item quantity="other">Неправильний PIN-код SIM-карти. У вас залишилося <xliff:g id="NUMBER_1">%d</xliff:g> спроби.</item>
+ </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="one">Неправильний PUK-код SIM-карти. У вас залишилася <xliff:g id="NUMBER_1">%d</xliff:g> спроба. Після цього SIM-карту буде назавжди заблоковано.</item>
+ <item quantity="few">Неправильний PUK-код SIM-карти. У вас залишилося <xliff:g id="NUMBER_1">%d</xliff:g> спроби. Після цього SIM-карту буде назавжди заблоковано.</item>
+ <item quantity="many">Неправильний PUK-код SIM-карти. У вас залишилося <xliff:g id="NUMBER_1">%d</xliff:g> спроб. Після цього SIM-карту буде назавжди заблоковано.</item>
+ <item quantity="other">Неправильний PUK-код SIM-карти. У вас залишилося <xliff:g id="NUMBER_1">%d</xliff:g> спроби. Після цього SIM-карту буде назавжди заблоковано.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Помилка введення PIN-коду SIM-карти."</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Помилка введення PUK-коду SIM-карти."</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">"Після перезавантаження пристрою потрібно ввести PIN-код"</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="2438626748767361010">"Адміністратор заблокував пристрій"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Пристрій заблоковано вручну"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Ви не розблоковували пристрій <xliff:g id="NUMBER_1">%d</xliff:g> годину. Підтвердьте ключ.</item>
+ <item quantity="few">Ви не розблоковували пристрій <xliff:g id="NUMBER_1">%d</xliff:g> години. Підтвердьте ключ.</item>
+ <item quantity="many">Ви не розблоковували пристрій <xliff:g id="NUMBER_1">%d</xliff:g> годин. Підтвердьте ключ.</item>
+ <item quantity="other">Ви не розблоковували пристрій <xliff:g id="NUMBER_1">%d</xliff:g> години. Підтвердьте ключ.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Ви не розблоковували пристрій <xliff:g id="NUMBER_1">%d</xliff:g> годину. Підтвердьте PIN-код.</item>
+ <item quantity="few">Ви не розблоковували пристрій <xliff:g id="NUMBER_1">%d</xliff:g> години. Підтвердьте PIN-код.</item>
+ <item quantity="many">Ви не розблоковували пристрій <xliff:g id="NUMBER_1">%d</xliff:g> годин. Підтвердьте PIN-код.</item>
+ <item quantity="other">Ви не розблоковували пристрій <xliff:g id="NUMBER_1">%d</xliff:g> години. Підтвердьте PIN-код.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Ви не розблоковували пристрій <xliff:g id="NUMBER_1">%d</xliff:g> годину. Підтвердьте пароль.</item>
+ <item quantity="few">Ви не розблоковували пристрій <xliff:g id="NUMBER_1">%d</xliff:g> години. Підтвердьте пароль.</item>
+ <item quantity="many">Ви не розблоковували пристрій <xliff:g id="NUMBER_1">%d</xliff:g> годин. Підтвердьте пароль.</item>
+ <item quantity="other">Ви не розблоковували пристрій <xliff:g id="NUMBER_1">%d</xliff:g> години. Підтвердьте пароль.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Не розпізнано"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml
index 959a2bd..bd04e16 100644
--- a/packages/SystemUI/res-keyguard/values-ur/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"اندراج کا طریقہ سوئچ کرنے کا بٹن۔"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"غلط PIN کوڈ۔"</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_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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"اپنا پیٹرن ڈرا کریں"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM PIN درج کریں"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" کیلئے SIM PIN درج کریں"</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">"ایسا PIN ٹائپ کریں جو 4 تا 8 اعداد پر مشتمل ہو۔"</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 کوڈ، آپ کے پاس <xliff:g id="NUMBER_1">%d</xliff:g> کوششیں بچی ہیں، اس کے بعد SIM مستقل طور پر ناقابل استعمال ہو جائے گا۔</item>
+ <item quantity="one">غلط SIM PUK کوڈ، آپ کے پاس <xliff:g id="NUMBER_0">%d</xliff:g> کوشش بچی ہے، اس کے بعد SIM مستقل طور پر ناقابل استعمال ہو جائے گا۔</item>
+ </plurals>
+ <string name="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">"آلہ دوبارہ چالو ہونے کے بعد PIN درکار ہوتا ہے"</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="2438626748767361010">"آلہ کے منتظم نے آلہ مقفل کر دیا"</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml
index 6391e2b..cfb10b3 100644
--- a/packages/SystemUI/res-keyguard/values-uz/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Kiritish uslubi tugmasini almashtirish."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyguard"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"PIN kodni kiriting"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"SIM karta PUK kodi va yangi PIN kodni tering"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"SIM karta PUK kodi"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Yangi SIM karta PIN kodi"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Parolni kiritish uchun bosing"</font></string>
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"PIN kodi xato."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Batareya quvvati to‘ldi"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Quvvatlash"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Tezkor quvvat olmoqda"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Sekin quvvat olmoqda"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Quvvatlash moslamasini ulang."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Qulfdan chiqarish uchun Menyu tugmasini bosing."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Tarmoq qulflangan"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"SIM karta yo‘q"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Planshetingizda SIM karta yo‘q."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Telefoningizda SIM karta yo‘q."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Telefonga SIM kartani joylashtiring."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM karta qo‘yilmagan yoki o‘qib bo‘lmayapti. SIM kartani joylashtiring."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Foydalanib bo‘lmaydigan SIM karta."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"SIM kartangiz butunlay bloklab qo‘yilgan.\n Yangi SIM karta olish uchun aloqa operatoringiz bilan bog‘laning."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM karta qulflangan."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"SIM karta PUK kod bilan qulflangan."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"SIM karta qulfi ochilmoqda…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"PIN kod maydoni"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"SIM karta PIN kodi maydoni"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"SIM karta PUK kodi maydoni"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Signal <xliff:g id="ALARM">%1$s</xliff:g> da chalinadi."</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"O‘chirib tashlash"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter tugmasi"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Grafik kalit esimdan chiqdi"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Grafik kalit xato"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Parol xato"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"PIN kod xato"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"<xliff:g id="NUMBER">%d</xliff:g> soniyadan keyin qaytadan urining."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Grafik kalit chizing"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"SIM kartaning PIN kodini kiriting"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"“<xliff:g id="CARRIER">%1$s</xliff:g>” SIM kartasi uchun PIN kodni kiriting"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN kodni kiriting"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Parol kiriting"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM karta hozir o‘chirilgan. Davom etish uchun PUK kodni kiriting. Batafsil axborot olish uchun tarmoq operatori bilan bog‘laning."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"“<xliff:g id="CARRIER">%1$s</xliff:g>” SIM kartasi o‘chirib qo‘yildi. Davom etish uchun PUK kodni kiriting. Tafsilotlar uchun aloqa operatoringizga murojaat qiling."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"So‘ralgan PIN kodni kiriting"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"So‘ralgan PIN kodni tasdiqlang"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"SIM karta qulfi ochilmoqda…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"4-8 ta raqamdan iborat PIN kodni kiriting."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK kod kamida 8 ta raqamdan iborat bo‘lishi shart."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"To‘g‘ri PUK kodni qayta kiriting. Qayta-qayta urinishlar SIM kartani butunlay o‘chirib qo‘yadi."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"PIN kod mos kelmadi"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Grafik kalit juda ko‘p marta chizildi"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"PIN kod <xliff:g id="NUMBER_0">%1$d</xliff:g> marta xato kiritildi. \n\n <xliff:g id="NUMBER_1">%2$d</xliff:g> soniyadan keyin qaytadan urining."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Parol <xliff:g id="NUMBER_0">%1$d</xliff:g> marta xato kiritildi. \n\n <xliff:g id="NUMBER_1">%2$d</xliff:g> soniyadan keyin qaytadan urining."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Grafik kalit <xliff:g id="NUMBER_0">%1$d</xliff:g> marta xato kiritildi. \n\n <xliff:g id="NUMBER_1">%2$d</xliff:g> soniyadan keyin qayta urining."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Siz planshetni qulfdan chiqarish uchun <xliff:g id="NUMBER_0">%1$d</xliff:g> marta noto‘g‘ri urinish qildingiz. Agar yana <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinish qilsangiz, ushbu planshetda zavod sozlamalari qayta tiklanadi va undagi barcha ma’lumotlar ham o‘chib ketadi."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Siz telefonni qulfdan chiqarish uchun <xliff:g id="NUMBER_0">%1$d</xliff:g> marta noto‘g‘ri urinish qildingiz. Agar yana <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinish qilsangiz, ushbu telefonda zavod sozlamalari qayta tiklanadi va undagi barcha ma’lumotlar ham o‘chib ketadi."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Siz planshetni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta noto‘g‘ri urinish qildingiz. Endi, ushbu planshetda zavod sozlamalari qayta tiklanadi va undagi barcha ma’lumotlar ham o‘chib ketadi."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Siz telefonni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta noto‘g‘ri urinish qildingiz. Endi, ushbu telefonda zavod sozlamalari qayta tiklanadi va undagi barcha ma’lumotlar ham o‘chib ketadi."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Siz planshetni qulfdan chiqarish uchun <xliff:g id="NUMBER_0">%1$d</xliff:g> marta noto‘g‘ri urinish qildingiz. Agar yana <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinish qilsangiz, ushbu foydalanuvchi o‘chirib tashlanadi va undagi barcha foydalanuvchi ma’lumotlari ham o‘chib ketadi."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Siz telefonni qulfdan chiqarish uchun <xliff:g id="NUMBER_0">%1$d</xliff:g> marta noto‘g‘ri urinish qildingiz. Agar yana <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinish qilsangiz, ushbu foydalanuvchi o‘chirib tashlanadi va undagi barcha foydalanuvchi ma’lumotlari ham o‘chib ketadi."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Siz planshetni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta noto‘g‘ri urinish qildingiz. Endi, ushbu foydalanuvchi o‘chirib tashlanadi va undagi barcha foydalanuvchi ma’lumotlari ham o‘chib ketadi."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Siz telefonni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta noto‘g‘ri urinish qildingiz. Endi, ushbu foydalanuvchi o‘chirib tashlanadi va undagi barcha foydalanuvchi ma’lumotlari ham o‘chib ketadi."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Siz planshetni qulfdan chiqarish uchun <xliff:g id="NUMBER_0">%1$d</xliff:g> marta noto‘g‘ri urinish qildingiz. Agar yana <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinish qilsangiz, ishchi profil o‘chirib tashlanadi va undagi barcha profil ma’lumotlari ham o‘chib ketadi."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Siz telefonni qulfdan chiqarish uchun <xliff:g id="NUMBER_0">%1$d</xliff:g> marta noto‘g‘ri urinish qildingiz. Agar yana <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinish qilsangiz, ishchi profil o‘chirib tashlanadi va undagi barcha profil ma’lumotlari ham o‘chib ketadi."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Siz planshetni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta noto‘g‘ri urinish qildingiz. Endi, ishchi profil o‘chirib tashlanadi va undagi barcha ma’lumotlar ham o‘chib ketadi."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Siz telefonni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta noto‘g‘ri urinish qildingiz. Endi, ishchi profil o‘chirib tashlanadi va undagi barcha ma’lumotlar ham o‘chib ketadi."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Grafik kalit <xliff:g id="NUMBER_0">%1$d</xliff:g> marta xato chizildi. <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinishdan keyin, sizdan e-pochtangizdan foydalanib, planshet qulfini ochishingiz so‘raladi.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> soniyadan keyin yana urinib ko‘ring."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Grafik kalit <xliff:g id="NUMBER_0">%1$d</xliff:g> marta xato chizildi. <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinishdan keyin, sizdan e-pochtangizdan foydalanib, telefon qulfini ochishingiz so‘raladi.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> soniyadan keyin qayta urinib ko‘ring."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"SIM kartaning PIN kodi xato. Qurilma qulfini ochish uchun operatoringizga murojaat qiling."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">SIM kartaning PIN kodi noto‘g‘ri. Sizda yana <xliff:g id="NUMBER_1">%d</xliff:g> ta urinish qoldi.</item>
+ <item quantity="one">SIM karta PIN kodi noto‘g‘ri terildi, yana <xliff:g id="NUMBER_0">%d</xliff:g> marta uirinib ko‘rishingiz mumkin, urinishlar tugagandan keyin qurilmangizni qulfdan chiqarish uchun aloqa operatoringiz bilan bog‘lanishingiz kerak.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM kartadan foydalanib bo‘lmaydi. Operatoringizga murojaat qiling."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">SIM kartaning PUK kodi noto‘g‘ri kiritildi. Yana <xliff:g id="NUMBER_1">%d</xliff:g> ta muvaffaqiyatsiz urinishdan keyin SIM karta butunlay ishdan chiqadi.</item>
+ <item quantity="one">SIM karta PUK kodi noto‘g‘ri terildi, yana <xliff:g id="NUMBER_0">%d</xliff:g> marta urinib ko‘rganingizdan keyin SIM kartadan umuman foydalanib bo‘lmaydi.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"SIM kartani qulfdan chiqarib bo‘lmadi!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"SIM kartani qulfdan chiqarib bo‘lmadi!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Kod qabul qilindi!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Aloqa yo‘q."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Matn kiritish usulini o‘zgartirish"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Parvoz rejimi"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Qurilma o‘chirib yoqilgandan keyin grafik kalit talab qilinadi"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Qurilma o‘chirib yoqilgandan keyin PIN kod talab qilinadi"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Qurilma o‘chirib yoqilgandan keyin parol talab qilinadi"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Qo‘shimcha xavfsizlik chorasi sifatida grafik kalit talab qilinadi"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Qo‘shimcha xavfsizlik chorasi sifatida PIN kod talab qilinadi"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Qo‘shimcha xavfsizlik chorasi sifatida parol talab qilinadi"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Profilni amlashtirishda grafik kalit talab qilinadi"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Profilni amlashtirishda PIN kod talab qilinadi"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Profilni amlashtirishda parol talab qilinadi"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Qurilma administrator tomonidan qulflangan"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Qurilma qo‘lda qulflangan"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Qurilma <xliff:g id="NUMBER_1">%d</xliff:g> soatdan beri qulfdan chiqarilgani yo‘q. Chizmali kalitni yana bir marta kiriting.</item>
+ <item quantity="one">Qurilma <xliff:g id="NUMBER_0">%d</xliff:g> soatdan beri qulfdan chiqarilgani yo‘q. Chizmali kalitni yana bir marta kiriting.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Qurilma <xliff:g id="NUMBER_1">%d</xliff:g> soatdan beri qulfdan chiqarilgani yo‘q. PIN kodni yana bir marta kiriting.</item>
+ <item quantity="one">Qurilma <xliff:g id="NUMBER_0">%d</xliff:g> soatdan beri qulfdan chiqarilgani yo‘q. PIN kodni yana bir marta kiriting.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Qurilma <xliff:g id="NUMBER_1">%d</xliff:g> soatdan beri qulfdan chiqarilgani yo‘q. Parolni yana bir marta kiriting.</item>
+ <item quantity="one">Qurilma <xliff:g id="NUMBER_0">%d</xliff:g> soatdan beri qulfdan chiqarilgani yo‘q. Parolni yana bir marta kiriting.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Barmoq izi aniqlanmadi"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml
index e2d0d22..aea7423 100644
--- a/packages/SystemUI/res-keyguard/values-vi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Nút chuyển phương thức nhập."</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Khóa bàn phím"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Nhập mã PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Nhập mã PIN mới và mã PUK của SIM"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Mã PUK của SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Mã PIN mới của SIM"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Chạm để nhập mật khẩu"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"Nhập mật khẩu để mở khóa"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"Nhập mã PIN để mở khóa"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Mã PIN không chính xác."</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Đã sạc đầy"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Đang sạc"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Đang sạc nhanh"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Đang sạc chậm"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Kết nối bộ sạc của bạn."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Nhấn vào Menu để mở khóa."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Mạng đã bị khóa"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Không có thẻ SIM nào"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Không có thẻ SIM nào trong máy tính bảng."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Không có thẻ SIM nào trong điện thoại."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Lắp thẻ SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Thẻ SIM bị thiếu hoặc không thể đọc được. Hãy lắp thẻ SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Thẻ SIM không sử dụng được."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Thẻ SIM của bạn đã bị vô hiệu hóa vĩnh viễn.\n Hãy liên hệ với nhà cung cấp dịch vụ không dây của bạn để lấy thẻ SIM khác."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"Thẻ SIM đã bị khóa."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"Thẻ SIM đã bị khóa bằng mã PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Đang mở khóa thẻ SIM…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Khu vực mã PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Khu vực mã PIN của SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Khu vực mã PUK của SIM"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Báo thức tiếp theo được đặt cho <xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Xóa"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Nhập"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Đã quên hình mở khóa"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Hình mở khóa sai"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Mật khẩu sai"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Mã PIN sai"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Thử lại sau <xliff:g id="NUMBER">%d</xliff:g> giây."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Vẽ hình mở khóa của bạn"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Nhập mã PIN của SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Nhập mã PIN của SIM dành cho \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Nhập mã PIN"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Nhập mật khẩu"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM hiện bị vô hiệu hóa. Hãy nhập mã PUK để tiếp tục. Liên hệ với nhà cung cấp dịch vụ để biết chi tiết."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" hiện bị vô hiệu hóa. Hãy nhập mã PUK để tiếp tục. Liên hệ với nhà cung cấp dịch vụ để biết chi tiết."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Nhập mã PIN mong muốn"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Xác nhận mã PIN mong muốn"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Đang mở khóa thẻ SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Nhập mã PIN có từ 4 đến 8 số."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"Mã PUK phải có từ 8 số trở lên."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Hãy nhập lại mã PUK chính xác. Nhiều lần lặp lại sẽ vô hiệu hóa vĩnh viễn thẻ SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Mã PIN không khớp"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Quá nhiều lần nhập hình mở khóa"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Bạn đã nhập sai mã PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> lần. \n\nHãy thử lại sau <xliff:g id="NUMBER_1">%2$d</xliff:g> giây."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Bạn đã nhập sai mật khẩu <xliff:g id="NUMBER_0">%1$d</xliff:g> lần. \n\nHãy thử lại sau <xliff:g id="NUMBER_1">%2$d</xliff:g> giây."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Bạn đã vẽ không chính xác hình mở khóa <xliff:g id="NUMBER_0">%1$d</xliff:g> lần. \n\nHãy thử lại sau <xliff:g id="NUMBER_1">%2$d</xliff:g> giây."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Bạn đã mở khóa máy tính bảng sai <xliff:g id="NUMBER_0">%1$d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%2$d</xliff:g> lần mở khóa không thành công nữa, máy tính bảng này sẽ được đặt lại, tức là tất cả dữ liệu của máy tính bảng sẽ bị xóa."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Bạn đã mở khóa điện thoại sai <xliff:g id="NUMBER_0">%1$d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%2$d</xliff:g> lần mở khóa không thành công nữa, điện thoại này sẽ được đặt lại, tức là tất cả dữ liệu của điện thoại sẽ bị xóa."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Bạn đã mở khóa máy tính bảng sai <xliff:g id="NUMBER">%d</xliff:g> lần. Máy tính bảng này sẽ được đặt lại, tức là tất cả dữ liệu của máy tính bảng sẽ bị xóa."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Bạn đã mở khóa điện thoại sai <xliff:g id="NUMBER">%d</xliff:g> lần. Điện thoại này sẽ được đặt lại, tức là tất cả dữ liệu của điện thoại sẽ bị xóa."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Bạn đã mở khóa máy tính bảng sai <xliff:g id="NUMBER_0">%1$d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%2$d</xliff:g> lần mở khóa không thành công nữa, người dùng này sẽ bị xóa, tức là tất cả dữ liệu người dùng sẽ bị xóa."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Bạn đã mở khóa điện thoại sai <xliff:g id="NUMBER_0">%1$d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%2$d</xliff:g> lần mở khóa không thành công nữa, người dùng này sẽ bị xóa, tức là tất cả dữ liệu người dùng sẽ bị xóa."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Bạn đã mở khóa máy tính bảng sai <xliff:g id="NUMBER">%d</xliff:g> lần. Người dùng này sẽ bị xóa, tức là tất cả dữ liệu người dùng sẽ bị xóa."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Bạn đã mở khóa điện thoại sai <xliff:g id="NUMBER">%d</xliff:g> lần. Người dùng này sẽ bị xóa, tức là tất cả dữ liệu người dùng sẽ bị xóa."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Bạn đã mở khóa máy tính bảng sai <xliff:g id="NUMBER_0">%1$d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%2$d</xliff:g> lần mở khóa không thành công nữa, hồ sơ công việc sẽ bị xóa, tức là tất cả dữ liệu hồ sơ sẽ bị xóa."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Bạn đã mở khóa điện thoại sai <xliff:g id="NUMBER_0">%1$d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%2$d</xliff:g> lần mở khóa không thành công nữa, hồ sơ công việc sẽ bị xóa, tức là tất cả dữ liệu hồ sơ sẽ bị xóa."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Bạn đã mở khóa máy tính bảng sai <xliff:g id="NUMBER">%d</xliff:g> lần. Hồ sơ công việc sẽ bị xóa, tức là tất cả dữ liệu hồ sơ sẽ bị xóa."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Bạn đã mở khóa điện thoại sai <xliff:g id="NUMBER">%d</xliff:g> lần. Hồ sơ công việc sẽ bị xóa, tức là tất cả dữ liệu hồ sơ sẽ bị xóa."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Bạn đã vẽ không chính xác hình mở khóa <xliff:g id="NUMBER_0">%1$d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%2$d</xliff:g> lần thử không thành công nữa, bạn sẽ được yêu cầu mở khóa máy tính bảng bằng tài khoản email.\n\n Hãy thử lại sau <xliff:g id="NUMBER_2">%3$d</xliff:g> giây."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Bạn đã vẽ không chính xác hình mở khóa <xliff:g id="NUMBER_0">%1$d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%2$d</xliff:g> lần thử không thành công nữa, bạn sẽ được yêu cầu mở khóa điện thoại bằng tài khoản email.\n\n Hãy thử lại sau <xliff:g id="NUMBER_2">%3$d</xliff:g> giây."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Mã PIN của SIM không chính xác, bây giờ bạn phải liên hệ với nhà cung cấp dịch vụ để mở khóa thiết bị của mình."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="other">Mã PIN của SIM không chính xác, bạn còn <xliff:g id="NUMBER_1">%d</xliff:g> lần thử.</item>
+ <item quantity="one">Mã PIN của SIM không chính xác, bạn còn <xliff:g id="NUMBER_0">%d</xliff:g> lần thử trước khi bạn phải liên hệ với nhà cung cấp dịch vụ để mở khóa thiết bị của mình.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"SIM không thể sử dụng được. Hãy liên hệ với nhà cung cấp dịch vụ của bạn."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="other">Mã PUK của SIM không chính xác, bạn còn <xliff:g id="NUMBER_1">%d</xliff:g> lần thử trước khi SIM vĩnh viễn không thể sử dụng được.</item>
+ <item quantity="one">Mã PUK của SIM không chính xác, bạn còn <xliff:g id="NUMBER_0">%d</xliff:g> lần thử trước khi SIM vĩnh viễn không thể sử dụng được.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Thao tác mã PIN của SIM không thành công!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Thao tác mã PUK của SIM không thành công!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Mã được chấp nhận!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Không có dịch vụ."</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Chuyển phương thức nhập"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Chế độ trên máy bay"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Yêu cầu hình mở khóa sau khi thiết bị khởi động lại"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Yêu cầu mã PIN sau khi thiết bị khởi động lại"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Yêu cầu mật khẩu sau khi thiết bị khởi động lại"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Yêu cầu hình mở khóa để bảo mật thêm"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Yêu cầu mã PIN để bảo mật thêm"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Yêu cầu mật khẩu để bảo mật thêm"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Yêu cầu hình mở khóa khi bạn chuyển đổi hồ sơ"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Yêu cầu mã PIN khi bạn chuyển đổi hồ sơ"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Yêu cầu mật khẩu khi bạn chuyển đổi hồ sơ"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Quản trị viên thiết bị đã khóa thiết bị"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Thiết bị đã bị khóa theo cách thủ công"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="other">Thiết bị đã không được mở khóa trong <xliff:g id="NUMBER_1">%d</xliff:g> giờ. Xác nhận hình mở khóa.</item>
+ <item quantity="one">Thiết bị đã không được mở khóa trong <xliff:g id="NUMBER_0">%d</xliff:g> giờ. Xác nhận hình mở khóa.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="other">Thiết bị đã không được mở khóa trong <xliff:g id="NUMBER_1">%d</xliff:g> giờ. Xác nhận mã PIN.</item>
+ <item quantity="one">Thiết bị đã không được mở khóa trong <xliff:g id="NUMBER_0">%d</xliff:g> giờ. Xác nhận mã PIN.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="other">Thiết bị đã không được mở khóa trong <xliff:g id="NUMBER_1">%d</xliff:g> giờ. Xác nhận mật khẩu.</item>
+ <item quantity="one">Thiết bị đã không được mở khóa trong <xliff:g id="NUMBER_0">%d</xliff:g> giờ. Xác nhận mật khẩu.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Không nhận dạng được"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
index 68624b1..b99bc09 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"输入法切换按钮。"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Keyboard"</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_password_wrong_pin_code" msgid="6535018036285012028">"PIN 码有误。"</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_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="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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"请在 <xliff:g id="NUMBER">%d</xliff:g> 秒后重试。"</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"绘制您的图案"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"请输入 SIM 卡 PIN 码"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"请输入“<xliff:g id="CARRIER">%1$s</xliff:g>”的 SIM 卡 PIN 码"</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">"您已经 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次输错 PIN 码。\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 码不正确,您还有 <xliff:g id="NUMBER_1">%d</xliff:g> 次尝试机会。如果仍不正确,SIM 卡将永远无法使用。</item>
+ <item quantity="one">SIM 卡 PUK 码不正确,您还有 <xliff:g id="NUMBER_0">%d</xliff:g> 次尝试机会。如果仍不正确,SIM 卡将永远无法使用。</item>
+ </plurals>
+ <string name="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">"重启设备后需要输入 PIN 码"</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="2438626748767361010">"设备管理员已锁定此设备"</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
index 94c9a2d..20cc670 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"切換輸入法按鈕。"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"PIN 碼不正確。"</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_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">"Delete 鍵 (刪除)"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter 鍵 (輸入)"</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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"請在 <xliff:g id="NUMBER">%d</xliff:g> 秒後再試一次。"</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"畫出上鎖圖案"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"輸入 SIM 卡 PIN 碼"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"輸入「<xliff:g id="CARRIER">%1$s</xliff:g>」的 SIM 卡 PIN 碼"</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 碼不正確,您還有 <xliff:g id="NUMBER_1">%d</xliff:g> 次輸入機會。如果仍然輸入錯誤,SIM 卡將永久無法使用。</item>
+ <item quantity="one">SIM 卡的 PUK 碼不正確,您還有 <xliff:g id="NUMBER_0">%d</xliff:g> 次輸入機會。如果仍然輸入錯誤,SIM 卡將永久無法使用。</item>
+ </plurals>
+ <string name="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">"PIN 碼正確!"</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">"裝置重新啟動後,必須輸入 PIN 碼才能使用"</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="2438626748767361010">"裝置管理員已將裝置上鎖"</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
index 94c9a2d..dd31862 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"切換輸入法按鈕。"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <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_password_wrong_pin_code" msgid="6535018036285012028">"PIN 碼不正確。"</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_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="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter 鍵"</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>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"請在 <xliff:g id="NUMBER">%d</xliff:g> 秒後再試一次。"</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"畫出解鎖圖案"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"輸入 SIM 卡 PIN 碼"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"輸入「<xliff:g id="CARRIER">%1$s</xliff:g>」的 SIM 卡 PIN 碼"</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> 次機會。如果失敗次數超過限制,你的 Work 設定檔將遭到移除,所有設定檔資料也會一併遭到刪除。"</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> 次機會。如果失敗次數超過限制,你的 Work 設定檔將遭到移除,所有設定檔資料也會一併遭到刪除。"</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"你嘗試解鎖平板電腦已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次。你的 Work 設定檔將遭到移除,所有設定檔資料也會一併遭到刪除。"</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"你嘗試解鎖手機已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次。你的 Work 設定檔將遭到移除,所有設定檔資料也會一併遭到刪除。"</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 碼輸入錯誤,你還可以再試 <xliff:g id="NUMBER_1">%d</xliff:g> 次。如果仍然失敗,SIM 卡將永久無法使用。</item>
+ <item quantity="one">SIM 卡的 PUK 碼輸入錯誤,你還可以再試 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍然失敗,SIM 卡將永久無法使用。</item>
+ </plurals>
+ <string name="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">"PIN 碼正確!"</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">"裝置重新啟動後需要輸入 PIN 碼"</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="2438626748767361010">"裝置管理員已鎖定裝置"</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>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml
index 6bd709e..c31f873 100644
--- a/packages/SystemUI/res-keyguard/values-zu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml
@@ -20,186 +20,113 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- no translation found for app_name (3171996292755059205) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_code (3420548423949593123) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_code (670683628782925409) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (3747778500166059332) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8188243197504453830) -->
- <skip />
- <!-- no translation found for keyguard_password_entry_touch_hint (5790410752696806482) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_password_code (595980919238127672) -->
- <skip />
- <!-- no translation found for keyguard_password_enter_pin_password_code (7504123374204446086) -->
- <skip />
- <!-- no translation found for keyguard_password_wrong_pin_code (6535018036285012028) -->
- <skip />
- <!-- no translation found for keyguard_charged (2222329688813033109) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in (89308975354638682) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_fast (8869226755413795173) -->
- <skip />
- <!-- no translation found for keyguard_plugged_in_charging_slowly (6637043106038550407) -->
- <skip />
- <!-- no translation found for keyguard_low_battery (9218432555787624490) -->
- <skip />
- <!-- no translation found for keyguard_instructions_when_pattern_disabled (8566679946700751371) -->
- <skip />
- <!-- no translation found for keyguard_network_locked_message (6743537524631420759) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message_short (6327533369959764518) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (4550152848200783542) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_message (6585414237800161146) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions (7350295932015220392) -->
- <skip />
- <!-- no translation found for keyguard_missing_sim_instructions_long (589889372883904477) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_message_short (654102080186420706) -->
- <skip />
- <!-- no translation found for keyguard_permanent_disabled_sim_instructions (4683178224791318347) -->
- <skip />
- <!-- no translation found for keyguard_sim_locked_message (953766009432168127) -->
- <skip />
- <!-- no translation found for keyguard_sim_puk_locked_message (1772789643694942073) -->
- <skip />
- <!-- no translation found for keyguard_sim_unlock_progress_dialog_message (3586601150825821675) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_pin_area (703175752097279029) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_pin_area (912702510825058921) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_sim_puk_area (136979425761438705) -->
- <skip />
- <!-- no translation found for keyguard_accessibility_next_alarm (5835196989158584991) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_delete (6883116827512721630) -->
- <skip />
- <!-- no translation found for keyboardview_keycode_enter (4505833604411016668) -->
- <skip />
- <!-- no translation found for kg_forgot_pattern_button_text (534245177645252620) -->
- <skip />
- <!-- no translation found for kg_wrong_pattern (7620081431514773802) -->
- <skip />
- <!-- no translation found for kg_wrong_password (4580683060277329277) -->
- <skip />
- <!-- no translation found for kg_wrong_pin (4785660766909463466) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_attempts_countdown (527455490371878356) -->
- <skip />
- <!-- no translation found for kg_pattern_instructions (5547646893001491340) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions (1795013002231184046) -->
- <skip />
- <!-- no translation found for kg_sim_pin_instructions_multi (1586316574649150223) -->
- <skip />
- <!-- no translation found for kg_pin_instructions (4069609316644030034) -->
- <skip />
- <!-- no translation found for kg_password_instructions (136952397352976538) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint (2288964170039899277) -->
- <skip />
- <!-- no translation found for kg_puk_enter_puk_hint_multi (1373131883510840794) -->
- <skip />
- <!-- no translation found for kg_puk_enter_pin_hint (3137789674920391087) -->
- <skip />
- <!-- no translation found for kg_enter_confirm_pin_hint (3089485999116759671) -->
- <skip />
- <!-- no translation found for kg_sim_unlock_progress_dialog_message (4471738151810900114) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_pin_hint (3057533256729513335) -->
- <skip />
- <!-- no translation found for kg_invalid_sim_puk_hint (6003602401368264144) -->
- <skip />
- <!-- no translation found for kg_invalid_puk (5399287873762592502) -->
- <skip />
- <!-- no translation found for kg_invalid_confirm_pin_hint (5672736555427444330) -->
- <skip />
- <!-- no translation found for kg_login_too_many_attempts (6604574268387867255) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8637788033282252027) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7724148763268377734) -->
- <skip />
- <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (4820967667848302092) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (1629351522209932316) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_wipe (3921998703529189931) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (4694232971224663735) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_wiping (2365964340830006961) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (1365418870560228936) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_user (2151286957817486128) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (5464020754932560928) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_user (6171564974118059) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (9154513795928824239) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_erase_profile (2162434417489128282) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8966727588974691544) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_now_erasing_profile (8476407539834855) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (956706236554092172) -->
- <skip />
- <!-- no translation found for kg_failed_attempts_almost_at_login (8364140853305528449) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code_pukked (3389829202093674267) -->
- <skip />
- <!-- no translation found for kg_password_wrong_pin_code (4314341367727055967) -->
- <!-- no translation found for kg_password_wrong_puk_code_dead (3329017604125179374) -->
- <skip />
- <!-- no translation found for kg_password_wrong_puk_code (2287504898931957513) -->
- <!-- no translation found for kg_password_pin_failed (8769990811451236223) -->
- <skip />
- <!-- no translation found for kg_password_puk_failed (1331621440873439974) -->
- <skip />
- <!-- no translation found for kg_pin_accepted (7637293533973802143) -->
- <skip />
- <!-- no translation found for keyguard_carrier_default (4274828292998453695) -->
- <skip />
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Vula indlela yokungena yenkinobho"</string>
- <!-- no translation found for airplane_mode (3807209033737676010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pattern (7246972020562621506) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_pin (6303592361322290145) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_restart_password (6984641181515902406) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pattern (5304487696073914063) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_pin (8851462864335757813) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_timeout_password (6563904839641583441) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pattern (3398054847288438444) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_pin (7426368139226961699) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_switch_profiles_password (8383831046318421845) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_device_admin (2438626748767361010) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_user_request (8236951765212462286) -->
- <skip />
- <!-- no translation found for kg_prompt_reason_time_pattern (71299470072448533) -->
- <!-- no translation found for kg_prompt_reason_time_pin (34586942088144385) -->
- <!-- no translation found for kg_prompt_reason_time_password (257297696215346527) -->
- <!-- no translation found for fingerprint_not_recognized (348813995267914625) -->
- <skip />
+ <string name="app_name" msgid="3171996292755059205">"Ukhiye wokugada"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Faka ikhodi ye-PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Thayipha i-PUK ye-SIM nekhodi yephinikhodi entsha"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"Ikhodi ye-PUK ye-SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Ikhodi Entsha ye-SIM PIN"</string>
+ <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>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Ikhodi ye-PIN engalungile!"</string>
+ <string name="keyguard_charged" msgid="2222329688813033109">"Kushajiwe"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"Iyashaja"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"Ishaja ngokushesha"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"Ishaja kancane"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"Xhuma ishaja yakho."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Chofoza Menyu ukuvula."</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"Inethiwekhi ivaliwe"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Alikho ikhadi le-SIM."</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Alikho ikhadi le-SIM efonini."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Alikho ikhadi le-SIM efonini."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Faka ikhadi le-SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"Ikhadi le-SIM alitholakali noma alifundeki. Sicela ufake ikhadi le-SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Ikhadi le-SIM elingasetshenzisiwe."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"Ikhadi le-SIM lakho likhutshazwe unomphela.\n Xhumana nomhlinzeki wakho wokuxhumana okungenazintambo ukuze uthole enye i-SIM khadi."</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"Ikhadi le-SIM livaliwe."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"Ikhadi le-SIM livalwe nge-PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"Ivula ikhadi le-SIM..."</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Indawo yephinikhodi"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Indawo yephinikhodi ye-SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Indawo ye-SIM PUK"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"I-alamu elandelayo esethelwe i-<xliff:g id="ALARM">%1$s</xliff:g>"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Susa"</string>
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Faka"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Ukhohlwe iphethini?"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"Iphatheni engalungile"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"Iphasiwedi engalungile"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"Iphinikhodi engalungile"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="527455490371878356">"Zama futhi emasekhondini angu-<xliff:g id="NUMBER">%d</xliff:g>."</string>
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Dweba iphethini yakho"</string>
+ <string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Faka i-PIN ye-SIM"</string>
+ <string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Faka i-PIN ye-SIM ye-\"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"Faka iphinikhodi"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Faka iphasiwedi"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Xhumana nenkampani yenethiwekhi ngemininingwane."</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"I-SIM ye-\"<xliff:g id="CARRIER">%1$s</xliff:g>\" manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Xhumana nenkampani yenethiwekhi ukuze uthole imininingwane."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Faka iphinikhodi oyithandayo"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"Qinisekisa iphinikhodi oyithandayo"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"Ivula ikhadi le-SIM..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"Thayipha i-PIN enezinombolo ezingu-4 kuya kwezingu-8."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"Ikhodi ye-PUK kufanele ibe yizinombolo ezingu-8 noma eziningi."</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"Faka kabusha ikhodi ye-PUK elungile. Imizamo ephindiwe izokhubaza unaphakade i-SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"Iphinikhodi ayifani"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Kunemizamo eminingi kakhulu yephathini!"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Ubhale iphinikhodi ykho ngendlela engafanele izikhathi ezingu-<xliff:g id="NUMBER_0">%1$d</xliff:g>. \n\nZama futhi emasekhondini angu-<xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Ubhale iphasiwedi yakho ngendlela engafanele <xliff:g id="NUMBER_0">%1$d</xliff:g> izikhathi. \n\nZama futhi emasekhondini angu-<xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Udwebe iphathini yakho yokuvula ngendlela engafanele-<xliff:g id="NUMBER_0">%1$d</xliff:g>. \n\n Zama futhi emasekhondini angu-<xliff:g id="NUMBER_1">%2$d</xliff:g>"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Uzame ngokungalungile ukuvula ithebulethi izikhathi ezingu-<xliff:g id="NUMBER_0">%1$d</xliff:g>. Ngemuva kwemizamo engaphezulu kwengu-<xliff:g id="NUMBER_1">%2$d</xliff:g> engaphumelelanga, le thebulethi izosethwa kabusha, okuzosusa yonke idatha yayo."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Uzame ngokungalungile ukuvula ifoni izikhathi ezingu-<xliff:g id="NUMBER_0">%1$d</xliff:g>. Ngemuva kwemizamo engaphezulu kwengu-<xliff:g id="NUMBER_1">%2$d</xliff:g> engaphumelelanga, le foni izosethwa kabusha, okuzosusa yonke idatha yayo."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Uzame ngokungalungile ukuvula ithebulethi izikhathi ezingu-<xliff:g id="NUMBER">%d</xliff:g>. Le thebulethi izosethwa kabusha, okuzosusa yonke idatha yayo."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"Uzame ngokungalungile ukuvula ifoni izikhathi ezingu-<xliff:g id="NUMBER">%d</xliff:g>. Le foni izosethwa kabusha, okuzosusa yonke idatha yayo."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"Uzame ngokungalungile ukuvula ithebulethi izikhathi ezingu-<xliff:g id="NUMBER_0">%1$d</xliff:g>. Ngemuva kwemizamo engaphezulu kwengu-<xliff:g id="NUMBER_1">%2$d</xliff:g> engaphumelelanga, lo msebenzisi uzosuswa, okuzosusa yonke idatha yomsebenzisi."</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Uzame ngokungalungile ukuvula ifoni izikhathi ezingu-<xliff:g id="NUMBER_0">%1$d</xliff:g>. Ngemuva kwemizamo engaphezulu kwengu-<xliff:g id="NUMBER_1">%2$d</xliff:g> engaphumelelanga, lo msebenzisi uzosuswa, okuzosusa yonke idatha yomsebenzisi."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Uzame ngokungalungile ukuvula ithebulethi izikhathi ezingu-<xliff:g id="NUMBER">%d</xliff:g>. Lo msebenzisi uzosuswa, okuzosusa yonke idatha yomsebenzisi."</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Uzame ngokungalungile ukuvula ifoni izikhathi ezingu-<xliff:g id="NUMBER">%d</xliff:g>. Lo msebenzisi uzosuswa, okuzosusa yonke idatha yomsebenzisi."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Uzame ngokungalungile ukuvula ithebulethi izikhathi ezingu-<xliff:g id="NUMBER_0">%1$d</xliff:g>. Ngemuva kwemizamo engaphezulu kwengu-<xliff:g id="NUMBER_1">%2$d</xliff:g> engaphumelelanga, iphrofayela yomsebenzi izosuswa, okuzosusa yonke idatha yephrofayela."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Uzame ngokungalungile ukuvula ifoni izikhathi ezingu-<xliff:g id="NUMBER_0">%1$d</xliff:g>. Ngemuva kwemizamo engaphezulu kwengu-<xliff:g id="NUMBER_1">%2$d</xliff:g> engaphumelelanga, iphrofayela yomsebenzi, izosuswa, okuzosusa yonke idatha yephrofayela."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Uzame ngokungalungile ukuvula ithebulethi izikhathi ezingu-<xliff:g id="NUMBER">%d</xliff:g>. Iphrofayela yomsebenzi izosuswa, okuzosusa yonke idatha yephrofayela."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Uzame ngokungalungile ukuvula ifoni izikhathi ezingu-<xliff:g id="NUMBER">%d</xliff:g>. Iphrofayela yomsebenzi izosuswa, okuzosusa yonke idatha yephrofayela."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Udwebe ngokungalungile iphethini yakho yokuvula ngezikhathi ezingu-<xliff:g id="NUMBER_0">%1$d</xliff:g>. Ngemuva kwemizamo engaphumelelanga kaningi engu-<xliff:g id="NUMBER_1">%2$d</xliff:g>, uzocelwa ukuthi uvule ithebulethi yakho usebenzisa i-akhawunti ye-imeyili.\n\nZama futhi kumasekhondi angu-<xliff:g id="NUMBER_2">%3$d</xliff:g>."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Ukulayisha ungenisa iphathini yakho yokuvula ngendlela engalungile izikhathi ezi-<xliff:g id="NUMBER_0">%1$d</xliff:g> Emva kweminye imizamo engu-<xliff:g id="NUMBER_1">%2$d</xliff:g>, uzocelwa ukuvula ifoni yakho usebenzisa ukungena ngemvume ku-Google\n\n Zame futhi emumva kwengu- <xliff:g id="NUMBER_2">%3$d</xliff:g> imizuzwana."</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Ikhodi yephinikhodi ye-SIM engalungile manje kumele uxhumane nenkampini yenethiwekhi yakho ukuvula idivayisi yakho."</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Ikhodi engalungile yephinikhodi ye-SIM, unemizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g> esele.</item>
+ <item quantity="other">Ikhodi engalungile yephinikhodi ye-SIM, unemizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g> esele.</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"I-SIM ayisebenziseki. Xhumana nemkampini yenethiwekhi yakho."</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">Ikhodi ye-PUK ye-SIM engalungile, unemizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g> esele ngaphambi kokuthi i-SIM ingasasebenziseki unaphakade.</item>
+ <item quantity="other">Ikhodi ye-PUK ye-SIM engalungile, unemizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g> esele ngaphambi kokuthi i-SIM ingasasebenziseki unaphakade.</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"Umsebenzi wephinikhodi ye-SIM wehlulekile!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"Umsebenzi we-PUK ye-SIM wehlulekile!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"Ikhodi yamukelwe!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"Ayikho isevisi"</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Shintsha indlela yokufaka"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Imodi yendiza"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Iphethini iyadingeka ngemuva kokuqala kabusha kwedivayisi"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Iphinikhodi iyadingeka ngemuva kokuqala kabusha kwedivayisi"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Iphasiwedi iyadingeka ngemuva kokuqala kabusha kwedivayisi"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"Kudingeka iphethini ngokuvikeleka okungeziwe"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"Kudingeka iphinikhodi ngokuvikeleka okungeziwe"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"Iphasiwedi idingelwa ukuvikela okungeziwe"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"Iphethini iyadingeka uma ushintsha amaphrofayela"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"Kudingeka iphinikhodi uma ushintsha amaphrofayela"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"Iphasiwedi iyadingeka uma ushintsha amaphrofayela"</string>
+ <string name="kg_prompt_reason_device_admin" msgid="2438626748767361010">"Umlawuli wedivayisi ukhiye idivayisi"</string>
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"Idivayisi ikhiywe ngokwenza"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Idivayisi ayikavulwa ngamahora angu-<xliff:g id="NUMBER_1">%d</xliff:g>. Qinisekisa iphethini.</item>
+ <item quantity="other">Idivayisi ayikavulwa ngamahora angu-<xliff:g id="NUMBER_1">%d</xliff:g>. Qinisekisa iphethini.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Idivayisi ayikavulwa ngamahora angu-<xliff:g id="NUMBER_1">%d</xliff:g>. Qinisekisa iphinikhodi.</item>
+ <item quantity="other">Idivayisi ayikavulwa ngamahora angu-<xliff:g id="NUMBER_1">%d</xliff:g>. Qinisekisa iphinikhodi.</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Idivayisi ayikavulwa ngamahora angu-<xliff:g id="NUMBER_1">%d</xliff:g>. Qinisekisa iphasiwedi.</item>
+ <item quantity="other">Idivayisi ayikavulwa ngamahora angu-<xliff:g id="NUMBER_1">%d</xliff:g>. Qinisekisa iphasiwedi.</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"Akubonwa"</string>
</resources>
diff --git a/packages/SystemUI/res/drawable/clipboard_empty.xml b/packages/SystemUI/res/drawable/clipboard_empty.xml
index 14a5ad2..33cd58c 100644
--- a/packages/SystemUI/res/drawable/clipboard_empty.xml
+++ b/packages/SystemUI/res/drawable/clipboard_empty.xml
@@ -1,25 +1,24 @@
<!--
- Copyright (C) 2016 The Android Open Source Project
+ Copyright (C) 2017 The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the License);
+ Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an AS IS BASIS,
+ distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT 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="24.0dp"
- android:height="24.0dp"
+ android:width="18.0dp"
+ android:height="18.0dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M19.0,2.0l-4.18,0.0C14.0,0.84 13.3,0.0 12.0,0.0c-1.3,0.0 -2.0,0.84 -2.82,2.0L5.0,2.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,16.0c0.0,1.0 0.9,2.0 2.0,2.0l14.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L21.0,4.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0zm-7.0,0.0c0.55,0.0 1.0,0.45 1.0,1.0s-0.45,1.0 -1.0,1.0 -1.0,-0.45 -1.0,-1.0 0.45,-1.0 1.0,-1.0zm7.0,18.0L5.0,20.0L5.0,4.0l2.0,0.0l0.0,3.0l10.0,0.0L17.0,4.0l2.0,0.0l0.0,16.0z" />
+ android:pathData="M16.0,1.0L4.0,1.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,14.0l2.0,0.0L4.0,3.0l12.0,0.0L16.0,1.0zm3.0,4.0L8.0,5.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,14.0c0.0,1.0 0.9,2.0 2.0,2.0l11.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L21.0,7.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0zm0.0,16.0L8.0,21.0L8.0,7.0l11.0,0.0l0.0,14.0z"/>
</vector>
-
diff --git a/packages/SystemUI/res/drawable/clipboard_full.xml b/packages/SystemUI/res/drawable/clipboard_full.xml
index 2d46870..cb056da 100644
--- a/packages/SystemUI/res/drawable/clipboard_full.xml
+++ b/packages/SystemUI/res/drawable/clipboard_full.xml
@@ -1,25 +1,24 @@
<!--
- Copyright (C) 2016 The Android Open Source Project
+ Copyright (C) 2017 The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the License);
+ Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an AS IS BASIS,
+ distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT 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="24.0dp"
- android:height="24.0dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:width="18.0dp"
+ android:height="18.0dp"
+ android:viewportWidth="18.0"
+ android:viewportHeight="18.0">
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M19.0,2.0l-4.18,0.0C14.0,0.84 13.3,0.0 12.0,0.0c-1.3,0.0 -2.0,0.84 -2.82,2.0L5.0,2.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,16.0c0.0,1.0 0.9,2.0 2.0,2.0l14.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L21.0,4.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0zm-7.0,0.0c0.55,0.0 1.0,0.45 1.0,1.0s-0.45,1.0 -1.0,1.0 -1.0,-0.45 -1.0,-1.0 0.45,-1.0 1.0,-1.0zm7.0,18.0L5.0,20.0L5.0,4.0l2.0,0.0l0.0,3.0l10.0,0.0L17.0,4.0l2.0,0.0l0.0,16.0z M 6,8 l 12,0 l 0,11 l -12,0 l 0,-11z" />
+ android:pathData="M12.0,0.75L3.0,0.75c-0.82,0.0 -1.5,0.67 -1.5,1.5l0.0,10.5L3.0,12.75L3.0,2.25l9.0,0.0L12.0,0.75zM14.25,3.75L6.0,3.75c-0.83,0.0 -1.5,0.67 -1.5,1.5l0.0,10.5c0.0,0.83 0.67,1.5 1.5,1.5l8.25,0.0c0.83,0.0 1.5,-0.67 1.5,-1.5L15.75,5.25C15.75,4.42 15.08,3.75 14.25,3.75zM7.25,6.5l5.74,0.0l0.0,1.75L7.25,8.25L7.25,6.5zM11.76,14.5l-4.5,0.0l0.0,-1.75l4.5,0.0L11.76,14.5zM13.0,11.38L7.26,11.38L7.26,9.62L13.0,9.62L13.0,11.38z"
+ android:fillColor="#FFFFFF"/>
</vector>
-
diff --git a/packages/SystemUI/res/drawable/ic_data_saver.xml b/packages/SystemUI/res/drawable/ic_data_saver.xml
index 9c3bd3a..64bbff0 100644
--- a/packages/SystemUI/res/drawable/ic_data_saver.xml
+++ b/packages/SystemUI/res/drawable/ic_data_saver.xml
@@ -23,7 +23,7 @@
android:fillColor="#FFFFFFFF"
android:pathData="M12.0,19.0c-3.9,0.0 -7.0,-3.1 -7.0,-7.0c0.0,-3.5 2.6,-6.4 6.0,-6.9L11.0,2.0C5.9,2.5 2.0,6.8 2.0,12.0c0.0,5.5 4.5,10.0 10.0,10.0c3.3,0.0 6.2,-1.6 8.1,-4.1l-2.6,-1.5C16.2,18.0 14.2,19.0 12.0,19.0z"/>
<path
- android:fillColor="#4DFFFFFF"
+ android:fillColor="#54FFFFFF"
android:pathData="M13.0,2.0l0.0,3.0c3.4,0.5 6.0,3.4 6.0,6.9c0.0,0.9 -0.2,1.8 -0.5,2.5l2.6,1.5c0.6,-1.2 0.9,-2.6 0.9,-4.1C22.0,6.8 18.0,2.6 13.0,2.0z"/>
<path
android:fillColor="#FFFFFFFF"
diff --git a/packages/SystemUI/res/drawable/ic_data_saver_off.xml b/packages/SystemUI/res/drawable/ic_data_saver_off.xml
index 918c61c..3001ad9 100644
--- a/packages/SystemUI/res/drawable/ic_data_saver_off.xml
+++ b/packages/SystemUI/res/drawable/ic_data_saver_off.xml
@@ -20,9 +20,9 @@
android:viewportHeight="24.0"
android:tint="?android:attr/colorControlNormal">
<path
- android:fillColor="#4DFFFFFF"
+ android:fillColor="#FFFFFFFF"
android:pathData="M12.0,19.0c-3.9,0.0 -7.0,-3.1 -7.0,-7.0c0.0,-3.5 2.6,-6.4 6.0,-6.9L11.0,2.0C5.9,2.5 2.0,6.8 2.0,12.0c0.0,5.5 4.5,10.0 10.0,10.0c3.3,0.0 6.2,-1.6 8.1,-4.1l-2.6,-1.5C16.2,18.0 14.2,19.0 12.0,19.0z"/>
<path
- android:fillColor="#4DFFFFFF"
+ android:fillColor="#FFFFFFFF"
android:pathData="M13.0,2.0l0.0,3.0c3.4,0.5 6.0,3.4 6.0,6.9c0.0,0.9 -0.2,1.8 -0.5,2.5l2.6,1.5c0.6,-1.2 0.9,-2.6 0.9,-4.1C22.0,6.8 18.0,2.6 13.0,2.0z"/>
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_fingerprint_error.xml b/packages/SystemUI/res/drawable/ic_fingerprint_error.xml
index 11e83a1..a7fb1a1 100644
--- a/packages/SystemUI/res/drawable/ic_fingerprint_error.xml
+++ b/packages/SystemUI/res/drawable/ic_fingerprint_error.xml
@@ -19,12 +19,12 @@
android:viewportWidth="32.0"
android:viewportHeight="32.0">
<path
- android:fillColor="@color/system_warning_color"
+ android:fillColor="?android:attr/colorError"
android:pathData="M15.99,2.5C8.53,2.5 2.5,8.54 2.5,16.0s6.03,13.5 13.49,13.5S29.5,23.46 29.5,16.0S23.45,2.5 15.99,2.5zM16.0,26.8c-5.97,0.0 -10.8,-4.83 -10.8,-10.8S10.03,5.2 16.0,5.2S26.8,10.03 26.8,16.0S21.97,26.8 16.0,26.8z"/>
<path
- android:fillColor="@color/system_warning_color"
+ android:fillColor="?android:attr/colorError"
android:pathData="M14.65,20.05l2.7,0.0l0.0,2.7l-2.7,0.0z"/>
<path
- android:fillColor="@color/system_warning_color"
+ android:fillColor="?android:attr/colorError"
android:pathData="M14.65,9.25l2.7,0.0l0.0,8.1l-2.7,0.0z"/>
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_network_logging.xml b/packages/SystemUI/res/drawable/ic_qs_network_logging.xml
index 87b5a14..7bdf50c 100644
--- a/packages/SystemUI/res/drawable/ic_qs_network_logging.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_network_logging.xml
@@ -20,8 +20,7 @@
android:width="12.0dp"
android:height="12.0dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0"
- android:tint="#4DFFFFFF" >
+ android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M2,24v-4h12v4H2z M2,16v-4h20v4H2z M5,7 12,0 19,7 14,7 14,15 10,15 10,7z"/>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_4g_plus.xml b/packages/SystemUI/res/drawable/ic_qs_signal_4g_plus.xml
index 54c52bf..782fbe4 100644
--- a/packages/SystemUI/res/drawable/ic_qs_signal_4g_plus.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_4g_plus.xml
@@ -16,8 +16,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32.0dp"
android:height="32.0dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:viewportWidth="19.0"
+ android:viewportHeight="19.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M4.6,7.8l0.7,0.0l0.0,1.3L4.6,9.1L4.6,11.0L3.0,11.0L3.0,9.2L0.1,9.2L0.0,8.2l3.0,-5.7l1.7,0.0L4.6,7.8L4.6,7.8zM1.7,7.8L3.0,7.8l0.0,-3.0L2.9,5.0L1.7,7.8z"/>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_e.xml b/packages/SystemUI/res/drawable/ic_qs_signal_e.xml
index dd0f271..4232126 100644
--- a/packages/SystemUI/res/drawable/ic_qs_signal_e.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_e.xml
@@ -16,9 +16,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
- android:viewportWidth="5.0"
- android:viewportHeight="5.0">
+ android:viewportWidth="13.0"
+ android:viewportHeight="13.0">
+ <group
+ android:translateX="3.5" >
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M4.400000,7.300000L1.700000,7.300000l0.000000,2.400000l3.300000,0.000000L5.000000,11.000000L0.000000,11.000000L0.000000,2.500000l4.900000,0.000000l0.000000,1.300000L1.700000,3.800000l0.000000,2.100000l2.800000,0.000000L4.500000,7.300000z"/>
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M4.400000,7.300000L1.700000,7.300000l0.000000,2.400000l3.300000,0.000000L5.000000,11.000000L0.000000,11.000000L0.000000,2.500000l4.900000,0.000000l0.000000,1.300000L1.700000,3.800000l0.000000,2.100000l2.800000,0.000000L4.500000,7.300000z"/>
+ </group>
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_g.xml
index 3b47c0d..0c512d7 100644
--- a/packages/SystemUI/res/drawable/ic_qs_signal_g.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_g.xml
@@ -16,9 +16,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
- android:viewportWidth="7.0"
- android:viewportHeight="7.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M6.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S0.700000,9.000000 0.700000,7.900000L0.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000L4.700000,5.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S4.000000,3.700000 3.600000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S2.300000,5.000000 2.300000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L4.700000,7.800000L3.500000,7.800000L3.500000,6.600000l2.900000,0.000000L6.400000,9.900000z"/>
+ android:viewportWidth="13.0"
+ android:viewportHeight="13.0">
+ <group android:translateX="3.5" >
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M6.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S0.700000,9.000000 0.700000,7.900000L0.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000L4.700000,5.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S4.000000,3.700000 3.600000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S2.300000,5.000000 2.300000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L4.700000,7.800000L3.500000,7.800000L3.500000,6.600000l2.900000,0.000000L6.400000,9.900000z"/>
+ </group>
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_h.xml b/packages/SystemUI/res/drawable/ic_qs_signal_h.xml
index d694e61..b9572b2 100644
--- a/packages/SystemUI/res/drawable/ic_qs_signal_h.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_h.xml
@@ -14,11 +14,14 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32.0dp"
+ android:width="32dp"
android:height="32dp"
- android:viewportWidth="6.0"
- android:viewportHeight="6.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M6.000000,11.000000L4.400000,11.000000L4.400000,7.500000L1.700000,7.500000L1.700000,11.000000L0.000000,11.000000L0.000000,2.500000l1.700000,0.000000l0.000000,3.700000l2.700000,0.000000L4.400000,2.500000L6.000000,2.500000L6.000000,11.000000z"/>
+ android:viewportWidth="13.0"
+ android:viewportHeight="13.0">
+ <group
+ android:translateX="3.5" >
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M6.000000,11.000000L4.400000,11.000000L4.400000,7.500000L1.700000,7.500000L1.700000,11.000000L0.000000,11.000000L0.000000,2.500000l1.700000,0.000000l0.000000,3.700000l2.700000,0.000000L4.400000,2.500000L6.000000,2.500000L6.000000,11.000000z"/>
+ </group>
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_remove_circle.xml b/packages/SystemUI/res/drawable/ic_remove_circle.xml
new file mode 100644
index 0000000..439cc78
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_remove_circle.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="48dp"
+ android:width="48dp"
+ android:tint="#db4437"
+ android:viewportHeight="48"
+ android:viewportWidth="48" >
+ <path android:fillColor="@android:color/white"
+ android:pathData="M24,4C12.95,4,4,12.95,4,24
+ s8.95,20,20,20,20-8.95,20-20
+ S35.05,4,24,4zm10,22H14v-4h20v4z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/instant_icon.xml b/packages/SystemUI/res/drawable/instant_icon.xml
new file mode 100644
index 0000000..0039c81
--- /dev/null
+++ b/packages/SystemUI/res/drawable/instant_icon.xml
@@ -0,0 +1,30 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="40dp"
+ android:height="40dp"
+ android:viewportWidth="2.2"
+ android:viewportHeight="2.2">
+
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M.1,1.1
+ c0,.55 .45,1 1,1
+ c.55,0 1,-.45 1,-1
+ c0,-.55 -.45,-1 -1,-1
+ c-.55,0 -1,.45 -1,1z
+ M1.15,.95 l.5,0 l-.7,1 l0.1,-.7 l-.5,0 l.7,-1 z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/lockscreen_fingerprint_error_state_to_fp.xml b/packages/SystemUI/res/drawable/lockscreen_fingerprint_error_state_to_fp.xml
index e207cb3..3af2f7f 100644
--- a/packages/SystemUI/res/drawable/lockscreen_fingerprint_error_state_to_fp.xml
+++ b/packages/SystemUI/res/drawable/lockscreen_fingerprint_error_state_to_fp.xml
@@ -98,11 +98,11 @@
<path
android:name="path_2"
android:pathData="M 1.35900878906,6.76104736328 c 0.0,0.0 -2.69998168945,0.0 -2.69998168945,0.0 c 0.0,0.0 0.0,-2.69995117188 0.0,-2.69995117188 c 0.0,0.0 2.69998168945,0.0 2.69998168945,0.0 c 0.0,0.0 0.0,2.69995117188 0.0,2.69995117188 Z"
- android:fillColor="@*android:color/system_error" />
+ android:fillColor="?android:attr/colorError" />
<path
android:name="path_1"
android:pathData="M 1.35363769531,1.36633300781 c 0.0,0.0 -2.69998168945,0.0 -2.69998168945,0.0 c 0.0,0.0 0.0,-8.09997558594 0.0,-8.09997558594 c 0.0,0.0 2.69998168945,0.0 2.69998168945,0.0 c 0.0,0.0 0.0,8.09997558594 0.0,8.09997558594 Z"
- android:fillColor="@*android:color/system_error" />
+ android:fillColor="?android:attr/colorError" />
</group>
</group>
<group
@@ -117,7 +117,7 @@
<path
android:name="path_3"
android:pathData="M 0.0101470947266,10.8087768555 c -5.96701049805,0.0 -10.8000183105,-4.8330078125 -10.8000183105,-10.8000488281 c 0.0,-5.96691894531 4.8330078125,-10.7999267578 10.8000183105,-10.7999267578 c 5.96697998047,0.0 10.799987793,4.8330078125 10.799987793,10.7999267578 c 0.0,5.96704101562 -4.8330078125,10.8000488281 -10.799987793,10.8000488281 Z"
- android:strokeColor="@*android:color/system_error"
+ android:strokeColor="?android:attr/colorError"
android:strokeWidth="2"
android:trimPathStart="0"
android:trimPathEnd="1" />
diff --git a/packages/SystemUI/res/drawable/lockscreen_fingerprint_fp_to_error_state.xml b/packages/SystemUI/res/drawable/lockscreen_fingerprint_fp_to_error_state.xml
index 2b4babc..a577afc 100644
--- a/packages/SystemUI/res/drawable/lockscreen_fingerprint_fp_to_error_state.xml
+++ b/packages/SystemUI/res/drawable/lockscreen_fingerprint_fp_to_error_state.xml
@@ -96,7 +96,7 @@
<path
android:name="ridge_5_path_0"
android:pathData="M -25.3591003418,-24.4138946533 c -0.569000244141,0.106399536133 -1.12660217285,0.140594482422 -1.45460510254,0.140594482422 c -1.29689025879,0.0 -2.53239440918,-0.343307495117 -3.62019348145,-1.12400817871 c -1.67700195312,-1.20349121094 -2.76950073242,-3.17008972168 -2.76950073242,-5.39189147949"
- android:strokeColor="@*android:color/system_error"
+ android:strokeColor="?android:attr/colorError"
android:strokeWidth="1.45"
android:strokeLineCap="round"
android:trimPathEnd="0" />
@@ -106,7 +106,7 @@
<path
android:name="ridge_7_path_0"
android:pathData="M -36.1409912109,-21.7843475342 c -1.00540161133,-1.19300842285 -1.57499694824,-1.9181060791 -2.36520385742,-3.50170898438 c -0.827560424805,-1.65869140625 -1.31352233887,-3.49159240723 -1.31352233887,-5.48489379883 c 0.0,-3.66279602051 2.96932983398,-6.63220214844 6.63221740723,-6.63220214844 c 3.6628112793,0.0 6.63220214844,2.96940612793 6.63220214844,6.63220214844"
- android:strokeColor="@*android:color/system_error"
+ android:strokeColor="?android:attr/colorError"
android:strokeWidth="1.45"
android:strokeLineCap="round"
android:trimPathEnd="0" />
@@ -116,7 +116,7 @@
<path
android:name="ridge_6_path_0"
android:pathData="M -42.1907958984,-25.6756896973 c -0.758117675781,-2.14370727539 -0.896545410156,-3.86891174316 -0.896545410156,-5.12921142578 c 0.0,-1.46069335938 0.249176025391,-2.84799194336 0.814682006836,-4.09748840332 c 1.56153869629,-3.45030212402 5.03434753418,-5.85076904297 9.0679473877,-5.85076904297 c 5.49430847168,0.0 9.94830322266,4.4539642334 9.94830322266,9.94825744629 c 0.0,1.83151245117 -1.48460388184,3.31610107422 -3.31610107422,3.31610107422 c -1.83149719238,0.0 -3.31610107422,-1.48469543457 -3.31610107422,-3.31610107422 c 0.0,-1.83139038086 -1.48458862305,-3.31610107422 -3.31610107422,-3.31610107422 c -1.83149719238,0.0 -3.31610107422,1.48471069336 -3.31610107422,3.31610107422 c 0.0,2.57020568848 0.989517211914,4.88710021973 2.60510253906,6.5865020752 c 1.22210693359,1.28550720215 2.43139648438,2.09950256348 4.47590637207,2.69030761719"
- android:strokeColor="@*android:color/system_error"
+ android:strokeColor="?android:attr/colorError"
android:strokeWidth="1.45"
android:strokeLineCap="round"
android:trimPathEnd="0" />
@@ -126,7 +126,7 @@
<path
android:name="ridge_2_path_0"
android:pathData="M -44.0646514893,-38.1672973633 c 1.19026184082,-1.77430725098 2.67503356934,-3.24531555176 4.55902099609,-4.27278137207 c 1.88395690918,-1.0274810791 4.04466247559,-1.61137390137 6.34175109863,-1.61137390137 c 2.28761291504,0.0 4.43991088867,0.579071044922 6.31831359863,1.59861755371 c 1.8784942627,1.01954650879 3.36059570312,2.4796295166 4.55279541016,4.24153137207"
- android:strokeColor="@*android:color/system_error"
+ android:strokeColor="?android:attr/colorError"
android:strokeWidth="1.45"
android:strokeLineCap="round"
android:trimPathStart="1" />
@@ -138,7 +138,7 @@
<path
android:name="ridge_1_path_0"
android:pathData="M 71.7812347412,97.0507202148 c -2.27149963379,-1.31344604492 -4.71360778809,-2.07006835938 -7.56221008301,-2.07006835938 c -2.84869384766,0.0 -5.23320007324,0.779556274414 -7.34411621094,2.07006835938"
- android:strokeColor="@*android:color/system_error"
+ android:strokeColor="?android:attr/colorError"
android:strokeWidth="1.45"
android:strokeLineCap="round"
android:trimPathEnd="0" />
@@ -157,11 +157,11 @@
<path
android:name="path_2"
android:pathData="M -1.3705291748,4.06730651855 c 0.0,0.0 0.036376953125,-0.0102386474609 0.036376953125,-0.0102386474609 c 0.0,0.0 -0.00682067871094,0.0040283203125 -0.00682067871093,0.0040283203125 c 0.0,0.0 -0.0161437988281,0.00479125976562 -0.0161437988281,0.00479125976563 c 0.0,0.0 -0.0134124755859,0.00141906738281 -0.0134124755859,0.00141906738281 Z"
- android:fillColor="@*android:color/system_error" />
+ android:fillColor="?android:attr/colorError" />
<path
android:name="path_1"
android:pathData="M -1.3737487793,-6.77532958984 c 0.0,0.0 0.00604248046875,0.0166625976562 0.00604248046876,0.0166625976562 c 0.0,0.0 0.0213623046875,0.0250244140625 0.0213623046875,0.0250244140625 c 0.0,0.0 -0.00604248046875,-0.0166625976562 -0.00604248046876,-0.0166625976562 c 0.0,0.0 -0.0213623046875,-0.0250244140625 -0.0213623046875,-0.0250244140625 Z"
- android:fillColor="@*android:color/system_error" />
+ android:fillColor="?android:attr/colorError" />
</group>
</group>
<group
@@ -176,7 +176,7 @@
<path
android:name="path_3"
android:pathData="M 0.0101470947266,10.8087768555 c -5.96701049805,0.0 -10.8000183105,-4.8330078125 -10.8000183105,-10.8000488281 c 0.0,-5.96691894531 4.8330078125,-10.7999267578 10.8000183105,-10.7999267578 c 5.96697998047,0.0 10.799987793,4.8330078125 10.799987793,10.7999267578 c 0.0,5.96704101562 -4.8330078125,10.8000488281 -10.799987793,10.8000488281 Z"
- android:strokeColor="@*android:color/system_error"
+ android:strokeColor="?android:attr/colorError"
android:strokeWidth="2"
android:trimPathStart="1" />
</group>
diff --git a/packages/SystemUI/res/drawable/qs_ic_wifi_lock.xml b/packages/SystemUI/res/drawable/qs_ic_wifi_lock.xml
index b7da30b..bf405fa 100644
--- a/packages/SystemUI/res/drawable/qs_ic_wifi_lock.xml
+++ b/packages/SystemUI/res/drawable/qs_ic_wifi_lock.xml
@@ -20,10 +20,10 @@
android:viewportHeight="72.0"
android:tint="?android:attr/textColorPrimary">
<group
- android:translateX="52.0"
- android:translateY="42.0" >
+ android:translateX="28.0"
+ android:translateY="10.5" >
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M18.0,8.0l-1.0,0.0L17.0,6.0c0.0,-2.76 -2.24,-5.0 -5.0,-5.0S7.0,3.24 7.0,6.0l0.0,2.0L6.0,8.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,10.0c0.0,1.0 0.9,2.0 2.0,2.0l12.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L20.0,10.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0zm-6.0,9.0c-1.1,0.0 -2.0,-0.9 -2.0,-2.0s0.9,-2.0 2.0,-2.0 2.0,0.9 2.0,2.0 -0.9,2.0 -2.0,2.0zm3.1,-9.0L8.9,8.0L8.9,6.0c0.0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0.0 3.1,1.39 3.1,3.1l0.0,2.0z"/>
+ android:pathData="M36 16l-2 0 0 -4C34 6.48 29.52 2 24 2 18.48 2 14 6.48 14 12l0 4 -2 0c-2.21 0 -4 1.79 -4 4l0 20c0 2.21 1.79 4 4 4l24 0c2.21 0 4 -1.79 4 -4l0 -20c0 -2.21 -1.79 -4 -4 -4zM24 34c-2.21 0 -4 -1.79 -4 -4 0 -2.21 1.79 -4 4 -4 2.21 0 4 1.79 4 4 0 2.21 -1.79 4 -4 4zm6.2 -18l-12.4 0 0 -4c0 -3.42 2.78 -6.2 6.2 -6.2 3.42 0 6.2 2.78 6.2 6.2l0 4z"
+ android:fillColor="#FFFFFF" />
</group>
</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_in.xml b/packages/SystemUI/res/drawable/stat_sys_signal_in.xml
new file mode 100644
index 0000000..7e6e09b
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_in.xml
@@ -0,0 +1,27 @@
+<?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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="17dp"
+ android:height="17dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:name="in"
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M8.7,12.2l-2.0,3.5l-2.0,-3.5z" />
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_inout.xml b/packages/SystemUI/res/drawable/stat_sys_signal_inout.xml
new file mode 100644
index 0000000..b7b6f0f
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_inout.xml
@@ -0,0 +1,31 @@
+<?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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="17dp"
+ android:height="17dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:name="in"
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M8.7,12.2l-2.0,3.5l-2.0,-3.5z" />
+ <path
+ android:name="out"
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M0.5,15.7l2.0,-3.5l2.0,3.5z" />
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_out.xml b/packages/SystemUI/res/drawable/stat_sys_signal_out.xml
new file mode 100644
index 0000000..910c035
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_out.xml
@@ -0,0 +1,27 @@
+<?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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="17dp"
+ android:height="17dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:name="out"
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M0.5,15.7l2.0,-3.5l2.0,3.5z" />
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_in.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_in.xml
new file mode 100644
index 0000000..666127b
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_in.xml
@@ -0,0 +1,27 @@
+<?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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18.41dp"
+ android:height="17dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:name="in"
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M8.7,18.3l-2.0,3.5l-2.0,-3.5z" />
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_inout.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_inout.xml
new file mode 100644
index 0000000..eeba030
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_inout.xml
@@ -0,0 +1,31 @@
+<?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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18.41dp"
+ android:height="17dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:name="in"
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M8.7,18.3l-2.0,3.5l-2.0,-3.5z" />
+ <path
+ android:name="out"
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M0.5,21.8l2.0,-3.5l2.0,3.5z" />
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_out.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_out.xml
new file mode 100644
index 0000000..d577d1a
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_out.xml
@@ -0,0 +1,27 @@
+<?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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18.41dp"
+ android:height="17dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:name="out"
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M0.5,21.8l2.0,-3.5l2.0,3.5z" />
+</vector>
diff --git a/packages/SystemUI/res/layout/battery_percentage_view.xml b/packages/SystemUI/res/layout/battery_percentage_view.xml
index d6abc47..f5c3d40 100644
--- a/packages/SystemUI/res/layout/battery_percentage_view.xml
+++ b/packages/SystemUI/res/layout/battery_percentage_view.xml
@@ -25,5 +25,5 @@
android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock"
android:textColor="?android:attr/textColorPrimary"
android:gravity="center_vertical|start"
- android:paddingEnd="4dp"
+ android:paddingStart="@dimen/battery_level_padding_start"
/>
diff --git a/packages/SystemUI/res/layout/divider.xml b/packages/SystemUI/res/layout/divider.xml
index 9581437..f1f0df0 100644
--- a/packages/SystemUI/res/layout/divider.xml
+++ b/packages/SystemUI/res/layout/divider.xml
@@ -16,5 +16,6 @@
<View xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="72dp"
android:layout_height="1dp"
+ android:layout_marginTop="8dp"
android:background="?android:attr/colorForeground"
android:alpha="?android:attr/disabledAlpha" />
diff --git a/packages/SystemUI/res/layout/keyguard_status_bar.xml b/packages/SystemUI/res/layout/keyguard_status_bar.xml
index a2dfc0d..c5f2f4a 100644
--- a/packages/SystemUI/res/layout/keyguard_status_bar.xml
+++ b/packages/SystemUI/res/layout/keyguard_status_bar.xml
@@ -52,16 +52,6 @@
>
<include layout="@layout/system_icons" />
</FrameLayout>
- <TextView android:id="@+id/battery_level"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginStart="@dimen/header_battery_margin_keyguard"
- android:paddingEnd="@dimen/battery_level_padding_end"
- android:textColor="#ffffff"
- android:visibility="gone"
- android:textSize="@dimen/battery_level_text_size"
- android:importantForAccessibility="noHideDescendants"/>
</LinearLayout>
<com.android.keyguard.CarrierText
diff --git a/packages/SystemUI/res/layout/mobile_signal_group.xml b/packages/SystemUI/res/layout/mobile_signal_group.xml
index 8b10074..d988acc 100644
--- a/packages/SystemUI/res/layout/mobile_signal_group.xml
+++ b/packages/SystemUI/res/layout/mobile_signal_group.xml
@@ -54,4 +54,10 @@
android:src="@drawable/stat_sys_roaming"
android:contentDescription="@string/accessibility_data_connection_roaming"
android:visibility="gone" />
+ <ImageView
+ android:id="@+id/mobile_inout"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:visibility="gone"
+ />
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/preference_widget_radiobutton.xml b/packages/SystemUI/res/layout/preference_widget_radiobutton.xml
new file mode 100644
index 0000000..b3ec43d
--- /dev/null
+++ b/packages/SystemUI/res/layout/preference_widget_radiobutton.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 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.
+-->
+
+<!-- Layout used by CheckBoxPreference for the checkbox style. This is inflated
+ inside android.R.layout.preference. -->
+<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@android:id/checkbox"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:focusable="false"
+ android:clickable="false" />
diff --git a/packages/SystemUI/res/layout/qs_detail_item.xml b/packages/SystemUI/res/layout/qs_detail_item.xml
index 6edf135..6544f0d 100644
--- a/packages/SystemUI/res/layout/qs_detail_item.xml
+++ b/packages/SystemUI/res/layout/qs_detail_item.xml
@@ -63,7 +63,6 @@
android:focusable="true"
android:scaleType="center"
android:contentDescription="@*android:string/media_route_controller_disconnect"
- android:tint="?android:attr/textColorPrimary"
- android:src="@drawable/ic_qs_cancel" />
+ android:tint="?android:attr/textColorPrimary" />
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/qs_page_indicator.xml b/packages/SystemUI/res/layout/qs_page_indicator.xml
index 02bd31a..583753a 100644
--- a/packages/SystemUI/res/layout/qs_page_indicator.xml
+++ b/packages/SystemUI/res/layout/qs_page_indicator.xml
@@ -20,9 +20,8 @@
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_gravity="center"
- android:layout_marginTop="40dp"
android:layout_marginBottom="24dp"
android:focusable="true"
android:gravity="center"
android:importantForAccessibility="yes"
- android:visibility="gone"/>
\ No newline at end of file
+ android:visibility="gone"/>
diff --git a/packages/SystemUI/res/layout/qs_paged_tile_layout.xml b/packages/SystemUI/res/layout/qs_paged_tile_layout.xml
index 8ff1d1e..00427cb 100644
--- a/packages/SystemUI/res/layout/qs_paged_tile_layout.xml
+++ b/packages/SystemUI/res/layout/qs_paged_tile_layout.xml
@@ -19,6 +19,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:paddingBottom="24dp"
android:clipChildren="false"
android:clipToPadding="false">
diff --git a/packages/SystemUI/res/layout/qs_tile_label.xml b/packages/SystemUI/res/layout/qs_tile_label.xml
index a093b87..8d1f9e4 100644
--- a/packages/SystemUI/res/layout/qs_tile_label.xml
+++ b/packages/SystemUI/res/layout/qs_tile_label.xml
@@ -16,10 +16,12 @@
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
- android:paddingTop="16dp">
+ android:gravity="center_horizontal"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp">
<TextView android:id="@+id/tile_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
index 6988c76..080f553 100644
--- a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
+++ b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
@@ -17,7 +17,6 @@
xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:layout_height="48dp"
android:layout_width="match_parent"
- android:layout_marginBottom="24dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
style="@style/BrightnessDialogContainer">
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 3e8e72a..78d4bdd 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
@@ -85,16 +85,6 @@
<include layout="@layout/system_icons" />
</FrameLayout>
-
- <TextView
- android:id="@+id/battery_level"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginStart="@dimen/header_battery_margin_expanded"
- android:importantForAccessibility="noHideDescendants"
- android:textColor="?android:attr/textColorPrimary"
- android:textSize="@dimen/battery_level_text_size"/>
</LinearLayout>
<com.android.systemui.statusbar.AlphaOptimizedFrameLayout
diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml
index 222a31d..4d03f0f 100644
--- a/packages/SystemUI/res/layout/signal_cluster_view.xml
+++ b/packages/SystemUI/res/layout/signal_cluster_view.xml
@@ -70,6 +70,11 @@
android:layout_width="wrap_content"
android:alpha="0.0"
/>
+ <ImageView
+ android:id="@+id/wifi_inout"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ />
</FrameLayout>
<View
android:id="@+id/wifi_signal_spacer"
diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml
index b3ff5d6..18ffd0f 100644
--- a/packages/SystemUI/res/layout/volume_dialog.xml
+++ b/packages/SystemUI/res/layout/volume_dialog.xml
@@ -20,6 +20,7 @@
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/volume_dialog_margin_bottom"
android:background="@drawable/volume_dialog_background"
+ android:paddingTop="@dimen/volume_dialog_padding_top"
android:translationZ="4dp" >
<LinearLayout
@@ -29,16 +30,11 @@
android:orientation="vertical" >
<LinearLayout
- android:id="@+id/volume_dialog_rows"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingEnd="@dimen/volume_button_size"
- android:paddingTop="@dimen/volume_dialog_collapsed_padding_top"
- android:orientation="vertical" >
- <View android:id="@+id/spacer"
- android:layout_width="match_parent"
- android:layout_height="@dimen/volume_dialog_expanded_spacer"
- android:visibility="gone"/>
+ android:id="@+id/volume_dialog_rows"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingEnd="@dimen/volume_button_size"
+ android:orientation="vertical" >
<!-- volume rows added and removed here! :-) -->
</LinearLayout>
@@ -48,7 +44,21 @@
<include layout="@layout/tuner_zen_mode_panel" />
</LinearLayout>
- <com.android.keyguard.AlphaOptimizedImageButton
+ <LinearLayout
+ android:id="@+id/volume_dialog_content"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentTop="true"
+ android:layout_marginEnd="@dimen/volume_expander_margin_end" >
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:maxLines="1"
+ android:textAppearance="@style/TextAppearance.Volume.Header" />
+ <com.android.keyguard.AlphaOptimizedImageButton
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/volume_expand_button"
@@ -60,9 +70,7 @@
android:src="@drawable/ic_volume_collapse_animation"
android:background="@drawable/ripple_drawable"
tools:ignore="RtlHardcoded"
- android:layout_alignParentEnd="true"
- android:layout_alignParentTop="true"
- android:layout_marginTop="@dimen/volume_expander_margin_top"
- android:layout_marginEnd="@dimen/volume_expander_margin_end"/>
+ />
+ </LinearLayout>
</RelativeLayout>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 0e351f5..d63fc0e 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Met kragkennisgewingkontroles kan jy \'n belangrikheidvlak van 0 tot 5 vir \'n program se kennisgewings stel. \n\n"<b>"Vlak 5"</b>" \n- Wys aan die bokant van die kennisgewinglys \n- Laat volskermonderbreking toe \n- Wys altyd opspringkennisgewings \n\n"<b>"Vlak 4"</b>" \n- Verhoed volskermonderbreking \n- Wys altyd opspringkennisgewings \n\n"<b>"Vlak 3"</b>" \n- Verhoed volskermonderbreking \n- Verhoed opspringkennisgewings \n\n"<b>"Vlak 2"</b>" \n- Verhoed volskermonderbreking \n- Verhoed opspringkennisgewings \n- Moet nooit \'n klank maak of vibreer nie \n\n"<b>"Vlak 1"</b>" \n- Verhoed volskermonderbreking \n- Verhoed opspringkennisgewings \n- Moet nooit \'n klank maak of vibreer nie \n- Versteek van sluitskerm en statusbalk \n- Wys aan die onderkant van die kennisgewinglys \n\n"<b>"Vlak 0"</b>" \n- Blokkeer alle kennisgewings van die program af"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Kennisgewings"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Jy sal nie meer hierdie kennisgewings kry nie."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g>-kennisgewings vir"</string>
- <string name="min_importance" msgid="7559703098688382595">"Laag"</string>
- <string name="low_importance" msgid="6891335321576225228">"Middelmatig"</string>
- <string name="default_importance" msgid="6400766013567512061">"Hoog"</string>
- <string name="high_importance" msgid="730741630855788381">"Dringend"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Geen klank of visuele onderbreking nie"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Wys sonder klank"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Maak geluid"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Maak geluid en spring op op skerm"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 uit <xliff:g id="NUMBER_1">%d</xliff:g> kategorieë in hierdie program</item>
+ <item quantity="one">1 uit <xliff:g id="NUMBER_0">%d</xliff:g> kategorie in hierdie program</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Alle kategorieë"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Meer instellings"</string>
<string name="notification_done" msgid="5279426047273930175">"Klaar"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Af"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigasiebalk"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Uitleg"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Links"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Regs"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Soort knoppie"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Ekstra linksknoppie-tipe"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Ekstra regsknoppie-tipe"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(verstek)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Knipbord"</item>
<item msgid="5742013440802239414">"Sleutelkode"</item>
- <item msgid="8748101184830239843">"Kieslys / Sleutelbordwisselaar"</item>
+ <item msgid="8802889973626281575">"Sleutelbordwisselaar"</item>
<item msgid="8175437057325747277">"Geen"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Verdeel (verstek)"</item>
- <item msgid="6210279084134579668">"Gesentreer"</item>
- <item msgid="89143234390889289">"Linksbelyn"</item>
- <item msgid="7715533883382410603">"Regsbelyn"</item>
+ <item msgid="8077901629964902399">"Normaal"</item>
+ <item msgid="8256205964297588988">"Kompak"</item>
+ <item msgid="8719936228094005878">"Na links"</item>
+ <item msgid="586019486955594690">"Na regs"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Kieslys / Sleutelbordwisselaar"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Sleutelbordwisselaar"</string>
<string name="save" msgid="2311877285724540644">"Stoor"</string>
<string name="reset" msgid="2448168080964209908">"Stel terug"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Verstel knoppiebreedte"</string>
<string name="clipboard" msgid="1313879395099896312">"Knipbord"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Gepasmaakte navigasieknoppie"</string>
- <string name="keycode" msgid="7335281375728356499">"Sleutelkode"</string>
- <string name="icon" msgid="8732339849035837289">"Ikoon"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Links-sleutelkode"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Regs-sleutelkode"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Links-ikoon"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Regs-ikoon"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Sleep om teëls by te voeg"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Sleep hierheen om te verwyder"</string>
<string name="qs_edit" msgid="2232596095725105230">"Wysig"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Maak <xliff:g id="ID_1">%s</xliff:g>-instellings oop."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Wysig volgorde van instellings."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Bladsy <xliff:g id="ID_1">%1$d</xliff:g> van <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Sluitskerm"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Vou uit"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimeer"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Maak toe"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Foon raak warm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Sommige kenmerke is beperk terwyl foon afkoel"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Jou foon sal outomaties probeer om af te koel. Jy kan steeds jou foon gebruik, maar dit sal dalk stadiger wees.\n\nJou foon sal normaalweg werk nadat dit afgekoel het."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Links"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Regs"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Pasmaak kortpad"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Kortpad"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Aanporboodskap vir wagwoord"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Links-kortpad"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Regs-kortpad"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Links-kortpad ontsluit ook"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Regs-kortpad ontsluit ook"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Geen"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Begin <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Ander programme"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Sirkel"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Links"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Regs"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Kieslys"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g>-program"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Opletberigte"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index c5fac77..4bfebd2 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"እነዚህን ማሳወቂያዎች ከእንግዲህ አያግኙዋቸውም።"</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> ማሳወቂያዎች ለ"</string>
- <string name="min_importance" msgid="7559703098688382595">"ዝቅተኛ"</string>
- <string name="low_importance" msgid="6891335321576225228">"መካከለኛ"</string>
- <string name="default_importance" msgid="6400766013567512061">"ከፍተኛ"</string>
- <string name="high_importance" msgid="730741630855788381">"አስቸኳይ"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"ምንም ድምፅ ወይም የሚታይ ትርጉም የለም"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"በፀጥታ አሳይ"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"ድምፅ ፍጠር"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"ድምፅ ፍጠር እና በማያ ገጽ ላይ ብቅ በል"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 ከ<xliff:g id="NUMBER_1">%d</xliff:g> ምድቦች ከዚህ መተግበሪያ</item>
+ <item quantity="other">1 ከ<xliff:g id="NUMBER_1">%d</xliff:g> ምድቦች ከዚህ መተግበሪያ</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"ሁሉም ምድቦች"</string>
<string name="notification_more_settings" msgid="816306283396553571">"ተጨማሪ ቅንብሮች"</string>
<string name="notification_done" msgid="5279426047273930175">"ተከናውኗል"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"ግራ"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"ቀኝ"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"የአዝራር አይነት"</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="8748101184830239843">"ምናሌ / የቁልፍ ሰሌዳ መቀየሪያ"</item>
+ <item msgid="8802889973626281575">"የቁልፍ ሰሌዳ መቀየሪያ"</item>
<item msgid="8175437057325747277">"ምንም የለም"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"የተከፈለ (ነባሪ)"</item>
- <item msgid="6210279084134579668">"መሃል ላይ የሆነ"</item>
- <item msgid="89143234390889289">"በግራ የተሰለፈ"</item>
- <item msgid="7715533883382410603">"በቀኝ የተሰለፈ"</item>
+ <item msgid="8077901629964902399">"መደበኛ"</item>
+ <item msgid="8256205964297588988">"እምቅ"</item>
+ <item msgid="8719936228094005878">"ወደ ግራ ያዘነበለ"</item>
+ <item msgid="586019486955594690">"ወደ ቀኝ ያዘነበለ"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"ምናሌ / የቁልፍ ሰሌዳ መቀየሪያ"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"የቁልፍ ሰሌዳ መቀየሪያ"</string>
<string name="save" msgid="2311877285724540644">"አስቀምጥ"</string>
<string name="reset" msgid="2448168080964209908">"ዳግም አስጀምር"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"የአዝራር ስፋት አስተካክል"</string>
<string name="clipboard" msgid="1313879395099896312">"የቅንጥብ ሰሌዳ"</string>
<string name="accessibility_key" msgid="5701989859305675896">"ብጁ የአሰሳ አዝራር"</string>
- <string name="keycode" msgid="7335281375728356499">"የቁልፍ ኮድ"</string>
- <string name="icon" msgid="8732339849035837289">"አዶ"</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="7058945779098711293">"ሰቆችን ለማከል ይጎትቱ"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"ለማስወገድ ወደዚህ ይጎትቱ"</string>
<string name="qs_edit" msgid="2232596095725105230">"አርትዕ"</string>
@@ -670,19 +667,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"አሳንስ"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"ዝጋ"</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_left" msgid="6806490081187499505">"ግራ"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"ቀኝ"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"አቋራጭን አብጅ"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"አቋራጭ"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"የይለፍ ቃል ጠይቅ"</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_screenshot" msgid="6314080179230000938">"ቅጽበታዊ ገጽ እይታዎች"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"አጠቃላይ መልዕክቶች"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ማከማቻ"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"የቅጽበት መተግበሪያዎች"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"ቅጽበታዊ መተግበሪያዎች መጫን አያስፈልጋቸውም።"</string>
+ <string name="app_info" msgid="6856026610594615344">"የመተግበሪያ መረጃ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 2ac6b5f..1381cb3 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -524,15 +524,15 @@
<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="5805874247999578073">"لن تتلقى هذه الإشعارات بعد الآن."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"إشعارات <xliff:g id="APP">%s</xliff:g> عن"</string>
- <string name="min_importance" msgid="7559703098688382595">"منخفض الأهمية"</string>
- <string name="low_importance" msgid="6891335321576225228">"متوسط الأهمية"</string>
- <string name="default_importance" msgid="6400766013567512061">"أهمية عالية"</string>
- <string name="high_importance" msgid="730741630855788381">"عاجل"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"من دون تنبيه صوتي أو مرئي"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"عرض بدون تنبيه صوتي"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"إصدار تنبيه صوتي"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"إصدار تنبيه صوتي والظهور بسرعة على الشاشة"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="zero">قناة واحدة من <xliff:g id="NUMBER_1">%d</xliff:g> فئة من هذا التطبيق</item>
+ <item quantity="two">قناة واحدة من فئتين (<xliff:g id="NUMBER_1">%d</xliff:g>) من هذا التطبيق</item>
+ <item quantity="few">قناة واحدة من <xliff:g id="NUMBER_1">%d</xliff:g> فئات من هذا التطبيق</item>
+ <item quantity="many">قناة واحدة من <xliff:g id="NUMBER_1">%d</xliff:g> فئة من هذا التطبيق</item>
+ <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="notification_all_categories" msgid="5407190218055113282">"كل الفئات"</string>
<string name="notification_more_settings" msgid="816306283396553571">"المزيد من الإعدادات"</string>
<string name="notification_done" msgid="5279426047273930175">"تم"</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>
@@ -606,30 +606,31 @@
<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="nav_bar_left" msgid="731491280511316123">"يسار"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"يمين"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"نوع الزر"</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="8748101184830239843">"مبدِّل القوائم / لوحة المفاتيح"</item>
+ <item msgid="8802889973626281575">"مفتاح تبديل لوحة المفاتيح"</item>
<item msgid="8175437057325747277">"بدون"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"مقسّم (افتراضي)"</item>
- <item msgid="6210279084134579668">"تم التوسيط"</item>
- <item msgid="89143234390889289">"تمت المحاذاة إلى اليسار"</item>
- <item msgid="7715533883382410603">"تمت المحاذاة إلى اليمين"</item>
+ <item msgid="8077901629964902399">"عادي"</item>
+ <item msgid="8256205964297588988">"مكثف"</item>
+ <item msgid="8719936228094005878">"مائل لليسار"</item>
+ <item msgid="586019486955594690">"مائل لليمين"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"مبدِّل القوائم / لوحة المفاتيح"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"مفتاح تبديل لوحة المفاتيح"</string>
<string name="save" msgid="2311877285724540644">"حفظ"</string>
<string name="reset" msgid="2448168080964209908">"إعادة تعيين"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"ضبط عرض الزر"</string>
<string name="clipboard" msgid="1313879395099896312">"الحافظة"</string>
<string name="accessibility_key" msgid="5701989859305675896">"زر التنقل المخصص"</string>
- <string name="keycode" msgid="7335281375728356499">"رمز المفتاح"</string>
- <string name="icon" msgid="8732339849035837289">"رمز"</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="7058945779098711293">"اسحب لإضافة مربعات"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"اسحب هنا للإزالة"</string>
<string name="qs_edit" msgid="2232596095725105230">"تعديل"</string>
@@ -678,19 +679,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"تصغير"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"إغلاق"</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_left" msgid="6806490081187499505">"يسار"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"يمين"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"تخصيص الاختصار"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"اختصار"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"طلب إدخال كلمة المرور"</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_screenshot" msgid="6314080179230000938">"لقطات الشاشة"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"رسائل عامة"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"سعة التخزين"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"التطبيقات الفورية"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"لا تتطلب التطبيقات الفورية إجراء التثبيت."</string>
+ <string name="app_info" msgid="6856026610594615344">"معلومات عن التطبيق"</string>
</resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 77705b1..c90e442 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Enerji bildiriş nəzarəti ilə, tətbiq bildirişləri üçün əhəmiyyət səviyyəsini 0-dan 5-ə kimi ayarlaya bilərsiniz. \n\n"<b>"Səviyyə 5"</b>" \n- Bildiriş siyahısının yuxarı hissəsində göstərin \n- Tam ekran kəsintisinə icazə verin \n- Hər zaman izləyin \n\n"<b>"Səviyyə 4"</b>" \n- Tam ekran kəsintisinin qarşısını alın \n- Hər zaman izləyin \n\n"<b>"Level 3"</b>" \n- Tam ekran kəsintisinin qarşısını alın \n- Heç vaxt izləməyin \n\n"<b>"Level 2"</b>" \n- Tam ekran kəsintisinin qarşısını alın \n- Heç vaxt izləməyin \n- Heç vaxt səsliyə və ya vibrasiyaya qoymayın \n\n"<b>"Səviyyə 1"</b>" \n- Prevent full screen interruption \n- Heç vaxt izləməyin \n- Heç vaxt səsliyə və ya vibrasiyaya qoymayın \n- Ekran kilidi və ya status panelindən gizlədin \n- Bildiriş siyahısının yuxarı hissəsində göstərin \n\n"<b>"Səviyyə 0"</b>" \n- Bütün bildirişləri tətbiqdən blok edin"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Bildirişlər"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Bu bildirişlər daha sizə göndərilməyəcək."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> bildirişləri:"</string>
- <string name="min_importance" msgid="7559703098688382595">"Az əhəmiyyətli"</string>
- <string name="low_importance" msgid="6891335321576225228">"Orta əhəmiyyətli"</string>
- <string name="default_importance" msgid="6400766013567512061">"Vacib"</string>
- <string name="high_importance" msgid="730741630855788381">"Çox vacib"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Səs və ya vizual kəsintisiz"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Sakit səsli"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Səsli"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Səsli və ekranda pəncərə ilə"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">Bu tətbiqin <xliff:g id="NUMBER_1">%d</xliff:g> kateqoriyasından 1 kanal</item>
+ <item quantity="one">Bu tətbiqin <xliff:g id="NUMBER_0">%d</xliff:g> kateqoriyasından 1 kanal</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Bütün Kateqoriyalar"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Daha çox ayar"</string>
<string name="notification_done" msgid="5279426047273930175">"Hazırdır"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Deaktiv"</string>
<string name="nav_bar" msgid="1993221402773877607">"Naviqasiya paneli"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Tərtibat"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Sol"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Sağ"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Düymə növü"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Əlavə sol düymə növü"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Əlavə sağ düymə növü"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(defolt)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Mübadilə buferi"</item>
<item msgid="5742013440802239414">"Açar kodu"</item>
- <item msgid="8748101184830239843">"Menyu / Klaviatura Keçirici"</item>
+ <item msgid="8802889973626281575">"Klaviatura dəyişdirici"</item>
<item msgid="8175437057325747277">"Heç bir"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Bölünmüş (defolt)"</item>
- <item msgid="6210279084134579668">"Mərkəzi"</item>
- <item msgid="89143234390889289">"Soldan düzülmüş"</item>
- <item msgid="7715533883382410603">"Sağdan düzülmüş"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Yığcam"</item>
+ <item msgid="8719936228094005878">"Sola əyilmiş"</item>
+ <item msgid="586019486955594690">"Sağa əyilmiş"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menyu / Klaviatura Keçirici"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Klaviatura dəyişdirici"</string>
<string name="save" msgid="2311877285724540644">"Saxlayın"</string>
<string name="reset" msgid="2448168080964209908">"Sıfırlayın"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Düymənin enini nizamlayın"</string>
<string name="clipboard" msgid="1313879395099896312">"Pano"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Fərdi naviqasiya düyməsi"</string>
- <string name="keycode" msgid="7335281375728356499">"Açar kodu"</string>
- <string name="icon" msgid="8732339849035837289">"İkona"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Sol açar kodu"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Sağ açar kodu"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Sol ikona"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Sağ ikona"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Xanalar əlavə etmək üçün sürüşdürün"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Silmək üçün bura sürüşdürün"</string>
<string name="qs_edit" msgid="2232596095725105230">"Redaktə edin"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> ayarlarını açın."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Ayarların sıralanmasını redaktə edin."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> səhifədən <xliff:g id="ID_1">%1$d</xliff:g> səhifə"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Ekran kilidi"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Genişləndirin"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Kiçildin"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Bağlayın"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefon qızmağa başlayır"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Telefon soyuyana kimi bəzi funksiyalar məhdudlaşdırılır"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefonunuz avtomatik olaraq soyumağa başlayacaq. Telefon istifadəsinə davam edə bilərsiniz, lakin sürəti yavaşlaya bilər.\n\nTelefonunuz soyuduqdan sonra normal işləyəcək."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Sol"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Sağ"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Qısayolu fərdiləşdirin"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Qısayol"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Parol üçün bildiriş"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Sol qısayol"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Sağ qısayol"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Sol qısayol kiliddən çıxır"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Sağ qısayol kiliddən çıxır"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Heç biri"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"<xliff:g id="APP">%1$s</xliff:g> tətbiqini başladın"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Digər tətbiqlər"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Çevrə"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plyus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Sol"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Sağ"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menyu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> tətbiqi"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Siqnallar"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 9ea5f4c..59a925e 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -518,15 +518,12 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Pomoću naprednih kontrola za obaveštenja možete da podesite nivo važnosti od 0. do 5. za obaveštenja aplikacije. \n\n"<b>"5. nivo"</b>" \n– Prikazuju se u vrhu liste obaveštenja \n- Dozvoli prekid režima celog ekrana \n– Uvek zaviruj \n\n"<b>"4. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Uvek zaviruj \n\n"<b>"3. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Nikada ne zaviruj \n\n"<b>"2. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Nikada ne zaviruj \n– Nikada ne proizvodi zvuk ili vibraciju \n\n"<b>"1. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Nikada ne zaviruj \n– Nikada ne proizvodi zvuk ili vibraciju \n– Sakrij na zaključanom ekranu i statusnoj traci \n– Prikazuju se u dnu liste obaveštenja \n\n"<b>"0. nivo"</b>" \n– Blokiraj sva obaveštenja iz aplikacije"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Obaveštenja"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Više nećete da dobijate ova obaveštenja."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Obaveštenja aplikacije <xliff:g id="APP">%s</xliff:g> za"</string>
- <string name="min_importance" msgid="7559703098688382595">"Nisko"</string>
- <string name="low_importance" msgid="6891335321576225228">"Srednje"</string>
- <string name="default_importance" msgid="6400766013567512061">"Visoko"</string>
- <string name="high_importance" msgid="730741630855788381">"Hitno"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Bez zvučnog signala ili vizuelnog obaveštenja"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Prikazuje se bez zvučnog signala"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Emituje se zvučni signal"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Emituje se zvučni signal i prikazuje se na ekranu"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 od <xliff:g id="NUMBER_1">%d</xliff:g> kategorije iz ove aplikacije</item>
+ <item quantity="few">1 od <xliff:g id="NUMBER_1">%d</xliff:g> kategorije iz ove aplikacije</item>
+ <item quantity="other">1 od <xliff:g id="NUMBER_1">%d</xliff:g> kategorija iz ove aplikacije</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Sve kategorije"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Još podešavanja"</string>
<string name="notification_done" msgid="5279426047273930175">"Gotovo"</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>
@@ -600,30 +597,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Isključeno"</string>
<string name="nav_bar" msgid="1993221402773877607">"Traka za navigaciju"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Raspored"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Levo"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Desno"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Tip dugmeta"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Dodatni tip levog dugmeta"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Dodatni tip desnog dugmeta"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(podrazumevano)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Memorija"</item>
<item msgid="5742013440802239414">"Kôd tastera"</item>
- <item msgid="8748101184830239843">"Prebacivač meni/tastatura"</item>
+ <item msgid="8802889973626281575">"Prebacivač za tastaturu"</item>
<item msgid="8175437057325747277">"Ništa"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Podeljeno (podrazumevano)"</item>
- <item msgid="6210279084134579668">"Centrirano"</item>
- <item msgid="89143234390889289">"Poravnato ulevo"</item>
- <item msgid="7715533883382410603">"Poravnato udesno"</item>
+ <item msgid="8077901629964902399">"Normalni"</item>
+ <item msgid="8256205964297588988">"Kompaktni"</item>
+ <item msgid="8719936228094005878">"Uz levu stranu"</item>
+ <item msgid="586019486955594690">"Uz desnu stranu"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Meni/Tastatura prebacivač"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Prebacivač za tastaturu"</string>
<string name="save" msgid="2311877285724540644">"Sačuvaj"</string>
<string name="reset" msgid="2448168080964209908">"Ponovo postavi"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Prilagodi širinu dugmeta"</string>
<string name="clipboard" msgid="1313879395099896312">"Privremena memorija"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Prilagođeno dugme za navigaciju"</string>
- <string name="keycode" msgid="7335281375728356499">"Kôd tastera"</string>
- <string name="icon" msgid="8732339849035837289">"Ikona"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Levo dugme za kôd tastera"</string>
+ <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_remove_tiles" msgid="3361212377437088062">"Prevucite ovde da biste uklonili"</string>
<string name="qs_edit" msgid="2232596095725105230">"Izmeni"</string>
@@ -672,19 +670,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Otvori podešavanja za <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Izmeni redosled podešavanja."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_1">%1$d</xliff:g>. strana od <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Zaključani ekran"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Proširi"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Umanji"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Zatvori"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefon se zagrejao"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Neke funkcije su ograničene dok se telefon ne ohladi"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefon će automatski pokušati da se ohladi. I dalje ćete moći da koristite telefon, ali će sporije reagovati.\n\nKada se telefon ohladi, normalno će raditi."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Levo"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Desno"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Prilagodi prečicu"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Prečica"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Upit za lozinku"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Leva prečica"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Desna prečica"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"I leva prečica otključava"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"I desna prečica otključava"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Ništa"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Pokretanje <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Druge aplikacije"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Krug"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Strelica ulevo"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Strelica udesno"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Meni"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Obaveštenja"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 8f9c916..efbf39e 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -522,15 +522,13 @@
<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="5805874247999578073">"Вы больш не будзеце атрымліваць гэтыя апавяшчэнні."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Апавяшчэнні праграмы <xliff:g id="APP">%s</xliff:g> для"</string>
- <string name="min_importance" msgid="7559703098688382595">"Нізкая важнасць"</string>
- <string name="low_importance" msgid="6891335321576225228">"Сярэдняя важнасць"</string>
- <string name="default_importance" msgid="6400766013567512061">"Высокая важнасць"</string>
- <string name="high_importance" msgid="730741630855788381">"Тэрміновае"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Без гуку ці візуальнага перапынення"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Паказваць бязгучна"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Прайграваць гук"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Прайграваць гук і паказваць на экране"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 з <xliff:g id="NUMBER_1">%d</xliff:g> катэгорыі ў гэтай праграме</item>
+ <item quantity="few">1 з <xliff:g id="NUMBER_1">%d</xliff:g> катэгорый у гэтай праграме</item>
+ <item quantity="many">1 з <xliff:g id="NUMBER_1">%d</xliff:g> катэгорый у гэтай праграме</item>
+ <item quantity="other">1 з <xliff:g id="NUMBER_1">%d</xliff:g> катэгорыі ў гэтай праграме</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Усе катэгорыі"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Дадатковыя налады"</string>
<string name="notification_done" msgid="5279426047273930175">"Гатова"</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>
@@ -604,30 +602,31 @@
<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="nav_bar_left" msgid="731491280511316123">"Злева"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Справа"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Тып кнопкі"</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="8748101184830239843">"Пераключальнік Меню / Клавіятура"</item>
+ <item msgid="8802889973626281575">"Пераключальнік клавіятуры"</item>
<item msgid="8175437057325747277">"Няма"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Падзеленая (стандартная)"</item>
- <item msgid="6210279084134579668">"У цэнтры"</item>
- <item msgid="89143234390889289">"Выраўнаваная злева"</item>
- <item msgid="7715533883382410603">"Выраўнаваная справа"</item>
+ <item msgid="8077901629964902399">"Звычайная"</item>
+ <item msgid="8256205964297588988">"Кампактная"</item>
+ <item msgid="8719936228094005878">"Бліжэй да левага боку"</item>
+ <item msgid="586019486955594690">"Бліжэй да правага боку"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Пераключальнік Меню/Клавіятура"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Пераключальнік клавіятуры"</string>
<string name="save" msgid="2311877285724540644">"Захаваць"</string>
<string name="reset" msgid="2448168080964209908">"Скінуць"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Адрэгуляваць шырыню кнопкі"</string>
<string name="clipboard" msgid="1313879395099896312">"Буфер абмену"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Кнопка карыстальніцкай навігацыі"</string>
- <string name="keycode" msgid="7335281375728356499">"Код клавішы"</string>
- <string name="icon" msgid="8732339849035837289">"Значок"</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="7058945779098711293">"Перацягніце, каб дадаць пліткі"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Перацягніце сюды, каб выдаліць"</string>
<string name="qs_edit" msgid="2232596095725105230">"Рэдагаваць"</string>
@@ -676,19 +675,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Згарнуць"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Закрыць"</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_left" msgid="6806490081187499505">"Налева"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Направа"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Наладзіць ярлык"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Ярлык"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Запыт пароля"</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">"Абвесткi"</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>
+ <string name="instant_apps" msgid="6647570248119804907">"Імгненныя праграмы"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"Імгненныя праграмы не патрабуюць усталёўкі."</string>
+ <string name="app_info" msgid="6856026610594615344">"Інфармацыя пра праграму"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 58c02f1..3ebfcc8 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"Вече няма да получавате тези известия."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Известия от <xliff:g id="APP">%s</xliff:g> за"</string>
- <string name="min_importance" msgid="7559703098688382595">"Малка"</string>
- <string name="low_importance" msgid="6891335321576225228">"Средна"</string>
- <string name="default_importance" msgid="6400766013567512061">"Голяма"</string>
- <string name="high_importance" msgid="730741630855788381">"Неотложна"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Без звук или визуално прекъсване"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Показване без звук"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Възпроизвеждане на звук"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Възпроизвеждане на звук и показване на изскачащ прозорец на екрана"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 от <xliff:g id="NUMBER_1">%d</xliff:g> категории от това приложение</item>
+ <item quantity="one">1 от <xliff:g id="NUMBER_0">%d</xliff:g> категория от това приложение</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Всички категории"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Още настройки"</string>
<string name="notification_done" msgid="5279426047273930175">"Готово"</string>
<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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"Вляво"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Вдясно"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Тип бутон"</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="8748101184830239843">"Превключвател на менюто/клавиатурата"</item>
+ <item msgid="8802889973626281575">"Превключвател на клавиатурата"</item>
<item msgid="8175437057325747277">"Няма"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Разделено (по подразбиране)"</item>
- <item msgid="6210279084134579668">"Центрирано"</item>
- <item msgid="89143234390889289">"Подравнено вляво"</item>
- <item msgid="7715533883382410603">"Подравнено вдясно"</item>
+ <item msgid="8077901629964902399">"Нормално"</item>
+ <item msgid="8256205964297588988">"Компактно"</item>
+ <item msgid="8719936228094005878">"Лява ориентация"</item>
+ <item msgid="586019486955594690">"Дясна ориентация"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Превкл. на менюто/клавиатурата"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Превключвател на клавиатурата"</string>
<string name="save" msgid="2311877285724540644">"Запазване"</string>
<string name="reset" msgid="2448168080964209908">"Повторно задаване"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Коригиране на ширината на бутона"</string>
<string name="clipboard" msgid="1313879395099896312">"Буферна памет"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Персонализиран бутон за навигация"</string>
- <string name="keycode" msgid="7335281375728356499">"Клавишен код"</string>
- <string name="icon" msgid="8732339849035837289">"Икона"</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="7058945779098711293">"Преместете с плъзгане, за да добавите плочки"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Преместете тук с плъзгане за премахване"</string>
<string name="qs_edit" msgid="2232596095725105230">"Редактиране"</string>
@@ -670,19 +667,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Намаляване"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Затваряне"</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_left" msgid="6806490081187499505">"Вляво"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Вдясно"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Персонализиране на прекия път"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Пряк път"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Подкана за парола"</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_screenshot" msgid="6314080179230000938">"Екранни снимки"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Общи съобщения"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Хранилище"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"Мигновени приложения"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"За мигновените приложения не се изисква инсталиране."</string>
+ <string name="app_info" msgid="6856026610594615344">"Информация за приложението"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 36b2e5c..476e27c 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -64,7 +64,7 @@
<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>
- <string name="usb_debugging_secondary_user_message" msgid="8572228137833020196">"ব্যবহারকারী বর্তমানে এই ডিভাইসটিতে প্রবেশ করুন করেছেন তাই USB ডিবাগিং চালু করা যাবে না। এই বৈশিষ্ট্যটি ব্যবহার করতে, অনুগ্রহ করে প্রশাসক ব্যবহারকারীতে পাল্টান।"</string>
+ <string name="usb_debugging_secondary_user_message" msgid="8572228137833020196">"ব্যবহারকারী বর্তমানে এই ডিভাইসটিতে প্রবেশ করেছেন তাই USB ডিবাগিং চালু করা যাবে না। এই বৈশিষ্ট্যটি ব্যবহার করতে, অনুগ্রহ করে প্রশাসক ব্যবহারকারীতে পাল্টান।"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"স্ক্রীণ পূরণ করতে জুম করুন"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"পূর্ণ স্ক্রীণে প্রসারিত করুন"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"স্ক্রীনশট সংরক্ষণ করা হচ্ছে..."</string>
@@ -516,15 +516,11 @@
<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="5805874247999578073">"আপনি আর এই বিজ্ঞপ্তিগুলি পাবেন না।"</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"এর জন্য <xliff:g id="APP">%s</xliff:g> বিজ্ঞপ্তি"</string>
- <string name="min_importance" msgid="7559703098688382595">"নিম্ন"</string>
- <string name="low_importance" msgid="6891335321576225228">"মাঝারি"</string>
- <string name="default_importance" msgid="6400766013567512061">"উচ্চ"</string>
- <string name="high_importance" msgid="730741630855788381">"জরুরি"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"কোনো শব্দ বা ভিজ্যুয়াল বাধা নেই"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"নিঃশব্দে দেখান"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"শব্দ করে"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"শব্দ করে ও স্ক্রীনে ভেসে ওঠে"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">এই অ্যাপের <xliff:g id="NUMBER_1">%d</xliff:g>টি বিভাগের মধ্যে ১</item>
+ <item quantity="other">এই অ্যাপের <xliff:g id="NUMBER_1">%d</xliff:g>টি বিভাগের মধ্যে ১</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"সকল বিভাগ"</string>
<string name="notification_more_settings" msgid="816306283396553571">"আরো সেটিংস"</string>
<string name="notification_done" msgid="5279426047273930175">"সম্পন্ন"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"বাঁ"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"ডান"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"বোতামের ধরণ"</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="8748101184830239843">"মেনু / কীবোর্ড স্যুইচার"</item>
+ <item msgid="8802889973626281575">"কিবোর্ড স্যুইচার"</item>
<item msgid="8175437057325747277">"কোনো কিছুই নয়"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"ভাগ করা (ডিফল্ট)"</item>
- <item msgid="6210279084134579668">"কেন্দ্রস্থ"</item>
- <item msgid="89143234390889289">"বাঁ দিকে সারিবদ্ধ"</item>
- <item msgid="7715533883382410603">"ডান দিকে সারিবদ্ধ"</item>
+ <item msgid="8077901629964902399">"সাধারণ"</item>
+ <item msgid="8256205964297588988">"নিবিড়"</item>
+ <item msgid="8719936228094005878">"বাঁদিক ঘেঁষা"</item>
+ <item msgid="586019486955594690">"ডানদিক ঘেঁষা"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"মেনু / কীবোর্ড স্যুইচার"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"কিবোর্ড স্যুইচার"</string>
<string name="save" msgid="2311877285724540644">"সংরক্ষণ করুন"</string>
- <string name="reset" msgid="2448168080964209908">"পুনরায় সেট করুন"</string>
+ <string name="reset" msgid="2448168080964209908">"আবার সেট করুন"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"বোতামের প্রস্থ সমন্বয় করুন"</string>
<string name="clipboard" msgid="1313879395099896312">"ক্লিপবোর্ড"</string>
<string name="accessibility_key" msgid="5701989859305675896">"কাস্টম নেভিগেশান বোতাম"</string>
- <string name="keycode" msgid="7335281375728356499">"কীকোড"</string>
- <string name="icon" msgid="8732339849035837289">"আইকন"</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="7058945779098711293">"টাইলগুলি যোগ করার জন্য টেনে আনুন"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"সরানোর জন্য এখানে টেনে আনুন"</string>
<string name="qs_edit" msgid="2232596095725105230">"সম্পাদনা করুন"</string>
@@ -664,25 +661,38 @@
<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_user" msgid="1567445362870421770">"<xliff:g id="ID_1">%s</xliff:g> হিসেবে প্রবেশ করে রয়েছেন"</string>
<string name="accessibility_quick_settings_no_internet" msgid="31890692343084075">"কোন ইন্টারনেট নেই৷"</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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g>টির মধ্যে <xliff:g id="ID_1">%1$d</xliff:g> নং পৃষ্ঠা"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"লক স্ক্রিন"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"প্রসারিত করুন"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"ছোটো করুন"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"বন্ধ করুন"</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_left" msgid="6806490081187499505">"বাঁ"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"ডান"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"কাস্টমাইজ করার শর্টকাট"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"শর্টকাট"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"পাসওয়ার্ড জানতে চান"</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_screenshot" msgid="6314080179230000938">"স্ক্রীনশটস"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"সাধারণ বার্তাগুলি"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"সঞ্চয়স্থান"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"ঝটপট অ্যাপ"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"ঝটপট অ্যাপ ইনস্টল করার প্রয়োজন হয় না।"</string>
+ <string name="app_info" msgid="6856026610594615344">"অ্যাপ্লিকেশানের তথ্য"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index b678025..c318501 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -243,7 +243,7 @@
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Prijenos podataka je pauziran"</string>
<string name="data_usage_disabled_dialog" msgid="1841738975235283398">"Dostigli ste ograničenje za prijenos podataka koje ste postavili. Više ne koristite mobilne podatke.\n\nUkoliko nastavite koristiti mobilne podatke, mogući su troškovi za prijenos podataka."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Nastavi"</string>
- <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Nema internet veze"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Niste povezani na internet"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi veza aktivna"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Traženje GPS signala"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Lokacija utvrđena GPS signalom"</string>
@@ -520,15 +520,12 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Uz kontrolu obavještenja o napajanju, možete postaviti nivo značaja obavještenja iz aplikacije, i to od nivoa 0 do 5. \n\n"<b>"Nivo 5"</b>" \n- Prikaži na vrhu liste obavještenja \n- Dopusti prekid prikaza cijelog ekrana \n- Uvijek izviruj \n\n"<b>"Nvio 4"</b>" \n- Spriječi prekid prikaza cijelog ekrana \n- Uvijek izviruj \n\n"<b>"Nivo 3"</b>" \n- Spriječi prekid prikaza cijelog ekrana \n- Nikad ne izviruj \n\n"<b>"Nivo 2"</b>" \n- Spriječi prekid prikaza cijelog ekrana \n- Nikad ne izviruj \n- Nikada ne puštaj zvuk ili vibraciju \n\n"<b>"Nivo 1"</b>" \n- Spriječi prekid prikaza cijelog ekrana \n- Nikada ne izviruj \n- Nikada ne puštaj zvuk ili vibraciju \n- Sakrij sa ekrana za zaključavanje i statusne trake \n- Prikaži na dnu liste obavještenja \n\n"<b>"Nivo 0"</b>" \n- Blokiraj sva obavještenja iz aplikacije"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Obavještenja"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Nećete više primati ova obavještenja."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Obavještenje aplikacije <xliff:g id="APP">%s</xliff:g> za"</string>
- <string name="min_importance" msgid="7559703098688382595">"Niska"</string>
- <string name="low_importance" msgid="6891335321576225228">"Srednja"</string>
- <string name="default_importance" msgid="6400766013567512061">"Visoka"</string>
- <string name="high_importance" msgid="730741630855788381">"Hitno"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Bez ometanja zvukom ili prikazivanjem"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Prikaži bez zvuka"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Pusti zvuk"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Pusti zvuk i prikaži na ekranu"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 od <xliff:g id="NUMBER_1">%d</xliff:g> kategorije iz ove aplikacije</item>
+ <item quantity="few">1 od <xliff:g id="NUMBER_1">%d</xliff:g> kategorije iz ove aplikacije</item>
+ <item quantity="other">1 od <xliff:g id="NUMBER_1">%d</xliff:g> kategorija iz ove aplikacije</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Sve kategorije"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Više postavki"</string>
<string name="notification_done" msgid="5279426047273930175">"Gotovo"</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>
@@ -602,30 +599,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Isključi"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigaciona traka"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Raspored"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Lijevo"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Desno"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Tip dugmeta"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Dodatni tip dugmeta lijevo"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Dodatni tip dugmeta desno"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(zadano)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Međumemorija"</item>
<item msgid="5742013440802239414">"Kôd tipke"</item>
- <item msgid="8748101184830239843">"Prebacivač Meni / Tastatura"</item>
+ <item msgid="8802889973626281575">"Prebacivač tastatura"</item>
<item msgid="8175437057325747277">"Nema"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Podijeljeno (zadano)"</item>
- <item msgid="6210279084134579668">"Centrirano"</item>
- <item msgid="89143234390889289">"Poredano nalijevo"</item>
- <item msgid="7715533883382410603">"Poredano nadesno"</item>
+ <item msgid="8077901629964902399">"Normalna"</item>
+ <item msgid="8256205964297588988">"Kompaktna"</item>
+ <item msgid="8719936228094005878">"Ulijevo"</item>
+ <item msgid="586019486955594690">"Udesno"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Izbornik / Prebacivač tipkovn."</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Prebacivač tastatura"</string>
<string name="save" msgid="2311877285724540644">"Sačuvaj"</string>
<string name="reset" msgid="2448168080964209908">"Ponovno pokretanje"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Podesite širinu dugmeta"</string>
<string name="clipboard" msgid="1313879395099896312">"Međumemorija"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Prilagođeno dugme za navigaciju"</string>
- <string name="keycode" msgid="7335281375728356499">"Kod tipke"</string>
- <string name="icon" msgid="8732339849035837289">"Ikona"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Kôd tipke lijevo"</string>
+ <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>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Povucite da dodate polja"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Prevucite ovdje za uklanjanje"</string>
<string name="qs_edit" msgid="2232596095725105230">"Uredi"</string>
@@ -674,19 +672,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Otvori postavke za: <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Urediti raspored postavki."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Stranica <xliff:g id="ID_1">%1$d</xliff:g> od <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Zaključavanje ekrana"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Proširi"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Umanji"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Zatvori"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefon se pregrijava"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Neke funkcije su ograničene dok se telefon hladi"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Vaš telefon će se automatski pokušati ohladiti. I dalje možete koristi telefon, ali će možda raditi sporije.\n\nNakon što se ohladi, telefon će normalno raditi."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Lijevo"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Desno"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Prilagodite prečicu"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Prečica"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Traži lozinku"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Prečica lijevo"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Prečica desno"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Prečica lijevo također otključava"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Prečica desno također otključava"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Ništa"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Pokrenite aplikaciju <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Druge aplikacije"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Krug"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Lijevo"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Desno"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Meni"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Upozorenja"</string>
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Snimci ekrana"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Općenite poruke"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Pohrana"</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>
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 9f29fa8..14455b3 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Amb els controls de notificació millorats, pots establir un nivell d\'importància d\'entre 0 i 5 per a les notificacions d\'una aplicació. \n\n"<b>"Nivell 5"</b>" \n- Mostra les notificacions a la part superior de la llista \n- Permet la interrupció de la pantalla completa \n- Permet sempre la previsualització \n\n"<b>"Nivell 4"</b>" \n- No permet la interrupció de la pantalla completa \n- Permet sempre la previsualització \n\n"<b>"Nivell 3"</b>" \n- No permet la interrupció de la pantalla completa \n- No permet mai la previsualització \n\n"<b>"Nivell 2"</b>" \n- No permet la interrupció de la pantalla completa \n- No permet mai la previsualització \n- Les notificacions no poden emetre sons ni vibracions \n\n"<b>"Nivell 1"</b>" \n- No permet la interrupció de la pantalla completa \n- No permet mai la previsualització \n- No activa mai el so ni la vibració \n- Amaga les notificacions de la pantalla de bloqueig i de la barra d\'estat \n- Mostra les notificacions a la part inferior de la llista \n\n"<b>"Nivell 0"</b>" \n- Bloqueja totes les notificacions de l\'aplicació"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notificacions"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Ja no rebràs aquestes notificacions."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Notificacions de l\'aplicació <xliff:g id="APP">%s</xliff:g> per a"</string>
- <string name="min_importance" msgid="7559703098688382595">"Baixa"</string>
- <string name="low_importance" msgid="6891335321576225228">"Mitjana"</string>
- <string name="default_importance" msgid="6400766013567512061">"Alta"</string>
- <string name="high_importance" msgid="730741630855788381">"Urgent"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Sense so ni interrupcions visuals"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Es mostren de manera silenciosa"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Amb so"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Amb so i amb una finestra emergent"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 categoria per a aquesta aplicació (<xliff:g id="NUMBER_1">%d</xliff:g> en total)</item>
+ <item quantity="one">1 categoria per a aquesta aplicació (<xliff:g id="NUMBER_0">%d</xliff:g> en total)</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Totes les categories"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Més opcions"</string>
<string name="notification_done" msgid="5279426047273930175">"Fet"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Desactivat"</string>
<string name="nav_bar" msgid="1993221402773877607">"Barra de navegació"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Disseny"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Esquerra"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Dreta"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Tipus de botó"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Tipus de botó addicional de l\'esquerra"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Tipus de botó addicional de la dreta"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(predeterminat)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Porta-retalls"</item>
<item msgid="5742013440802239414">"Codi de tecla"</item>
- <item msgid="8748101184830239843">"Commutador del teclat/menú"</item>
+ <item msgid="8802889973626281575">"Commutador del teclat"</item>
<item msgid="8175437057325747277">"Cap"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Dividit (predeterminat)"</item>
- <item msgid="6210279084134579668">"Centrat"</item>
- <item msgid="89143234390889289">"Alineat a l\'esquerra"</item>
- <item msgid="7715533883382410603">"Alineat a la dreta"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Compacte"</item>
+ <item msgid="8719936228094005878">"Cap a l\'esquerra"</item>
+ <item msgid="586019486955594690">"Cap a la dreta"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Commutador del teclat/menú"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Commutador del teclat"</string>
<string name="save" msgid="2311877285724540644">"Desa"</string>
<string name="reset" msgid="2448168080964209908">"Restableix"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Ajusta l\'amplada del botó"</string>
<string name="clipboard" msgid="1313879395099896312">"Porta-retalls"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Botó de navegació personalitzat"</string>
- <string name="keycode" msgid="7335281375728356499">"Codi de tecla"</string>
- <string name="icon" msgid="8732339849035837289">"Icona"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Codi de tecla de l\'esquerra"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Codi de tecla de la dreta"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Icona de l\'esquerra"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Icona de la dreta"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Arrossega per afegir funcions"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Arrossega aquí per suprimir una funció"</string>
<string name="qs_edit" msgid="2232596095725105230">"Edita"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Obre la configuració per a <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Edita l\'ordre de la configuració."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Pàgina <xliff:g id="ID_1">%1$d</xliff:g> (<xliff:g id="ID_2">%2$d</xliff:g> en total)"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Pantalla de bloqueig"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Desplega"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimitza"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Tanca"</string>
<string name="high_temp_title" msgid="4589508026407318374">"El telèfon s\'està escalfant"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Algunes funcions estaran limitades mentre el telèfon es refreda"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"El telèfon provarà de refredar-se automàticament. Podràs continuar utilitzant-lo, però és possible que funcioni més lentament.\n\nUn cop s\'hagi refredat, funcionarà amb normalitat."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Esquerra"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Dreta"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Personalitza la drecera"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Drecera"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Sol·licita la contrasenya"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Drecera de l\'esquerra"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Drecera de la dreta"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"La drecera de l\'esquerra també desbloqueja el dispositiu"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"La drecera de la dreta també desbloqueja el dispositiu"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Cap"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Inicia <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Altres aplicacions"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Cercle"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Més"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Menys"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Esquerra"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Dreta"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menú"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Aplicació <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertes"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 54b146d..2cb79c9 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -522,15 +522,13 @@
<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="5805874247999578073">"Tato oznámení již nebudete dostávat."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Oznámení aplikace <xliff:g id="APP">%s</xliff:g>"</string>
- <string name="min_importance" msgid="7559703098688382595">"Nízká"</string>
- <string name="low_importance" msgid="6891335321576225228">"Střední"</string>
- <string name="default_importance" msgid="6400766013567512061">"Vysoká"</string>
- <string name="high_importance" msgid="730741630855788381">"Naléhavá"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Bez zvukového a vizuálního vyrušení"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Zobrazovat tiše"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Vydat zvukový signál"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Vydat zvukový signál a vyskočit na obrazovku"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="few">1 ze <xliff:g id="NUMBER_1">%d</xliff:g> kategorií z této aplikace</item>
+ <item quantity="many">1 z <xliff:g id="NUMBER_1">%d</xliff:g> kategorie z této aplikace</item>
+ <item quantity="other">1 z <xliff:g id="NUMBER_1">%d</xliff:g> kategorií z této aplikace</item>
+ <item quantity="one">1 z <xliff:g id="NUMBER_0">%d</xliff:g> kategorie z této aplikace</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Všechny kategorie"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Další nastavení"</string>
<string name="notification_done" msgid="5279426047273930175">"Hotovo"</string>
<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>
@@ -604,30 +602,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Vypnuto"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigační panel"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Rozvržení"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Vlevo"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Vpravo"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Typ tlačítka"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Zvláštní typ tlačítka vlevo"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Zvláštní typ tlačítka vpravo"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(výchozí)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Schránka"</item>
<item msgid="5742013440802239414">"Klávesa"</item>
- <item msgid="8748101184830239843">"Přepínač nabídky/klávesnice"</item>
+ <item msgid="8802889973626281575">"Přepínač klávesnice"</item>
<item msgid="8175437057325747277">"Žádné"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Rozděleno (výchozí)"</item>
- <item msgid="6210279084134579668">"Zarovnáno na střed"</item>
- <item msgid="89143234390889289">"Zarovnáno doleva"</item>
- <item msgid="7715533883382410603">"Zarovnáno doprava"</item>
+ <item msgid="8077901629964902399">"Normální"</item>
+ <item msgid="8256205964297588988">"Kompaktní"</item>
+ <item msgid="8719936228094005878">"Přichyceno vlevo"</item>
+ <item msgid="586019486955594690">"Přichyceno vpravo"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Přepínač nabídky/klávesnice"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Přepínač klávesnice"</string>
<string name="save" msgid="2311877285724540644">"Uložit"</string>
<string name="reset" msgid="2448168080964209908">"Resetovat"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Upravit šířku tlačítka"</string>
<string name="clipboard" msgid="1313879395099896312">"Schránka"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Vlastní navigační tlačítko"</string>
- <string name="keycode" msgid="7335281375728356499">"Klávesa"</string>
- <string name="icon" msgid="8732339849035837289">"Ikona"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Klávesa vlevo"</string>
+ <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_remove_tiles" msgid="3361212377437088062">"Přetažením sem dlaždice odstraníte"</string>
<string name="qs_edit" msgid="2232596095725105230">"Upravit"</string>
@@ -676,19 +675,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Stránka <xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Obrazovka uzamčení"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Rozbalit"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimalizovat"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Zavřít"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefon se zahřívá"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Některé funkce jsou při chladnutí omezeny"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefon se automaticky pokusí vychladnout. Lze jej nadále používat, ale může být pomalejší.\n\nAž telefon vychladne, bude fungovat normálně."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Vlevo"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Vpravo"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Přizpůsobit zkratku"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Zkratka"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Výzva k zadání hesla"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Zkratka vlevo"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Zkratka vpravo"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Zkratka vlevo také odemyká"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Zkratka vpravo také odemyká"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Žádné"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Spustit aplikaci <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Další aplikace"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Kruh"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Vlevo"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Vpravo"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Nabídka"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Aplikace <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Upozornění"</string>
<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="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">"Informace o aplikaci"</string>
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index b2b7fa3..681f747 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Med kontrolelementer til underretninger om strøm kan du konfigurere et vigtighedsniveau fra 0 til 5 for en apps underretninger. \n\n"<b>"Niveau 5"</b>\n"- Vis øverst på listen over underretninger \n- Tillad afbrydelse af fuld skærm \n- Se altid smugkig \n\n"<b>"Niveau 4"</b>\n"- Ingen afbrydelse af fuld skærm \n- Se altid smugkig \n\n"<b>"Niveau 3"</b>\n"- Ingen afbrydelse af fuld skærm \n- Se aldrig smugkig \n\n"<b>"Niveau 2"</b>\n"- Ingen afbrydelse af fuld skærm \n Se aldrig smugkig \n- Ingen lyd og vibration \n\n"<b>"Niveau 1"</b>\n"- Ingen afbrydelse af fuld skærm \n- Se aldrig smugkig \n- Ingen lyd eller vibration \n- Skjul fra låseskærm og statusbjælke \n- Vis nederst på listen over underretninger \n\n"<b>"Niveau 0"</b>\n"- Bloker alle underretninger fra appen."</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Underretninger"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Du modtager ikke længere disse underretninger."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g>-underretninger til"</string>
- <string name="min_importance" msgid="7559703098688382595">"Lav"</string>
- <string name="low_importance" msgid="6891335321576225228">"Middel"</string>
- <string name="default_importance" msgid="6400766013567512061">"Høj"</string>
- <string name="high_importance" msgid="730741630855788381">"Haster"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Ingen lyd eller pop op-visning"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Vis lydløst"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Med lyd"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Med lyd og pop op-visning"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 ud af <xliff:g id="NUMBER_1">%d</xliff:g> kategori fra denne app</item>
+ <item quantity="other">1 ud af <xliff:g id="NUMBER_1">%d</xliff:g> kategorier fra denne app</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Alle kategorier"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Flere indstillinger"</string>
<string name="notification_done" msgid="5279426047273930175">"Udfør"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Fra"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigationslinje"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Layout"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Til venstre"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Til højre"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Knaptype"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Ekstra venstre knaptype"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Ekstra højre knaptype"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(standard)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Udklipsholder"</item>
<item msgid="5742013440802239414">"Tastekode"</item>
- <item msgid="8748101184830239843">"Menu/tastaturskifter"</item>
+ <item msgid="8802889973626281575">"Tastaturskifter"</item>
<item msgid="8175437057325747277">"Ingen"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Opdelt (standard)"</item>
- <item msgid="6210279084134579668">"Centreret"</item>
- <item msgid="89143234390889289">"Venstrejusteret"</item>
- <item msgid="7715533883382410603">"Højrejusteret"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Kompakt"</item>
+ <item msgid="8719936228094005878">"Venstreorienteret"</item>
+ <item msgid="586019486955594690">"Højreorienteret"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menu/tastaturskifter"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Tastaturskifter"</string>
<string name="save" msgid="2311877285724540644">"Gem"</string>
<string name="reset" msgid="2448168080964209908">"Nulstil"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Juster knappens bredde"</string>
<string name="clipboard" msgid="1313879395099896312">"Udklipsholder"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Tilpasset navigationsknap"</string>
- <string name="keycode" msgid="7335281375728356499">"Tastekode"</string>
- <string name="icon" msgid="8732339849035837289">"Ikon"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Venstre tastekode"</string>
+ <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>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Træk for at tilføje felter"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Træk herhen for at fjerne"</string>
<string name="qs_edit" msgid="2232596095725105230">"Rediger"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Åbn <xliff:g id="ID_1">%s</xliff:g>-indstillinger."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Rediger rækkefølgen af indstillinger."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Side <xliff:g id="ID_1">%1$d</xliff:g> af <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Låseskærm"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Udvid"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimer"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Luk"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefonen er ved at blive varm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Nogle funktioner er begrænsede, mens telefonen køler ned"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Din telefon forsøger automatisk at køle ned. Du kan stadig bruge telefonen, men den kører muligvis langsommere.\n\nNår din telefon er kølet ned, fungerer den normalt igen."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Venstre"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Højre"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Tilpas genvej"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Genvej"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Spørg om adgangskode"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Venstre genvej"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Højre genvej"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Venstre genvej låser også op"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Højre genvej låser også op"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Ingen"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Start <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Andre apps"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Cirkel"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Venstre"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Højre"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Appen <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Underretninger"</string>
<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="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">"Oplysninger om appen"</string>
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 111991d..cb6c4b3 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -518,15 +518,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Mit den erweiterten Benachrichtigungseinstellungen kannst du für App-Benachrichtigungen eine Wichtigkeitsstufe von 0 bis 5 festlegen. \n\n"<b>"Stufe 5"</b>" \n- Auf der Benachrichtigungsleiste ganz oben anzeigen \n- Vollbildunterbrechung zulassen \n- Immer kurz einblenden \n\n"<b>"Stufe 4"</b>" \n- Keine Vollbildunterbrechung \n- Immer kurz einblenden \n\n"<b>"Stufe 3"</b>" \n- Keine Vollbildunterbrechung \n- Nie kurz einblenden \n\n"<b>"Stufe 2"</b>" \n- Keine Vollbildunterbrechung \n- Nie kurz einblenden \n- Weder Ton noch Vibration \n\n"<b>"Stufe 1"</b>" \n- Keine Vollbildunterbrechung \n- Nie kurz einblenden \n- Weder Ton noch Vibration \n- Auf Sperrbildschirm und Statusleiste verbergen \n- Auf der Benachrichtigungsleiste ganz unten anzeigen \n\n"<b>"Stufe 0"</b>" \n- Alle Benachrichtigungen der App sperren"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Benachrichtigungen"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Du erhältst diese Benachrichtigungen nicht mehr."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g>-Benachrichtigungen für"</string>
- <string name="min_importance" msgid="7559703098688382595">"Niedrig"</string>
- <string name="low_importance" msgid="6891335321576225228">"Mittel"</string>
- <string name="default_importance" msgid="6400766013567512061">"Hoch"</string>
- <string name="high_importance" msgid="730741630855788381">"Dringend"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Kein akustisches Signal und keine visuelle Unterbrechung"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Ohne Ton anzeigen"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Akustisches Signal"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Akustisches Signal und Bildschirmbenachrichtigung"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 von <xliff:g id="NUMBER_1">%d</xliff:g> Kategorien dieser App</item>
+ <item quantity="one">1 von <xliff:g id="NUMBER_0">%d</xliff:g> Kategorie dieser App</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Alle Kategorien"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Weitere Einstellungen"</string>
<string name="notification_done" msgid="5279426047273930175">"Fertig"</string>
<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>
@@ -600,30 +596,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Aus"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigationsleiste"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Layout"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Links"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Rechts"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Schaltflächentyp"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Zusätzlicher linker Schaltflächentyp"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Zusätzlicher rechter Schaltflächentyp"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(Standard)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Zwischenablage"</item>
<item msgid="5742013440802239414">"Keycode"</item>
- <item msgid="8748101184830239843">"Menü-/Tastaturwechsler"</item>
+ <item msgid="8802889973626281575">"Tastaturwechsler"</item>
<item msgid="8175437057325747277">"Keine"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Geteilt (Standard)"</item>
- <item msgid="6210279084134579668">"Zentriert"</item>
- <item msgid="89143234390889289">"Linksbündig"</item>
- <item msgid="7715533883382410603">"Rechtsbündig"</item>
+ <item msgid="8077901629964902399">"Mittel"</item>
+ <item msgid="8256205964297588988">"Kompakt"</item>
+ <item msgid="8719936228094005878">"Linksbündig"</item>
+ <item msgid="586019486955594690">"Rechtsbündig"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menü-/Tastaturwechsler"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Tastaturwechsler"</string>
<string name="save" msgid="2311877285724540644">"Speichern"</string>
<string name="reset" msgid="2448168080964209908">"Zurücksetzen"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Schaltflächenbreite anpassen"</string>
<string name="clipboard" msgid="1313879395099896312">"Zwischenablage"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Benutzerdefinierte Navigationsschaltfläche"</string>
- <string name="keycode" msgid="7335281375728356499">"Keycode"</string>
- <string name="icon" msgid="8732339849035837289">"Symbol"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Linker Keycode"</string>
+ <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>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Zum Hinzufügen von Kacheln ziehen"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Zum Entfernen hierher ziehen"</string>
<string name="qs_edit" msgid="2232596095725105230">"Bearbeiten"</string>
@@ -672,19 +669,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Einstellungen für <xliff:g id="ID_1">%s</xliff:g> öffnen."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Reihenfolge der Einstellungen bearbeiten."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Seite <xliff:g id="ID_1">%1$d</xliff:g> von <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Sperrbildschirm"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Maximieren"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimieren"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Schließen"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Smartphone wird warm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Einige Funktionen sind während der Abkühlphase des Smartphones eingeschränkt"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Dein Smartphone kühlt sich automatisch ab. Du kannst dein Smartphone weiterhin nutzen, aber es reagiert möglicherweise langsamer.\n\nSobald dein Smartphone abgekühlt ist, funktioniert es wieder normal."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Links"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Rechts"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Verknüpfung anpassen"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Verknüpfung"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Zur Passworteingabe auffordern"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Linke Verknüpfung"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Rechte Verknüpfung"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Linke Verknüpfung entsperrt außerdem"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Rechte Verknüpfung entsperrt außerdem"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Keine"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"<xliff:g id="APP">%1$s</xliff:g> starten"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Weitere Apps"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Kreis"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Links"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Rechts"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menü"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"App \"<xliff:g id="APP">%1$s</xliff:g>\""</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Warnmeldungen"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 567aa05..0998797 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"Δεν θα λαμβάνεται πλέον αυτές τις ειδοποιήσεις."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Ειδοποιήσεις <xliff:g id="APP">%s</xliff:g> για"</string>
- <string name="min_importance" msgid="7559703098688382595">"Χαμηλή"</string>
- <string name="low_importance" msgid="6891335321576225228">"Μεσαία"</string>
- <string name="default_importance" msgid="6400766013567512061">"Υψηλή"</string>
- <string name="high_importance" msgid="730741630855788381">"Επείγον"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Χωρίς ηχητική ή οπτική διακοπή"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Εμφάνιση χωρίς ειδοποίηση"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Αναπαραγωγή ήχου"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Αναπαραγωγή ήχου και εμφάνιση στην οθόνη"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 από <xliff:g id="NUMBER_1">%d</xliff:g> κατηγορίες αυτής της εφαρμογής</item>
+ <item quantity="one">1 από <xliff:g id="NUMBER_0">%d</xliff:g> κατηγορία αυτής της εφαρμογής</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Όλες οι κατηγορίες"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Περισσότερες ρυθμίσεις"</string>
<string name="notification_done" msgid="5279426047273930175">"Τέλος"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"Αριστερά"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Δεξιά"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Τύπος κουμπιού"</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="8748101184830239843">"Εναλλαγή μενού/πληκτρολογίου"</item>
+ <item msgid="8802889973626281575">"Εναλλαγή πληκτρολογίων"</item>
<item msgid="8175437057325747277">"Κανένα"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Διαχωρισμένο (προεπιλογή)"</item>
- <item msgid="6210279084134579668">"Στοίχιση στο κέντρο"</item>
- <item msgid="89143234390889289">"Στοίχιση αριστερά"</item>
- <item msgid="7715533883382410603">"Στοίχιση δεξιά"</item>
+ <item msgid="8077901629964902399">"Κανονική"</item>
+ <item msgid="8256205964297588988">"Συμπαγής"</item>
+ <item msgid="8719936228094005878">"Αριστερού προσανατολισμού"</item>
+ <item msgid="586019486955594690">"Δεξιού προσανατολισμού"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Εναλλαγή μενού/πληκτρολογίου"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Εναλλαγή πληκτρολογίων"</string>
<string name="save" msgid="2311877285724540644">"Αποθήκευση"</string>
<string name="reset" msgid="2448168080964209908">"Επαναφορά"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Προσαρμογή πλάτους κουμπιού"</string>
<string name="clipboard" msgid="1313879395099896312">"Πρόχειρο"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Προσαρμοσμένο κουμπί πλοήγησης"</string>
- <string name="keycode" msgid="7335281375728356499">"Κωδικός-πλήκτρο"</string>
- <string name="icon" msgid="8732339849035837289">"Εικονίδιο"</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="7058945779098711293">"Σύρετε για να προσθέσετε πλακίδια"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Σύρετε εδώ για κατάργηση"</string>
<string name="qs_edit" msgid="2232596095725105230">"Επεξεργασία"</string>
@@ -670,19 +667,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Ελαχιστοποίηση"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Κλείσιμο"</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_left" msgid="6806490081187499505">"Αριστερά"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Δεξιά"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Προσαρμογή συντόμευσης"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Συντόμευση"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Προτροπή για κωδικό πρόσβασης"</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_screenshot" msgid="6314080179230000938">"Στιγμιότυπα οθόνης"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Γενικά μηνύματα"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Αποθηκευτικός χώρος"</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>
</resources>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 25fdb81..eba837a 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"With power notification controls, you can set an importance level from 0 to 5 for an app\'s notifications. \n\n"<b>"Level 5"</b>" \n- Show at the top of the notification list \n- Allow full screen interruption \n- Always peek \n\n"<b>"Level 4"</b>" \n- Prevent full screen interruption \n- Always peek \n\n"<b>"Level 3"</b>" \n- Prevent full screen interruption \n- Never peek \n\n"<b>"Level 2"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound and vibration \n\n"<b>"Level 1"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound or vibrate \n- Hide from lock screen and status bar \n- Show at the bottom of the notification list \n\n"<b>"Level 0"</b>" \n- Block all notifications from the app"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notifications"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"You won\'t get these notifications anymore."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> notifications for"</string>
- <string name="min_importance" msgid="7559703098688382595">"Low"</string>
- <string name="low_importance" msgid="6891335321576225228">"Medium"</string>
- <string name="default_importance" msgid="6400766013567512061">"High"</string>
- <string name="high_importance" msgid="730741630855788381">"Urgent"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"No sound or visual interruption"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Show silently"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Make sound"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Make sound and pop on screen"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 out of <xliff:g id="NUMBER_1">%d</xliff:g> categories from this app</item>
+ <item quantity="one">1 out of <xliff:g id="NUMBER_0">%d</xliff:g> category from this app</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"All Categories"</string>
<string name="notification_more_settings" msgid="816306283396553571">"More settings"</string>
<string name="notification_done" msgid="5279426047273930175">"Done"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Off"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigation bar"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Layout"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Left"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Right"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Button type"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Extra left button type"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Extra right button type"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(default)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Clipboard"</item>
<item msgid="5742013440802239414">"Keycode"</item>
- <item msgid="8748101184830239843">"Menu/Keyboard Switcher"</item>
+ <item msgid="8802889973626281575">"Keyboard switcher"</item>
<item msgid="8175437057325747277">"None"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Divided (default)"</item>
- <item msgid="6210279084134579668">"Centred"</item>
- <item msgid="89143234390889289">"Left-aligned"</item>
- <item msgid="7715533883382410603">"Right-aligned"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Compact"</item>
+ <item msgid="8719936228094005878">"Left-leaning"</item>
+ <item msgid="586019486955594690">"Right-leaning"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menu / Keyboard Switcher"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Keyboard switcher"</string>
<string name="save" msgid="2311877285724540644">"Save"</string>
<string name="reset" msgid="2448168080964209908">"Reset"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Adjust button width"</string>
<string name="clipboard" msgid="1313879395099896312">"Clipboard"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Customised navigation button"</string>
- <string name="keycode" msgid="7335281375728356499">"Keycode"</string>
- <string name="icon" msgid="8732339849035837289">"Icon"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Left keycode"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Right keycode"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Left icon"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Right icon"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Drag to add tiles"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Drag here to remove"</string>
<string name="qs_edit" msgid="2232596095725105230">"Edit"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Open <xliff:g id="ID_1">%s</xliff:g> settings."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Edit order of settings."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Lock screen"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Expand"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimise"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Close"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Phone is getting warm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Some features limited while phone cools down"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Left"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Right"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Customise shortcut"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Shortcut"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Prompt for password"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Left shortcut"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Right shortcut"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Left shortcut also unlocks"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Right shortcut also unlocks"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"None"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Launch <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Other apps"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Circle"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Left"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Right"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> app"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alerts"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 25fdb81..eba837a 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"With power notification controls, you can set an importance level from 0 to 5 for an app\'s notifications. \n\n"<b>"Level 5"</b>" \n- Show at the top of the notification list \n- Allow full screen interruption \n- Always peek \n\n"<b>"Level 4"</b>" \n- Prevent full screen interruption \n- Always peek \n\n"<b>"Level 3"</b>" \n- Prevent full screen interruption \n- Never peek \n\n"<b>"Level 2"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound and vibration \n\n"<b>"Level 1"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound or vibrate \n- Hide from lock screen and status bar \n- Show at the bottom of the notification list \n\n"<b>"Level 0"</b>" \n- Block all notifications from the app"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notifications"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"You won\'t get these notifications anymore."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> notifications for"</string>
- <string name="min_importance" msgid="7559703098688382595">"Low"</string>
- <string name="low_importance" msgid="6891335321576225228">"Medium"</string>
- <string name="default_importance" msgid="6400766013567512061">"High"</string>
- <string name="high_importance" msgid="730741630855788381">"Urgent"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"No sound or visual interruption"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Show silently"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Make sound"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Make sound and pop on screen"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 out of <xliff:g id="NUMBER_1">%d</xliff:g> categories from this app</item>
+ <item quantity="one">1 out of <xliff:g id="NUMBER_0">%d</xliff:g> category from this app</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"All Categories"</string>
<string name="notification_more_settings" msgid="816306283396553571">"More settings"</string>
<string name="notification_done" msgid="5279426047273930175">"Done"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Off"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigation bar"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Layout"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Left"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Right"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Button type"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Extra left button type"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Extra right button type"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(default)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Clipboard"</item>
<item msgid="5742013440802239414">"Keycode"</item>
- <item msgid="8748101184830239843">"Menu/Keyboard Switcher"</item>
+ <item msgid="8802889973626281575">"Keyboard switcher"</item>
<item msgid="8175437057325747277">"None"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Divided (default)"</item>
- <item msgid="6210279084134579668">"Centred"</item>
- <item msgid="89143234390889289">"Left-aligned"</item>
- <item msgid="7715533883382410603">"Right-aligned"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Compact"</item>
+ <item msgid="8719936228094005878">"Left-leaning"</item>
+ <item msgid="586019486955594690">"Right-leaning"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menu / Keyboard Switcher"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Keyboard switcher"</string>
<string name="save" msgid="2311877285724540644">"Save"</string>
<string name="reset" msgid="2448168080964209908">"Reset"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Adjust button width"</string>
<string name="clipboard" msgid="1313879395099896312">"Clipboard"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Customised navigation button"</string>
- <string name="keycode" msgid="7335281375728356499">"Keycode"</string>
- <string name="icon" msgid="8732339849035837289">"Icon"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Left keycode"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Right keycode"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Left icon"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Right icon"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Drag to add tiles"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Drag here to remove"</string>
<string name="qs_edit" msgid="2232596095725105230">"Edit"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Open <xliff:g id="ID_1">%s</xliff:g> settings."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Edit order of settings."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Lock screen"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Expand"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimise"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Close"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Phone is getting warm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Some features limited while phone cools down"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Left"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Right"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Customise shortcut"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Shortcut"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Prompt for password"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Left shortcut"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Right shortcut"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Left shortcut also unlocks"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Right shortcut also unlocks"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"None"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Launch <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Other apps"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Circle"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Left"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Right"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> app"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alerts"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 25fdb81..eba837a 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"With power notification controls, you can set an importance level from 0 to 5 for an app\'s notifications. \n\n"<b>"Level 5"</b>" \n- Show at the top of the notification list \n- Allow full screen interruption \n- Always peek \n\n"<b>"Level 4"</b>" \n- Prevent full screen interruption \n- Always peek \n\n"<b>"Level 3"</b>" \n- Prevent full screen interruption \n- Never peek \n\n"<b>"Level 2"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound and vibration \n\n"<b>"Level 1"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound or vibrate \n- Hide from lock screen and status bar \n- Show at the bottom of the notification list \n\n"<b>"Level 0"</b>" \n- Block all notifications from the app"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notifications"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"You won\'t get these notifications anymore."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> notifications for"</string>
- <string name="min_importance" msgid="7559703098688382595">"Low"</string>
- <string name="low_importance" msgid="6891335321576225228">"Medium"</string>
- <string name="default_importance" msgid="6400766013567512061">"High"</string>
- <string name="high_importance" msgid="730741630855788381">"Urgent"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"No sound or visual interruption"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Show silently"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Make sound"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Make sound and pop on screen"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 out of <xliff:g id="NUMBER_1">%d</xliff:g> categories from this app</item>
+ <item quantity="one">1 out of <xliff:g id="NUMBER_0">%d</xliff:g> category from this app</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"All Categories"</string>
<string name="notification_more_settings" msgid="816306283396553571">"More settings"</string>
<string name="notification_done" msgid="5279426047273930175">"Done"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Off"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigation bar"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Layout"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Left"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Right"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Button type"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Extra left button type"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Extra right button type"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(default)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Clipboard"</item>
<item msgid="5742013440802239414">"Keycode"</item>
- <item msgid="8748101184830239843">"Menu/Keyboard Switcher"</item>
+ <item msgid="8802889973626281575">"Keyboard switcher"</item>
<item msgid="8175437057325747277">"None"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Divided (default)"</item>
- <item msgid="6210279084134579668">"Centred"</item>
- <item msgid="89143234390889289">"Left-aligned"</item>
- <item msgid="7715533883382410603">"Right-aligned"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Compact"</item>
+ <item msgid="8719936228094005878">"Left-leaning"</item>
+ <item msgid="586019486955594690">"Right-leaning"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menu / Keyboard Switcher"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Keyboard switcher"</string>
<string name="save" msgid="2311877285724540644">"Save"</string>
<string name="reset" msgid="2448168080964209908">"Reset"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Adjust button width"</string>
<string name="clipboard" msgid="1313879395099896312">"Clipboard"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Customised navigation button"</string>
- <string name="keycode" msgid="7335281375728356499">"Keycode"</string>
- <string name="icon" msgid="8732339849035837289">"Icon"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Left keycode"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Right keycode"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Left icon"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Right icon"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Drag to add tiles"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Drag here to remove"</string>
<string name="qs_edit" msgid="2232596095725105230">"Edit"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Open <xliff:g id="ID_1">%s</xliff:g> settings."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Edit order of settings."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Lock screen"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Expand"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimise"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Close"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Phone is getting warm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Some features limited while phone cools down"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Left"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Right"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Customise shortcut"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Shortcut"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Prompt for password"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Left shortcut"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Right shortcut"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Left shortcut also unlocks"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Right shortcut also unlocks"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"None"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Launch <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Other apps"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Circle"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Left"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Right"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> app"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alerts"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 94efa8b..c2a41f1 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -518,15 +518,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Con los controles de activación de notificaciones, puedes establecer un nivel de importancia para las notificaciones de una app. \n\n"<b>"Nivel 5"</b>" \n- Mostrar en la parte superior de la lista de notificaciones. \n- Permitir interrupción en la pantalla completa. \n- Mostrar siempre. \n\n"<b>"Nivel 4"</b>" \n- No permitir interrupción en la pantalla completa. \n- Mostrar siempre. \n\n"<b>"Nivel 3"</b>" \n- No permitir interrupción en la pantalla completa. \n- No mostrar. \n\n"<b>"Nivel 2"</b>" \n- No permitir interrupción en la pantalla completa. \n- No mostrar. \n- No sonar ni vibrar. \n\n"<b>"Nivel 1"</b>" \n- No permitir interrupción en la pantalla completa. \n- No mostrar. \n- No sonar ni vibrar. \n- Ocultar de la pantalla bloqueada y la barra de estado. \n- Mostrar al final de la lista de notificaciones. \n\n"<b>"Nivel 0"</b>" \n- Bloquear todas las notificaciones de la app."</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notificaciones"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Ya no recibirás estas notificaciones."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Notificaciones de <xliff:g id="APP">%s</xliff:g> para"</string>
- <string name="min_importance" msgid="7559703098688382595">"Baja"</string>
- <string name="low_importance" msgid="6891335321576225228">"Media"</string>
- <string name="default_importance" msgid="6400766013567512061">"Alta"</string>
- <string name="high_importance" msgid="730741630855788381">"Urgente"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"No emitir sonido ni mostrar"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Mostrar sin emitir sonido"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Emitir sonido"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Emitir sonido y mostrar en pantalla"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 de <xliff:g id="NUMBER_1">%d</xliff:g> categorías de esta app</item>
+ <item quantity="one">1 de <xliff:g id="NUMBER_0">%d</xliff:g> categoría de esta app</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Todas las categorías"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Más opciones de configuración"</string>
<string name="notification_done" msgid="5279426047273930175">"Listo"</string>
<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>
@@ -600,30 +596,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Desactivado"</string>
<string name="nav_bar" msgid="1993221402773877607">"Barra de navegación"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Diseño"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Izquierda"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Derecha"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Tipo de botón"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Tipo de botón izquierdo adicional"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Tipo de botón derecho adicional"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(predeterminada)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Portapapeles"</item>
<item msgid="5742013440802239414">"Clave de código"</item>
- <item msgid="8748101184830239843">"Cambio de teclado/menú"</item>
+ <item msgid="8802889973626281575">"Cambio de teclado"</item>
<item msgid="8175437057325747277">"Ninguno"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Dividido (predeterminado)"</item>
- <item msgid="6210279084134579668">"Centrado"</item>
- <item msgid="89143234390889289">"Alineado a la izquierda"</item>
- <item msgid="7715533883382410603">"Alineado a la derecha"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Compacto"</item>
+ <item msgid="8719936228094005878">"Hacia la izquierda"</item>
+ <item msgid="586019486955594690">"Hacia la derecha"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menú/Cambio de teclado"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Cambio de teclado"</string>
<string name="save" msgid="2311877285724540644">"Guardar"</string>
<string name="reset" msgid="2448168080964209908">"Restablecer"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Ajustar ancho del botón"</string>
<string name="clipboard" msgid="1313879395099896312">"Portapapeles"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Botón de navegación personalizado"</string>
- <string name="keycode" msgid="7335281375728356499">"Clave de código"</string>
- <string name="icon" msgid="8732339849035837289">"Ícono"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Clave de código izquierdo"</string>
+ <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>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Arrastra los mosaicos para agregarlos"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Arrastra aquí para quitar"</string>
<string name="qs_edit" msgid="2232596095725105230">"Editar"</string>
@@ -672,19 +669,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Abrir configuración de <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Editar orden de configuración"</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Pantalla bloqueada"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Expandir"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizar"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Cerrar"</string>
<string name="high_temp_title" msgid="4589508026407318374">"El teléfono se está calentando"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Se limitarán algunas funciones mientras se enfría el teléfono"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Tu teléfono intentará enfriarse automáticamente. Podrás usarlo, pero es posible que funcione más lento.\n\nUna vez que se haya enfriado, volverá a funcionar correctamente."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Izquierda"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Derecha"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Personalizar acceso directo"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Acceso directo"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Solicitar contraseña"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Acceso directo izquierdo"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Acceso directo derecho"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"El acceso directo izquierdo también lo desbloquea"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"El acceso directo derecho también lo desbloquea"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Ninguno"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Iniciar <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Otras apps"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Círculo"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Más"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Menos"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Izquierda"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Derecha"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menú"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"App de <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
<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="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 la app"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 6e0cdaa..503eb64 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -518,15 +518,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Los controles de energía de las notificaciones permiten establecer un nivel de importancia de 0 a 5 para las notificaciones de las aplicaciones. \n\n"<b>"Nivel 5"</b>" \n- Mostrar en la parte superior de la lista de notificaciones \n- Permitir interrumpir en el modo de pantalla completa \n- Mostrar siempre \n\n"<b>"Nivel 4"</b>" \n- Evitar interrumpir en el modo de pantalla completa \n- Mostrar siempre \n\n"<b>"Nivel 3"</b>" \n- Evitar interrumpir en el modo de pantalla completa \n- No mostrar nunca \n\n"<b>"Nivel 2"</b>" \n- Evitar interrumpir en el modo de pantalla completa\n- No mostrar nunca \n- No emitir sonido ni vibrar nunca \n\n"<b>"Nivel 1"</b>" \n- Evitar interrumpir en el modo de pantalla completa \n- No mostrar nunca \n- No emitir sonido ni vibrar nunca \n- Ocultar de la pantalla de bloqueo y de la barra de estado \n- Mostrar en la parte inferior de la lista de notificaciones \n\n"<b>"Nivel 0"</b>" \n- Bloquear todas las notificaciones de la aplicación"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notificaciones"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Ya no recibirás estas notificaciones."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Notificaciones de <xliff:g id="APP">%s</xliff:g>:"</string>
- <string name="min_importance" msgid="7559703098688382595">"Baja"</string>
- <string name="low_importance" msgid="6891335321576225228">"Media"</string>
- <string name="default_importance" msgid="6400766013567512061">"Alta"</string>
- <string name="high_importance" msgid="730741630855788381">"Urgente"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Sin sonido ni interrupción visual"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Mostrar de forma silenciosa"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Emitir sonido"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Emitir sonido y mostrar en pantalla"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">Categoría 1 de <xliff:g id="NUMBER_1">%d</xliff:g> categorías de esta aplicación</item>
+ <item quantity="one">Categoría 1 de <xliff:g id="NUMBER_0">%d</xliff:g> de esta aplicación</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Todas las categorías"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Más ajustes"</string>
<string name="notification_done" msgid="5279426047273930175">"Listo"</string>
<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>
@@ -600,30 +596,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"No"</string>
<string name="nav_bar" msgid="1993221402773877607">"Barra de navegación"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Diseño"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Izquierda"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Derecha"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Tipo de botón"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Tipo de botón a la izquierda extra"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Tipo de botón a la derecha extra"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(predeterminada)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Portapapeles"</item>
<item msgid="5742013440802239414">"Código de teclado"</item>
- <item msgid="8748101184830239843">"Menú/Cambio de teclado"</item>
+ <item msgid="8802889973626281575">"Cambio de teclado"</item>
<item msgid="8175437057325747277">"Ninguno"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Dividida (predeterminada)"</item>
- <item msgid="6210279084134579668">"Centrada"</item>
- <item msgid="89143234390889289">"Alineada a la izquierda"</item>
- <item msgid="7715533883382410603">"Alineada a la derecha"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Compacto"</item>
+ <item msgid="8719936228094005878">"Para zurdos"</item>
+ <item msgid="586019486955594690">"Para diestros"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menú/Cambio de teclado"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Cambio de teclado"</string>
<string name="save" msgid="2311877285724540644">"Guardar"</string>
<string name="reset" msgid="2448168080964209908">"Restablecer"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Ajustar el ancho del botón"</string>
<string name="clipboard" msgid="1313879395099896312">"Portapapeles"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Botón de navegación personalizada"</string>
- <string name="keycode" msgid="7335281375728356499">"Código de teclado"</string>
- <string name="icon" msgid="8732339849035837289">"Icono"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Código de teclado a la izq."</string>
+ <string name="right_keycode" msgid="708447961000848163">"Código de teclado a la derecha"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Icono a la izquierda"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Icono a la derecha"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Arrastra para añadir funciones"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Arrastra aquí para quitar una función"</string>
<string name="qs_edit" msgid="2232596095725105230">"Editar"</string>
@@ -672,19 +669,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Abrir ajustes de <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Cambiar el orden de los ajustes."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Pantalla de bloqueo"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Mostrar"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizar"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Cerrar"</string>
<string name="high_temp_title" msgid="4589508026407318374">"El teléfono se está calentando"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Se limitan algunas funciones mientras el teléfono se enfría"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"El teléfono intentará enfriarse. Puedes seguir utilizándolo, pero es posible que funcione con mayor lentitud.\n\nUna vez que se haya enfriado, funcionará con normalidad."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Izquierda"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Derecha"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Personalizar el acceso directo"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Acceso directo"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Solicitar contraseña"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Acceso directo a la izquierda"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Acceso directo a la derecha"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Desbloquear también con el acceso directo a la izquierda"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Desbloquear también con el acceso directo a la derecha"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Ninguno"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Abrir <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Otras aplicaciones"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Círculo"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Más"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Menos"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Izquierda"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Derecha"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menú"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Aplicación <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index dc01393..94577f5 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -518,15 +518,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Toite märguannete juhtnuppudega saate määrata rakenduse märguannete tähtsuse taseme vahemikus 0–5. \n\n"<b>"5. tase"</b>" \n- Kuva märguannete loendi ülaosas\n- Luba täisekraanil häirimine \n- Kuva alati ekraani servas \n\n"<b>"4. tase"</b>" \n- Keela täisekraanil häirimine \n- Kuva alati ekraani servas \n\n"<b>"3. tase"</b>" \n- Keela täisekraanil häirimine \n- Ära kunagi kuva ekraani servas \n\n"<b>"2. tase"</b>" \n- Keela täisekraanil häirimine \n- Ära kunagi kuva ekraani servas \n- Ära kunagi helise ega vibreeri \n\n"<b>"1. tase"</b>" \n- Keela täisekraanil häirimine \n- Ära kunagi kuva ekraani servas \n- Ära kunagi helise ega vibreeri \n- Peida lukustuskuval ja olekuribal \n- Kuva märguannete loendi allosas \n\n"<b>"Tase 0"</b>" \n- Blokeeri kõik rakenduse märguanded"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Märguanded"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Te ei saa enam neid märguandeid."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Rakenduse <xliff:g id="APP">%s</xliff:g> märguanded:"</string>
- <string name="min_importance" msgid="7559703098688382595">"Väike"</string>
- <string name="low_importance" msgid="6891335321576225228">"Keskmine"</string>
- <string name="default_importance" msgid="6400766013567512061">"Suur"</string>
- <string name="high_importance" msgid="730741630855788381">"Kiireloomuline"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Heli ja visuaalne katkestus puudub"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Kuva vaikselt"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Esita heli"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Esita heli ja tõsta märguanne esile"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 selle rakenduse <xliff:g id="NUMBER_1">%d</xliff:g>-st kategooriast</item>
+ <item quantity="one">1 selle rakenduse <xliff:g id="NUMBER_0">%d</xliff:g>-st kategooriast</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Kõik kategooriad"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Rohkem seadeid"</string>
<string name="notification_done" msgid="5279426047273930175">"Valmis"</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>
@@ -600,30 +596,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Väljas"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigeerimisriba"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Paigutus"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Vasak"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Parem"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Nupu tüüp"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Täiendava vasaku nupu tüüp"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Täiendava parema nupu tüüp"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(vaikeseade)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Lõikelaud"</item>
<item msgid="5742013440802239414">"Võtmekood"</item>
- <item msgid="8748101184830239843">"Menüü/klaviatuuri vahetaja"</item>
+ <item msgid="8802889973626281575">"Klaviatuuri vahetaja"</item>
<item msgid="8175437057325747277">"Mitte ükski"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Jagatud (vaikeseade)"</item>
- <item msgid="6210279084134579668">"Keskel"</item>
- <item msgid="89143234390889289">"Vasakule joondatud"</item>
- <item msgid="7715533883382410603">"Paremale joondatud"</item>
+ <item msgid="8077901629964902399">"Tavaline"</item>
+ <item msgid="8256205964297588988">"Kompaktne"</item>
+ <item msgid="8719936228094005878">"Vasakule kaldu"</item>
+ <item msgid="586019486955594690">"Paremale kaldu"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menüü / klaviatuuri vahetaja"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Klaviatuuri vahetaja"</string>
<string name="save" msgid="2311877285724540644">"Salvesta"</string>
<string name="reset" msgid="2448168080964209908">"Lähtesta"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Nupu laiuse reguleerimine"</string>
<string name="clipboard" msgid="1313879395099896312">"Lõikelaud"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Kohandatud navigeerimisnupp"</string>
- <string name="keycode" msgid="7335281375728356499">"Võtmekood"</string>
- <string name="icon" msgid="8732339849035837289">"Ikoon"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Vasak võtmekood"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Parem võtmekood"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Vasak ikoon"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Parem ikoon"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Lohistage paanide lisamiseks"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Lohistage eemaldamiseks siia"</string>
<string name="qs_edit" msgid="2232596095725105230">"Muutmine"</string>
@@ -672,19 +669,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Ava teenuse <xliff:g id="ID_1">%s</xliff:g> seaded."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Muuda seadete järjestust."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Leht <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">"Lukustuskuva"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Laiendamine"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimeeri"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Sule"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefon soojeneb"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Mõned funktsioonid on piiratud, kuni telefon jahtub"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Teie telefon proovib automaatselt maha jahtuda. Saate telefoni ikka kasutada, kuid see võib olla aeglasem.\n\nKui telefon on jahtunud, töötab see tavapäraselt."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Vasak"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Parem"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Otsetee kohandamine"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Otsetee"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Parooli viip"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Vasak otsetee"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Parem otsetee"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Vasak otsetee avab ka"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Parem otsetee avab ka"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Mitte ükski"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Rakenduse <xliff:g id="APP">%1$s</xliff:g> käivitamine"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Muud rakendused"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Ring"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Pluss"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Miinus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Vasak"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Parem"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menüü"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Rakendus <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Teatised"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index df17eae..72d8ecb 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -518,15 +518,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Bateria-mailaren arabera jakinarazpenak kontrolatzeko aukerekin, 0 eta 5 bitarteko garrantzi-mailetan sailka ditzakezu aplikazioen jakinarazpenak. \n\n"<b>"5. maila"</b>" \n- Erakutsi jakinarazpenen zerrendaren goialdean. \n- Baimendu etetea pantaila osoko moduan zaudenean. \n- Agerrarazi beti jakinarazpenak. \n\n"<b>"4. maila"</b>" \n- Galarazi etetea pantaila osoko moduan zaudenean. \n- Agerrarazi beti jakinarazpenak. \n\n"<b>"3. maila"</b>" \n- Galarazi etetea pantaila osoko moduan zaudenean. \n- Ez agerrarazi jakinarazpenik inoiz. \n\n"<b>"2. maila"</b>" \n- Galarazi etetea pantaila osoko moduan zaudenean. \n- Ez agerrarazi jakinarazpenik inoiz. \n- Ez egin soinurik edo dardararik inoiz. \n\n"<b>"1. maila"</b>" \n- Galarazi etetea pantaila osoko moduan zaudenean. \n- Ez agerrarazi jakinarazpenik inoiz. \n- Ez egin soinurik edo dardararik inoiz. \n- Ezkutatu pantaila blokeatutik eta egoera-barratik. \n- Erakutsi jakinarazpenen zerrendaren behealdean. \n\n"<b>"0. maila"</b>" \n- Blokeatu aplikazioaren jakinarazpen guztiak."</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Jakinarazpenak"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Aurrerantzean ez duzu jasoko horrelako jakinarazpenik."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> aplikazioaren jakinarazpenak"</string>
- <string name="min_importance" msgid="7559703098688382595">"Txikia"</string>
- <string name="low_importance" msgid="6891335321576225228">"Ertaina"</string>
- <string name="default_importance" msgid="6400766013567512061">"Handia"</string>
- <string name="high_importance" msgid="730741630855788381">"Premiazkoa"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Ez egin soinurik eta ez erakutsi"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Erakutsi soinurik egin gabe"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Egin soinua"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Egin soinua eta erakutsi pantailan"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">Aplikazio honetako 1/<xliff:g id="NUMBER_1">%d</xliff:g> kategoria</item>
+ <item quantity="one">Aplikazio honetako 1/<xliff:g id="NUMBER_0">%d</xliff:g> kategoria</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Kategoria guztiak"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Ezarpen gehiago"</string>
<string name="notification_done" msgid="5279426047273930175">"Eginda"</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>
@@ -600,30 +596,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Desaktibatuta"</string>
<string name="nav_bar" msgid="1993221402773877607">"Nabigazio-barra"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Diseinua"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Ezkerrera botoia"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Eskuinera botoia"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Botoi mota"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Ezkerreko botoi gehigarriaren mota"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Eskuineko botoi gehigarriaren mota"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(lehenetsia)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Arbela"</item>
<item msgid="5742013440802239414">"Tekla-kodea"</item>
- <item msgid="8748101184830239843">"Menu- edo teklatu-aldatzailea"</item>
+ <item msgid="8802889973626281575">"Teklatu-aldatzailea"</item>
<item msgid="8175437057325747277">"Bat ere ez"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Zatitua (lehenetsia)"</item>
- <item msgid="6210279084134579668">"Erdiratua"</item>
- <item msgid="89143234390889289">"Ezkerrean lerrokatua"</item>
- <item msgid="7715533883382410603">"Eskuinean lerrokatua"</item>
+ <item msgid="8077901629964902399">"Normala"</item>
+ <item msgid="8256205964297588988">"Trinkoa"</item>
+ <item msgid="8719936228094005878">"Ezkerraldekoa"</item>
+ <item msgid="586019486955594690">"Eskuinaldekoa"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menu- edo teklatu-aldatzailea"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Teklatu-aldatzailea"</string>
<string name="save" msgid="2311877285724540644">"Gorde"</string>
<string name="reset" msgid="2448168080964209908">"Berrezarri"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Doitu botoiaren zabalera"</string>
<string name="clipboard" msgid="1313879395099896312">"Arbela"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Nabigazio-botoi pertsonalizatua"</string>
- <string name="keycode" msgid="7335281375728356499">"Tekla-kodea"</string>
- <string name="icon" msgid="8732339849035837289">"Ikonoa"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Ezkerreko teklaren kodea"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Eskuineko teklaren kodea"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Ezkerreko ikonoa"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Eskuineko ikonoa"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Arrastatu lauzak hemen gehitzeko"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Kentzeko, arrastatu hona"</string>
<string name="qs_edit" msgid="2232596095725105230">"Editatu"</string>
@@ -672,19 +669,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Ireki <xliff:g id="ID_1">%s</xliff:g> ezarpenak."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Editatu ezarpenen ordena."</string>
<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> orria"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Pantaila blokeatua"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Zabaldu"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizatu"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Itxi"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Berotzen ari da telefonoa"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Eginbide batzuk ezingo dira erabili telefonoa hoztu arte"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefonoa automatikoki saiatuko da hozten. Hoztu bitartean, telefonoa erabiltzen jarrai dezakezu, baina mantsoago funtziona lezake.\n\nTelefonoaren tenperatura jaitsi bezain laster, ohi bezala funtzionatzen jarraituko du."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Ezkerraldea"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Eskuinaldea"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Pertsonalizatu lasterbidea"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Lasterbidea"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Eskatu pasahitza"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Ezkerreko lasterbidea"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Eskuineko lasterbidea"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Ezkerreko lasterbideak desblokeatzeko ere balio du"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Eskuineko lasterbideak desblokeatzeko ere balio du"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Bat ere ez"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Abiarazi <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Beste aplikazio batzuk"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Zirkulua"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Ezkerrera"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Eskuinera"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menua"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> aplikazioa"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Abisuak"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 63da9dc..b8e8ed1 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"دیگر این اعلانها را دریافت نخواهید کرد."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"اعلانهای <xliff:g id="APP">%s</xliff:g> برای"</string>
- <string name="min_importance" msgid="7559703098688382595">"کم"</string>
- <string name="low_importance" msgid="6891335321576225228">"متوسط"</string>
- <string name="default_importance" msgid="6400766013567512061">"زیاد"</string>
- <string name="high_importance" msgid="730741630855788381">"فوری"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"بدون وقفه صوتی و تصویری"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"نمایش بهصورت بیصدا"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"پخش صدا"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"پخش صدا و صفحه بازشو"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">یکی از <xliff:g id="NUMBER_1">%d</xliff:g> دسته این برنامه</item>
+ <item quantity="other">یکی از <xliff:g id="NUMBER_1">%d</xliff:g> دسته این برنامه</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"همه دستهها"</string>
<string name="notification_more_settings" msgid="816306283396553571">"تنظیمات بیشتر"</string>
<string name="notification_done" msgid="5279426047273930175">"تمام"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"چپ"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"راست"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"نوع دکمه"</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="8748101184830239843">"جابهجاکننده منو / صفحهکلید"</item>
+ <item msgid="8802889973626281575">"تغییردهنده صفحهکلید"</item>
<item msgid="8175437057325747277">"هیچکدام"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"تقسیمشده (پیشفرض)"</item>
- <item msgid="6210279084134579668">"ترازشده در مرکز"</item>
- <item msgid="89143234390889289">"ترازشده در چپ"</item>
- <item msgid="7715533883382410603">"ترازشده در راست"</item>
+ <item msgid="8077901629964902399">"معمولی"</item>
+ <item msgid="8256205964297588988">"فشرده"</item>
+ <item msgid="8719936228094005878">"متمایل به چپ"</item>
+ <item msgid="586019486955594690">"متمایل به راست"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"جابهجاکننده منو / صفحهکلید"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"تغییردهنده صفحهکلید"</string>
<string name="save" msgid="2311877285724540644">"ذخیره کردن"</string>
<string name="reset" msgid="2448168080964209908">"بازنشانی"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"تنظیم پهنای دکمه"</string>
<string name="clipboard" msgid="1313879395099896312">"کلیپبورد"</string>
<string name="accessibility_key" msgid="5701989859305675896">"دکمه پیمایش سفارشی"</string>
- <string name="keycode" msgid="7335281375728356499">"کد کلید"</string>
- <string name="icon" msgid="8732339849035837289">"نماد"</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="7058945779098711293">"برای افزودن کاشی، بکشید"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"برای حذف، به اینجا بکشید"</string>
<string name="qs_edit" msgid="2232596095725105230">"ویرایش"</string>
@@ -670,19 +667,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"کوچک کردن"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"بستن"</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_left" msgid="6806490081187499505">"چپ"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"راست"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"سفارشی کردن میانبر"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"میانبر"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"درخواست وارد کردن گذرواژه"</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_screenshot" msgid="6314080179230000938">"عکسهای صفحهنمایش"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"پیامهای عمومی"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"فضای ذخیرهسازی"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"برنامههای فوری"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"برنامههای فوری نیاز به نصب ندارند."</string>
+ <string name="app_info" msgid="6856026610594615344">"اطلاعات برنامه"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 35ec9e2..2480ac8 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Ilmoitusten tehohallinnan avulla voit määrittää sovelluksen ilmoituksille tärkeystason väliltä 0–5. \n\n"<b>"Taso 5"</b>" \n– Ilmoitukset näytetään ilmoitusluettelon yläosassa \n– Näkyminen koko näytön tilassa sallitaan \n– Ilmoitukset kurkistavat aina näytölle\n\n"<b>"Taso 4"</b>" \n– Näkyminen koko näytön tilassa estetään \n– Ilmoitukset kurkistavat aina näytölle \n\n"<b>"Taso 3"</b>" \n– Näkyminen koko näytön tilassa estetään \n– Ei kurkistamista \n\n"<b>"Taso 2"</b>" \n– Näkyminen koko näytön tilassa estetään \n– Ei kurkistamista \n– Ei ääniä eikä värinää \n\n"<b>"Taso 1"</b>" \n– Näkyminen koko näytön tilassa estetään \n– Ei kurkistamista \n– Ei ääniä eikä värinää \n– Ilmoitukset piilotetaan lukitusnäytöltä ja tilapalkista \n– Ilmoitukset näytetään ilmoitusluettelon alaosassa \n\n"<b>"Taso 0"</b>" \n– Kaikki sovelluksen ilmoitukset estetään"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Ilmoitukset"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Et saa näitä ilmoituksia enää."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Sovelluksen <xliff:g id="APP">%s</xliff:g> ilmoitukset:"</string>
- <string name="min_importance" msgid="7559703098688382595">"Matala"</string>
- <string name="low_importance" msgid="6891335321576225228">"Keskitaso"</string>
- <string name="default_importance" msgid="6400766013567512061">"Korkea"</string>
- <string name="high_importance" msgid="730741630855788381">"Kiireellinen"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Ei ääntä tai näkyvää ilmoitusta"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Näkyy ilman ääntä"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Ääni"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Ääni, ilmoitus näkyy näytöllä"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1/<xliff:g id="NUMBER_1">%d</xliff:g> luokkaa tästä sovelluksesta</item>
+ <item quantity="one">1/<xliff:g id="NUMBER_0">%d</xliff:g> luokka tästä sovelluksesta</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Kaikki luokat"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Lisäasetukset"</string>
<string name="notification_done" msgid="5279426047273930175">"Valmis"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Pois käytöstä"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigointipalkki"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Asettelu"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Vasen"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Oikea"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Painikkeen tyyppi"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Ylimääräinen vasen painiketyyppi"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Ylimääräinen oikea painiketyyppi"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(oletus)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Leikepöytä"</item>
<item msgid="5742013440802239414">"Näppäinkoodi"</item>
- <item msgid="8748101184830239843">"Valikko/näppäimistövalitsin"</item>
+ <item msgid="8802889973626281575">"Näppäimistövalitsin"</item>
<item msgid="8175437057325747277">"Ei mitään"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Jaettu (oletus)"</item>
- <item msgid="6210279084134579668">"Keskitetty"</item>
- <item msgid="89143234390889289">"Tasattu vasemmalle"</item>
- <item msgid="7715533883382410603">"Tasattu oikealle"</item>
+ <item msgid="8077901629964902399">"Normaali"</item>
+ <item msgid="8256205964297588988">"Kompakti"</item>
+ <item msgid="8719936228094005878">"Vasemmanpuoleinen"</item>
+ <item msgid="586019486955594690">"Oikeanpuoleinen"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Valikko/Näppäimistövalitsin"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Näppäimistövalitsin"</string>
<string name="save" msgid="2311877285724540644">"Tallenna"</string>
<string name="reset" msgid="2448168080964209908">"Palauta"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Muokkaa painikkeen leveyttä"</string>
<string name="clipboard" msgid="1313879395099896312">"Leikepöytä"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Muokattu navigointipainike"</string>
- <string name="keycode" msgid="7335281375728356499">"Näppäinkoodi"</string>
- <string name="icon" msgid="8732339849035837289">"Kuvake"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Vasen näppäinkoodi"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Oikea näppäinkoodi"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Vasen kuvake"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Oikea kuvake"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Lisää osioita vetämällä"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Poista vetämällä tähän."</string>
<string name="qs_edit" msgid="2232596095725105230">"Muokkaa"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Avaa kohteen <xliff:g id="ID_1">%s</xliff:g> asetukset."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Muokkaa asetusten järjestystä."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Sivu <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">"Lukitusnäyttö"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Laajenna"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Pienennä"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Sulje"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Puhelin lämpenee"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Joidenkin ominaisuuksien käyttöä on rajoitettu puhelimen jäähtymisen aikana."</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Puhelimesi yrittää automaattisesti jäähdyttää itsensä. Voit silti käyttää puhelinta, mutta se voi toimia hitaammin.\n\nKun puhelin on jäähtynyt, se toimii normaalisti."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Vasen"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Oikea"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Muokkaa pikakuvaketta"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Pikakuvake"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Kysy salasanaa"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Vasen pikakuvake"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Oikea pikakuvake"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Myös vasen pikakuvake avaa lukituksen"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Myös oikea pikakuvake avaa lukituksen"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Ei mitään"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Käynnistä <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Muut sovellukset"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Piiri"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Miinus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Vasen"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Oikea"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Valikko"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> sovellus"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Ilmoitukset"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 75ddcad..121b137 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -518,15 +518,11 @@
<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="5805874247999578073">"Vous ne recevrez plus ces notifications."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> notifications pour"</string>
- <string name="min_importance" msgid="7559703098688382595">"Faible"</string>
- <string name="low_importance" msgid="6891335321576225228">"Moyenne"</string>
- <string name="default_importance" msgid="6400766013567512061">"Élevée"</string>
- <string name="high_importance" msgid="730741630855788381">"Urgente"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Aucun son ni interruption visuelle"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Affichage silencieux"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Émettre un son"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Émettre un son et s\'afficher à l\'écran"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 catégorie sur <xliff:g id="NUMBER_1">%d</xliff:g> pour cette application</item>
+ <item quantity="other">1 catégories sur <xliff:g id="NUMBER_1">%d</xliff:g> pour cette application</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Toutes les catégories"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Plus de paramètres"</string>
<string name="notification_done" msgid="5279426047273930175">"Terminé"</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>
@@ -600,30 +596,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Désactivé"</string>
<string name="nav_bar" msgid="1993221402773877607">"Barre de navigation"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Disposition"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"À gauche"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"À droite"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Type de bouton"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Type de bouton gauche supplémentaire"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Type de bouton droit supplémentaire"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(par défaut)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Presse-papiers"</item>
<item msgid="5742013440802239414">"Code de touche"</item>
- <item msgid="8748101184830239843">"Sélecteur menu/clavier"</item>
+ <item msgid="8802889973626281575">"Sélecteur de clavier"</item>
<item msgid="8175437057325747277">"Aucun"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Divisé (par défaut)"</item>
- <item msgid="6210279084134579668">"Centré"</item>
- <item msgid="89143234390889289">"Aligné à gauche"</item>
- <item msgid="7715533883382410603">"Aligné à droite"</item>
+ <item msgid="8077901629964902399">"Normale"</item>
+ <item msgid="8256205964297588988">"Compacte"</item>
+ <item msgid="8719936228094005878">"Alignée à gauche"</item>
+ <item msgid="586019486955594690">"Alignée à droite"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Sélecteur menu/clavier"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Sélecteur de clavier"</string>
<string name="save" msgid="2311877285724540644">"Enregistrer"</string>
<string name="reset" msgid="2448168080964209908">"Réinitialiser"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Ajuster la largeur du bouton"</string>
<string name="clipboard" msgid="1313879395099896312">"Presse-papiers"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Bouton de navigation personnalisé"</string>
- <string name="keycode" msgid="7335281375728356499">"Code de touche"</string>
- <string name="icon" msgid="8732339849035837289">"Icône"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Code de touche gauche"</string>
+ <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_remove_tiles" msgid="3361212377437088062">"Faites glisser les tuiles ici pour les supprimer"</string>
<string name="qs_edit" msgid="2232596095725105230">"Modifier"</string>
@@ -672,19 +669,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Page <xliff:g id="ID_1">%1$d</xliff:g> sur <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Écran de verrouillage"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Développer"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Réduire"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Fermer"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Le téléphone commence à chauffer"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Les fonctionnalités sont limitées pendant que le téléphone refroidit"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Votre téléphone va essayer de se refroidir automatiquement. Vous pouvez toujours l\'utiliser, mais il risque d\'être plus lent.\n\nUne fois refroidi, il fonctionnera normalement."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"À gauche"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"À droite"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Personnaliser le raccourci"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Raccourci"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Demander le mot de passe"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Raccourci gauche"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Raccourci droit"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Le raccourci gauche déverrouille aussi :"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Le raccourci droit déverrouille aussi :"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Aucun"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Lancer l\'application <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Autres applications"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Cercle"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Moins"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Gauche"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Droite"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Application <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertes"</string>
<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>
+ <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>
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index a78d8af..6d677ae 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -518,15 +518,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Grâce aux commandes de gestion des notifications, vous pouvez définir le niveau d\'importance (compris entre 0 et 5) des notifications d\'une application. \n\n"<b>"Niveau 5"</b>" \n- Afficher en haut de la liste des notifications \n- Autoriser l\'interruption en plein écran \n- Toujours en aperçu \n\n"<b>"Niveau 4"</b>" \n- Empêcher l\'interruption en plein écran \n- Toujours en aperçu \n\n"<b>"Niveau 3"</b>" \n- Empêcher l\'interruption en plein écran \n- Jamais en aperçu \n\n"<b>"Niveau 2"</b>" \n- Empêcher l\'interruption en plein écran \n- Jamais en aperçu \n- Ne jamais émettre de signal sonore ni déclencher le vibreur \n\n"<b>"Niveau 1"</b>" \n- Empêcher l\'interruption en plein écran \n- Jamais en aperçu \n- Ne jamais émettre de signal sonore ni déclencher le vibreur \n- Masquer les notifications dans l\'écran de verrouillage et la barre d\'état \n- Afficher au bas de la liste des notifications \n\n"<b>"Niveau 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="5805874247999578073">"Vous ne recevrez plus ces notifications."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Notifications de l\'application <xliff:g id="APP">%s</xliff:g> pour"</string>
- <string name="min_importance" msgid="7559703098688382595">"Faible"</string>
- <string name="low_importance" msgid="6891335321576225228">"Moyenne"</string>
- <string name="default_importance" msgid="6400766013567512061">"Élevée"</string>
- <string name="high_importance" msgid="730741630855788381">"Urgente"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Aucune interruption sonore ni visuelle"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Affichage silencieux"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Alerte sonore"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Alerte sonore et affichage à l\'écran"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 catégorie sur <xliff:g id="NUMBER_1">%d</xliff:g> pour cette application</item>
+ <item quantity="other">1 catégorie sur <xliff:g id="NUMBER_1">%d</xliff:g> pour cette application</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Toutes les catégories"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Plus de paramètres"</string>
<string name="notification_done" msgid="5279426047273930175">"Terminé"</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>
@@ -600,30 +596,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Désactivé"</string>
<string name="nav_bar" msgid="1993221402773877607">"Barre de navigation"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Disposition"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Gauche"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Droite"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Type de bouton"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Type de bouton gauche supplémentaire"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Type de bouton droit supplémentaire"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(par défaut)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Presse-papiers"</item>
<item msgid="5742013440802239414">"Code de touche"</item>
- <item msgid="8748101184830239843">"Sélecteur menu/clavier"</item>
+ <item msgid="8802889973626281575">"Sélecteur clavier"</item>
<item msgid="8175437057325747277">"Aucun"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Divisée (par défaut)"</item>
- <item msgid="6210279084134579668">"Centrée"</item>
- <item msgid="89143234390889289">"Alignée à gauche"</item>
- <item msgid="7715533883382410603">"Alignée à droite"</item>
+ <item msgid="8077901629964902399">"Normale"</item>
+ <item msgid="8256205964297588988">"Compacte"</item>
+ <item msgid="8719936228094005878">"Alignée à gauche"</item>
+ <item msgid="586019486955594690">"Alignée à droite"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Sélecteur menu/clavier"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Sélecteur clavier"</string>
<string name="save" msgid="2311877285724540644">"Enregistrer"</string>
<string name="reset" msgid="2448168080964209908">"Réinitialiser"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Ajuster la largeur du bouton"</string>
<string name="clipboard" msgid="1313879395099896312">"Presse-papiers"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Bouton de navigation personnalisé"</string>
- <string name="keycode" msgid="7335281375728356499">"Code de touche"</string>
- <string name="icon" msgid="8732339849035837289">"Icône"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Code de touche gauche"</string>
+ <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 ici pour les ajouter"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Faites glisser les tuiles ici pour les supprimer."</string>
<string name="qs_edit" msgid="2232596095725105230">"Modifier"</string>
@@ -672,19 +669,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Page <xliff:g id="ID_1">%1$d</xliff:g> sur <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Écran de verrouillage"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Développer"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Réduire"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Fermer"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Le téléphone chauffe"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Fonctionnalités limitées pendant le refroidissement du téléphone"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Votre téléphone va essayer de se refroidir automatiquement. Vous pouvez toujours l\'utiliser, mais il risque d\'être plus lent.\n\nUne fois refroidi, il fonctionnera normalement."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Gauche"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Droite"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Personnaliser le raccourci"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Raccourci"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Demander le mot de passe"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Raccourci gauche"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Raccourci droit"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Le raccourci gauche déverrouille également"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Le raccourci droit déverrouille également"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Aucun"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Lancer <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Autres applications"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Cercle"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Moins"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Gauche"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Droite"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Application <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertes"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 190a68b..e5df1d3 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -518,15 +518,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Cos controis de notificacións mellorados, podes asignarlles un nivel de importancia comprendido entre 0 e 5 ás notificacións dunha aplicación determinada. \n\n"<b>"Nivel 5"</b>" \n- Mostrar na parte superior da lista de notificacións. \n- Permitir interrupcións no modo de pantalla completa. \n- Mostrar sempre. \n\n"<b>"Nivel 4"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Mostrar sempre. \n\n"<b>"Nivel 3"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Non mostrar nunca. \n\n"<b>"Nivel 2"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Non mostrar nunca. \n- Non soar nin vibrar nunca. \n\n"<b>"Nivel 1"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Non mostrar nunca. \n- Non soar nin vibrar nunca. \n- Ocultar na pantalla de bloqueo e na barra de estado. \n- Mostrar na parte inferior da lista de notificacións. \n\n"<b>"Nivel 0"</b>" \n- Bloquear todas as notificacións da aplicación."</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notificacións"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Deixarás de recibir estas notificacións."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Notificacións da aplicación <xliff:g id="APP">%s</xliff:g> para"</string>
- <string name="min_importance" msgid="7559703098688382595">"Baixa"</string>
- <string name="low_importance" msgid="6891335321576225228">"Media"</string>
- <string name="default_importance" msgid="6400766013567512061">"Alta"</string>
- <string name="high_importance" msgid="730741630855788381">"Urxente"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Nin son nin interrupción visual"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Mostrar en silencio"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Emitir son"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Emitir son e aparecer na pantalla"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 de <xliff:g id="NUMBER_1">%d</xliff:g> categorías desta aplicación</item>
+ <item quantity="one">1 de <xliff:g id="NUMBER_0">%d</xliff:g> categoría desta aplicación</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Todas as categorías"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Máis opcións"</string>
<string name="notification_done" msgid="5279426047273930175">"Feito"</string>
<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>
@@ -600,30 +596,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Desactivar"</string>
<string name="nav_bar" msgid="1993221402773877607">"Barra de navegación"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Deseño"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Esquerda"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Dereita"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Tipo de botón"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Tipo de botón adicional á esquerda"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Tipo de botón adicional á dereita"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(predeterminado)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Portapapeis"</item>
<item msgid="5742013440802239414">"Código de teclas"</item>
- <item msgid="8748101184830239843">"Conmutador menú/teclado"</item>
+ <item msgid="8802889973626281575">"Conmutador do teclado"</item>
<item msgid="8175437057325747277">"Ningún"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Dividido (predeterminado)"</item>
- <item msgid="6210279084134579668">"Centrado"</item>
- <item msgid="89143234390889289">"Aliñado á esquerda"</item>
- <item msgid="7715533883382410603">"Aliñado á dereita"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Compacto"</item>
+ <item msgid="8719936228094005878">"Á esquerda"</item>
+ <item msgid="586019486955594690">"Á dereita"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Conmutador menú/teclado"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Conmutador do teclado"</string>
<string name="save" msgid="2311877285724540644">"Gardar"</string>
<string name="reset" msgid="2448168080964209908">"Restablecer"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Axustar o ancho do botón"</string>
<string name="clipboard" msgid="1313879395099896312">"Portapapeis"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Botón de navegación personalizada"</string>
- <string name="keycode" msgid="7335281375728356499">"Código de teclas"</string>
- <string name="icon" msgid="8732339849035837289">"Icona"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Código de teclas á esquerda"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Código de teclas á dereita"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Icona á esquerda"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Icona á dereita"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Arrastrar para engadir funcións"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Arrastra o elemento ata aquí para eliminalo"</string>
<string name="qs_edit" msgid="2232596095725105230">"Editar"</string>
@@ -672,19 +669,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Abrir a configuración de <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Editar a orde das opcións de configuración."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Páxina <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Pantalla de bloqueo"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Despregar"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizar"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Pechar"</string>
<string name="high_temp_title" msgid="4589508026407318374">"O teléfono está quentando"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"O uso dalgunhas funcións é limitado mentres o teléfono arrefría"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"O teléfono tentará arrefriar automaticamente. Podes utilizalo, pero é probable que funcione máis lento.\n\nUnha vez que arrefríe, funcionará con normalidade."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Esquerda"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Dereita"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Personalizar atallo"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Atallo"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Solicitude de contrasinal"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Atallo á esquerda"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Atallo á dereita"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"O atallo á esquerda tamén desbloquea o dispositivo"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"O atallo á dereita tamén desbloquea o dispositivo"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Ningún"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Iniciar <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Outras aplicacións"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Círculo"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Máis"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Menos"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Esquerda"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Dereita"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menú"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Aplicación <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
<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="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">"Información da aplicación"</string>
</resources>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 003ddec..381476f 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"તમને હવે આ સૂચનાઓ મળશે નહીં."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"આ માટે <xliff:g id="APP">%s</xliff:g> સૂચનાઓ"</string>
- <string name="min_importance" msgid="7559703098688382595">"નિમ્ન"</string>
- <string name="low_importance" msgid="6891335321576225228">"મધ્યમ"</string>
- <string name="default_importance" msgid="6400766013567512061">"ઉચ્ચ"</string>
- <string name="high_importance" msgid="730741630855788381">"તાત્કાલિક"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"કોઈ અવાજ અથવા વિઝ્યુઅલ અવરોધ નહીં"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"ચુપચાપ બતાવો"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"અવાજ કરો"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"અવાજ કરો અને સ્ક્રીન પર બતાવો"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">આ ઍપ્લિકેશન તરફથી <xliff:g id="NUMBER_1">%d</xliff:g> માંથી 1 કૅટેગરી</item>
+ <item quantity="other">આ ઍપ્લિકેશન તરફથી <xliff:g id="NUMBER_1">%d</xliff:g> માંથી 1 કૅટેગરી</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"બધી કૅટેગરી"</string>
<string name="notification_more_settings" msgid="816306283396553571">"વધુ સેટિંગ્સ"</string>
<string name="notification_done" msgid="5279426047273930175">"થઈ ગયું"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"ડાબે"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"જમણે"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"બટનનો પ્રકાર"</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="8748101184830239843">"મેનૂ / કીબોર્ડ સ્વિચર"</item>
+ <item msgid="8802889973626281575">"કીબોર્ડ સ્વિચર"</item>
<item msgid="8175437057325747277">"કોઈ નહીં"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"વિભાજીત (ડિફૉલ્ટ)"</item>
- <item msgid="6210279084134579668">"કેન્દ્રિત"</item>
- <item msgid="89143234390889289">"ડાબે-સંરેખિત"</item>
- <item msgid="7715533883382410603">"જમણે-સંરેખિત"</item>
+ <item msgid="8077901629964902399">"સામાન્ય"</item>
+ <item msgid="8256205964297588988">"નિબિડ"</item>
+ <item msgid="8719936228094005878">"ડાબી બાજુએ ઢળતું"</item>
+ <item msgid="586019486955594690">"જમણી બાજુએ ઢળતું"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"મેનૂ / કીબોર્ડ સ્વિચર"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"કીબોર્ડ સ્વિચર"</string>
<string name="save" msgid="2311877285724540644">"સાચવો"</string>
<string name="reset" msgid="2448168080964209908">"ફરીથી સેટ કરો"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"બટનની પહોળાઈ સમાયોજિત કરો"</string>
<string name="clipboard" msgid="1313879395099896312">"ક્લિપબોર્ડ"</string>
<string name="accessibility_key" msgid="5701989859305675896">"કસ્ટમ નેવિગેશન બટન"</string>
- <string name="keycode" msgid="7335281375728356499">"કીકોડ"</string>
- <string name="icon" msgid="8732339849035837289">"આઇકન"</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="7058945779098711293">"ટાઇલ્સ ઉમેરવા માટે ખેંચો"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"દૂર કરવા માટે અહીં ખેંચો"</string>
<string name="qs_edit" msgid="2232596095725105230">"સંપાદિત કરો"</string>
@@ -670,19 +667,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> માંથી <xliff:g id="ID_1">%1$d</xliff:g> પૃષ્ઠ"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"લૉક સ્ક્રીન"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"વિસ્તૃત કરો"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"નાનું કરો"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"બંધ કરો"</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_left" msgid="6806490081187499505">"ડાબે"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"જમણે"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"શૉર્ટકટ કસ્ટમાઇઝ કરો"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"શૉર્ટકટ"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"પાસવર્ડ માટેનો સંકેત આપો"</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_screenshot" msgid="6314080179230000938">"સ્ક્રીનશૉટ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"સામાન્ય સંદેશા"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"સ્ટોરેજ"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"ઝટપટ ઍપ્લિકેશનો"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"ઝટપટ ઍપ્લિકેશનો માટે ઇન્સ્ટૉલેશનની જરૂર નથી."</string>
+ <string name="app_info" msgid="6856026610594615344">"ઍપ્લિકેશન માહિતી"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index dd9e4c9..27a5918 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"अब आपको ये नोटिफ़िकेशन नहीं मिलेंगे."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"इसके लिए <xliff:g id="APP">%s</xliff:g> नोटिफ़िकेशन"</string>
- <string name="min_importance" msgid="7559703098688382595">"निम्न"</string>
- <string name="low_importance" msgid="6891335321576225228">"मध्यम"</string>
- <string name="default_importance" msgid="6400766013567512061">"उच्च"</string>
- <string name="high_importance" msgid="730741630855788381">"अति आवश्यक"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"ध्वनि या दृश्य संबंधी कोई रुकावट नहीं"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"मौन रूप से दिखाएं"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"ध्वनि करें"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"ध्वनि करें और स्क्रीन पर दिखाएं"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">इस ऐप की <xliff:g id="NUMBER_1">%d</xliff:g> श्रेणियों में से 1</item>
+ <item quantity="other">इस ऐप की <xliff:g id="NUMBER_1">%d</xliff:g> श्रेणियों में से 1</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"सभी श्रेणियां"</string>
<string name="notification_more_settings" msgid="816306283396553571">"और सेटिंग"</string>
<string name="notification_done" msgid="5279426047273930175">"हो गया"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"बाएं"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"दाएं"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"बटन प्रकार"</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="8748101184830239843">"मेनू / कीबोर्ड स्विचर"</item>
+ <item msgid="8802889973626281575">"कीबोर्ड स्विचर"</item>
<item msgid="8175437057325747277">"कोई नहीं"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"विभाजित (डिफ़ॉल्ट)"</item>
- <item msgid="6210279084134579668">"केंद्रित"</item>
- <item msgid="89143234390889289">"बायां-संरेखित"</item>
- <item msgid="7715533883382410603">"दायां-संरेखित"</item>
+ <item msgid="8077901629964902399">"सामान्य"</item>
+ <item msgid="8256205964297588988">"संक्षिप्त"</item>
+ <item msgid="8719936228094005878">"बाएं झुका हुआ"</item>
+ <item msgid="586019486955594690">"दाएं झुका हुआ"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"मेनू / कीबोर्ड स्विचर"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"कीबोर्ड स्विचर"</string>
<string name="save" msgid="2311877285724540644">"सहेजें"</string>
<string name="reset" msgid="2448168080964209908">"रीसेट करें"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"बटन की चौड़ाई समायोजित करें"</string>
<string name="clipboard" msgid="1313879395099896312">"क्लिपबोर्ड"</string>
<string name="accessibility_key" msgid="5701989859305675896">"कस्टम मार्गदर्शक बटन"</string>
- <string name="keycode" msgid="7335281375728356499">"कुंजी कोड"</string>
- <string name="icon" msgid="8732339849035837289">"आइकन"</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="7058945779098711293">"टाइलों को जोड़ने के लिए खींचें"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"निकालने के लिए यहां खींचें"</string>
<string name="qs_edit" msgid="2232596095725105230">"संपादित करें"</string>
@@ -670,19 +667,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"पेज <xliff:g id="ID_2">%2$d</xliff:g> में से <xliff:g id="ID_1">%1$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"लॉक स्क्रीन"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"विस्तृत करें"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"छोटा करें"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"बंद करें"</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_left" msgid="6806490081187499505">"बाएं"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"दाएं"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"शॉर्टकट कस्टमाइज़ करें"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"शॉर्टकट"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"पासवर्ड के लिए संकेत दें"</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_screenshot" msgid="6314080179230000938">"स्क्रीनशॉट"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"सामान्य संदेश"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"जगह"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"झटपट ऐप्स"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"झटपट ऐप्स के लिए इंस्टॉलेशन ज़रूरी नहीं है."</string>
+ <string name="app_info" msgid="6856026610594615344">"ऐप की जानकारी"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 2547a2c..7957f2c 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -518,15 +518,12 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Napredne kontrole obavijesti omogućuju vam da postavite razinu važnosti za obavijesti aplikacije od 0 do 5. \n\n"<b>"Razina 5"</b>" \n– prikaži na vrhu popisa obavijesti \n– dopusti prekide prikaza na cijelom zaslonu \n– uvijek dopusti brzi pregled \n\n"<b>"Razina 4"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– uvijek dopusti brzi pregled \n\n"<b>"Razina 3"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– nikad ne dopusti brzi pregled\n\n"<b>"Razina 2"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– nikad ne dopusti brzi pregled \n– nikad ne emitiraj zvuk ni vibraciju \n\n"<b>"Razina 1"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– nikad ne dopusti brzi pregled \n– nikad ne emitiraj zvuk ni vibraciju \n– ne prikazuj na zaključanom zaslonu i traci statusa \n– prikaži na dnu popisa obavijesti \n\n"<b>"Razina 0"</b>" \n– blokiraj sve obavijesti aplikacije"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Obavijesti"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Više nećete primati te obavijesti."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Obavijesti aplikacije <xliff:g id="APP">%s</xliff:g> za"</string>
- <string name="min_importance" msgid="7559703098688382595">"Niski"</string>
- <string name="low_importance" msgid="6891335321576225228">"Srednji"</string>
- <string name="default_importance" msgid="6400766013567512061">"Visoki"</string>
- <string name="high_importance" msgid="730741630855788381">"Hitni"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Bez zvučnog ili vizualnog ometanja"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Prikaži tiho"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Reproduciraj zvuk"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Reproduciraj zvuk i prikaži na zaslonu"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 od <xliff:g id="NUMBER_1">%d</xliff:g> kategorije iz ove aplikacije</item>
+ <item quantity="few">1 od <xliff:g id="NUMBER_1">%d</xliff:g> kategorije iz ove aplikacije</item>
+ <item quantity="other">1 od <xliff:g id="NUMBER_1">%d</xliff:g> kategorija iz ove aplikacije</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Sve kategorije"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Više postavki"</string>
<string name="notification_done" msgid="5279426047273930175">"Gotovo"</string>
<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>
@@ -600,30 +597,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Isključeno"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigacijska traka"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Izgled"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Lijevo"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Desno"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Vrsta gumba"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Vrsta dodatnog lijevog gumba"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Vrsta dodatnog desnog gumba"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(zadano)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Međuspremnik"</item>
<item msgid="5742013440802239414">"Kôd tipke"</item>
- <item msgid="8748101184830239843">"Izmjena izbornika/tipkovnice"</item>
+ <item msgid="8802889973626281575">"Izmjena tipkovnice"</item>
<item msgid="8175437057325747277">"Ništa"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Podijeljeno (zadano)"</item>
- <item msgid="6210279084134579668">"Centrirano"</item>
- <item msgid="89143234390889289">"Lijevo poravnanje"</item>
- <item msgid="7715533883382410603">"Desno poravnanje"</item>
+ <item msgid="8077901629964902399">"Uobičajen"</item>
+ <item msgid="8256205964297588988">"Kompaktan"</item>
+ <item msgid="8719936228094005878">"Pretežno slijeva"</item>
+ <item msgid="586019486955594690">"Pretežno zdesna"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Izmjena izbornika/tipkovnice"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Izmjena tipkovnice"</string>
<string name="save" msgid="2311877285724540644">"Spremi"</string>
<string name="reset" msgid="2448168080964209908">"Ponovo postavi"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Prilagodite širinu gumba"</string>
<string name="clipboard" msgid="1313879395099896312">"Međuspremnik"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Prilagođeni navigacijski gumb"</string>
- <string name="keycode" msgid="7335281375728356499">"Kôd tipke"</string>
- <string name="icon" msgid="8732339849035837289">"Ikona"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Lijevi kôd tipke"</string>
+ <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>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Povucite da biste dodali pločice"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Povucite ovdje za uklanjanje"</string>
<string name="qs_edit" msgid="2232596095725105230">"Uredi"</string>
@@ -672,19 +670,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Otvaranje postavki za <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Uređivanje redoslijeda postavki."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Stranica <xliff:g id="ID_1">%1$d</xliff:g> od <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Zaključan zaslon"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Proširivanje"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimiziraj"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Zatvori"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefon se zagrijava"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Neke su značajke ograničene dok se telefon hladi"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefon će se automatski pokušati ohladiti. Možete ga nastaviti koristiti, no mogao bi raditi sporije.\n\nKad se ohladi, radit će normalno."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Lijevo"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Desno"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Prilagodi prečac"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Prečac"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Upit za zaporku"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Lijevi prečac"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Desni prečac"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Lijevi prečac također otključava"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Desni prečac također otključava"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Ništa"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Pokreni aplikaciju <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Ostale aplikacije"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Krug"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Lijevo"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Desno"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Izbornik"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Upozorenja"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 0c12c9c..629867b 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Az értesítési beállítások révén 0-tól 5-ig állíthatja be a fontossági szintet az alkalmazás értesítéseinél. \n\n"<b>"5. szint"</b>" \n– Megjelenítés az értesítési lista tetején \n– Teljes képernyő megszakításának engedélyezése \n– Mindig felugrik \n\n"<b>"4. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Mindig felugrik \n\n"<b>"3. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Soha nem ugrik fel \n\n"<b>"2. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Soha nem ugrik fel \n– Soha nincs hangjelzés és rezgés \n\n"<b>"1. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Soha nem ugrik fel \n– Soha nincs hangjelzés vagy rezgés \n– Elrejtés a lezárási képernyőről és az állapotsávról \n– Megjelenítés az értesítési lista alján \n\n"<b>"0. szint"</b>" \n– Az alkalmazás összes értesítésének letiltása"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Értesítések"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Többé nem jelennek meg ezek az értesítések."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g>-értesítések"</string>
- <string name="min_importance" msgid="7559703098688382595">"Nem fontos"</string>
- <string name="low_importance" msgid="6891335321576225228">"Közepesen fontos"</string>
- <string name="default_importance" msgid="6400766013567512061">"Fontos"</string>
- <string name="high_importance" msgid="730741630855788381">"Sürgős"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Hangjelzés és vizuális megszakítás nélkül"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Megjelenítés hangjelzés nélkül"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Hangjelzés"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Hangjelzés és felugró értesítés a képernyőn"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 az alkalmazás <xliff:g id="NUMBER_1">%d</xliff:g> kategóriájából</item>
+ <item quantity="one">1 az alkalmazás <xliff:g id="NUMBER_0">%d</xliff:g> kategóriájából</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Minden kategória"</string>
<string name="notification_more_settings" msgid="816306283396553571">"További beállítások"</string>
<string name="notification_done" msgid="5279426047273930175">"Kész"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Ki"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigációs sáv"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Elrendezés"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Balra"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Jobbra"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Gombtípus"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"További bal oldali gombtípus"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"További jobb oldali gombtípus"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(alapértelmezett)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Vágólap"</item>
<item msgid="5742013440802239414">"Billentyűkód"</item>
- <item msgid="8748101184830239843">"Menü/Billentyűzetváltó"</item>
+ <item msgid="8802889973626281575">"Billentyűzetváltó"</item>
<item msgid="8175437057325747277">"Nincs"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Osztott (alapértelmezett)"</item>
- <item msgid="6210279084134579668">"Középre igazított"</item>
- <item msgid="89143234390889289">"Balra igazított"</item>
- <item msgid="7715533883382410603">"Jobbra igazított"</item>
+ <item msgid="8077901629964902399">"Normál"</item>
+ <item msgid="8256205964297588988">"Kompakt"</item>
+ <item msgid="8719936228094005878">"Bal oldali"</item>
+ <item msgid="586019486955594690">"Jobb oldali"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menü/Billentyűzetváltó"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Billentyűzetváltó"</string>
<string name="save" msgid="2311877285724540644">"Mentés"</string>
<string name="reset" msgid="2448168080964209908">"Alaphelyzet"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Gombszélesség beállítása"</string>
<string name="clipboard" msgid="1313879395099896312">"Vágólap"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Személyre szabott navigációs gomb"</string>
- <string name="keycode" msgid="7335281375728356499">"Billentyűkód"</string>
- <string name="icon" msgid="8732339849035837289">"Ikon"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Bal oldali billentyűkód"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Jobb oldali billentyűkód"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Bal oldali ikon"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Jobb oldali ikon"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Húzza csempe hozzáadásához"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Húzza ide az eltávolításhoz"</string>
<string name="qs_edit" msgid="2232596095725105230">"Szerkesztés"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"A(z) <xliff:g id="ID_1">%s</xliff:g> beállításainak megnyitása."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Beállítások sorrendjének szerkesztése."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_1">%1$d</xliff:g>. oldal, összesen: <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Lezárási képernyő"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Kibontás"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Kis méret"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Bezárás"</string>
<string name="high_temp_title" msgid="4589508026407318374">"A telefon melegszik"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Bizonyos funkciók korlátozottan működnek a telefon hűlése közben"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"A telefon automatikusan megpróbál lehűlni. Továbbra is tudja használni a telefont, de elképzelhető, hogy működése lelassul.\n\nAmint a telefon lehűl, újra a szokásos módon működik majd."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Balra"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Jobbra"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Billentyűparancs személyre szabása"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Billentyűparancs"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Jelszókérés"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Bal oldali parancsikon"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Jobb oldali parancsikon"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"A bal oldali parancsikon szintén feloldja a zárolást"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"A jobb oldali parancsikon szintén feloldja a zárolást"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Nincs"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"A(z) <xliff:g id="APP">%1$s</xliff:g> alkalmazás indítása"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Egyéb alkalmazások"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Kör"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plusz"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Mínusz"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Bal"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Jobb"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menü"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> alkalmazás"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Értesítések"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index de8abfc..f090714 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"Այս ծանուցումներն այլևս չեք ստանա։"</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> ծանուցումներ հետևյալ ալիքի համար"</string>
- <string name="min_importance" msgid="7559703098688382595">"Ցածր"</string>
- <string name="low_importance" msgid="6891335321576225228">"Միջին"</string>
- <string name="default_importance" msgid="6400766013567512061">"Բարձր"</string>
- <string name="high_importance" msgid="730741630855788381">"Շտապ"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Առանց ձայնի և տեսողական ընդհատումների"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Ցույց տալ անձայն"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Ձայն հանել"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Ձայն հանել և ցուցադրել էկրանին"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 out of <xliff:g id="NUMBER_1">%d</xliff:g> categories from this app</item>
+ <item quantity="other">1 ալիք` այս հավելվածի <xliff:g id="NUMBER_1">%d</xliff:g> կատեգորիաներից</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Բոլոր կատեգորիաները"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Այլ կարգավորումներ"</string>
<string name="notification_done" msgid="5279426047273930175">"Պատրաստ է"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"Ձախ"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Աջ"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Կոճակի տեսակը"</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="8748101184830239843">"Ընտրացանկ/Ստեղնաշարի փոխարկիչ"</item>
+ <item msgid="8802889973626281575">"Ստեղնաշարի փոխարկիչ"</item>
<item msgid="8175437057325747277">"Չկան"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Բաժանված (կանխադրված)"</item>
- <item msgid="6210279084134579668">"Կենտրոնում"</item>
- <item msgid="89143234390889289">"Հավասարեցված ձախ"</item>
- <item msgid="7715533883382410603">"Հավասարեցված աջ"</item>
+ <item msgid="8077901629964902399">"Սովորական"</item>
+ <item msgid="8256205964297588988">"Սեղմ"</item>
+ <item msgid="8719936228094005878">"Ձախակողմյան"</item>
+ <item msgid="586019486955594690">"Աջակողմյան"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Ընտրացանկ/Ստեղնաշարի փոխարկիչ"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Ստեղնաշարի փոխարկիչ"</string>
<string name="save" msgid="2311877285724540644">"Պահել"</string>
<string name="reset" msgid="2448168080964209908">"Վերակայել"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Կարգավորել կոճակի լայնությունը"</string>
<string name="clipboard" msgid="1313879395099896312">"Սեղմատախտակ"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Հատուկ նավարկման կոճակ"</string>
- <string name="keycode" msgid="7335281375728356499">"Ստեղնային կոդ"</string>
- <string name="icon" msgid="8732339849035837289">"Պատկերակ"</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="7058945779098711293">"Քաշեք՝ սալիկներ ավելացնելու համար"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Քաշեք այստեղ՝ հեռացնելու համար"</string>
<string name="qs_edit" msgid="2232596095725105230">"Փոփոխել"</string>
@@ -670,19 +667,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Ծալել"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Փակել"</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">"Ձեր հեռախոսն ավտոմատ կերպով կփորձի hովանալ: Կարող եք շարունակել օգտագործել հեռախոսը, սակայն հնարավոր է, որ այն ավելի դանդաղ աշխատի:\n\nՀովանալուց հետո հեռախոսը կաշխատի կանոնավոր կերպով:"</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Ձախ"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Աջ"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Հարմարեցնել դյուրանցումը"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Դյուրանցում"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Պահանջել գաղտնաբառ"</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_screenshot" msgid="6314080179230000938">"Էկրանի պատկերներ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Ընդհանուր հաղորդագրություններ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Հիշողություն"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"Ակնթարթորեն գործարկվող հավելվածներ"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"Ակնթարթորեն գործարկվող հավելվածները տեղադրում չեն պահանջում։"</string>
+ <string name="app_info" msgid="6856026610594615344">"Հավելվածի տվյալներ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 2ccfd7c..12acc55 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -155,7 +155,7 @@
<string name="accessibility_cell_data" msgid="7080312242791850520">"Data Seluler"</string>
<string name="accessibility_cell_data_on" msgid="4310018593519761767">"Data Seluler Aktif"</string>
<string name="accessibility_cell_data_off" msgid="8000803571751407635">"Data Seluler Nonaktif"</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Penambatan bluetooth."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Tethering bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mode pesawat."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Tidak ada kartu SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Jaringan operator berubah."</string>
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Dengan kontrol notifikasi daya, Anda dapt menyetel level kepentingan notifikasi aplikasi dari 0 sampai 5. \n\n"<b>"Level 5"</b>" \n- Muncul di atas daftar notifikasi \n- Izinkan interupsi layar penuh \n- Selalu intip pesan \n\n"<b>"Level 4"</b>" \n- Jangan interupsi layar penuh \n- Selalu intip pesan \n\n"<b>"Level 3"</b>" \n- Jangan interupsi layar penuh \n- Tak pernah intip pesan \n\n"<b>"Level 2"</b>" \n- Jangan interupsi layar penuh \n- Tak pernah intip pesan \n- Tanpa suara dan getaran \n\n"<b>"Level 1"</b>" \n- Jangan interupsi layar penuh \n- Tak pernah intip pesan \n- Tanpa suara atau getaran \n- Sembunyikan dari layar kunci dan bilah status \n- Muncul di bawah daftar notifikasi \n\n"<b>"Level 0"</b>" \n- Blokir semua notifikasi dari aplikasi"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notifikasi"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Anda tidak akan mendapatkan notifikasi ini lagi."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Notifikasi <xliff:g id="APP">%s</xliff:g> untuk"</string>
- <string name="min_importance" msgid="7559703098688382595">"Rendah"</string>
- <string name="low_importance" msgid="6891335321576225228">"Sedang"</string>
- <string name="default_importance" msgid="6400766013567512061">"Tinggi"</string>
- <string name="high_importance" msgid="730741630855788381">"Penting"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Tidak ada gangguan suara atau visual"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Tampilkan secara diam-diam"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Buat suara"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Buat suara dan munculkan di layar"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 dari <xliff:g id="NUMBER_1">%d</xliff:g> kategori dari aplikasi ini</item>
+ <item quantity="one">1 dari <xliff:g id="NUMBER_0">%d</xliff:g> kategori dari aplikasi ini</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Semua Kategori"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Setelan lainnya"</string>
<string name="notification_done" msgid="5279426047273930175">"Selesai"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Nonaktif"</string>
<string name="nav_bar" msgid="1993221402773877607">"Bilah navigasi"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Tata Letak"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Kiri"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Kanan"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Jenis tombol"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Jenis tombol ekstra kiri"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Jenis tombol ekstra kanan"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(default)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Papan klip"</item>
<item msgid="5742013440802239414">"Kode tombol"</item>
- <item msgid="8748101184830239843">"Pengalih Menu / Keyboard"</item>
+ <item msgid="8802889973626281575">"Pengalih keyboard"</item>
<item msgid="8175437057325747277">"Tidak Ada"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Terbagi (default)"</item>
- <item msgid="6210279084134579668">"Tengah"</item>
- <item msgid="89143234390889289">"Rata-kiri"</item>
- <item msgid="7715533883382410603">"Rata-kanan"</item>
+ <item msgid="8077901629964902399">"Biasa"</item>
+ <item msgid="8256205964297588988">"Rapat"</item>
+ <item msgid="8719936228094005878">"Condong ke kiri"</item>
+ <item msgid="586019486955594690">"Condong ke kanan"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Pengalih Menu / Keyboard"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Pengalih keyboard"</string>
<string name="save" msgid="2311877285724540644">"Simpan"</string>
<string name="reset" msgid="2448168080964209908">"Setel ulang"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Sesuaikan lebar tombol"</string>
<string name="clipboard" msgid="1313879395099896312">"Papan klip"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Tombol navigasi khusus"</string>
- <string name="keycode" msgid="7335281375728356499">"Kode tombol"</string>
- <string name="icon" msgid="8732339849035837289">"Ikon"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Kode tombol kiri"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Kode tombol kanan"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Ikon kiri"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Ikon kanan"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Seret untuk menambahkan ubin"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Seret ke sini untuk menghapus"</string>
<string name="qs_edit" msgid="2232596095725105230">"Edit"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Buka setelan <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Edit urutan setelan."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Halaman <xliff:g id="ID_1">%1$d</xliff:g> dari <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Layar kunci"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Luaskan"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimalkan"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Tutup"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Ponsel menjadi hangat"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Beberapa fitur dibatasi saat ponsel mendingin"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Ponsel akan otomatis mencoba mendingin. Anda tetap dapat menggunakan ponsel, tetapi mungkin berjalan lebih lambat.\n\nSetelah dingin, ponsel akan berjalan seperti biasa."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Kiri"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Kanan"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Sesuaikan pintasan"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Pintasan"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Minta sandi"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Pintasan kiri"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Pintasan kanan"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Pintasan kiri juga membuka kunci"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Pintasan kanan juga membuka kunci"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Tidak Ada"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Luncurkan <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Aplikasi lainnya"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Lingkaran"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Kiri"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Kanan"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Aplikasi <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Notifikasi"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 6bde28d..a355771 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Með orkutilkynningastýringum geturðu stillt mikilvægi frá 0 upp í 5 fyrir tilkynningar forrita. \n\n"<b>"Stig 5"</b>" \n- Sýna efst á tilkynningalista \n- Leyfa truflun þegar birt er á öllum skjánum \n- Kíkja alltaf \n\n"<b>"Stig 4"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja alltaf \n\n"<b>"Stig 3"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja aldrei \n\n"<b>"Stig 2"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja aldrei \n- Slökkva á hljóði og titringi \n\n"<b>"Stig 1"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja aldrei \n- Slökkva á hljóði og titringi \n- Fela á lásskjá og stöðustiku \n- Sýna neðst á tilkynningalista \n\n"<b>"Stig 0"</b>" \n- Setja allar tilkynningar frá forriti á bannlista"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Tilkynningar"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Þú færð þessar tilkynningar ekki framar."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Tilkynningar frá <xliff:g id="APP">%s</xliff:g> fyrir"</string>
- <string name="min_importance" msgid="7559703098688382595">"Ekki mikilvægt"</string>
- <string name="low_importance" msgid="6891335321576225228">"Í meðallagi"</string>
- <string name="default_importance" msgid="6400766013567512061">"Mikilvægt"</string>
- <string name="high_importance" msgid="730741630855788381">"Áríðandi"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Ekkert hljóð eða sjónræn truflun"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Sýna án hljóðs"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Spila hljóð"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Spila hljóð og birta sprettitilkynningu"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">Einn af <xliff:g id="NUMBER_1">%d</xliff:g> flokki í þessu forriti</item>
+ <item quantity="other">Einn af <xliff:g id="NUMBER_1">%d</xliff:g> flokkum í þessu forriti</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Allir flokkar"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Fleiri stillingar"</string>
<string name="notification_done" msgid="5279426047273930175">"Lokið"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Slökkt"</string>
<string name="nav_bar" msgid="1993221402773877607">"Yfirlitsstika"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Útlit"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Vinstri"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Hægri"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Gerð hnapps"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Gerð aukahnapps til vinstri"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Gerð aukahnapps til hægri"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(sjálfgefið)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Klippiborð"</item>
<item msgid="5742013440802239414">"Lykilkóði"</item>
- <item msgid="8748101184830239843">"Valmynd / lyklaborðsval"</item>
+ <item msgid="8802889973626281575">"Lyklaborðsval"</item>
<item msgid="8175437057325747277">"Ekkert"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Skipt (sjálfgefið)"</item>
- <item msgid="6210279084134579668">"Miðjað"</item>
- <item msgid="89143234390889289">"Vinstrijafnað"</item>
- <item msgid="7715533883382410603">"Hægrijafnað"</item>
+ <item msgid="8077901629964902399">"Venjulegt"</item>
+ <item msgid="8256205964297588988">"Þjappað"</item>
+ <item msgid="8719936228094005878">"Hallar til vinstri"</item>
+ <item msgid="586019486955594690">"Hallar til hægri"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Valmynd / lyklaborðsval"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Lyklaborðsval"</string>
<string name="save" msgid="2311877285724540644">"Vista"</string>
<string name="reset" msgid="2448168080964209908">"Endurstilla"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Breyta breidd hnapps"</string>
<string name="clipboard" msgid="1313879395099896312">"Klippiborð"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Sérsniðinn flettingahnappur"</string>
- <string name="keycode" msgid="7335281375728356499">"Lykilkóði"</string>
- <string name="icon" msgid="8732339849035837289">"Tákn"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Lykilkóði til vinstri"</string>
+ <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_remove_tiles" msgid="3361212377437088062">"Dragðu hingað til að fjarlægja"</string>
<string name="qs_edit" msgid="2232596095725105230">"Breyta"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Opna <xliff:g id="ID_1">%s</xliff:g> stillingar."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Breyta röð stillinga."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Blaðsíða <xliff:g id="ID_1">%1$d</xliff:g> af <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Lásskjár"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Stækka"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minnka"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Loka"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Síminn er að hitna"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Sumir eiginleikar eru takmarkaðir þegar síminn kælir sig"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Síminn reynir sjálfkrafa að kæla sig. Þú getur enn notað símann en hann gæti verið hægvirkari.\n\nEftir að síminn hefur kælt sig niður virkar hann eðlilega."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Vinstri"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Hægri"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Sérstilla flýtilykil"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Flýtilykill"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Beiðni um aðgangsorð"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Flýtilykill til vinstri"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Flýtilykill til hægri"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Flýtilykill til vinstri opnar einnig"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Flýtilykill til hægri opnar einnig"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Ekkert"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Ræsa <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Önnur forrit"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Hringur"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plúsmerki"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Mínus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Vinstri"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Hægri"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Valmynd"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Forritið <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Tilkynningar"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index e9f560a..be648e7 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -518,15 +518,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"I controlli di gestione delle notifiche ti consentono di impostare un livello di importanza compreso tra 0 e 5 per le notifiche di un\'app. \n\n"<b>"Livello 5"</b>" \n- Mostra in cima all\'elenco di notifiche \n- Consenti l\'interruzione a schermo intero \n- Visualizza sempre \n\n"<b>"Livello 4"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Visualizza sempre \n\n"<b>"Livello 3"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Non visualizzare mai \n\n"<b>"Livello 2"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Non visualizzare mai \n- Non emettere mai suoni e vibrazioni \n\n"<b>"Livello 1"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Non visualizzare mai \n- Non emettere mai suoni e vibrazioni \n- Nascondi da schermata di blocco e barra di stato \n- Mostra in fondo all\'elenco di notifiche \n\n"<b>"Livello 0"</b>" \n- Blocca tutte le notifiche dell\'app"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notifiche"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Non riceverai più queste notifiche."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Notifiche di <xliff:g id="APP">%s</xliff:g> per"</string>
- <string name="min_importance" msgid="7559703098688382595">"Bassa"</string>
- <string name="low_importance" msgid="6891335321576225228">"Media"</string>
- <string name="default_importance" msgid="6400766013567512061">"Alta"</string>
- <string name="high_importance" msgid="730741630855788381">"Urgente"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Senza suoneria o interruzione visiva"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Mostra silenziosamente"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Con suoneria"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Con suoneria e visualizzazione sullo schermo"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 categoria su <xliff:g id="NUMBER_1">%d</xliff:g> di questa app</item>
+ <item quantity="one">1 categoria su <xliff:g id="NUMBER_0">%d</xliff:g> di questa app</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Tutte le categorie"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Altre impostazioni"</string>
<string name="notification_done" msgid="5279426047273930175">"Fine"</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>
@@ -600,30 +596,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Off"</string>
<string name="nav_bar" msgid="1993221402773877607">"Barra di navigazione"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Layout"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Sinistra"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Destra"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Tipo di pulsante"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Tipo di pulsante extra sinistra"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Tipo di pulsante extra destra"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(predefinito)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Appunti"</item>
<item msgid="5742013440802239414">"Keycode"</item>
- <item msgid="8748101184830239843">"Selettore menu/tastiera"</item>
+ <item msgid="8802889973626281575">"Selettore tastiera"</item>
<item msgid="8175437057325747277">"Nessuno"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Diviso (predefinito)"</item>
- <item msgid="6210279084134579668">"Centrato"</item>
- <item msgid="89143234390889289">"Allineato a sinistra"</item>
- <item msgid="7715533883382410603">"Allineato a destra"</item>
+ <item msgid="8077901629964902399">"Normale"</item>
+ <item msgid="8256205964297588988">"Compatto"</item>
+ <item msgid="8719936228094005878">"Orientato a sinistra"</item>
+ <item msgid="586019486955594690">"Orientato a destra"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Selettore menu/tastiera"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Selettore tastiera"</string>
<string name="save" msgid="2311877285724540644">"Salva"</string>
<string name="reset" msgid="2448168080964209908">"Reimposta"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Modifica la larghezza del pulsante"</string>
<string name="clipboard" msgid="1313879395099896312">"Appunti"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Pulsante di navigazione personalizzato"</string>
- <string name="keycode" msgid="7335281375728356499">"Keycode"</string>
- <string name="icon" msgid="8732339849035837289">"Icona"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Keycode sinistra"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Keycode destra"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Icona sinistra"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Icona destra"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Trascina per aggiungere le funzioni"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Trascina qui per rimuovere"</string>
<string name="qs_edit" msgid="2232596095725105230">"Modifica"</string>
@@ -672,19 +669,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Apri le impostazioni <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Modifica l\'ordine delle impostazioni."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Pagina <xliff:g id="ID_1">%1$d</xliff:g> di <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Schermata di blocco"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Espandi"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Riduci a icona"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Chiudi"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Il telefono si sta scaldando"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Alcune funzioni limitate durante il raffreddamento del telefono"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Il telefono cercherà automaticamente di raffreddarsi. Puoi comunque usarlo, ma potrebbe essere più lento.\n\nUna volta raffreddato, il telefono funzionerà normalmente."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Sinistra"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Destra"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Personalizza scorciatoia"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Scorciatoia"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Richiedi password"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Scorciatoia sinistra"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Scorciatoia destra"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Anche la scorciatoia sinistra consente di sbloccare"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Anche la scorciatoia destra consente di sbloccare"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Nessuna"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Avvia <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Altre app"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Cerchio"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Più"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Meno"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Sinistra"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Destra"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"App <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Avvisi"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 246f46d..d20d590 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -520,15 +520,13 @@
<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="5805874247999578073">"לא תקבל את ההודעות האלה יותר."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"הודעות <xliff:g id="APP">%s</xliff:g> עבור"</string>
- <string name="min_importance" msgid="7559703098688382595">"נמוכה"</string>
- <string name="low_importance" msgid="6891335321576225228">"בינונית"</string>
- <string name="default_importance" msgid="6400766013567512061">"גבוהה"</string>
- <string name="high_importance" msgid="730741630855788381">"דחופה"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"ללא צליל וללא הפרעה ויזואלית"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"הצג ללא צליל"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"השמע צליל"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"השמע צליל והצג במסך"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="two">1 מתוך <xliff:g id="NUMBER_1">%d</xliff:g> קטגוריות מאפליקציה זו</item>
+ <item quantity="many">1 מתוך <xliff:g id="NUMBER_1">%d</xliff:g> קטגוריות מאפליקציה זו</item>
+ <item quantity="other">1 מתוך <xliff:g id="NUMBER_1">%d</xliff:g> קטגוריות מאפליקציה זו</item>
+ <item quantity="one">1 קטגוריה מתוך <xliff:g id="NUMBER_0">%d</xliff:g> מאפליקציה זו</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"כל הקטגוריות"</string>
<string name="notification_more_settings" msgid="816306283396553571">"הגדרות נוספות"</string>
<string name="notification_done" msgid="5279426047273930175">"סיום"</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>
@@ -602,30 +600,31 @@
<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="nav_bar_left" msgid="731491280511316123">"צד שמאל"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"צד ימין"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"סוג לחצן"</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="8748101184830239843">"מחליף תפריט / מקלדת"</item>
+ <item msgid="8802889973626281575">"מחליף מקלדת"</item>
<item msgid="8175437057325747277">"ללא"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"מחולק (ברירת מחדל)"</item>
- <item msgid="6210279084134579668">"ממורכז"</item>
- <item msgid="89143234390889289">"מיושר לשמאל"</item>
- <item msgid="7715533883382410603">"מיושר לימין"</item>
+ <item msgid="8077901629964902399">"רגילה"</item>
+ <item msgid="8256205964297588988">"קומפקטית"</item>
+ <item msgid="8719936228094005878">"נטייה שמאלה"</item>
+ <item msgid="586019486955594690">"נטייה ימינה"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"מחליף תפריט / מקלדת"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"מחליף מקלדת"</string>
<string name="save" msgid="2311877285724540644">"שמור"</string>
<string name="reset" msgid="2448168080964209908">"איפוס"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"שינוי של רוחב לחצן"</string>
<string name="clipboard" msgid="1313879395099896312">"לוח"</string>
<string name="accessibility_key" msgid="5701989859305675896">"לחצן לניווט מותאם אישית"</string>
- <string name="keycode" msgid="7335281375728356499">"קוד מפתח"</string>
- <string name="icon" msgid="8732339849035837289">"סמל"</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="7058945779098711293">"גרור כדי להוסיף משבצות"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"גרור לכאן כדי להסיר"</string>
<string name="qs_edit" msgid="2232596095725105230">"ערוך"</string>
@@ -674,19 +673,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"מזער"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"סגור"</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_left" msgid="6806490081187499505">"צד שמאל"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"צד ימין"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"התאם אישית את קיצור הדרך"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"קיצור דרך"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"בקש סיסמה"</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_screenshot" msgid="6314080179230000938">"צילומי מסך"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"הודעות כלליות"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"אחסון"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"אפליקציות אינסטנט"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"אפליקציות אינסטנט לא דורשות התקנה."</string>
+ <string name="app_info" msgid="6856026610594615344">"פרטי אפליקציה"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index addf67c..00405ac 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -518,15 +518,11 @@
<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="5805874247999578073">"今後、この通知は配信されません。"</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"「<xliff:g id="APP">%s</xliff:g>」からの通知"</string>
- <string name="min_importance" msgid="7559703098688382595">"低"</string>
- <string name="low_importance" msgid="6891335321576225228">"中"</string>
- <string name="default_importance" msgid="6400766013567512061">"高"</string>
- <string name="high_importance" msgid="730741630855788381">"緊急"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"音声や画面表示を使用しない"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"マナーモードで表示する"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"音声で知らせる"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"音声とポップアップで知らせる"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">このアプリのカテゴリ <xliff:g id="NUMBER_1">%d</xliff:g> 件中 1 件</item>
+ <item quantity="one">このアプリのカテゴリ <xliff:g id="NUMBER_0">%d</xliff:g> 件中 1 件</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"すべてのカテゴリ"</string>
<string name="notification_more_settings" msgid="816306283396553571">"詳細設定"</string>
<string name="notification_done" msgid="5279426047273930175">"完了"</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>
@@ -600,30 +596,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"OFF"</string>
<string name="nav_bar" msgid="1993221402773877607">"ナビゲーション バー"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"レイアウト"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"左"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"右"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"ボタンタイプ"</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="8748101184830239843">"メニューとキーボードの切り替え"</item>
+ <item msgid="8802889973626281575">"キーボードを切り替え"</item>
<item msgid="8175437057325747277">"なし"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"分割(デフォルト)"</item>
- <item msgid="6210279084134579668">"中央揃え"</item>
- <item msgid="89143234390889289">"左揃え"</item>
- <item msgid="7715533883382410603">"右揃え"</item>
+ <item msgid="8077901629964902399">"標準"</item>
+ <item msgid="8256205964297588988">"コンパクト"</item>
+ <item msgid="8719936228094005878">"左寄り"</item>
+ <item msgid="586019486955594690">"右寄り"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"メニューとキーボードの切り替え"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"キーボードを切り替え"</string>
<string name="save" msgid="2311877285724540644">"保存"</string>
<string name="reset" msgid="2448168080964209908">"リセット"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"ボタンの幅の調整"</string>
<string name="clipboard" msgid="1313879395099896312">"クリップボード"</string>
<string name="accessibility_key" msgid="5701989859305675896">"カスタム ナビゲーション ボタン"</string>
- <string name="keycode" msgid="7335281375728356499">"キーコード"</string>
- <string name="icon" msgid="8732339849035837289">"アイコン"</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="7058945779098711293">"タイルを追加するにはドラッグしてください"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"削除するにはここにドラッグ"</string>
<string name="qs_edit" msgid="2232596095725105230">"編集"</string>
@@ -672,19 +669,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"最小化"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"閉じる"</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_left" msgid="6806490081187499505">"左"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"右"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"ショートカットのカスタマイズ"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"ショートカット"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"パスワードの入力"</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_screenshot" msgid="6314080179230000938">"スクリーンショット"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"一般メッセージ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ストレージ"</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>
</resources>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index a939744..b5bc2408 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"ამ შეტყობინებებს აღარ მიიღებთ."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g>-ის შეტყობინებები"</string>
- <string name="min_importance" msgid="7559703098688382595">"დაბალი"</string>
- <string name="low_importance" msgid="6891335321576225228">"საშუალო"</string>
- <string name="default_importance" msgid="6400766013567512061">"მაღალი"</string>
- <string name="high_importance" msgid="730741630855788381">"სასწრაფო"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"ხმოვანი ან ვიზუალური შეფერხების გარეშე"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"უხმოდ ჩვენება"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"ხმის გამოცემა"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"ხმის გამოცემა და ეკრანზე გამოჩენა"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other"> ამ აპის <xliff:g id="NUMBER_1">%d</xliff:g> კატეგორიიდან 1</item>
+ <item quantity="one"> ამ აპის <xliff:g id="NUMBER_0">%d</xliff:g> კატეგორიიდან 1</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"ყველა კატეგორია"</string>
<string name="notification_more_settings" msgid="816306283396553571">"დამატებითი პარამეტრები"</string>
<string name="notification_done" msgid="5279426047273930175">"მზადაა"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"მარცხნივ"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"მარჯვნივ"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"ღილაკის ტიპი"</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="8748101184830239843">"მენიუს/კლავიატურის გადამრთველი"</item>
+ <item msgid="8802889973626281575">"კლავიატურის გადამრთველი"</item>
<item msgid="8175437057325747277">"არცერთი"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"გაყოფილი (ნაგულისხმევი)"</item>
- <item msgid="6210279084134579668">"ცენტრში"</item>
- <item msgid="89143234390889289">"მარცხენა სწორებით"</item>
- <item msgid="7715533883382410603">"მარჯვენა სწორებით"</item>
+ <item msgid="8077901629964902399">"ჩვეულებრივი"</item>
+ <item msgid="8256205964297588988">"კომპაქტური"</item>
+ <item msgid="8719936228094005878">"მარცხნივ გადახრილი"</item>
+ <item msgid="586019486955594690">"მარჯვნივ გადახრილი"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"მენიუს/კლავიატურის გადამრთველი"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"კლავიატურის გადამრთველი"</string>
<string name="save" msgid="2311877285724540644">"შენახვა"</string>
<string name="reset" msgid="2448168080964209908">"საწყისზე დაბრუნება"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"ღილაკის სიგანის კორექტირება"</string>
<string name="clipboard" msgid="1313879395099896312">"გაცვლის ბუფერი"</string>
<string name="accessibility_key" msgid="5701989859305675896">"ნავიგაციის მორგებული ღილაკი"</string>
- <string name="keycode" msgid="7335281375728356499">"კლავიშის კოდი"</string>
- <string name="icon" msgid="8732339849035837289">"ხატულა"</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="7058945779098711293">"ფილების დასამატებლად, გადაიტანეთ ჩავლებით"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"ამოსაშლელად, ჩავლებით გადმოიტანეთ აქ"</string>
<string name="qs_edit" msgid="2232596095725105230">"რედაქტირება"</string>
@@ -670,19 +667,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"ჩაკეცვა"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"დახურვა"</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_left" msgid="6806490081187499505">"მარცხნივ"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"მარჯვნივ"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"მალსახმობის მორგება"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"მალსახმობი"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"პაროლის მოთხოვნა"</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_screenshot" msgid="6314080179230000938">"ეკრანის ანაბეჭდები"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"ზოგადი შეტყობინებები"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"მეხსიერება"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"მყისიერი აპები"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"მყისიერი აპები ინსტალაციას არ საჭიროებს."</string>
+ <string name="app_info" msgid="6856026610594615344">"აპის შესახებ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index c0bf680..3e5fe2d 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"Сізге енді бұл хабарландырулар жіберілмейді."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> хабарландырулары"</string>
- <string name="min_importance" msgid="7559703098688382595">"Төмен"</string>
- <string name="low_importance" msgid="6891335321576225228">"Орташа"</string>
- <string name="default_importance" msgid="6400766013567512061">"Жоғары"</string>
- <string name="high_importance" msgid="730741630855788381">"Шұғыл"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Дыбыссыз және визуалдық кедергісіз"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Дыбыссыз көрсету"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Дыбыстық сигнал беру"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Дыбыстық сигнал беру және экранға шығару"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">Осы қолданбадағы <xliff:g id="NUMBER_1">%d</xliff:g> санаттың 1-і</item>
+ <item quantity="one">Осы қолданбадағы <xliff:g id="NUMBER_0">%d</xliff:g> санаттың 1-і</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Барлық санаттар"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Қосымша параметрлер"</string>
<string name="notification_done" msgid="5279426047273930175">"Дайын"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"Сол жақ"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Оң жақ"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Түйме түрі"</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="8748101184830239843">"Мәзір/пернетақта ауыстырғышы"</item>
+ <item msgid="8802889973626281575">"Пернетақта ауыстырғышы"</item>
<item msgid="8175437057325747277">"Ешқандай"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Бөлінген (әдепкі)"</item>
- <item msgid="6210279084134579668">"Ортасына тураланған"</item>
- <item msgid="89143234390889289">"Сол жағына тураланған"</item>
- <item msgid="7715533883382410603">"Оң жағына тураланған"</item>
+ <item msgid="8077901629964902399">"Орташа"</item>
+ <item msgid="8256205964297588988">"Жинақы"</item>
+ <item msgid="8719936228094005878">"Сол жақтан"</item>
+ <item msgid="586019486955594690">"Оң жақтан"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Мәзір/пернетақта ауыстырғышы"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Пернетақта ауыстырғышы"</string>
<string name="save" msgid="2311877285724540644">"Сақтау"</string>
<string name="reset" msgid="2448168080964209908">"Қайта реттеу"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Түйме енін реттеу"</string>
<string name="clipboard" msgid="1313879395099896312">"Буфер"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Арнаулы шарлау түймесі"</string>
- <string name="keycode" msgid="7335281375728356499">"Кілт коды"</string>
- <string name="icon" msgid="8732339849035837289">"Белгіше"</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="7058945779098711293">"Қажеттерін сүйреп қойыңыз"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Керексіздерін осы жерге сүйреңіз"</string>
<string name="qs_edit" msgid="2232596095725105230">"Өңдеу"</string>
@@ -670,19 +667,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> ішінен <xliff:g id="ID_1">%1$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Құлыпталған экран"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Жаю"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Кішірейту"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Жабу"</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_left" msgid="6806490081187499505">"Сол жақ"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Оң жақ"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Таңбашаны реттеу"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Таңбаша"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Құпия сөзді сұрау"</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">"Mәзір"</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_screenshot" msgid="6314080179230000938">"Скриншоттар"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Жалпы хабарлар"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Жад"</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>
</resources>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 88ad6d8..4856e3c 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"អ្នកនឹងមិនទទួលបានការជូនដំណឹងទាំងនេះទៀតទេ។"</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"ការជូនដំណឹងរបស់ <xliff:g id="APP">%s</xliff:g> សម្រាប់"</string>
- <string name="min_importance" msgid="7559703098688382595">"ទាប"</string>
- <string name="low_importance" msgid="6891335321576225228">"មធ្យម"</string>
- <string name="default_importance" msgid="6400766013567512061">"ខ្ពស់"</string>
- <string name="high_importance" msgid="730741630855788381">"បន្ទាន់"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"គ្មានសំឡេង ឬការរំខានដល់ការមើលឡើយ"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"បង្ហាញស្ងាត់ៗ"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"បន្លឺសំឡេង"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"បន្លឺសំឡេង និងលេចឡើងនៅលើអេក្រង់"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">ប្រភេទ 1 ក្នុងចំណោមប្រភេទ <xliff:g id="NUMBER_1">%d</xliff:g> ពីកម្មវិធីនេះ</item>
+ <item quantity="one">ប្រភេទ 1 ក្នុងចំណោមប្រភេទ <xliff:g id="NUMBER_0">%d</xliff:g> ពីកម្មវិធីនេះ</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"ប្រភេទទាំងអស់"</string>
<string name="notification_more_settings" msgid="816306283396553571">"ការកំណត់ច្រើនទៀត"</string>
<string name="notification_done" msgid="5279426047273930175">"រួចរាល់"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"ឆ្វេង"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"ស្ដាំ"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"ប្រភេទប៊ូតុង"</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="8748101184830239843">"ម៉ឺនុយ / កម្មវិធីប្តូរក្តារចុច"</item>
+ <item msgid="8802889973626281575">"កម្មវិធីប្តូរក្តារចុច"</item>
<item msgid="8175437057325747277">"គ្មាន"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"បំបែក (លំនាំដើម)"</item>
- <item msgid="6210279084134579668">"ដាក់នៅកណ្តាល"</item>
- <item msgid="89143234390889289">"តម្រឹមឆ្វេង"</item>
- <item msgid="7715533883382410603">"តម្រឹមស្ដាំ"</item>
+ <item msgid="8077901629964902399">"ធម្មតា"</item>
+ <item msgid="8256205964297588988">"តូច"</item>
+ <item msgid="8719936228094005878">"ផ្អៀងទៅឆ្វេង"</item>
+ <item msgid="586019486955594690">"ផ្អៀងទៅស្តាំ"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"កម្មវិធីប្តូរក្តារចុច / ម៉ឺនុយ"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"កម្មវិធីប្តូរក្តារចុច"</string>
<string name="save" msgid="2311877285724540644">"រក្សាទុក"</string>
<string name="reset" msgid="2448168080964209908">"កំណត់ឡើងវិញ"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"កែសម្រួលទទឹងប៊ូតុង"</string>
<string name="clipboard" msgid="1313879395099896312">"ក្ដារតម្បៀតខ្ទាស់"</string>
<string name="accessibility_key" msgid="5701989859305675896">"ប៊ូតុងរុករកផ្ទាល់ខ្លួន"</string>
- <string name="keycode" msgid="7335281375728356499">"លេខកូដគ្រាប់ចុច"</string>
- <string name="icon" msgid="8732339849035837289">"រូបតំណាង"</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="7058945779098711293">"អូសដើម្បីបន្ថែមប្រអប់"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"អូសទីនេះដើម្បីយកចេញ"</string>
<string name="qs_edit" msgid="2232596095725105230">"កែសម្រួល"</string>
@@ -670,19 +667,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"បង្រួម"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"បិទ"</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_left" msgid="6806490081187499505">"ឆ្វេង"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"ស្ដាំ"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"ប្ដូរផ្លូវកាត់តាមបំណង"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"ផ្លូវកាត់"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"ជំរុញឲ្យបញ្ចូលពាក្យសម្ងាត់"</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_screenshot" msgid="6314080179230000938">"រូបថតអេក្រង់"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"សារទូទៅ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ទំហំផ្ទុក"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"កម្មវិធីប្រើភ្លាមៗ"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"កម្មវិធីប្រើភ្លាមៗមិនតម្រូវឲ្យមានការដំឡើងទេ។"</string>
+ <string name="app_info" msgid="6856026610594615344">"ព័ត៌មានកម្មវិធី"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 79c5695..65b89b8 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -83,8 +83,7 @@
<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 />
+ <string name="accessibility_accessibility_button" msgid="7601252764577607915">"ಪ್ರವೇಶಿಸುವಿಕೆ"</string>
<string name="accessibility_recent" msgid="5208608566793607626">"ಸಮಗ್ರ ನೋಟ"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"ಹುಡುಕಿ"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"ಕ್ಯಾಮರಾ"</string>
@@ -517,15 +516,11 @@
<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="5805874247999578073">"ನೀವು ಇನ್ನು ಮುಂದೆ ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಪಡೆಯುವುದಿಲ್ಲ."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"ಇದಕ್ಕೆ <xliff:g id="APP">%s</xliff:g> ಅಧಿಸೂಚನೆಗಳಿಗೆ"</string>
- <string name="min_importance" msgid="7559703098688382595">"ಕಡಿಮೆ"</string>
- <string name="low_importance" msgid="6891335321576225228">"ಮಧ್ಯಮ"</string>
- <string name="default_importance" msgid="6400766013567512061">"ಅಧಿಕ"</string>
- <string name="high_importance" msgid="730741630855788381">"ತುರ್ತು"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"ಯಾವುದೇ ಧ್ವನಿ ಅಥವಾ ದೃಶ್ಯ ಅಡಚಣೆಗಳಿಲ್ಲ"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"ಮೌನವಾಗಿ ತೋರಿಸಿ"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"ಧ್ವನಿ ಮಾಡಿ"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"ಪರದೆಯ ಮೇಲೆ ಧ್ವನಿಮಾಡಿ ಮತ್ತು ಪಾಪ್ ಮಾಡಿ"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">ಈ ಅಪ್ಲಿಕೇಶನ್ನಿಂದ <xliff:g id="NUMBER_1">%d</xliff:g> ವರ್ಗಗಳಲ್ಲಿ 1</item>
+ <item quantity="other">ಈ ಅಪ್ಲಿಕೇಶನ್ನಿಂದ <xliff:g id="NUMBER_1">%d</xliff:g> ವರ್ಗಗಳಲ್ಲಿ 1</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"ಎಲ್ಲ ವರ್ಗಗಳು"</string>
<string name="notification_more_settings" msgid="816306283396553571">"ಹೆಚ್ಚಿನ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="notification_done" msgid="5279426047273930175">"ಮುಗಿದಿದೆ"</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>
@@ -599,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"ಎಡ"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"ಬಲ"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"ಬಟನ್ ವಿಧ"</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="8748101184830239843">"ಮೆನು / ಕೀಬೋರ್ಡ್ ಬದಲಾಯಿಸುವಿಕೆ"</item>
+ <item msgid="8802889973626281575">"ಕೀಬೋರ್ಡ್ ಬದಲಾಯಿಸುವಿಕೆ"</item>
<item msgid="8175437057325747277">"ಯಾವುದೂ ಅಲ್ಲ"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"ವಿಭಜಿಸಲಾಗಿದೆ (ಡಿಫಾಲ್ಟ್)"</item>
- <item msgid="6210279084134579668">"ಕೇಂದ್ರೀಕೃತ"</item>
- <item msgid="89143234390889289">"ಎಡಕ್ಕೆ ಹೊಂದಿಸಿರುವುದು"</item>
- <item msgid="7715533883382410603">"ಬಲಕ್ಕೆ ಹೊಂದಿಸಿರುವುದು"</item>
+ <item msgid="8077901629964902399">"ಸಾಮಾನ್ಯ"</item>
+ <item msgid="8256205964297588988">"ಕಾಂಪ್ಯಾಕ್ಟ್"</item>
+ <item msgid="8719936228094005878">"ಎಡ-ಬಾಗುವಿಕೆ"</item>
+ <item msgid="586019486955594690">"ಬಲ-ಬಾಗುವಿಕೆ"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"ಮೆನು / ಕೀಬೋರ್ಡ್ ಬದಲಾಯಿಸುವಿಕೆ"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"ಕೀಬೋರ್ಡ್ ಬದಲಾಯಿಸುವಿಕೆ"</string>
<string name="save" msgid="2311877285724540644">"ಉಳಿಸು"</string>
<string name="reset" msgid="2448168080964209908">"ಮರುಹೊಂದಿಸು"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"ಬಟನ್ ಅಳತೆ ಹೊಂದಿಸು"</string>
<string name="clipboard" msgid="1313879395099896312">"ಕ್ಲಿಪ್ಬೋರ್ಡ್"</string>
<string name="accessibility_key" msgid="5701989859305675896">"ಕಸ್ಟಮ್ ನ್ಯಾವಿಗೇಷನ್ ಬಟನ್"</string>
- <string name="keycode" msgid="7335281375728356499">"ಕೀಕೋಡ್"</string>
- <string name="icon" msgid="8732339849035837289">"ಐಕಾನ್"</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="7058945779098711293">"ಟೈಲ್ಗಳನ್ನು ಸೇರಿಸಲು ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"ತೆಗೆದುಹಾಕಲು ಇಲ್ಲಿ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>
<string name="qs_edit" msgid="2232596095725105230">"ಎಡಿಟ್"</string>
@@ -671,19 +667,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> ರಲ್ಲಿ <xliff:g id="ID_1">%1$d</xliff:g> ಪುಟ"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"ಲಾಕ್ ಪರದೆ"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"ವಿಸ್ತೃತಗೊಳಿಸು"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"ಕುಗ್ಗಿಸಿ"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"ಮುಚ್ಚಿ"</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_left" msgid="6806490081187499505">"ಎಡ"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"ಬಲ"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"ಶಾರ್ಟ್ಕಟ್ ಕಸ್ಟಮೈಸ್ ಮಾಡಿ"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"ಶಾರ್ಟ್ಕಟ್"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"ಪಾಸ್ವರ್ಡ್ ಕೇಳಿ"</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_screenshot" msgid="6314080179230000938">"ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳು"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"ಸಾಮಾನ್ಯ ಸಂದೇಶಗಳು"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ಸಂಗ್ರಹಣೆ"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"ತತ್ಕ್ಷಣ ಆಪ್ಗಳು"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"ತತ್ಕ್ಷಣ ಆಪ್ಗಳಿಗೆ ಸ್ಥಾಪನೆಯ ಅಗತ್ಯವಿಲ್ಲ."</string>
+ <string name="app_info" msgid="6856026610594615344">"ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index bc01b9e..9c277b0 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -518,15 +518,11 @@
<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="5805874247999578073">"더 이상 다음의 알림을 받지 않습니다."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"다음 채널의 <xliff:g id="APP">%s</xliff:g> 알림"</string>
- <string name="min_importance" msgid="7559703098688382595">"낮음"</string>
- <string name="low_importance" msgid="6891335321576225228">"중간"</string>
- <string name="default_importance" msgid="6400766013567512061">"높음"</string>
- <string name="high_importance" msgid="730741630855788381">"긴급"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"소리나 시각적인 방해 없음"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"조용히 표시"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"소리로 알림"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"소리 및 화면 표시로 알림"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">이 앱의 카테고리 <xliff:g id="NUMBER_1">%d</xliff:g>개 중 1개</item>
+ <item quantity="one">이 앱의 카테고리 <xliff:g id="NUMBER_0">%d</xliff:g>개 중 1개</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"전체 카테고리"</string>
<string name="notification_more_settings" msgid="816306283396553571">"설정 더보기"</string>
<string name="notification_done" msgid="5279426047273930175">"완료"</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>
@@ -600,30 +596,31 @@
<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="nav_bar_left" msgid="731491280511316123">"왼쪽"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"오른쪽"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"버튼 유형"</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="8748101184830239843">"메뉴/키보드 전환 도구"</item>
+ <item msgid="8802889973626281575">"키보드 전환 도구"</item>
<item msgid="8175437057325747277">"없음"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"분할(기본)"</item>
- <item msgid="6210279084134579668">"가운데 맞춤"</item>
- <item msgid="89143234390889289">"왼쪽 정렬됨"</item>
- <item msgid="7715533883382410603">"오른쪽 정렬됨"</item>
+ <item msgid="8077901629964902399">"보통"</item>
+ <item msgid="8256205964297588988">"작게"</item>
+ <item msgid="8719936228094005878">"왼쪽으로 기울기"</item>
+ <item msgid="586019486955594690">"오른쪽으로 기울기"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"메뉴/키보드 전환 도구"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"키보드 전환 도구"</string>
<string name="save" msgid="2311877285724540644">"저장"</string>
<string name="reset" msgid="2448168080964209908">"초기화"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"버튼 너비 조정"</string>
<string name="clipboard" msgid="1313879395099896312">"클립보드"</string>
<string name="accessibility_key" msgid="5701989859305675896">"맞춤 탐색 버튼"</string>
- <string name="keycode" msgid="7335281375728356499">"키 코드"</string>
- <string name="icon" msgid="8732339849035837289">"아이콘"</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="7058945779098711293">"드래그하여 타일 추가"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"삭제하려면 여기를 드래그"</string>
<string name="qs_edit" msgid="2232596095725105230">"수정"</string>
@@ -672,19 +669,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g>페이지 중 <xliff:g id="ID_1">%1$d</xliff:g>페이지"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"잠금 화면"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"펼치기"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"최소화"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"닫기"</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_left" msgid="6806490081187499505">"왼쪽"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"오른쪽"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"바로가기 맞춤설정"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"바로가기"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"비밀번호 요청"</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_screenshot" msgid="6314080179230000938">"스크린샷"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"일반 메시지"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"저장소"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"빠른 실행 앱"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"빠른 실행 앱은 설치가 필요하지 않습니다."</string>
+ <string name="app_info" msgid="6856026610594615344">"앱 정보"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index c1bc826..9080df8 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"Мындан ары бул эскертмелер сизге жөнөтүлбөйт."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> колдонмосунун төмөнкү каналга жөнөткөн эскертмелери"</string>
- <string name="min_importance" msgid="7559703098688382595">"Төмөн"</string>
- <string name="low_importance" msgid="6891335321576225228">"Орточо"</string>
- <string name="default_importance" msgid="6400766013567512061">"Жогору"</string>
- <string name="high_importance" msgid="730741630855788381">"Шашылыш"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Добуш да чыгарбасын, экранда да көрсөтүлбөсүн"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Үнсүз көрсөтүлсүн"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Добуш чыгарсын"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Добуш менен экранга калкып чыксын"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">Бул колдонмодогу <xliff:g id="NUMBER_1">%d</xliff:g> категориянын ичинен 1 категория</item>
+ <item quantity="one">Бул колдонмодогу <xliff:g id="NUMBER_0">%d</xliff:g> категориянын ичинен 1 категория</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Бардык категориялар"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Дагы жөндөөлөр"</string>
<string name="notification_done" msgid="5279426047273930175">"Бүттү"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"Сол жакта"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Оң жакта"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Баскычтын түрү"</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="8748101184830239843">"Меню / Баскычтоп которуштургуч"</item>
+ <item msgid="8802889973626281575">"Баскычтоп которуштургуч"</item>
<item msgid="8175437057325747277">"Эч бири"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Бөлүнгөн (демейки)"</item>
- <item msgid="6210279084134579668">"Так ортодо"</item>
- <item msgid="89143234390889289">"Солго тегизделген"</item>
- <item msgid="7715533883382410603">"Оңго тегизделген"</item>
+ <item msgid="8077901629964902399">"Кадимки"</item>
+ <item msgid="8256205964297588988">"Жыйнактуу"</item>
+ <item msgid="8719936228094005878">"Сол жакта"</item>
+ <item msgid="586019486955594690">"Оң жакта"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Меню / Баскычтоп которуштургуч"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Баскычтоп которуштургуч"</string>
<string name="save" msgid="2311877285724540644">"Сактоо"</string>
<string name="reset" msgid="2448168080964209908">"Баштапкы абалга келтирүү"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Баскычтын жазылыгын тууралоо"</string>
<string name="clipboard" msgid="1313879395099896312">"Алмашуу буфери"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Ыңгайлаштырылган чабыттоо баскычы"</string>
- <string name="keycode" msgid="7335281375728356499">"Баскыч коду"</string>
- <string name="icon" msgid="8732339849035837289">"Сүрөтчө"</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="7058945779098711293">"Керектүү нерселерди сүйрөп кошуңуз"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Алып салуу үчүн бул жерге сүйрөңүз"</string>
<string name="qs_edit" msgid="2232596095725105230">"Түзөтүү"</string>
@@ -670,19 +667,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> ичинен <xliff:g id="ID_1">%1$d</xliff:g>-бет"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Кулпуланган экран"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Жайып көрсөтүү"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Кичирейтүү"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Жабуу"</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_left" msgid="6806490081187499505">"Сол жакта"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Оң жакта"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Кыска жолду тууралоо"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Кыска жол"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Сырсөздү суроо"</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_screenshot" msgid="6314080179230000938">"Скриншоттор"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Жалпы билдирүүлөр"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Сактагыч"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"Ыкчам ачылуучу колдонмолор"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"Ыкчам ачылуучу колдонмолорду орнотуу талап кылынбайт."</string>
+ <string name="app_info" msgid="6856026610594615344">"Колдонмо тууралуу"</string>
</resources>
diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml
index c40797c..ca05240 100644
--- a/packages/SystemUI/res/values-land/dimens.xml
+++ b/packages/SystemUI/res/values-land/dimens.xml
@@ -19,9 +19,6 @@
<!-- thickness (width) of the navigation bar on phones that require it -->
<dimen name="navigation_bar_size">@*android:dimen/navigation_bar_width</dimen>
- <!-- Standard notification gravity -->
- <integer name="notification_panel_layout_gravity">@integer/standard_notification_panel_layout_gravity</integer>
-
<dimen name="docked_divider_handle_width">2dp</dimen>
<dimen name="docked_divider_handle_height">16dp</dimen>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 7111805..3ccbe92 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"ທ່ານຈະບໍ່ໄດ້ຮັບການແຈ້ງເຕືອນເຫຼົ່ານີ້ອີກຕໍ່ໄປ."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"ການແຈ້ງເຕືອນ <xliff:g id="APP">%s</xliff:g> ສຳລັບ"</string>
- <string name="min_importance" msgid="7559703098688382595">"ຕໍ່າ"</string>
- <string name="low_importance" msgid="6891335321576225228">"ປານກາງ"</string>
- <string name="default_importance" msgid="6400766013567512061">"ສູງ"</string>
- <string name="high_importance" msgid="730741630855788381">"ດ່ວນ"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"ບໍ່ມີສຽງ ຫຼື ການລົບກວນໃນໜ້າຈໍ"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"ສະແດງແບບງຽບໆ"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"ເຮັດສຽງ"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"ເຮັດສຽງດັງ ແລະ ສະແດງຂຶ້ນໃນໜ້າຈໍ"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 ຈາກທັງໝົດ <xliff:g id="NUMBER_1">%d</xliff:g> ໝວດໝູ່ຈາກແອັບນີ້</item>
+ <item quantity="one">1 ຈາກທັງໝົດ <xliff:g id="NUMBER_0">%d</xliff:g> ໝວດໝູ່ຈາກແອັບນີ້</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"ທຸກໝວດໝູ່"</string>
<string name="notification_more_settings" msgid="816306283396553571">"ການຕັ້ງຄ່າເພີ່ມເຕີມ"</string>
<string name="notification_done" msgid="5279426047273930175">"ສຳເລັດແລ້ວ"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"ຊ້າຍ"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"ຂວາ"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"ປະເພດປຸ່ມ"</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="8748101184830239843">"ຕົວປ່ຽນເມນູ / ແປ້ນພິມ"</item>
+ <item msgid="8802889973626281575">"ຕົວສະຫຼັບແປ້ນພິມ"</item>
<item msgid="8175437057325747277">"ບໍ່ໃຊ້"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"ແຍກກັນ (ຄ່າເລີ່ມຕົ້ນ)"</item>
- <item msgid="6210279084134579668">"ທາງກາງ"</item>
- <item msgid="89143234390889289">"ຮຽງຊ້າຍ"</item>
- <item msgid="7715533883382410603">"ຮຽງຂວາ"</item>
+ <item msgid="8077901629964902399">"ປົກກະຕິ"</item>
+ <item msgid="8256205964297588988">"ນ້ອຍ"</item>
+ <item msgid="8719936228094005878">"ອຽງຊ້າຍ"</item>
+ <item msgid="586019486955594690">"ອຽງຂວາ"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"ຕົວປ່ຽນເມນູ / ແປ້ນພິມ"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"ຕົວສະຫຼັບແປ້ນພິມ"</string>
<string name="save" msgid="2311877285724540644">"ບັນທຶກ"</string>
<string name="reset" msgid="2448168080964209908">"ຣີເຊັດ"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"ປັບຄວາມກວ້າງຂອງປຸ່ມ"</string>
<string name="clipboard" msgid="1313879395099896312">"ຄລິບບອດ"</string>
<string name="accessibility_key" msgid="5701989859305675896">"ປຸ່ມນຳທາງແບບກຳນົດເອງ"</string>
- <string name="keycode" msgid="7335281375728356499">"Keycode"</string>
- <string name="icon" msgid="8732339849035837289">"ໄອຄອນ"</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="7058945779098711293">"ລາກເພື່ອເພີ່ມໄອຄອນ"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"ລາກມາບ່ອນນີ້ເພື່ອລຶບອອກ"</string>
<string name="qs_edit" msgid="2232596095725105230">"ແກ້ໄຂ"</string>
@@ -670,19 +667,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"ຫຍໍ້"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"ປິດ"</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_left" msgid="6806490081187499505">"ຊ້າຍ"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"ຂວາ"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"ປັບແຕ່ງທາງລັດ"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"ທາງລັດ"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"ຖາມຫາລະຫັດຜ່ານ"</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_screenshot" msgid="6314080179230000938">"ຮູບຖ່າຍໜ້າຈໍ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"ຂໍ້ຄວາມທົ່ວໄປ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ບ່ອນເກັບຂໍ້ມູນ"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"ອິນສະແຕນແອັບ"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"ອິນສະແຕນແອັບບໍ່ຈຳເປັນຕ້ອງມີການຕິດຕັ້ງ."</string>
+ <string name="app_info" msgid="6856026610594615344">"ຂໍ້ມູນແອັບ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 57db34a..fa4ab0d 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -520,15 +520,13 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Naudodami pranešimų valdiklius galite nustatyti programos pranešimų svarbos lygį nuo 0 iki 5. \n\n"<b>"5 lygis"</b>" \n– Rodyti pranešimų sąrašo viršuje \n– Leisti pertraukti, kai veikia viso ekrano režimas \n– Visada rodyti pranešimus \n\n"<b>"4 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Visada rodyti pranešimus \n\n"<b>"3 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Niekada nerodyti pranešimų \n\n"<b>"2 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Niekada nerodyti pranešimų \n– Niekada neleisti garso ir nevibruoti \n\n"<b>"1 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Niekada nerodyti pranešimų \n– Niekada neleisti garso ir nevibruoti \n– Slėpti užrakinimo ekrane ir būsenos juostoje \n– Rodyti pranešimų sąrašo apačioje \n\n"<b>"0 lygis"</b>" \n– Blokuoti visus programos pranešimus"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Pranešimai"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Nebegausite šių pranešimų."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"„<xliff:g id="APP">%s</xliff:g>“ pranešimai, skirti"</string>
- <string name="min_importance" msgid="7559703098688382595">"Nelabai svarbus"</string>
- <string name="low_importance" msgid="6891335321576225228">"Vidutiniškai svarbus"</string>
- <string name="default_importance" msgid="6400766013567512061">"Svarbus"</string>
- <string name="high_importance" msgid="730741630855788381">"Skubus"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Neskambėti ir nepertraukti vaizdo"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Rodyti tyliai"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Skambėti"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Skambėti ir iššokti ekrane"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 iš <xliff:g id="NUMBER_1">%d</xliff:g> kategorijos (iš šios programos)</item>
+ <item quantity="few">1 iš <xliff:g id="NUMBER_1">%d</xliff:g> kategorijų (iš šios programos)</item>
+ <item quantity="many">1 iš <xliff:g id="NUMBER_1">%d</xliff:g> kategorijos (iš šios programos)</item>
+ <item quantity="other">1 iš <xliff:g id="NUMBER_1">%d</xliff:g> kategorijų (iš šios programos)</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Visos kategorijos"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Daugiau nustatymų"</string>
<string name="notification_done" msgid="5279426047273930175">"Atlikta"</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>
@@ -602,30 +600,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Išjungta"</string>
<string name="nav_bar" msgid="1993221402773877607">"Naršymo juosta"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Išdėstymas"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Kairėn"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Dešinėn"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Mygtuko tipas"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Papildomo mygtuko kairėje tipas"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Papildomo mygtuko dešinėje tipas"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(numatytoji)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Iškarpinė"</item>
<item msgid="5742013440802239414">"Klavišo kodas"</item>
- <item msgid="8748101184830239843">"Meniu / klaviatūros perjungiklis"</item>
+ <item msgid="8802889973626281575">"Klaviatūros perjungiklis"</item>
<item msgid="8175437057325747277">"Nėra"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Padalyta (numatytoji)"</item>
- <item msgid="6210279084134579668">"Centruota"</item>
- <item msgid="89143234390889289">"Sulygiuota kairėje"</item>
- <item msgid="7715533883382410603">"Sulygiuota dešinėje"</item>
+ <item msgid="8077901629964902399">"Įprastas"</item>
+ <item msgid="8256205964297588988">"Kompaktiškas"</item>
+ <item msgid="8719936228094005878">"Kairėje"</item>
+ <item msgid="586019486955594690">"Dešinėje"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Meniu / klaviatūros perjung."</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Klaviatūros perjungiklis"</string>
<string name="save" msgid="2311877285724540644">"Išsaugoti"</string>
<string name="reset" msgid="2448168080964209908">"Atstatyti"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Mygtuko pločio koregavimas"</string>
<string name="clipboard" msgid="1313879395099896312">"Iškarpinė"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Tinkintas naršymo mygtukas"</string>
- <string name="keycode" msgid="7335281375728356499">"Klavišo kodas"</string>
- <string name="icon" msgid="8732339849035837289">"Piktograma"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Klavišo kodas kairėje"</string>
+ <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_remove_tiles" msgid="3361212377437088062">"Vilkite čia, jei norite pašalinti"</string>
<string name="qs_edit" msgid="2232596095725105230">"Redaguoti"</string>
@@ -674,19 +673,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Atidaryti „<xliff:g id="ID_1">%s</xliff:g>“ nustatymus."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Redaguoti nustatymų tvarką."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_1">%1$d</xliff:g> psl. iš <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Užrakinimo ekranas"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Išskleisti"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Sumažinti"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Uždaryti"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefonas kaista"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Kai kurios funkcijos gali neveikti, kol telefonas vėsta"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefonas automatiškai bandys atvėsti. Telefoną vis tiek galėsite naudoti, tačiau jis gali veikti lėčiau.\n\nKai telefonas atvės, jis veiks įprastai."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Kairioji pusė"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Dešinioji pusė"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Tinkinti spartųjį klavišą"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Spartusis klavišas"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Paraginti įvesti slaptažodį"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Spartusis klavišas kairėje"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Spartusis klavišas dešinėje"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Spartusis klavišas kairėje taip pat atrakina"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Spartusis klavišas dešinėje taip pat atrakina"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Nėra"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Paleisti programą „<xliff:g id="APP">%1$s</xliff:g>“"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Kitos programos"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Draugų ratas"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Pliusas"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minusas"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Kairėje"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Dešinėje"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Meniu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Programa „<xliff:g id="APP">%1$s</xliff:g>“"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Įspėjimai"</string>
<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>
+ <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>
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 3725060..cb7c413 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -518,15 +518,12 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Izmantojot barošanas paziņojumu vadīklas, varat lietotnes paziņojumiem iestatīt svarīguma līmeni (no 0 līdz 5). \n\n"<b>"5. līmenis"</b>" \n- Tiek rādīts paziņojumu saraksta augšdaļā \n- Tiek atļauta pilnekrāna režīma pārtraukšana \n- Ieskats vienmēr atļauts \n\n"<b>"4. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats vienmēr atļauts \n\n"<b>"3. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats nav atļauts \n\n"<b>"2. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats nav atļauts \n- Nav atļautas skaņas un vibrosignāls \n\n"<b>"1. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats nav atļauts \n- Nav atļautas skaņas un vibrosignāls \n- Paziņojumi tiek paslēpti bloķēšanas ekrānā un statusa joslā \n- Paziņojumi tiek rādīti paziņojumu saraksta apakšdaļā \n\n"<b>"0. līmenis"</b>" \n- Visi lietotnes paziņojumi tiek bloķēti"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Paziņojumi"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Jūs vairs nesaņemsiet šos paziņojumus."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Lietotnes <xliff:g id="APP">%s</xliff:g> paziņojumi par"</string>
- <string name="min_importance" msgid="7559703098688382595">"Mazsvarīgs"</string>
- <string name="low_importance" msgid="6891335321576225228">"Vidēji svarīgs"</string>
- <string name="default_importance" msgid="6400766013567512061">"Ļoti svarīgs"</string>
- <string name="high_importance" msgid="730741630855788381">"Steidzams"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Bez skaņas signāla vai vizuāla paziņojuma"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Rādīt bez skaņas signāla"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Atskaņot skaņas signālu"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Atskaņot skaņas signālu un īslaicīgi parādīt ekrānā"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="zero">1 no <xliff:g id="NUMBER_1">%d</xliff:g> kategorijām šai lietotnei</item>
+ <item quantity="one">1 no <xliff:g id="NUMBER_1">%d</xliff:g> kategorijas šai lietotnei</item>
+ <item quantity="other">1 no <xliff:g id="NUMBER_1">%d</xliff:g> kategorijām šai lietotnei</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Visas kategorijas"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Citi iestatījumi"</string>
<string name="notification_done" msgid="5279426047273930175">"Gatavs"</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>
@@ -600,30 +597,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Izslēgts"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigācijas josla"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Izkārtojums"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Pa kreisi"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Pa labi"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Pogas veids"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Kreisās puses papildu pogas veids"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Labās puses papildu pogas veids"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(noklusējums)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Starpliktuve"</item>
<item msgid="5742013440802239414">"Taustiņu kods"</item>
- <item msgid="8748101184830239843">"Izvēlnes/tastatūras slēdzis"</item>
+ <item msgid="8802889973626281575">"Tastatūras pārslēdzējs"</item>
<item msgid="8175437057325747277">"Neviens"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Sadalīts (noklusējums)"</item>
- <item msgid="6210279084134579668">"Centrēts"</item>
- <item msgid="89143234390889289">"Izlīdzināts pa kreisi"</item>
- <item msgid="7715533883382410603">"Izlīdzināts pa labi"</item>
+ <item msgid="8077901629964902399">"Normāls"</item>
+ <item msgid="8256205964297588988">"Kompakts"</item>
+ <item msgid="8719936228094005878">"Novirzīts pa kreisi"</item>
+ <item msgid="586019486955594690">"Novirzīts pa labi"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Izvēlnes/tastatūras slēdzis"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Tastatūras pārslēdzējs"</string>
<string name="save" msgid="2311877285724540644">"Saglabāt"</string>
<string name="reset" msgid="2448168080964209908">"Atiestatīt"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Pogas platuma pielāgošana"</string>
<string name="clipboard" msgid="1313879395099896312">"Starpliktuve"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Pielāgota navigācijas poga"</string>
- <string name="keycode" msgid="7335281375728356499">"Taustiņu kods"</string>
- <string name="icon" msgid="8732339849035837289">"Ikona"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Taustiņu kods kreisajā pusē"</string>
+ <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_remove_tiles" msgid="3361212377437088062">"Lai noņemtu vienumus, velciet tos šeit."</string>
<string name="qs_edit" msgid="2232596095725105230">"Rediģēt"</string>
@@ -672,19 +670,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Atvērt <xliff:g id="ID_1">%s</xliff:g> iestatījumus."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Rediģēt iestatījumu secību."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_1">%1$d</xliff:g>. lpp. no <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Bloķēšanas ekrāns"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Izvērst"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizēt"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Aizvērt"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Tālrunis kļūst silts"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Dažas funkcijas ir ierobežotas, kamēr tālrunis mēģina atdzist"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Jūsu tālrunis automātiski mēģinās atdzist. Jūs joprojām varat izmantot tālruni, taču tas, iespējams, darbosies lēnāk.\n\nTiklīdz tālrunis būs atdzisis, tas darbosies normāli."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Pa kreisi"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Pa labi"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Pielāgot īsinājumtaustiņu"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Īsinājumtaustiņš"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Pieprasīt paroli"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Saīsne kreisajā pusē"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Saīsne labajā pusē"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Saīsne kreisajā pusē arī atbloķē"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Saīsne labajā pusē arī atbloķē"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Nav"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Palaist <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Citas lietotnes"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Loks"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Pluss"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Mīnuss"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Pa kreisi"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Pa labi"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Izvēlne"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> lietotne"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Brīdinājumi"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 624cafc..cdadb0a 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"Веќе нема да ги добивате овие известувања."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Известувања од <xliff:g id="APP">%s</xliff:g> за"</string>
- <string name="min_importance" msgid="7559703098688382595">"Ниско"</string>
- <string name="low_importance" msgid="6891335321576225228">"Средно"</string>
- <string name="default_importance" msgid="6400766013567512061">"Високо"</string>
- <string name="high_importance" msgid="730741630855788381">"Итно"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Без звук или визуелен прекин"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Прикажи тивко"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Испушти звук"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Испушти звук и прикажи го на екранот"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 од <xliff:g id="NUMBER_1">%d</xliff:g> категорија од оваа апликација</item>
+ <item quantity="other">1 од <xliff:g id="NUMBER_1">%d</xliff:g> категории од оваа апликација</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Сите категории"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Повеќе поставки"</string>
<string name="notification_done" msgid="5279426047273930175">"Готово"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"Лево"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Десно"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Тип копче"</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="8748101184830239843">"Менувач на мени/тастатура"</item>
+ <item msgid="8802889973626281575">"Менувач на тастатура"</item>
<item msgid="8175437057325747277">"Ништо"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Поделен (стандардно)"</item>
- <item msgid="6210279084134579668">"Во средина"</item>
- <item msgid="89143234390889289">"Порамнет налево"</item>
- <item msgid="7715533883382410603">"Порамнет надесно"</item>
+ <item msgid="8077901629964902399">"Нормални"</item>
+ <item msgid="8256205964297588988">"Компактни"</item>
+ <item msgid="8719936228094005878">"Се потпира лево"</item>
+ <item msgid="586019486955594690">"Се потпира десно"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Менување мени/тастатура"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Менувач на тастатура"</string>
<string name="save" msgid="2311877285724540644">"Зачувај"</string>
<string name="reset" msgid="2448168080964209908">"Ресетирај"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Приспособи ја ширината на копчето"</string>
<string name="clipboard" msgid="1313879395099896312">"Табла со исечоци"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Приспособено копче за навигација"</string>
- <string name="keycode" msgid="7335281375728356499">"Код од тастери"</string>
- <string name="icon" msgid="8732339849035837289">"Икона"</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="7058945779098711293">"Повлечете за додавање плочки"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Повлечете тука за да се отстрани"</string>
<string name="qs_edit" msgid="2232596095725105230">"Уреди"</string>
@@ -670,19 +667,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Минимизирај"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Затвори"</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_left" msgid="6806490081187499505">"Лево"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Десно"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Приспособете ја кратенката"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Кратенка"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Побарај лозинка"</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_screenshot" msgid="6314080179230000938">"Слики од екранот"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Општи пораки"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Меморија"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"Инстант апликации"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"Инстант апликациите нема потреба да се инсталираат."</string>
+ <string name="app_info" msgid="6856026610594615344">"Информации за апликација"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 5fd5022..38769cf 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -83,8 +83,7 @@
<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 />
+ <string name="accessibility_accessibility_button" msgid="7601252764577607915">"ഉപയോഗസഹായി"</string>
<string name="accessibility_recent" msgid="5208608566793607626">"കാഴ്ച"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"തിരയൽ"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"ക്യാമറ"</string>
@@ -517,15 +516,11 @@
<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="5805874247999578073">"നിങ്ങൾക്ക് ഈ അറിയിപ്പുകൾ ഇനിയങ്ങോട്ട് ലഭിക്കില്ല."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"ഇനിപ്പറയുന്നതിനുള്ള <xliff:g id="APP">%s</xliff:g> അറിയിപ്പുകൾ:"</string>
- <string name="min_importance" msgid="7559703098688382595">"കുറഞ്ഞ പ്രാധാന്യം"</string>
- <string name="low_importance" msgid="6891335321576225228">"ഇടത്തരം പ്രാധാന്യം"</string>
- <string name="default_importance" msgid="6400766013567512061">"ഉയർന്ന പ്രാധാന്യം"</string>
- <string name="high_importance" msgid="730741630855788381">"അടിയന്തിര പ്രാധാന്യം"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"ശബ്ദപരമോ ദൃശ്യപരമോ ആയ തടസ്സമില്ല"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"നിശബ്ദമായി കാണിക്കുക"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"ശബ്ദമുണ്ടാക്കുക"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"ശബ്ദമുണ്ടാക്കുക, സ്ക്രീനിൽ കാണിക്കുക"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">ഈ ആപ്പിൽ നിന്നുള്ള 1 / <xliff:g id="NUMBER_1">%d</xliff:g> വിഭാഗങ്ങൾ</item>
+ <item quantity="one">ഈ ആപ്പിൽ നിന്നുള്ള 1 / <xliff:g id="NUMBER_0">%d</xliff:g> വിഭാഗം</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"എല്ലാ വിഭാഗങ്ങളും"</string>
<string name="notification_more_settings" msgid="816306283396553571">"കൂടുതൽ ക്രമീകരണം"</string>
<string name="notification_done" msgid="5279426047273930175">"പൂർത്തിയായി"</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>
@@ -599,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"ഇടത്"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"വലത്"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"ബട്ടൺ തരം"</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="8748101184830239843">"മെനു / കീബോർഡ് സ്വിച്ചർ"</item>
+ <item msgid="8802889973626281575">"കീബോർഡ് സ്വിച്ചർ"</item>
<item msgid="8175437057325747277">"ഒന്നുമില്ല"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"വിഭജിച്ചത് (ഡിഫോൾട്ട്)"</item>
- <item msgid="6210279084134579668">"മധ്യഭാഗത്ത് വിന്യസിച്ചത്"</item>
- <item msgid="89143234390889289">"ഇടതുവശത്ത് വിന്യസിച്ചത്"</item>
- <item msgid="7715533883382410603">"വലതുവശത്ത് വിന്യസിച്ചത്"</item>
+ <item msgid="8077901629964902399">"സാധാരണ വേഗത്തിൽ"</item>
+ <item msgid="8256205964297588988">"ഒതുക്കമുള്ളത്"</item>
+ <item msgid="8719936228094005878">"ഇടത്തേക്ക് ചാഞ്ഞിരിക്കുന്നത്"</item>
+ <item msgid="586019486955594690">"വലത്തേക്ക് ചാഞ്ഞിരിക്കുന്നത്"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"മെനു / കീബോർഡ് സ്വിച്ചർ"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"കീബോർഡ് സ്വിച്ചർ"</string>
<string name="save" msgid="2311877285724540644">"സംരക്ഷിക്കുക"</string>
<string name="reset" msgid="2448168080964209908">"പുനഃസജ്ജമാക്കുക"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"ബട്ടൺ വീതി ക്രമീകരിക്കുക"</string>
<string name="clipboard" msgid="1313879395099896312">"ക്ലിപ്പ്ബോർഡ്"</string>
<string name="accessibility_key" msgid="5701989859305675896">"ഇഷ്ടാനുസൃത നാവിഗേഷൻ ബട്ടൺ"</string>
- <string name="keycode" msgid="7335281375728356499">"കീകോഡ്"</string>
- <string name="icon" msgid="8732339849035837289">"ഐക്കൺ"</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="7058945779098711293">"ടൈലുകൾ ചേർക്കുന്നതിന് വലിച്ചിടുക"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"നീക്കംചെയ്യുന്നതിന് ഇവിടെ വലിച്ചിടുക"</string>
<string name="qs_edit" msgid="2232596095725105230">"എഡിറ്റുചെയ്യുക"</string>
@@ -671,19 +667,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"ചെറുതാക്കുക"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"അടയ്ക്കുക"</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_left" msgid="6806490081187499505">"ഇടത്"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"വലത്"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"കുറുക്കുവഴി ഇഷ്ടാനുസൃതമാക്കുക"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"കുറുക്കുവഴി"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"പാസ്വേഡ് ആവശ്യപ്പെടുക"</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_screenshot" msgid="6314080179230000938">"സ്ക്രീൻഷോട്ടുകൾ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"പൊതുവായ സന്ദേശങ്ങൾ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"സ്റ്റോറേജ്"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"ഇൻസ്റ്റന്റ് ആപ്പ്"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"ഇൻസ്റ്റന്റ് ആപ്പിന് ഇൻസ്റ്റലേഷൻ ആവശ്യമില്ല."</string>
+ <string name="app_info" msgid="6856026610594615344">"ആപ്പ് വിവരം"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 5e02cce..206a9cc 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"Ta цаашид мэдэгдэл авахгүй."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> мэдэгдэл"</string>
- <string name="min_importance" msgid="7559703098688382595">"Бага"</string>
- <string name="low_importance" msgid="6891335321576225228">"Дунд"</string>
- <string name="default_importance" msgid="6400766013567512061">"Өндөр"</string>
- <string name="high_importance" msgid="730741630855788381">"Яаралтай"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Дуугүй, эсвэл үзэхэд саадгүй"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Чимээгүй харуулах"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Дуу гаргах"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Дуу гаргаж, дэлгэцэд гэнэт гаргах"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">энэ аппын <xliff:g id="NUMBER_1">%d</xliff:g>-с 1 ангилал</item>
+ <item quantity="one">энэ аппын <xliff:g id="NUMBER_0">%d</xliff:g>-с 1 ангилал</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Бүх ангилал"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Бусад тохиргоо"</string>
<string name="notification_done" msgid="5279426047273930175">"Дууссан"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"Зүүн"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Баруун"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Товчлуурын төрөл"</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="8748101184830239843">"Цэс / Гар солигч"</item>
+ <item msgid="8802889973626281575">"Гар солигч"</item>
<item msgid="8175437057325747277">"Хоосон"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Хуваагдсан (өгөгдмөл)"</item>
- <item msgid="6210279084134579668">"Голлосон"</item>
- <item msgid="89143234390889289">"Зүүн зэрэгцүүлсэн"</item>
- <item msgid="7715533883382410603">"Баруун зэрэгцүүлсэн"</item>
+ <item msgid="8077901629964902399">"Энгийн"</item>
+ <item msgid="8256205964297588988">"Нягтшил сайтай"</item>
+ <item msgid="8719936228094005878">"Зүүн налуу"</item>
+ <item msgid="586019486955594690">"Баруун налуу"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Цэс / Гар солигч"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Гар солигч"</string>
<string name="save" msgid="2311877285724540644">"Хадгалах"</string>
<string name="reset" msgid="2448168080964209908">"Бүгдийг цэвэрлэх"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Товчлуурын өргөнг тохируулах"</string>
<string name="clipboard" msgid="1313879395099896312">"Түр санах ой"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Навигацийн товчлуурыг өөрчлөх"</string>
- <string name="keycode" msgid="7335281375728356499">"Түлхүүр код"</string>
- <string name="icon" msgid="8732339849035837289">"Дүрс тэмдэг"</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="7058945779098711293">"Дөрвөлж нэмэхийн тулд чирнэ үү"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Устгахын тулд энд зөөнө үү"</string>
<string name="qs_edit" msgid="2232596095725105230">"Засах"</string>
@@ -670,19 +667,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g>-н <xliff:g id="ID_1">%1$d</xliff:g>-р хуудас"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Түгжигдсэн дэлгэц"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Дэлгэх"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Багасгах"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Хаах"</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_left" msgid="6806490081187499505">"Зүүн"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Баруун"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Товчлолыг өөрчлөх"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Товчлол"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Нууц үг шаардах"</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_screenshot" msgid="6314080179230000938">"Дэлгэцийн зураг дарах"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Энгийн зурвас"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Хадгалах сан"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"Шуурхай апп"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"Шуурхай аппыг суулгах шаардлагагүй."</string>
+ <string name="app_info" msgid="6856026610594615344">"Апп-н мэдээлэл"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 14eaf28..266d0c9 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"आपल्याला यापुढे या सूचना प्राप्त होणार नाहीत."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"यासाठी <xliff:g id="APP">%s</xliff:g> सूचना"</string>
- <string name="min_importance" msgid="7559703098688382595">"निम्न"</string>
- <string name="low_importance" msgid="6891335321576225228">"मध्यम"</string>
- <string name="default_importance" msgid="6400766013567512061">"सर्वाधिक"</string>
- <string name="high_importance" msgid="730741630855788381">"त्वरित"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"कोणताही ध्वनी किंवा व्हिज्युअल व्यत्यय नाही"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"शांतपणे दर्शवा"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"ध्वनी करा"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"ध्वनी करा आणि स्क्रीनवर पॉप करा"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">या अॅपवरून <xliff:g id="NUMBER_1">%d</xliff:g> श्रेणीपैकी 1</item>
+ <item quantity="other">या अॅपवरून <xliff:g id="NUMBER_1">%d</xliff:g> श्रेण्यांपैकी 1</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"सर्व श्रेण्या"</string>
<string name="notification_more_settings" msgid="816306283396553571">"अधिक सेटिंग्ज"</string>
<string name="notification_done" msgid="5279426047273930175">"पूर्ण झाले"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"डावा"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"उजवा"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"बटणाचा प्रकार"</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="8748101184830239843">"मेनू / कीबोर्ड स्विचर"</item>
+ <item msgid="8802889973626281575">"कीबोर्ड स्विचर"</item>
<item msgid="8175437057325747277">"काहीही नाही"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"विभाजित (डीफॉल्ट)"</item>
- <item msgid="6210279084134579668">"मध्यवर्ती"</item>
- <item msgid="89143234390889289">"डावे-संरेखित"</item>
- <item msgid="7715533883382410603">"उजवे-संरेखित"</item>
+ <item msgid="8077901629964902399">"सामान्य"</item>
+ <item msgid="8256205964297588988">"संक्षिप्त"</item>
+ <item msgid="8719936228094005878">"डावीकडे कललेले"</item>
+ <item msgid="586019486955594690">"उजवीकडे कललेले"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"मेनू / कीबोर्ड स्विचर"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"कीबोर्ड स्विचर"</string>
<string name="save" msgid="2311877285724540644">"जतन करा"</string>
<string name="reset" msgid="2448168080964209908">"रीसेट करा"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"बटण रूंदी समायोजित करा"</string>
<string name="clipboard" msgid="1313879395099896312">"क्लिपबोर्ड"</string>
<string name="accessibility_key" msgid="5701989859305675896">"सानुकूल नेव्हिगेशन बटण"</string>
- <string name="keycode" msgid="7335281375728356499">"कीकोड"</string>
- <string name="icon" msgid="8732339849035837289">"चिन्ह"</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="7058945779098711293">"टाइल जोडण्यासाठी ड्रॅग करा"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"काढण्यासाठी येथे ड्रॅग करा"</string>
<string name="qs_edit" msgid="2232596095725105230">"संपादित करा"</string>
@@ -670,19 +667,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"पृष्ठ <xliff:g id="ID_2">%2$d</xliff:g> पैकी <xliff:g id="ID_1">%1$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"लॉक स्क्रीन"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"विस्तृत करा"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"लहान करा"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"बंद करा"</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_left" msgid="6806490081187499505">"डावा"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"उजवा"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"शॉर्टकट सानुकूल करा"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"शॉर्टकट"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"संकेतशब्दासाठी संकेत"</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_screenshot" msgid="6314080179230000938">"स्क्रीनशॉट"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"सर्वसाधारण संदेश"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"संचय"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"इन्सटंट अॅप्स"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"इन्सटंट अॅप्सना स्थापनेची आवश्यकता नसते."</string>
+ <string name="app_info" msgid="6856026610594615344">"अॅप माहिती"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 5be0afd..441b4c1 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Dengan kawalan pemberitahuan berkuasa, anda boleh menetapkan tahap kepentingan dari 0 hingga 5 untuk pemberitahuan apl. \n\n"<b>"Tahap 5"</b>" \n- Tunjukkan pada bahagian atas senarai pemberitahuan \n- Benarkan gangguan skrin penuh \n- Sentiasa intai \n\n"<b>"Tahap 4"</b>" \n- Halang gangguan skrin penuh \n- Sentiasa intai \n\n"<b>"Tahap 3"</b>" \n- Halang gangguan skrin penuh \n- Jangan intai \n\n"<b>"Tahap 2"</b>" \n- Halang gangguan skrin penuh \n- Jangan intai \n- Jangan berbunyi dan bergetar \n\n"<b>"Tahap 1"</b>" \n- Halang gangguan skrin penuh \n- Jangan intai \n- Jangan berbunyi atau bergetar \n- Sembunyikan daripada skrin kunci dan bar status \n- Tunjukkan di bahagian bawah senarai pemberitahuan \n\n"<b>"Tahap 0"</b>" \n- Sekat semua pemberitahuan daripada apl"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Pemberitahuan"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Anda tidak akan menerima pemberitahuan ini lagi."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Pemberitahuan <xliff:g id="APP">%s</xliff:g> untuk"</string>
- <string name="min_importance" msgid="7559703098688382595">"Rendah"</string>
- <string name="low_importance" msgid="6891335321576225228">"Sederhana"</string>
- <string name="default_importance" msgid="6400766013567512061">"Tinggi"</string>
- <string name="high_importance" msgid="730741630855788381">"Segera"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Tiada gangguan bunyi atau visual"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Tunjukkan secara senyap"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Berbunyi"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Berbunyi dan paparkan pada skrin"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 daripada <xliff:g id="NUMBER_1">%d</xliff:g> kategori daripada apl ini</item>
+ <item quantity="one">1 daripada <xliff:g id="NUMBER_0">%d</xliff:g> kategori daripada apl ini</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Semua Kategori"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Lagi tetapan"</string>
<string name="notification_done" msgid="5279426047273930175">"Selesai"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Mati"</string>
<string name="nav_bar" msgid="1993221402773877607">"Bar navigasi"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Reka letak"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Kiri"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Kanan"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Jenis butang"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Jenis butang kiri tambahan"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Jenis butang kanan tambahan"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(lalai)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Papan Keratan"</item>
<item msgid="5742013440802239414">"Kod Kunci"</item>
- <item msgid="8748101184830239843">"Penukar Menu/Papan Kekunci"</item>
+ <item msgid="8802889973626281575">"Penukar papan kekunci"</item>
<item msgid="8175437057325747277">"Tiada"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Terbahagi (lalai)"</item>
- <item msgid="6210279084134579668">"Ditengahkan"</item>
- <item msgid="89143234390889289">"Jajar kiri"</item>
- <item msgid="7715533883382410603">"Jajar kanan"</item>
+ <item msgid="8077901629964902399">"Biasa"</item>
+ <item msgid="8256205964297588988">"Sarat"</item>
+ <item msgid="8719936228094005878">"Jajar ke kiri"</item>
+ <item msgid="586019486955594690">"Jajar ke kanan"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Penukar Menu/Papan Kekunci"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Penukar papan kekunci"</string>
<string name="save" msgid="2311877285724540644">"Simpan"</string>
<string name="reset" msgid="2448168080964209908">"Tetapkan semula"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Laraskan lebar butang"</string>
<string name="clipboard" msgid="1313879395099896312">"Papan Keratan"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Butang navigasi tersuai"</string>
- <string name="keycode" msgid="7335281375728356499">"Kod Kunci"</string>
- <string name="icon" msgid="8732339849035837289">"Ikon"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Kod kunci kiri"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Kod kunci kanan"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Ikon kiri"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Ikon kanan"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Seret untuk menambahkan jubin"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Seret ke sini untuk mengalih keluar"</string>
<string name="qs_edit" msgid="2232596095725105230">"Edit"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Buka tetapan <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Edit susunan tetapan."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Halaman <xliff:g id="ID_1">%1$d</xliff:g> daripada <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Kunci skrin"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Kembangkan"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimumkan"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Tutup"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefon semakin panas"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Sesetengah ciri adalah terhad semasa telefon menyejuk"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefon anda akan cuba menyejuk secara automatik. Anda masih dapat menggunakan telefon itu tetapi telefon tersebut mungkin berjalan lebih perlahan.\n\nSetelah telefon anda sejuk, telefon itu akan berjalan seperti biasa."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Kiri"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Kanan"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Sesuaikan pintasan"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Pintasan"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Gesa untuk kata laluan"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Pintasan kiri"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Pintasan kanan"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Pintasan kiri juga membuka kunci"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Pintasan kanan juga membuka kunci"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Tiada"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Lancarkan <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Apl lain"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Bulatan"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Tambah"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Tolak"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Kiri"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Kanan"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Apl <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Makluman"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 8e2e0a4..9b9359e 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"သင်သည် ဤအကြောင်းကြားချက်များကို လက်ခံရရှိတော့မည် မဟုတ်ပါ။"</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"ဤအရာအတွက် <xliff:g id="APP">%s</xliff:g> အကြောင်းကြားချက်များ"</string>
- <string name="min_importance" msgid="7559703098688382595">"အရေးသိပ်မကြီးပါ"</string>
- <string name="low_importance" msgid="6891335321576225228">"အတော်အသင့်"</string>
- <string name="default_importance" msgid="6400766013567512061">"အရေးကြီးသည်"</string>
- <string name="high_importance" msgid="730741630855788381">"အရေးပေါ်"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"မည်သည့်အသံ သို့မဟုတ် ရုပ်ပုံ ကြားဝင်နှောင့်ယှက်ခြင်း မရှိပါ"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"တိတ်တဆိတ်ပြပါ"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"အသံဖွင့်ပါ"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"အသံဖွင့်၍ မျက်နှာပြင်ပေါ်တွင် ပြပါ"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <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="notification_all_categories" msgid="5407190218055113282">"အုပ်စုအားလုံး"</string>
<string name="notification_more_settings" msgid="816306283396553571">"နောက်ထပ် ဆက်တင်များ"</string>
<string name="notification_done" msgid="5279426047273930175">"ပြီးပါပြီ"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"ဘယ်"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"ညာ"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"ခလုတ်အမျိုးအစား"</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="8748101184830239843">"မီနူး / ကီးဘုတ်ပြောင်းစနစ်"</item>
+ <item msgid="8802889973626281575">"ကီးဘုတ် ပြောင်းလဲပေးသည့်စနစ်"</item>
<item msgid="8175437057325747277">"တစ်ခုမျှမရှိ"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"ခွဲခြားထားသော (မူရင်း)"</item>
- <item msgid="6210279084134579668">"အလယ်ဗဟိုပြုထားသော"</item>
- <item msgid="89143234390889289">"ဘယ်ဘက်ကပ်ထားသော"</item>
- <item msgid="7715533883382410603">"ညာဘက်ကပ်ထားသော"</item>
+ <item msgid="8077901629964902399">"ပုံမှန်"</item>
+ <item msgid="8256205964297588988">"ကျစ်ကျစ်လစ်လစ်"</item>
+ <item msgid="8719936228094005878">"လက်ဝဲဖက် ကပ်လျက်"</item>
+ <item msgid="586019486955594690">"လက်ယာဖက် ကပ်လျက်"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"မီနူး / ကီးဘုတ်ပြောင်းစနစ်"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"ကီးဘုတ် ပြောင်းလဲပေးသည့်စနစ်"</string>
<string name="save" msgid="2311877285724540644">"သိမ်းရန်"</string>
<string name="reset" msgid="2448168080964209908">"ပြန်လည်သတ်မှတ်ရန်"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"ခလုတ်အလျားကို ချိန်ညှိပါ"</string>
<string name="clipboard" msgid="1313879395099896312">"ကလစ်ဘုတ်"</string>
<string name="accessibility_key" msgid="5701989859305675896">"စိတ်ကြိုက်ရွှေ့လျားရန် ခလုတ်"</string>
- <string name="keycode" msgid="7335281375728356499">"ကီးကုဒ်"</string>
- <string name="icon" msgid="8732339849035837289">"သင်္ကေတ"</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="7058945779098711293">"အချပ်များကိုထည့်ရန် ဖိဆွဲပါ"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"ဖယ်ရှားရန် ဤနေရာသို့ဖိဆွဲပါ"</string>
<string name="qs_edit" msgid="2232596095725105230">"တည်းဖြတ်ပါ"</string>
@@ -670,19 +667,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"စာမျက်နှာ <xliff:g id="ID_2">%2$d</xliff:g> အနက်မှ စာမျက်နှာ <xliff:g id="ID_1">%1$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"လော့ခ်ချထားချိန် မျက်နှာပြင်"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"ချဲ့ရန်"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"ချုံ့ရန်"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"ပိတ်ရန်"</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_left" msgid="6806490081187499505">"ဘယ်"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"ညာ"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"ဖြတ်လမ်းလင့်ခ်ကို စိတ်ကြိုက်ပြင်ဆင်ရန်"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"ဖြတ်လမ်းလင့်ခ်"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"စကားဝှက်ကို မေးရန်"</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_screenshot" msgid="6314080179230000938">"မျက်နှာပြင်ဓာတ်ပုံများ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"အထွေထွေ မက်ဆေ့ဂျ်များ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"သိုလှောင်မှုများ"</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>
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 701b295..1744729 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Med effektive varselinnstillinger kan du angi viktighetsnivåer fra 0 til 5 for appvarsler. \n\n"<b>"Nivå 5"</b>" \n– Vis øverst på varsellisten \n– Tillat forstyrrelser ved fullskjermmodus \n– Vis alltid raskt \n\n"<b>"Nivå 4"</b>" \n– Forhindre forstyrrelser ved fullskjermmodus \n– Vis alltid raskt \n\n"<b>"Nivå 3"</b>" \n– Forhindre forstyrrelser ved fullskjermmodus \n– Vis aldri raskt \n\n"<b>"Nivå 2"</b>" \n– Forhindre forstyrrelser ved fullskjermmodus \n– Vis aldri fort \n– Tillat aldri lyder eller vibrering \n\n"<b>"Nivå 1"</b>" \n– Forhindre forstyrrelser ved fullskjermmodus \n– Vis aldri raskt \n– Tillat aldri lyder eller vibrering \n– Skjul fra låseskjermen og statusfeltet \n– Vis nederst på varsellisten \n\n"<b>"Nivå 0"</b>" \n– Blokkér alle varsler fra appen"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Varsler"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Du får ikke disse varslene lenger."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g>-varsler for"</string>
- <string name="min_importance" msgid="7559703098688382595">"Lav"</string>
- <string name="low_importance" msgid="6891335321576225228">"Middels"</string>
- <string name="default_importance" msgid="6400766013567512061">"Høy"</string>
- <string name="high_importance" msgid="730741630855788381">"Haster"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Ingen lyd eller visuell forstyrrelse"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Vis uten lyd"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Lag lyd"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Lag lyd og vis i forgrunnen"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 av <xliff:g id="NUMBER_1">%d</xliff:g> kategorier fra denne appen</item>
+ <item quantity="one">1 av <xliff:g id="NUMBER_0">%d</xliff:g> kategori fra denne appen</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Alle kategorier"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Flere innstillinger"</string>
<string name="notification_done" msgid="5279426047273930175">"Ferdig"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Av"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigasjonsrad"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Oppsett"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Venstre"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Høyre"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Knappetype"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Ekstra venstre-knapptype"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Ekstra høyre-knapptype"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(standard)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Utklippstavle"</item>
<item msgid="5742013440802239414">"Nøkkelkode"</item>
- <item msgid="8748101184830239843">"Bytteknapp for meny/tastatur"</item>
+ <item msgid="8802889973626281575">"Bytteknapp for tastatur"</item>
<item msgid="8175437057325747277">"Ingen"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Delt (standardt)"</item>
- <item msgid="6210279084134579668">"Midtstilt"</item>
- <item msgid="89143234390889289">"Venstrejustert"</item>
- <item msgid="7715533883382410603">"Høyrejustert"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Kompakt"</item>
+ <item msgid="8719936228094005878">"Lent mot venstre"</item>
+ <item msgid="586019486955594690">"Lent mot høyre"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Bytteknapp for meny/tastatur"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Bytteknapp for tastatur"</string>
<string name="save" msgid="2311877285724540644">"Lagre"</string>
<string name="reset" msgid="2448168080964209908">"Tilbakestill"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Juster bredden på knappen"</string>
<string name="clipboard" msgid="1313879395099896312">"Utklippstavle"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Spesialtilpasset navigasjonsknapp"</string>
- <string name="keycode" msgid="7335281375728356499">"Nøkkelkode"</string>
- <string name="icon" msgid="8732339849035837289">"Ikon"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Venstre-nøkkelkode"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Høyre-nøkkelkode"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Venstre-ikon"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Høyre-ikon"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Dra for å legge til fliser"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Dra hit for å fjerne"</string>
<string name="qs_edit" msgid="2232596095725105230">"Endre"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Åpne <xliff:g id="ID_1">%s</xliff:g>-innstillingene."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Endre rekkefølgen på innstillingene."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Side <xliff:g id="ID_1">%1$d</xliff:g> av <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Låseskjerm"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Vis"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimer"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Lukk"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefonen begynner å bli varm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Enkelte funksjoner er begrenset mens telefonen kjøles ned"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefonen din kommer til å prøve å kjøle seg ned automatisk. Du kan fremdeles bruke telefonen, men den kjører muligens saktere.\n\nTelefonen kommer til å kjøre som normalt, når den har kjølt seg ned."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Venstre"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Høyre"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Tilpass snarvei"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Snarvei"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Påminnelse for passord"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Venstre hurtigtast"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Høyre hurtigtast"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Venstre hurtigtast låser også opp"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Høyre hurtigtast låser også opp"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Ingen"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Start <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Andre apper"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Sirkel"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Pluss"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Venstre"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Høyre"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Meny"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g>-appen"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Varsler"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index ad450ba..a634b91 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -83,8 +83,7 @@
<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 />
+ <string name="accessibility_accessibility_button" msgid="7601252764577607915">"पहुँच"</string>
<string name="accessibility_recent" msgid="5208608566793607626">"सारांश"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"खोज्नुहोस्"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"क्यामेरा"</string>
@@ -241,7 +240,7 @@
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G डेटा रोकिएको छ"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"सेल्यूलर डेटा रोकिएको छ"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"डेटा रोकिएको छ"</string>
- <string name="data_usage_disabled_dialog" msgid="1841738975235283398">"तपाईँले सेट गर्नुभएको डेटाको सीमामा पुगिएको छ। अबदेखि तपाईँ सेलुलर डेटाको प्रयोग गर्नुहुने छैन। \n\nतपाईँले प्रयोग जारी राख्नुभयो भने डेटा प्रयोगका शुल्कहरू लाग्न सक्छन्।"</string>
+ <string name="data_usage_disabled_dialog" msgid="1841738975235283398">"तपाईंले सेट गर्नुभएको डेटाको सीमामा पुगिएको छ। अबदेखि तपाईं सेलुलर डेटाको प्रयोग गर्नुहुने छैन। \n\nतपाईंले प्रयोग जारी राख्नुभयो भने डेटा प्रयोगका शुल्कहरू लाग्न सक्छन्।"</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"पुनः सुरु गर्नुहोस्"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"इन्टरनेट जडान छैन"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi जडित"</string>
@@ -352,9 +351,9 @@
<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>
- <string name="zen_priority_introduction" msgid="3070506961866919502">"अलार्म, रिमाइन्डर, घटना, र तपाईँले निर्दिष्ट गर्नुहुने कलरहरू देखि बाहेक, आवाज र कम्पनले तपाईँ लाई वाधा गर्ने छैन।"</string>
+ <string name="zen_priority_introduction" msgid="3070506961866919502">"अलार्म, रिमाइन्डर, घटना, र तपाईंले निर्दिष्ट गर्नुहुने कलरहरू देखि बाहेक, आवाज र कम्पनले तपाईं लाई वाधा गर्ने छैन।"</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"आफू अनुकूल बनाउनुहोस्"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"यसले अलार्म, संगीत, भिडियो, र खेलहरू लगायतका सबै ध्वनि र कम्पन रोक्छ। तपाईँ अझै पनि फोन कल गर्न सक्षम हुनुहुन्छ।"</string>
+ <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"यसले अलार्म, संगीत, भिडियो, र खेलहरू लगायतका सबै ध्वनि र कम्पन रोक्छ। तपाईं अझै पनि फोन कल गर्न सक्षम हुनुहुन्छ।"</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>
@@ -388,7 +387,7 @@
<string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"यस सत्रमा सबै अनुप्रयोगहरू र डेटा मेटाइनेछ।"</string>
<string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"हटाउनुहोस्"</string>
<string name="guest_wipe_session_title" msgid="6419439912885956132">"पुनः स्वागत, अतिथि!"</string>
- <string name="guest_wipe_session_message" msgid="8476238178270112811">"तपाईँ आफ्नो सत्र जारी गर्न चाहनुहुन्छ?"</string>
+ <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>
<string name="guest_notification_title" msgid="1585278533840603063">"अतिथि प्रयोगकर्ता"</string>
@@ -430,13 +429,13 @@
<string name="monitoring_description_vpn_settings" msgid="8869300202410505143">"VPN सम्बन्धी सेटिङहरू खोल्नुहोस्"</string>
<string name="monitoring_description_network_logging" msgid="7223505523384076027">"तपाईँको प्रशासकले तपाईँको यन्त्रमा ट्राफिकको अनुगमन गर्ने नेटवर्कको लगिङलाई सक्रिय पार्नुभएको छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string>
<string name="monitoring_description_vpn" msgid="4445150119515393526">"तपाईँले VPN जडान गर्न अनुप्रयोगलाई अनुमति दिनुभयो।\n\nयो अनुप्रयोगले तपाईँका यन्त्र र नेटवर्क गतिविधि लगायत इमेल, अनुप्रयोग र वेबसाइटहरू अनुगमन गर्न सक्छ।"</string>
- <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"तपाईँको कार्य प्रोफाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g> ले व्यवस्थापन गर्दछ।\n\nतपाईँको प्रशासकले तपाईँको इमेल, अनुप्रयोग र वेबसाइट सहित नेटवर्कमा तपाईँको गतिविधिको अनुगमन गर्न सक्नुहुन्छ। \n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।\n\n तपाईँ एउटा VPN मा जडित हुनुहुन्छ। यस VPN ले नेटवर्कमा तपाईँको गतिविधिको अनुगमन गर्न सक्छ।"</string>
+ <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"तपाईंको कार्य प्रोफाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g> ले व्यवस्थापन गर्दछ।\n\nतपाईंको प्रशासकले तपाईंको इमेल, अनुप्रयोग र वेबसाइट सहित नेटवर्कमा तपाईंको गतिविधिको अनुगमन गर्न सक्नुहुन्छ। \n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।\n\n तपाईं एउटा VPN मा जडित हुनुहुन्छ। यस VPN ले नेटवर्कमा तपाईंको गतिविधिको अनुगमन गर्न सक्छ।"</string>
<string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string>
- <string name="monitoring_description_app" msgid="6259179342284742878">"तपाईँ <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="monitoring_description_app" msgid="6259179342284742878">"तपाईं <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>
<string name="monitoring_description_app_work" msgid="7777228449969022305">"तपाईँको कार्य प्रोफाइल <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="4946600443852045903">"तपाईँको कार्य प्रोफाइल <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="monitoring_description_app_personal_work" msgid="4946600443852045903">"तपाईंको कार्य प्रोफाइल <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_disabled" msgid="7412534203633528135">"तपाईँले नखोले सम्म उपकरण बन्द रहनेछ"</string>
<string name="hidden_notifications_title" msgid="7139628534207443290">"छिटो सूचनाहरू प्राप्त गर्नुहोस्"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"तपाईँले अनलक गर्नअघि तिनीहरूलाई हेर्नुहोस्"</string>
@@ -452,7 +451,7 @@
<string name="screen_pinning_positive" msgid="3783985798366751226">"बुझेँ"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"धन्यवाद पर्दैन"</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_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>
@@ -514,18 +513,14 @@
<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">"सशक्त सूचना नियन्त्रणहरू मार्फत तपाईँ अनुप्रयाेगका सूचनाहरूका लागि ० देखि ५ सम्मको महत्व सम्बन्धी स्तर सेट गर्न सक्नुहुन्छ। \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="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="5805874247999578073">"तपाईंले अबदेखि यी सूचनाहरू प्राप्त गर्नुहुने छैन।"</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"निम्न कुराका लागि <xliff:g id="APP">%s</xliff:g> का सूचनाहरू"</string>
- <string name="min_importance" msgid="7559703098688382595">"न्यून"</string>
- <string name="low_importance" msgid="6891335321576225228">"मध्यम"</string>
- <string name="default_importance" msgid="6400766013567512061">"उच्च"</string>
- <string name="high_importance" msgid="730741630855788381">"जरुरी"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"कुनै आवाज ननिकाल्ने वा दृश्य सम्बन्धी अवरोध नपुर्याउने"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"मौन रूपमा देखाउने"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"आवाज निकाल्ने"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"आवाज निकाल्ने र स्क्रिनमा पपअप देखाउने"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <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="notification_all_categories" msgid="5407190218055113282">"सबै कोटिहरू"</string>
<string name="notification_more_settings" msgid="816306283396553571">"थप सेटिङहरू"</string>
<string name="notification_done" msgid="5279426047273930175">"सम्पन्न भयो"</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>
@@ -599,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"बायाँ"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"दायाँ"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"बटनको प्रकार"</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="8748101184830239843">"मेनु / किबोर्ड परिवर्तक"</item>
+ <item msgid="8802889973626281575">"किबोर्ड स्विचर"</item>
<item msgid="8175437057325747277">"कुनै पनि होइन"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"विभाजित (पूर्वनिर्धारित)"</item>
- <item msgid="6210279084134579668">"मध्य भागमा"</item>
- <item msgid="89143234390889289">"बायाँतिर पङ्क्तिबद्ध"</item>
- <item msgid="7715533883382410603">"दायाँतिर पङ्क्तिबद्ध"</item>
+ <item msgid="8077901629964902399">"साधारण"</item>
+ <item msgid="8256205964297588988">"खँदिलो"</item>
+ <item msgid="8719936228094005878">"बायाँतिर लैजानुहोस्"</item>
+ <item msgid="586019486955594690">"दायाँतिर लैजानुहोस्"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"मेनु / किबोर्ड स्विचर"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"किबोर्ड स्विचर"</string>
<string name="save" msgid="2311877285724540644">"सुरक्षित गर्नुहोस्"</string>
<string name="reset" msgid="2448168080964209908">"पुनःसेट गर्नु"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"बटनको चौडाइ समायोजन गर्नुहोस्"</string>
<string name="clipboard" msgid="1313879395099896312">"क्लिपबोर्ड"</string>
<string name="accessibility_key" msgid="5701989859305675896">"अनुकूलनको नेभिगेशन बटन"</string>
- <string name="keycode" msgid="7335281375728356499">"Keycode"</string>
- <string name="icon" msgid="8732339849035837289">"आइकन"</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="7058945779098711293">"टाइलहरू थप्न तान्नुहोस्"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"हटाउनका लागि यहाँ तान्नुहोस्"</string>
<string name="qs_edit" msgid="2232596095725105230">"सम्पादन गर्नुहोस्"</string>
@@ -671,19 +667,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> मध्ये पृष्ठ <xliff:g id="ID_1">%1$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"लक स्क्रिन"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"विस्तृत गर्नुहोस्"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"सानो बनाउनुहोस्"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"बन्द गर्नुहोस्"</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_left" msgid="6806490081187499505">"बायाँ"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"दायाँ"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"सर्टकट आफू अनुकूल पार्नुहोस्"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"सर्टकट"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"पासवर्ड माग्ने"</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_screenshot" msgid="6314080179230000938">"स्क्रिनशटहरू"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"सामान्य सन्देशहरू"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"भण्डारण"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"तात्कालिक अनुप्रयोगहरू"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"तात्कालिक अनुप्रयोगहरूलाई स्थापना गर्नु पर्दैन|"</string>
+ <string name="app_info" msgid="6856026610594615344">"अनुप्रयोगका बारे जानकारी"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 041b7b4..b5b741c 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Met beheeropties voor meldingen met betrekking tot stroomverbruik kun je een belangrijkheidsniveau van 0 tot 5 instellen voor de meldingen van een app. \n\n"<b>"Niveau 5"</b>" \n- Boven aan de lijst met meldingen weergeven \n- Onderbreking op volledig scherm toestaan \n- Altijd korte weergave \n\n"<b>"Niveau 4"</b>" \n- Geen onderbreking op volledig scherm \n- Altijd korte weergave \n\n"<b>"Niveau 3"</b>" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n\n"<b>"Niveau 2"</b>" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n\n"<b>"Niveau 1"</b>" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n- Verbergen op vergrendelingsscherm en statusbalk \n- Onder aan de lijst met meldingen weergeven \n\n"<b>"Niveau 0"</b>" \n- Alle meldingen van de app blokkeren"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Meldingen"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Je ontvangt deze meldingen niet meer."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g>-meldingen voor"</string>
- <string name="min_importance" msgid="7559703098688382595">"Laag"</string>
- <string name="low_importance" msgid="6891335321576225228">"Gemiddeld"</string>
- <string name="default_importance" msgid="6400766013567512061">"Hoog"</string>
- <string name="high_importance" msgid="730741630855788381">"Urgent"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Geen geluid of visuele onderbreking"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Zonder geluid weergeven"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Geluid laten horen"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Geluid laten horen en op het scherm weergeven"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">Eén van <xliff:g id="NUMBER_1">%d</xliff:g> categorieën van deze app</item>
+ <item quantity="one">Eén van <xliff:g id="NUMBER_0">%d</xliff:g> categorie van deze app</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Alle categorieën"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Meer instellingen"</string>
<string name="notification_done" msgid="5279426047273930175">"Gereed"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Uit"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigatiebalk"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Lay-out"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Links"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Rechts"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Knoptype"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Extra knoptype links"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Extra knoptype rechts"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(standaard)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Klembord"</item>
<item msgid="5742013440802239414">"Toetscode"</item>
- <item msgid="8748101184830239843">"Menu/toetsenbord-schakelaar"</item>
+ <item msgid="8802889973626281575">"Toetsenbordschakelaar"</item>
<item msgid="8175437057325747277">"Geen"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Verdeeld (standaard)"</item>
- <item msgid="6210279084134579668">"Gecentreerd"</item>
- <item msgid="89143234390889289">"Links uitgelijnd"</item>
- <item msgid="7715533883382410603">"Rechts uitgelijnd"</item>
+ <item msgid="8077901629964902399">"Normaal"</item>
+ <item msgid="8256205964297588988">"Compact"</item>
+ <item msgid="8719936228094005878">"Schuin naar links"</item>
+ <item msgid="586019486955594690">"Schuin naar rechts"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menu/toetsenbord-schakelaar"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Toetsenbordschakelaar"</string>
<string name="save" msgid="2311877285724540644">"Opslaan"</string>
<string name="reset" msgid="2448168080964209908">"Resetten"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Breedte van knop aanpassen"</string>
<string name="clipboard" msgid="1313879395099896312">"Klembord"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Aangepaste navigatieknop"</string>
- <string name="keycode" msgid="7335281375728356499">"Toetscode"</string>
- <string name="icon" msgid="8732339849035837289">"Pictogram"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Toetscode links"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Toetscode rechts"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Pictogram links"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Pictogram rechts"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Sleep om tegels toe te voegen"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Sleep hier naartoe om te verwijderen"</string>
<string name="qs_edit" msgid="2232596095725105230">"Bewerken"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g>-instellingen openen."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Volgorde van instellingen bewerken."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Pagina <xliff:g id="ID_1">%1$d</xliff:g> van <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Scherm vergrendelen"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Uitvouwen"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimaliseren"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Sluiten"</string>
<string name="high_temp_title" msgid="4589508026407318374">"De telefoon wordt warm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Bepaalde functies zijn beperkt terwijl de telefoon afkoelt"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Je telefoon probeert automatisch af te koelen. Je kunt je telefoon nog steeds gebruiken, maar deze kan langzamer werken.\n\nZodra de telefoon is afgekoeld, werkt deze weer normaal."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Links"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Rechts"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Snelkoppeling aanpassen"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Snelkoppeling"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Wachtwoordprompt"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Snelkoppeling links"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Snelkoppeling rechts"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Snelkoppeling links ontgrendelt ook"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Snelkoppeling rechts ontgrendelt ook"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Geen"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"<xliff:g id="APP">%1$s</xliff:g> starten"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Andere apps"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Cirkel"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Min"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Links"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Rechts"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Apps <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Meldingen"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index f409687..abd0a70 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"ਤੁਸੀਂ ਹੁਣ ਇਹ ਸੂਚਨਾਵਾਂ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕਰੋਂਗੇ।"</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"ਇਸ ਦੇ ਲਈ <xliff:g id="APP">%s</xliff:g> ਸੂਚਨਾਵਾਂ"</string>
- <string name="min_importance" msgid="7559703098688382595">"ਘੱਟ"</string>
- <string name="low_importance" msgid="6891335321576225228">"ਔਸਤ"</string>
- <string name="default_importance" msgid="6400766013567512061">"ਉੱਚ"</string>
- <string name="high_importance" msgid="730741630855788381">"ਜ਼ਰੂਰੀ"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"ਕੋਈ ਧੁਨੀ ਜਾਂ ਦ੍ਰਿਸ਼ਟਾਂਤਕ ਰੁਕਾਵਟ ਨਹੀਂ"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"ਚੁੱਪਚਾਪ ਵਿਖਾਓ"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"ਧੁਨੀ ਵਜਾਓ"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"ਧੁਨੀ ਵਜਾਓ ਅਤੇ ਸਕ੍ਰੀਨ \'ਤੇ ਵਿਖਾਓ"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">ਇਸ ਐਪ ਤੋਂ <xliff:g id="NUMBER_1">%d</xliff:g> ਸ਼੍ਰੇਣੀ ਵਿੱਚੋਂ 1</item>
+ <item quantity="other">ਇਸ ਐਪ ਤੋਂ <xliff:g id="NUMBER_1">%d</xliff:g> ਸ਼੍ਰੇਣੀਆਂ ਵਿੱਚੋਂ 1</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"ਸਭ ਸ਼੍ਰੇਣੀਆਂ"</string>
<string name="notification_more_settings" msgid="816306283396553571">"ਹੋਰ ਸੈਟਿੰਗਾਂ"</string>
<string name="notification_done" msgid="5279426047273930175">"ਹੋ ਗਿਆ"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"ਖੱਬੇ"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"ਸੱਜੇ"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"ਬਟਨ ਕਿਸਮ"</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="8748101184830239843">"ਮੀਨੂ/ਕੀ-ਬੋਰਡ ਸਵਿੱਚਰ"</item>
+ <item msgid="8802889973626281575">"ਕੀ-ਬੋਰਡ ਸਵਿੱਚਰ"</item>
<item msgid="8175437057325747277">"ਕੋਈ ਨਹੀਂ"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"ਵਿਭਾਜਿਤ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item>
- <item msgid="6210279084134579668">"ਕੇਂਦਰਿਤ"</item>
- <item msgid="89143234390889289">"ਖੱਬੇ-ਇਕਸਾਰ ਕੀਤਾ ਗਿਆ"</item>
- <item msgid="7715533883382410603">"ਸੱਜੇ-ਇਕਸਾਰ ਕੀਤਾ ਗਿਆ"</item>
+ <item msgid="8077901629964902399">"ਸਧਾਰਨ"</item>
+ <item msgid="8256205964297588988">"ਸੰਖੇਪ"</item>
+ <item msgid="8719936228094005878">"ਖੱਬੇ-ਉਲਾਰ"</item>
+ <item msgid="586019486955594690">"ਸੱਜੇ-ਉਲਾਰ"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"ਮੀਨੂ/ਕੀ-ਬੋਰਡ ਸਵਿੱਚਰ"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"ਕੀ-ਬੋਰਡ ਸਵਿੱਚਰ"</string>
<string name="save" msgid="2311877285724540644">"ਰੱਖਿਅਤ ਕਰੋ"</string>
<string name="reset" msgid="2448168080964209908">"ਰੀਸੈੱਟ ਕਰੋ"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"ਬਟਨ ਚੁੜਾਈ ਵਿਵਸਥਿਤ ਕਰੋ"</string>
<string name="clipboard" msgid="1313879395099896312">"ਕਲਿੱਪਬੋਰਡ"</string>
<string name="accessibility_key" msgid="5701989859305675896">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਆਵਾਗੌਣ ਬਟਨ"</string>
- <string name="keycode" msgid="7335281375728356499">"ਕੀਕੋਡ"</string>
- <string name="icon" msgid="8732339849035837289">"ਪ੍ਰਤੀਕ"</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="7058945779098711293">"ਟਾਇਲਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਘਸੀਟੋ"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"ਹਟਾਉਣ ਲਈ ਇੱਥੇ ਘਸੀਟੋ"</string>
<string name="qs_edit" msgid="2232596095725105230">"ਸੰਪਾਦਨ ਕਰੋ"</string>
@@ -670,19 +667,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> ਦਾ <xliff:g id="ID_1">%1$d</xliff:g> ਪੰਨਾ"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"ਲੌਕ ਸਕ੍ਰੀਨ"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"ਵਿਸਤਾਰ ਕਰੋ"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"ਛੋਟਾ ਕਰੋ"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"ਬੰਦ ਕਰੋ"</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_left" msgid="6806490081187499505">"ਖੱਬੇ"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"ਸੱਜੇ"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਕਰੋ"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"ਸ਼ਾਰਟਕੱਟ"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"ਪਾਸਵਰਡ ਲਈ ਪੁੱਛੋ"</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_screenshot" msgid="6314080179230000938">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"ਆਮ ਸੁਨੇਹੇ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ਸਟੋਰੇਜ"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"ਤਤਕਾਲ ਐਪਾਂ"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"ਤਤਕਾਲ ਐਪਾਂ ਨੂੰ ਸਥਾਪਨਾ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ।"</string>
+ <string name="app_info" msgid="6856026610594615344">"ਐਪ ਜਾਣਕਾਰੀ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 3c52089..09159ab 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -520,15 +520,13 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Dzięki zaawansowanym ustawieniom możesz określić poziom ważności powiadomień z aplikacji w skali od 0 do 5. \n\n"<b>"Poziom 5"</b>" \n– Pokazuj u góry listy powiadomień \n– Zezwalaj na powiadomienia na pełnym ekranie \n– Zawsze pokazuj podgląd \n\n"<b>"Poziom 4"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Zawsze pokazuj podgląd \n\n"<b>"Poziom 3"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Nigdy nie pokazuj podglądu \n\n"<b>"Poziom 2"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Nigdy nie pokazuj podglądu \n– NIgdy nie powiadamiaj dźwiękiem ani wibracjami \n\n"<b>"Poziom 1"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Nigdy nie pokazuj podglądu \n– NIgdy nie powiadamiaj dźwiękiem ani wibracjami \n– Ukrywaj na ekranie blokady i pasku stanu \n– Pokazuj u dołu listy powiadomień \n\n"<b>"Poziom 0"</b>" \n– Blokuj wszystkie powiadomienia aplikacji"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Powiadomienia"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Nie będziesz już otrzymywać tych powiadomień."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Powiadomienia aplikacji <xliff:g id="APP">%s</xliff:g>"</string>
- <string name="min_importance" msgid="7559703098688382595">"Niska"</string>
- <string name="low_importance" msgid="6891335321576225228">"Średnia"</string>
- <string name="default_importance" msgid="6400766013567512061">"Wysoka"</string>
- <string name="high_importance" msgid="730741630855788381">"Pilna"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Brak dźwięku i komunikatów wizualnych"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Pokazuj dyskretnie"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Sygnalizacja dźwiękiem"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Sygnalizacja dźwiękiem i wyświetlenie komunikatu"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="few">1 z <xliff:g id="NUMBER_1">%d</xliff:g> kategorii z tej aplikacji</item>
+ <item quantity="many">1 z <xliff:g id="NUMBER_1">%d</xliff:g> kategorii z tej aplikacji</item>
+ <item quantity="other">1 z <xliff:g id="NUMBER_1">%d</xliff:g> kategorii z tej aplikacji</item>
+ <item quantity="one">1 z <xliff:g id="NUMBER_0">%d</xliff:g> kategorii z tej aplikacji</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Wszystkie kategorie"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Więcej ustawień"</string>
<string name="notification_done" msgid="5279426047273930175">"Gotowe"</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>
@@ -602,30 +600,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Wył."</string>
<string name="nav_bar" msgid="1993221402773877607">"Pasek nawigacji"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Układ"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Po lewej"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Po prawej"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Typ przycisku"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Typ dodatkowego lewego przycisku"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Typ dodatkowego prawego przycisku"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(wartość domyślna)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Schowek"</item>
<item msgid="5742013440802239414">"Klawisz"</item>
- <item msgid="8748101184830239843">"Menu / przełączanie klawiatury"</item>
+ <item msgid="8802889973626281575">"Przełączanie klawiatury"</item>
<item msgid="8175437057325747277">"Brak"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Podzielony (wartość domyślna)"</item>
- <item msgid="6210279084134579668">"Wyśrodkowany"</item>
- <item msgid="89143234390889289">"Wyrównany do lewej"</item>
- <item msgid="7715533883382410603">"Wyrównany do prawej"</item>
+ <item msgid="8077901629964902399">"Normalny"</item>
+ <item msgid="8256205964297588988">"Kompaktowy"</item>
+ <item msgid="8719936228094005878">"Pochylony w lewo"</item>
+ <item msgid="586019486955594690">"Pochylony w prawo"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menu / przełączanie klawiatury"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Przełączanie klawiatury"</string>
<string name="save" msgid="2311877285724540644">"Zapisz"</string>
<string name="reset" msgid="2448168080964209908">"Resetuj"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Regulacja szerokości przycisku"</string>
<string name="clipboard" msgid="1313879395099896312">"Schowek"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Niestandardowy przycisk nawigacji"</string>
- <string name="keycode" msgid="7335281375728356499">"Klawisz"</string>
- <string name="icon" msgid="8732339849035837289">"Ikona"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Lewy klawisz"</string>
+ <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>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Przeciągnij, aby dodać kafelki"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Przeciągnij tutaj, by usunąć"</string>
<string name="qs_edit" msgid="2232596095725105230">"Edytuj"</string>
@@ -674,19 +673,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Otwórz ustawienia: <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Edytuj kolejność ustawień."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Strona <xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Ekran blokady"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Rozwiń"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimalizuj"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Zamknij"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefon się nagrzewa"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Podczas obniżania temperatury telefonu niektóre funkcje są ograniczone"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefon automatycznie podejmie próbę obniżenia temperatury. Możesz go wciąż używać, ale telefon może działać wolniej.\n\nGdy temperatura się obniży, telefon będzie działał normalnie."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Po lewej"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Po prawej"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Dostosuj skrót"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Skrót"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Pytaj o hasło"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Lewy skrót"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Prawy skrót"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Lewy skrót również odblokowuje"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Prawy skrót również odblokowuje"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Brak"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Uruchom aplikację <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Inne aplikacje"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Okrąg"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Strzałka w lewo"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Strzałka w prawo"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Aplikacja <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alerty"</string>
<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">"Miejsce"</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>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index e089a8b..19c3c28 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -518,15 +518,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Com controles de ativação de notificações, é possível definir o nível de importância de 0 a 5 para as notificações de um app. \n\n"<b>"Nível 5"</b>" \n- Exibir na parte superior da lista de notificações \n- Permitir interrupção em tela cheia \n- Sempre exibir \n\n"<b>"Nível 4"</b>" \n- Impedir interrupções em tela cheia \n- Sempre exibir \n\n"<b>"Nível 3"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n\n"<b>"Nível 2"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n- Nunca emitir som ou vibrar \n\n"<b>"Nível 1"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n- Nunca emitir som ou vibrar \n- Ocultar da tela de bloqueio e barra de status \n- Exibir na parte inferior da lista de notificações \n\n"<b>"Nível 0"</b>" \n- Bloquear todas as notificações do app"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notificações"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Você deixará de receber essas notificações."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Notificações do app <xliff:g id="APP">%s</xliff:g> para"</string>
- <string name="min_importance" msgid="7559703098688382595">"Baixa"</string>
- <string name="low_importance" msgid="6891335321576225228">"Média"</string>
- <string name="default_importance" msgid="6400766013567512061">"Alta"</string>
- <string name="high_importance" msgid="730741630855788381">"Urgente"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Sem som ou interrupção visual"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Mostrar de forma silenciosa"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Emitir som"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Emitir som e exibir na tela"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 de <xliff:g id="NUMBER_1">%d</xliff:g> categoria desse app</item>
+ <item quantity="other">1 de <xliff:g id="NUMBER_1">%d</xliff:g> categorias desse app</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Todas as categorias"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Mais configurações"</string>
<string name="notification_done" msgid="5279426047273930175">"Concluído"</string>
<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>
@@ -600,30 +596,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Desativado"</string>
<string name="nav_bar" msgid="1993221402773877607">"Barra de navegação"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Layout"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Para a esquerda"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Para a direita"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Tipo de botão"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Tipo de botão esquerdo extra"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Tipo de botão direito extra"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(padrão)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Área de transferência"</item>
<item msgid="5742013440802239414">"Código de tecla"</item>
- <item msgid="8748101184830239843">"Alternador de teclado / menu"</item>
+ <item msgid="8802889973626281575">"Alternador de teclado"</item>
<item msgid="8175437057325747277">"Nenhum"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Dividido (padrão)"</item>
- <item msgid="6210279084134579668">"Centralizado"</item>
- <item msgid="89143234390889289">"Alinhado à esquerda"</item>
- <item msgid="7715533883382410603">"Alinhado à direita"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Compacto"</item>
+ <item msgid="8719936228094005878">"Inclinação à esquerda"</item>
+ <item msgid="586019486955594690">"Inclinação à direita"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Alternador de teclado / menu"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Alternador de teclado"</string>
<string name="save" msgid="2311877285724540644">"Salvar"</string>
<string name="reset" msgid="2448168080964209908">"Redefinir"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Ajustar largura do botão"</string>
<string name="clipboard" msgid="1313879395099896312">"Prancheta"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Botão de navegação personalizado"</string>
- <string name="keycode" msgid="7335281375728356499">"Código de tecla"</string>
- <string name="icon" msgid="8732339849035837289">"Ícone"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Código de tecla à esquerda"</string>
+ <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>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Arraste para adicionar blocos"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Arraste aqui para remover"</string>
<string name="qs_edit" msgid="2232596095725105230">"Editar"</string>
@@ -672,19 +669,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Abrir configurações de <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Editar ordem das configurações."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Tela de bloqueio"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Expandir"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizar"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Fechar"</string>
<string name="high_temp_title" msgid="4589508026407318374">"O smartphone está esquentando"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Alguns recursos ficam limitados enquanto o smartphone é resfriado"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Seu smartphone tentará se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nQuando o smartphone estiver resfriado, ele voltará ao normal."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Para a esquerda"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Para a direita"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Personalizar atalho"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Atalho"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Solicitar senha"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Atalho à esquerda"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Atalho à direita"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"O atalho à esquerda também desbloqueia"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"O atalho à direita também desbloqueia"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Nenhum"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Iniciar <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Outros apps"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Círculo"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Mais"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Menos"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Para a esquerda"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Para a direita"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"App <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 24532a8..d221f3a 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Com os controlos de notificações do consumo de energia, pode definir um nível de importância de 0 a 5 para as notificações de aplicações. \n\n"<b>"Nível 5"</b>" \n- Mostrar no início da lista de notificações \n- Permitir a interrupção do ecrã inteiro \n- Aparecer rapidamente sempre \n\n"<b>"Nível 4"</b>" \n- Impedir a interrupção do ecrã inteiro \n- Aparecer rapidamente sempre\n\n"<b>"Nível 3"</b>" \n- Impedir a interrupção do ecrã inteiro \n- Nunca aparecer rapidamente \n\n"<b>"Nível 2"</b>" \n- Impedir a interrupção do ecrã inteiro \n- Nunca aparecer rapidamente \n- Nunca tocar nem vibrar \n\n"<b>"Nível 1"</b>" \n- Impedir a interrupção do ecrã inteiro \n- Nunca aparecer rapidamente \n- Nunca tocar nem vibrar \n- Ocultar do ecrã de bloqueio e da barra de estado \n- Mostrar no fim da lista de notificações \n\n"<b>"Nível 0"</b>" \n- Bloquear todas as notificações da aplicação"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notificações"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Já não recebe estas notificações."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Notificações da aplicação <xliff:g id="APP">%s</xliff:g> para"</string>
- <string name="min_importance" msgid="7559703098688382595">"Baixa"</string>
- <string name="low_importance" msgid="6891335321576225228">"Média"</string>
- <string name="default_importance" msgid="6400766013567512061">"Alta"</string>
- <string name="high_importance" msgid="730741630855788381">"Urgente"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Sem interrupção sonora ou visual"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Mostrar silenciosamente"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Emitir som"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Emitir som e aparecer no ecrã"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 de <xliff:g id="NUMBER_1">%d</xliff:g> categorias desta aplicação</item>
+ <item quantity="one">1 de <xliff:g id="NUMBER_0">%d</xliff:g> categoria desta aplicação</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Todas as categorias"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Mais definições"</string>
<string name="notification_done" msgid="5279426047273930175">"Concluído"</string>
<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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Desativado"</string>
<string name="nav_bar" msgid="1993221402773877607">"Barra de navegação"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Esquema"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Esquerda"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Direita"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Tipo de botão"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Tipo de botão esquerdo adicional"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Tipo de botão direito adicional"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(predefinição)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Área de transferência"</item>
<item msgid="5742013440802239414">"Código de tecla"</item>
- <item msgid="8748101184830239843">"Menu/comutador de teclado"</item>
+ <item msgid="8802889973626281575">"Comutador de teclado"</item>
<item msgid="8175437057325747277">"Nenhum"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Dividido (predefinição)"</item>
- <item msgid="6210279084134579668">"Centrado"</item>
- <item msgid="89143234390889289">"Alinhado à esquerda"</item>
- <item msgid="7715533883382410603">"Alinhado à direita"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Compacta"</item>
+ <item msgid="8719936228094005878">"Alinhada à esquerda"</item>
+ <item msgid="586019486955594690">"Alinhada à direita"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menu/comutador de teclado"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Comutador de teclado"</string>
<string name="save" msgid="2311877285724540644">"Guardar"</string>
<string name="reset" msgid="2448168080964209908">"Repor"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Ajustar largura do botão"</string>
<string name="clipboard" msgid="1313879395099896312">"Área de transferência"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Botão de navegação personalizado"</string>
- <string name="keycode" msgid="7335281375728356499">"Código de tecla"</string>
- <string name="icon" msgid="8732339849035837289">"Ícone"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Código de tecla esquerdo"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Código de tecla direito"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Ícone esquerdo"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Ícone direito"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Arraste para adicionar mosaicos"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Arrastar para aqui para remover"</string>
<string name="qs_edit" msgid="2232596095725105230">"Editar"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Abrir as definições de <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Editar a ordem das definições."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Ecrã de bloqueio"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Expandir"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizar"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Fechar"</string>
<string name="high_temp_title" msgid="4589508026407318374">"O telemóvel está a aquecer"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Algumas funcionalidades são limitadas enquanto o telemóvel arrefece"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"O telemóvel tenta arrefecer automaticamente. Pode continuar a utilizá-lo, mas este poderá funcionar mais lentamente.\n\nAssim que o telemóvel tiver arrefecido, funcionará normalmente."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Esquerda"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Direita"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Personalizar atalho"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Atalho"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Solicitar palavra-passe"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Atalho esquerdo"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Atalho direito"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"O atalho esquerdo também desbloqueia"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"O atalho direito também desbloqueia"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Nenhum"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Iniciar a aplicação <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Outras aplicações"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Círculo"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Mais"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Menos"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Esquerda"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Direita"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Aplicação <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index e089a8b..19c3c28 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -518,15 +518,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Com controles de ativação de notificações, é possível definir o nível de importância de 0 a 5 para as notificações de um app. \n\n"<b>"Nível 5"</b>" \n- Exibir na parte superior da lista de notificações \n- Permitir interrupção em tela cheia \n- Sempre exibir \n\n"<b>"Nível 4"</b>" \n- Impedir interrupções em tela cheia \n- Sempre exibir \n\n"<b>"Nível 3"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n\n"<b>"Nível 2"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n- Nunca emitir som ou vibrar \n\n"<b>"Nível 1"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n- Nunca emitir som ou vibrar \n- Ocultar da tela de bloqueio e barra de status \n- Exibir na parte inferior da lista de notificações \n\n"<b>"Nível 0"</b>" \n- Bloquear todas as notificações do app"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notificações"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Você deixará de receber essas notificações."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Notificações do app <xliff:g id="APP">%s</xliff:g> para"</string>
- <string name="min_importance" msgid="7559703098688382595">"Baixa"</string>
- <string name="low_importance" msgid="6891335321576225228">"Média"</string>
- <string name="default_importance" msgid="6400766013567512061">"Alta"</string>
- <string name="high_importance" msgid="730741630855788381">"Urgente"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Sem som ou interrupção visual"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Mostrar de forma silenciosa"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Emitir som"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Emitir som e exibir na tela"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 de <xliff:g id="NUMBER_1">%d</xliff:g> categoria desse app</item>
+ <item quantity="other">1 de <xliff:g id="NUMBER_1">%d</xliff:g> categorias desse app</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Todas as categorias"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Mais configurações"</string>
<string name="notification_done" msgid="5279426047273930175">"Concluído"</string>
<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>
@@ -600,30 +596,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Desativado"</string>
<string name="nav_bar" msgid="1993221402773877607">"Barra de navegação"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Layout"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Para a esquerda"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Para a direita"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Tipo de botão"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Tipo de botão esquerdo extra"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Tipo de botão direito extra"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(padrão)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Área de transferência"</item>
<item msgid="5742013440802239414">"Código de tecla"</item>
- <item msgid="8748101184830239843">"Alternador de teclado / menu"</item>
+ <item msgid="8802889973626281575">"Alternador de teclado"</item>
<item msgid="8175437057325747277">"Nenhum"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Dividido (padrão)"</item>
- <item msgid="6210279084134579668">"Centralizado"</item>
- <item msgid="89143234390889289">"Alinhado à esquerda"</item>
- <item msgid="7715533883382410603">"Alinhado à direita"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Compacto"</item>
+ <item msgid="8719936228094005878">"Inclinação à esquerda"</item>
+ <item msgid="586019486955594690">"Inclinação à direita"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Alternador de teclado / menu"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Alternador de teclado"</string>
<string name="save" msgid="2311877285724540644">"Salvar"</string>
<string name="reset" msgid="2448168080964209908">"Redefinir"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Ajustar largura do botão"</string>
<string name="clipboard" msgid="1313879395099896312">"Prancheta"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Botão de navegação personalizado"</string>
- <string name="keycode" msgid="7335281375728356499">"Código de tecla"</string>
- <string name="icon" msgid="8732339849035837289">"Ícone"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Código de tecla à esquerda"</string>
+ <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>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Arraste para adicionar blocos"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Arraste aqui para remover"</string>
<string name="qs_edit" msgid="2232596095725105230">"Editar"</string>
@@ -672,19 +669,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Abrir configurações de <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Editar ordem das configurações."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Tela de bloqueio"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Expandir"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizar"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Fechar"</string>
<string name="high_temp_title" msgid="4589508026407318374">"O smartphone está esquentando"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Alguns recursos ficam limitados enquanto o smartphone é resfriado"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Seu smartphone tentará se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nQuando o smartphone estiver resfriado, ele voltará ao normal."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Para a esquerda"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Para a direita"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Personalizar atalho"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Atalho"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Solicitar senha"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Atalho à esquerda"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Atalho à direita"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"O atalho à esquerda também desbloqueia"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"O atalho à direita também desbloqueia"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Nenhum"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Iniciar <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Outros apps"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Círculo"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Mais"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Menos"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Para a esquerda"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Para a direita"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"App <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 02d1787..2f32f6b 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -520,15 +520,12 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Folosind comenzile de gestionare a notificărilor, puteți să setați un nivel de importanță de la 0 la 5 pentru notificările unei aplicații. \n\n"<b>"Nivelul 5"</b>" \n– Se afișează la începutul listei de notificări \n– Se permite întreruperea pe ecranul complet \n– Se afișează întotdeauna scurt \n\n"<b>"Nivelul 4"</b>" \n– Se împiedică întreruperea pe ecranul complet \n– Se afișează întotdeauna scurt \n\n"<b>"Nivelul 3"</b>" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n\n"<b>"Nivelul 2"</b>" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n– Nu se emit sunete și nu vibrează niciodată \n\n"<b>"Nivelul 1"</b>" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n– Nu se emit sunete și nu vibrează niciodată \n– Se ascunde în ecranul de blocare și în bara de stare \n– Se afișează la finalul listei de notificări \n\n"<b>"Nivelul 0"</b>" \n– Se blochează toate notificările din aplicație"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notificări"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Nu veți mai primi aceste notificări."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Notificări <xliff:g id="APP">%s</xliff:g> pentru"</string>
- <string name="min_importance" msgid="7559703098688382595">"Scăzută"</string>
- <string name="low_importance" msgid="6891335321576225228">"Medie"</string>
- <string name="default_importance" msgid="6400766013567512061">"Ridicată"</string>
- <string name="high_importance" msgid="730741630855788381">"Urgentă"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Fără sunet sau întrerupere vizuală"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Se afișează fără sunet"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Se emite un sunet"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Se emite un sunet și se evidențiază pe ecran"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="few">1 din <xliff:g id="NUMBER_1">%d</xliff:g> categorii din această aplicație</item>
+ <item quantity="other">1 din <xliff:g id="NUMBER_1">%d</xliff:g> de categorii din această aplicație</item>
+ <item quantity="one">1 din <xliff:g id="NUMBER_0">%d</xliff:g> categorie din această aplicație</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Toate categoriile"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Mai multe setări"</string>
<string name="notification_done" msgid="5279426047273930175">"Terminat"</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>
@@ -602,30 +599,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Dezactivați"</string>
<string name="nav_bar" msgid="1993221402773877607">"Bară de navigare"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Aspect"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Stânga"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Dreapta"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Tip de buton"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Tip de buton din extrema stângă"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Tip de buton din extrema dreaptă"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(prestabilit)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Clipboard"</item>
<item msgid="5742013440802239414">"Cod de tastă"</item>
- <item msgid="8748101184830239843">"Comutator meniu/tastatură"</item>
+ <item msgid="8802889973626281575">"Comutator tastatură"</item>
<item msgid="8175437057325747277">"Niciunul"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Împărțită (prestabilit)"</item>
- <item msgid="6210279084134579668">"Centrată"</item>
- <item msgid="89143234390889289">"Aliniată la stânga"</item>
- <item msgid="7715533883382410603">"Aliniată la dreapta"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Compact"</item>
+ <item msgid="8719936228094005878">"Înclinat spre stânga"</item>
+ <item msgid="586019486955594690">"Înclinat spre dreapta"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Comutator meniu/tastatură"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Comutator tastatură"</string>
<string name="save" msgid="2311877285724540644">"Salvați"</string>
<string name="reset" msgid="2448168080964209908">"Resetați"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Ajustați lățimea butonului"</string>
<string name="clipboard" msgid="1313879395099896312">"Clipboard"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Buton personalizat pentru navigare"</string>
- <string name="keycode" msgid="7335281375728356499">"Cod de tastă"</string>
- <string name="icon" msgid="8732339849035837289">"Pictogramă"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Codul de taste din stânga"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Codul de taste din dreapta"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Pictograma din stânga"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Pictograma din dreapta"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Trageți pentru a adăuga sectoare"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Trageți aici pentru a elimina"</string>
<string name="qs_edit" msgid="2232596095725105230">"Editați"</string>
@@ -674,19 +672,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Deschideți setările <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Editați ordinea setărilor."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Pagina <xliff:g id="ID_1">%1$d</xliff:g> din <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Ecran de blocare"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Extindeți"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizați"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Închideți"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefonul se încălzește"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Anumite funcții sunt limitate în timp ce telefonul se răcește"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefonul va încerca automat să se răcească. Puteți folosi telefonul în continuare, dar este posibil să funcționeze mai lent.\n\nDupă ce se răcește, telefonul va funcționa normal."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Stânga"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Dreapta"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Personalizați comanda rapidă"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Comandă rapidă"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Solicitați parola"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Comanda rapidă din stânga"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Comanda rapidă din dreapta"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Comanda rapidă din stânga și deblochează"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Comanda rapidă din dreapta și deblochează"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Niciuna"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Lansați <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Alte aplicații"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Cerc"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Stânga"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Dreapta"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Meniu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Aplicația <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alerte"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index cddbf52..744e322 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -522,15 +522,13 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"С помощью этой функции вы можете устанавливать уровень важности уведомлений от 0 до 5 для каждого приложения.\n\n"<b>"Уровень 5"</b>\n"‒ Помещать уведомления в начало списка.\n‒ Показывать полноэкранные уведомления.\n‒ Показывать всплывающие уведомления.\nУровень 4\n"<b></b>\n"‒ Не показывать полноэкранные уведомления.\n‒ Показывать всплывающие уведомления.\nУровень 3\n"<b></b>\n"‒ Не показывать полноэкранные уведомления.\n‒ Не показывать всплывающие уведомления.\nУровень 2\n"<b></b>\n"‒ Не показывать полноэкранные уведомления.\n‒ Не показывать всплывающие уведомления.\n‒ Не использовать звук и вибрацию.\nУровень 1\n"<b></b>\n"‒ Не показывать полноэкранные уведомления.\n‒ Не показывать всплывающие уведомления.\n‒ Не использовать звук и вибрацию.\n‒ Не показывать на экране блокировки и в строке состояния.\n‒ Помещать уведомления в конец списка.\nУровень 0\n"<b></b>\n"‒ Блокировать все уведомления приложения."</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Уведомления"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Вы больше не будете получать эти уведомления."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g>: уведомления"</string>
- <string name="min_importance" msgid="7559703098688382595">"Низкий приоритет"</string>
- <string name="low_importance" msgid="6891335321576225228">"Средний приоритет"</string>
- <string name="default_importance" msgid="6400766013567512061">"Высокий приоритет"</string>
- <string name="high_importance" msgid="730741630855788381">"Срочно"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Без уведомлений"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Без звука"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Звук"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Звук и всплывающее окно"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 из <xliff:g id="NUMBER_1">%d</xliff:g> категории в этом приложении</item>
+ <item quantity="few">1 из <xliff:g id="NUMBER_1">%d</xliff:g> категорий в этом приложении</item>
+ <item quantity="many">1 из <xliff:g id="NUMBER_1">%d</xliff:g> категорий в этом приложении</item>
+ <item quantity="other">1 из <xliff:g id="NUMBER_1">%d</xliff:g> категорий в этом приложении</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Все категории"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Другие настройки"</string>
<string name="notification_done" msgid="5279426047273930175">"Готово"</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>
@@ -604,30 +602,31 @@
<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="nav_bar_left" msgid="731491280511316123">"Влево"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Вправо"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Тип кнопки"</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="8748101184830239843">"Меню/переключение раскладки"</item>
+ <item msgid="8802889973626281575">"Переключение раскладки"</item>
<item msgid="8175437057325747277">"Нет"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Раздельно (по умолчанию)"</item>
- <item msgid="6210279084134579668">"По центру"</item>
- <item msgid="89143234390889289">"По левому краю"</item>
- <item msgid="7715533883382410603">"По правому краю"</item>
+ <item msgid="8077901629964902399">"Обычная"</item>
+ <item msgid="8256205964297588988">"Компактная"</item>
+ <item msgid="8719936228094005878">"С уклоном влево"</item>
+ <item msgid="586019486955594690">"С уклоном вправо"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Меню/переключение раскладки"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Переключение раскладки"</string>
<string name="save" msgid="2311877285724540644">"Сохранить"</string>
<string name="reset" msgid="2448168080964209908">"Сбросить"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Выбор ширины кнопки"</string>
<string name="clipboard" msgid="1313879395099896312">"Буфер обмена"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Персонализированная кнопка навигации"</string>
- <string name="keycode" msgid="7335281375728356499">"Код клавиши"</string>
- <string name="icon" msgid="8732339849035837289">"Значок"</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="7058945779098711293">"Перетащите нужные элементы"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Чтобы удалить, перетащите сюда"</string>
<string name="qs_edit" msgid="2232596095725105230">"Изменить"</string>
@@ -676,19 +675,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Свернуть"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Закрыть"</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_left" msgid="6806490081187499505">"Левая сторона"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Правая сторона"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Настроить ярлык"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Ярлык"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Подсказка для пароля"</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_screenshot" msgid="6314080179230000938">"Скриншоты"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Сообщения"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Хранилище"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"Приложения с мгновенным запуском"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"Приложения с мгновенным запуском не требуется устанавливать."</string>
+ <string name="app_info" msgid="6856026610594615344">"О приложении"</string>
</resources>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 522f126..1b60299 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"ඔබ තවදුරටත් මෙම දැනුම්දීම් නොලැබෙනු ඇත."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> දැනුම්දීම්"</string>
- <string name="min_importance" msgid="7559703098688382595">"පහළ"</string>
- <string name="low_importance" msgid="6891335321576225228">"මධ්යම"</string>
- <string name="default_importance" msgid="6400766013567512061">"ඉහළ"</string>
- <string name="high_importance" msgid="730741630855788381">"හදිසි"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"ශබ්ද හෝ දෘශ්ය බාධා නැත"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"නිහඬව පෙන්වන්න"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"ශබ්ද කරන්න"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"ශබ්ද කර තිරය මත උත්පතනය කරන්න"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">මෙම යෙදුමෙන් ප්රවර්ග <xliff:g id="NUMBER_1">%d</xliff:g>කින් 1</item>
+ <item quantity="other">මෙම යෙදුමෙන් ප්රවර්ග <xliff:g id="NUMBER_1">%d</xliff:g>කින් 1</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"සියලු ප්රවර්ග"</string>
<string name="notification_more_settings" msgid="816306283396553571">"තව සැකසීම්"</string>
<string name="notification_done" msgid="5279426047273930175">"නිමයි"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"වම්"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"දකුණු"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"බොත්තම් වර්ගය"</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="8748101184830239843">"මෙනු / යතුරු පුවරු මාරුව"</item>
+ <item msgid="8802889973626281575">"යතුරු පුවරු මාරුව"</item>
<item msgid="8175437057325747277">"කිසිවක් නැත"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"බෙදූ (පෙරනිමි)"</item>
- <item msgid="6210279084134579668">"මැදට ගත්"</item>
- <item msgid="89143234390889289">"වමට පෙළගැස්වූ"</item>
- <item msgid="7715533883382410603">"දකුණට පෙළගැස්වූ"</item>
+ <item msgid="8077901629964902399">"සාමාන්ය"</item>
+ <item msgid="8256205964297588988">"සංයුක්ත"</item>
+ <item msgid="8719936228094005878">"වමට-හැරුණු"</item>
+ <item msgid="586019486955594690">"දකුණට-හැරුණු"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"මෙනු / යතුරු පුවරු මාරුව"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"යතුරු පුවරු මාරුව"</string>
<string name="save" msgid="2311877285724540644">"සුරකින්න"</string>
<string name="reset" msgid="2448168080964209908">"යළි පිහිටුවන්න"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"බොත්තම් පළල සීරුමාරු කරන්න"</string>
<string name="clipboard" msgid="1313879395099896312">"පසුරු පුවරුව"</string>
<string name="accessibility_key" msgid="5701989859305675896">"අභිරුචි සංචලන බොත්තම"</string>
- <string name="keycode" msgid="7335281375728356499">"යතුරු කේතය"</string>
- <string name="icon" msgid="8732339849035837289">"නිරූපකය"</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="7058945779098711293">"ටයිල් එක් කිරීමට අදින්න"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"ඉවත් කිරීමට මෙතැනට අදින්න"</string>
<string name="qs_edit" msgid="2232596095725105230">"සංස්කරණය"</string>
@@ -670,19 +667,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> න් <xliff:g id="ID_1">%1$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"අගුලු තිරය"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"දිග හරින්න"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"කුඩා කරන්න"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"වසන්න"</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_left" msgid="6806490081187499505">"වම්"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"දකුණු"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"කෙටි මග අභිරුචිකරණය කරන්න"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"කෙටි මග"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"මුරපදය සඳහා ප්රේරණය කරන්න"</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_screenshot" msgid="6314080179230000938">"තිර රු"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"පොදු පණිවිඩ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ගබඩාව"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"ක්ෂණික යෙදුම්"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"ක්ෂණික යෙදුම් ස්ථාපනය කිරීම අවශ්ය නොවේ."</string>
+ <string name="app_info" msgid="6856026610594615344">"යෙදුම් තොරතුරු"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index d186cac..4ff18ba 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -522,15 +522,13 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Pomocou ovládacích prvkov zobrazovania upozornení môžete nastaviť pre upozornenia aplikácie úroveň dôležitosti od 0 do 5. \n\n"<b>"Úroveň 5"</b>" \n– Zobrazovať v hornej časti zoznamu upozornení. \n– Povoliť prerušenia na celú obrazovku. \n– Vždy zobrazovať čiastočne. \n\n"<b>"Úroveň 4"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Vždy zobrazovať čiastočne. \n\n"<b>"Úroveň 3"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Nikdy nezobrazovať čiastočne. \n\n"<b>"Úroveň 2"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Nikdy nezobrazovať čiastočne. \n– Nikdy nespúšťať zvuk ani vibrácie. \n\n"<b>"Úroveň 1"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Nikdy nezobrazovať čiastočne. \n– Nikdy nespúšťať zvuk ani vibrácie. \n– Skryť na uzamknutej obrazovke a v stavovom riadku. \n– Zobraziť v dolnej časti zoznamu upozornení. \n\n"<b>"Úroveň 0"</b>" \n– Blokovať všetky upozornenia z aplikácie."</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Upozornenia"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Takéto upozornenia už nebudete dostávať."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Upozornenia aplikácie <xliff:g id="APP">%s</xliff:g>"</string>
- <string name="min_importance" msgid="7559703098688382595">"Nízka"</string>
- <string name="low_importance" msgid="6891335321576225228">"Stredná"</string>
- <string name="default_importance" msgid="6400766013567512061">"Vysoká"</string>
- <string name="high_importance" msgid="730741630855788381">"Neodkladná"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Bez zvuku a vizuálneho vyrušenia"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Zobraziť bez zvukov"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Vydať zvukový signál"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Vydať zvukový signál a vyskočiť na obrazovku"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="few">1 z <xliff:g id="NUMBER_1">%d</xliff:g> kategórií z tejto aplikácie</item>
+ <item quantity="many">1 z <xliff:g id="NUMBER_1">%d</xliff:g> kategórie z tejto aplikácie</item>
+ <item quantity="other">1 z <xliff:g id="NUMBER_1">%d</xliff:g> kategórií z tejto aplikácie</item>
+ <item quantity="one">1 z <xliff:g id="NUMBER_0">%d</xliff:g> kategórie z tejto aplikácie</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Všetky kategórie"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Ďalšie nastavenia"</string>
<string name="notification_done" msgid="5279426047273930175">"Hotovo"</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>
@@ -604,30 +602,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Vypnuté"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigačný panel"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Rozloženie"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Doľava"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Doprava"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Typ tlačidla"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Dodatočný typ ľavého tlačidla"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Dodatočný typ pravého tlačidla"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(predvolené)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Schránka"</item>
<item msgid="5742013440802239414">"Kód klávesnice"</item>
- <item msgid="8748101184830239843">"Prepínač – ponuka/klávesnica"</item>
+ <item msgid="8802889973626281575">"Prepínač klávesnice"</item>
<item msgid="8175437057325747277">"Žiadne"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Rozdelené (predvolené)"</item>
- <item msgid="6210279084134579668">"V strede"</item>
- <item msgid="89143234390889289">"Zarovnané doľava"</item>
- <item msgid="7715533883382410603">"Zarovnané doprava"</item>
+ <item msgid="8077901629964902399">"Štandardná"</item>
+ <item msgid="8256205964297588988">"Kompaktná"</item>
+ <item msgid="8719936228094005878">"Naklonená doľava"</item>
+ <item msgid="586019486955594690">"Naklonená doprava"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Prepínač – ponuka/klávesnica"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Prepínač klávesnice"</string>
<string name="save" msgid="2311877285724540644">"Uložiť"</string>
<string name="reset" msgid="2448168080964209908">"Obnoviť"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Upraviť šírku tlačidla"</string>
<string name="clipboard" msgid="1313879395099896312">"Schránka"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Vlastné tlačidlo navigácie"</string>
- <string name="keycode" msgid="7335281375728356499">"Kód klávesnice"</string>
- <string name="icon" msgid="8732339849035837289">"Ikona"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Ľavý kód klávesnice"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Pravý kód klávesnice"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Ľavá ikona"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Pravá ikona"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Dlaždice pridáte presunutím"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Presunutím sem odstránite"</string>
<string name="qs_edit" msgid="2232596095725105230">"Upraviť"</string>
@@ -676,19 +675,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Otvoriť nastavenia <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Upraviť poradie nastavení"</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Strana <xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Uzamknutá obrazovka"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Rozbaliť"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimalizovať"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Zavrieť"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Teplota telefónu stúpa"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Niektoré funkcie budú obmedzené, dokým neklesne teplota telefónu"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Váš telefón sa automaticky pokúsi schladiť. Môžete ho naďalej používať, ale môže fungovať pomalšie.\n\nPo poklese teploty bude telefón fungovať ako normálne."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Vľavo"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Vpravo"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Prispôsobiť skratku"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Skratka"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Požadovať heslo"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Ľavá skratka"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Pravá skratka"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Ľavá skratka tiež odomkne"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Pravá skratka tiež odomkne"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Žiadne"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Spustiť aplikáciu <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Ďalšie aplikácie"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Kruh"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Mínus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Doľava"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Doprava"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Ponuka"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Aplikácia <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Upozornenia"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 9a5ccc9..a689699 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -522,15 +522,13 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"S kontrolniki za pomebnost obvestila je mogoče za obvestila aplikacije nastaviti stopnjo pomembnosti od 0 do 5. \n\n"<b>"Stopnja 5"</b>" \n– Prikaz na vrhu seznama obvestil \n– Omogočanje prekinitev v celozaslonskem načinu \n– Vedno prikaži hitre predoglede \n\n"<b>"Stopnja 4"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Vedno prikaži hitre predoglede \n\n"<b>"Stopnja 3"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Nikoli ne prikaži hitrih predogledov \n\n"<b>"Stopnja 2"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Nikoli ne prikaži hitrih predogledov \n– Nikoli ne uporabi zvoka in vibriranja \n\n"<b>"Stopnja 1"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Nikoli ne prikaži hitrih predogledov \n– Nikoli ne uporabi zvoka in vibriranja \n– Skrivanje na zaklenjenem zaslonu in v vrstici stanja \n– Prikaz na dnu seznama obvestil \n\n"<b>"Stopnja 0"</b>" \n– Blokiranje vseh obvestil aplikacije"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Obvestila"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Teh obvestil ne boste več prejemali."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Obvestila iz aplikacije <xliff:g id="APP">%s</xliff:g> za"</string>
- <string name="min_importance" msgid="7559703098688382595">"Nizka"</string>
- <string name="low_importance" msgid="6891335321576225228">"Srednja"</string>
- <string name="default_importance" msgid="6400766013567512061">"Visoka"</string>
- <string name="high_importance" msgid="730741630855788381">"Nujno"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Brez zvočne ali vizualne prekinitve"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Prikaži brez zvoka"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Predvajaj zvok"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Predvajaj zvok in prikaži na zaslonu"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 od <xliff:g id="NUMBER_1">%d</xliff:g> kategorije iz te aplikacije</item>
+ <item quantity="two">1 od <xliff:g id="NUMBER_1">%d</xliff:g> kategorij iz te aplikacije</item>
+ <item quantity="few">1 od <xliff:g id="NUMBER_1">%d</xliff:g> kategorij iz te aplikacije</item>
+ <item quantity="other">1 od <xliff:g id="NUMBER_1">%d</xliff:g> kategorij iz te aplikacije</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Vse kategorije"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Več nastavitev"</string>
<string name="notification_done" msgid="5279426047273930175">"Dokončano"</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>
@@ -604,30 +602,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Izklop"</string>
<string name="nav_bar" msgid="1993221402773877607">"Vrstica za krmarjenje"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Postavitev"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Levo"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Desno"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Vrsta gumba"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Vrsta dodatnega levega gumba"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Vrsta dodatnega desnega gumba"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(privzeto)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Odložišče"</item>
<item msgid="5742013440802239414">"Koda tipke"</item>
- <item msgid="8748101184830239843">"Preklopnik menija/tipkovnice"</item>
+ <item msgid="8802889973626281575">"Preklopnik tipkovnice"</item>
<item msgid="8175437057325747277">"Brez"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Razdeljeno (privzeto)"</item>
- <item msgid="6210279084134579668">"Na sredini"</item>
- <item msgid="89143234390889289">"Poravnano na levo"</item>
- <item msgid="7715533883382410603">"Poravnano na desno"</item>
+ <item msgid="8077901629964902399">"Običajna"</item>
+ <item msgid="8256205964297588988">"Strnjena"</item>
+ <item msgid="8719936228094005878">"Nagnjena na levo"</item>
+ <item msgid="586019486955594690">"Nagnjena na desno"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Preklopnik menija/tipkovnice"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Preklopnik tipkovnice"</string>
<string name="save" msgid="2311877285724540644">"Shrani"</string>
<string name="reset" msgid="2448168080964209908">"Ponastavi"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Prilagajanje širine gumba"</string>
<string name="clipboard" msgid="1313879395099896312">"Odložišče"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Gumb za krmarjenje po meri"</string>
- <string name="keycode" msgid="7335281375728356499">"Koda tipke"</string>
- <string name="icon" msgid="8732339849035837289">"Ikona"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Leva koda tipke"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Desna koda tipke"</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">"Povlecite, če želite dodati ploščice"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Če želite odstraniti, povlecite sem"</string>
<string name="qs_edit" msgid="2232596095725105230">"Uredi"</string>
@@ -676,19 +675,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Odpri nastavitve za <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Uredi vrstni red nastavitev."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_1">%1$d</xliff:g>. stran od <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Zaklenjen zaslon"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Razširi"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimiraj"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Zapri"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefon se segreva"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Nekatere funkcije bodo med ohlajanjem omejene."</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefon se bo samodejno poskusil ohladiti. Še naprej ga lahko uporabljate, vendar bo morda deloval počasneje.\n\nKo se telefon ohladi, bo zopet deloval kot običajno."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Levo"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Desno"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Prilagodi bližnjico"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Bližnjica"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Poziv za geslo"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Leva bližnjica"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Desna bližnjica"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Levo bližnjico uporabi tudi za odklepanje"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Desno bližnjico uporabi tudi za odklepanje"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Ni izbrana"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Zaženi aplikacijo <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Druge aplikacije"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Krog"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Levo"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Desno"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Meni"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Opozorila"</string>
<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="instant_apps" msgid="6647570248119804907">"Aplikacije brez nameščanja"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"Aplikacij brez nameščanja ni treba namestiti."</string>
+ <string name="app_info" msgid="6856026610594615344">"Podatki o aplikaciji"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 4d8951c..757714fa 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Me kontrollet e njoftimit të energjisë, mund të caktosh një nivel rëndësie nga 0 në 5 për njoftimet e një aplikacioni. \n\n"<b>"Niveli 5"</b>" \n- Shfaq në krye të listës së njoftimeve \n- Lejo ndërprerjen e ekranit të plotë \n- Gjithmonë shfaq shpejt \n\n"<b>"Niveli 4"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Gijthmonë shfaq shpejt \n\n"<b>"Niveli 3"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Asnjëherë mos shfaq shpejt \n\n"<b>"Niveli 2"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Asnjëherë mos shfaq shpejt \n- Asnjëherë mos lësho tingull dhe dridhje \n\n"<b>"Niveli 1"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Asnjëherë mos shfaq shpejt \n- Asnjëherë mos lësho tingull ose dridhje \n- Fshih nga ekrani i kyçjes dhe shiriti i statusit \n- Shfaq në fund të listës së njoftimeve \n\n"<b>"Niveli 0"</b>" \n- Blloko të gjitha njoftimet nga aplikacioni"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Njoftime"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Këto njoftime nuk do t\'i marrësh më."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Njoftimet e <xliff:g id="APP">%s</xliff:g> për"</string>
- <string name="min_importance" msgid="7559703098688382595">"I ulët"</string>
- <string name="low_importance" msgid="6891335321576225228">"Mesatar"</string>
- <string name="default_importance" msgid="6400766013567512061">"I lartë"</string>
- <string name="high_importance" msgid="730741630855788381">"Urgjent"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Asnjë tingull apo ndërprerje vizuale"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Shfaq në heshtje"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Bëj tingull"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Bëj një tingull dhe shfaq në ekran"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 nga <xliff:g id="NUMBER_1">%d</xliff:g> kategori nga ky aplikacion</item>
+ <item quantity="one">1 nga <xliff:g id="NUMBER_0">%d</xliff:g> kategori nga ky aplikacion</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Të gjitha kategoritë"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Cilësime të tjera"</string>
<string name="notification_done" msgid="5279426047273930175">"U krye"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Joaktiv"</string>
<string name="nav_bar" msgid="1993221402773877607">"Shiriti i navigimit"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Struktura"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Majtas"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Djathtas"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Lloji i butonit"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Lloji i butonit shtesë majtas"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Lloji i butonit shtesë djathtas"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(e parazgjedhura)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Kujtesa e fragmenteve"</item>
<item msgid="5742013440802239414">"Kodi i tasteve"</item>
- <item msgid="8748101184830239843">"Ndërruesi i menysë/tastierës"</item>
+ <item msgid="8802889973626281575">"Ndërruesi i tastierës"</item>
<item msgid="8175437057325747277">"Asnjë"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"E ndarë (e parazgjedhura)"</item>
- <item msgid="6210279084134579668">"Në qendër"</item>
- <item msgid="89143234390889289">"Bashkërenditur në të majtë"</item>
- <item msgid="7715533883382410603">"Bashkërenditur në të djathtë"</item>
+ <item msgid="8077901629964902399">"Normale"</item>
+ <item msgid="8256205964297588988">"Kompakte"</item>
+ <item msgid="8719936228094005878">"Me prirje majtas"</item>
+ <item msgid="586019486955594690">"Me prirje djathtas"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Ndërruesi i menysë/tastierës"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Ndërruesi i tastierës"</string>
<string name="save" msgid="2311877285724540644">"Ruaj"</string>
<string name="reset" msgid="2448168080964209908">"Rivendos"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Rregullo gjerësinë e butonit"</string>
<string name="clipboard" msgid="1313879395099896312">"Kujtesa e fragmenteve"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Butoni i personalizuar i navigimit"</string>
- <string name="keycode" msgid="7335281375728356499">"Kodi i tasteve"</string>
- <string name="icon" msgid="8732339849035837289">"Ikona"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Kodi i tasteve majtas"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Kodi i tasteve djathtas"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Ikona majtas"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Ikona djathtas"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Zvarrit për të shtuar pllakëzat"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Zvarrit këtu për ta hequr"</string>
<string name="qs_edit" msgid="2232596095725105230">"Redakto"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Hap cilësimet e <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Modifiko rendin e cilësimeve."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Faqja <xliff:g id="ID_1">%1$d</xliff:g> nga <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Ekrani i kyçjes"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Zgjero"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizo"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Mbyll"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefoni po bëhet i ngrohtë"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Disa funksione janë të kufizuara kur telefoni është duke u ftohur"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefoni yt do të përpiqet automatikisht që të ftohet. Mund ta përdorësh përsëri telefonin, por ai mund të punojë më ngadalë.\n\nPasi telefoni të jetë ftohur, ai do të punojë si normalisht."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Majtas"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Djathtas"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Personalizo shkurtoren"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Shkurtore"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Kërko fjalëkalimin"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Shkurtorja majtas"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Shkurtorja djathtas"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Shkurtorja majtas shkyç po ashtu"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Shkurtorja djathtas shkyç po ashtu"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Asnjë"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Hap aplikacionin <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Aplikacionet e tjera"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Rrethi"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Majtas"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Djathtas"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menyja"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Aplikacioni <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Sinjalizimet"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 66808f7..f02e935 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -518,15 +518,12 @@
<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="5805874247999578073">"Више нећете да добијате ова обавештења."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Обавештења апликације <xliff:g id="APP">%s</xliff:g> за"</string>
- <string name="min_importance" msgid="7559703098688382595">"Ниско"</string>
- <string name="low_importance" msgid="6891335321576225228">"Средње"</string>
- <string name="default_importance" msgid="6400766013567512061">"Високо"</string>
- <string name="high_importance" msgid="730741630855788381">"Хитно"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Без звучног сигнала или визуелног обавештења"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Приказује се без звучног сигнала"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Емитује се звучни сигнал"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Емитује се звучни сигнал и приказује се на екрану"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 од <xliff:g id="NUMBER_1">%d</xliff:g> категорије из ове апликације</item>
+ <item quantity="few">1 од <xliff:g id="NUMBER_1">%d</xliff:g> категорије из ове апликације</item>
+ <item quantity="other">1 од <xliff:g id="NUMBER_1">%d</xliff:g> категорија из ове апликације</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Све категорије"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Још подешавања"</string>
<string name="notification_done" msgid="5279426047273930175">"Готово"</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>
@@ -600,30 +597,31 @@
<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="nav_bar_left" msgid="731491280511316123">"Лево"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Десно"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Тип дугмета"</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="8748101184830239843">"Пребацивач мени/тастатура"</item>
+ <item msgid="8802889973626281575">"Пребацивач за тастатуру"</item>
<item msgid="8175437057325747277">"Ништа"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Подељено (подразумевано)"</item>
- <item msgid="6210279084134579668">"Центрирано"</item>
- <item msgid="89143234390889289">"Поравнато улево"</item>
- <item msgid="7715533883382410603">"Поравнато удесно"</item>
+ <item msgid="8077901629964902399">"Нормални"</item>
+ <item msgid="8256205964297588988">"Компактни"</item>
+ <item msgid="8719936228094005878">"Уз леву страну"</item>
+ <item msgid="586019486955594690">"Уз десну страну"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Мени/Тастатура пребацивач"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Пребацивач за тастатуру"</string>
<string name="save" msgid="2311877285724540644">"Сачувај"</string>
<string name="reset" msgid="2448168080964209908">"Поново постави"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Прилагоди ширину дугмета"</string>
<string name="clipboard" msgid="1313879395099896312">"Привремена меморија"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Прилагођено дугме за навигацију"</string>
- <string name="keycode" msgid="7335281375728356499">"Кôд тастера"</string>
- <string name="icon" msgid="8732339849035837289">"Икона"</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="7058945779098711293">"Превуците да бисте додали плочице"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Превуците овде да бисте уклонили"</string>
<string name="qs_edit" msgid="2232596095725105230">"Измени"</string>
@@ -672,19 +670,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Умањи"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Затвори"</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_left" msgid="6806490081187499505">"Лево"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Десно"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Прилагоди пречицу"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Пречица"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Упит за лозинку"</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_screenshot" msgid="6314080179230000938">"Снимци екрана"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Опште поруке"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Меморијски простор"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"Инстант апликације"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"Инстант апликације не захтевају инсталацију."</string>
+ <string name="app_info" msgid="6856026610594615344">"Информације о апликацији"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index ccde1d2..6778c73 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Med aviseringsinställningarna kan du ange prioritetsnivå från 0 till 5 för aviseringar från en app. \n\n"<b>"Nivå 5"</b>" \n– Visa högst upp i aviseringslistan\n– Tillåt avbrott i helskärmsläge \n– Snabbvisa alltid \n\n"<b>"Nivå 4"</b>" \n– Tillåt inte avbrott i helskärmsläge \n– Snabbvisa alltid \n\n"<b>"Nivå 3"</b>" \n- Tillåt inte avbrott i helskärmsläge \n– Snabbvisa aldrig \n\n"<b>"Nivå 2"</b>" \n– Tillåt inte avbrott i helskärmsläge \n– Snabbvisa aldrig \n– Aldrig med ljud eller vibration \n\n"<b>"Nivå 1"</b>" \n– Tillåt inte avbrott i helskärmsläge \n– Snabbvisa aldrig \n– Aldrig med ljud eller vibration \n– Visa inte på låsskärmen och i statusfältet \n– Visa längst ned i aviseringslistan \n\n"<b>"Nivå 0"</b>" \n– Blockera alla aviseringar från appen"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Aviseringar"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Inga fler aviseringar av det här slaget visas."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Aviseringar från <xliff:g id="APP">%s</xliff:g> –"</string>
- <string name="min_importance" msgid="7559703098688382595">"Låg"</string>
- <string name="low_importance" msgid="6891335321576225228">"Medelhög"</string>
- <string name="default_importance" msgid="6400766013567512061">"Hög"</string>
- <string name="high_importance" msgid="730741630855788381">"Brådskande"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Spela inte upp ljud och visa inte"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Visa utan ljud"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Spela upp ljud"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Spela upp ljud och visa på skärmen"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 av <xliff:g id="NUMBER_1">%d</xliff:g> kategorier från den här appen</item>
+ <item quantity="one">1 av <xliff:g id="NUMBER_0">%d</xliff:g> kategori från den här appen</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Alla kategorier"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Fler inställningar"</string>
<string name="notification_done" msgid="5279426047273930175">"Klar"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Inaktiverat"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigeringsfält"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Layout"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Vänster"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Höger"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Knapptyp"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Knapptyp för extra vänster"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Knapptyp för extra höger"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(standard)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Urklipp"</item>
<item msgid="5742013440802239414">"Tangentkod"</item>
- <item msgid="8748101184830239843">"Byt mellan meny/tangentbord"</item>
+ <item msgid="8802889973626281575">"Byt mellan meny/tangentbord"</item>
<item msgid="8175437057325747277">"Ingen"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"delad (standard)"</item>
- <item msgid="6210279084134579668">"Centrerad"</item>
- <item msgid="89143234390889289">"Vänsterjusterad"</item>
- <item msgid="7715533883382410603">"Högerjusterad"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Kompakt"</item>
+ <item msgid="8719936228094005878">"Lutande åt vänster"</item>
+ <item msgid="586019486955594690">"Lutande åt höger"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Byt mellan meny/tangentbord"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Byt mellan meny/tangentbord"</string>
<string name="save" msgid="2311877285724540644">"Spara"</string>
<string name="reset" msgid="2448168080964209908">"Återställ"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Justera knappens bredd"</string>
<string name="clipboard" msgid="1313879395099896312">"Urklipp"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Anpassad navigeringsknapp"</string>
- <string name="keycode" msgid="7335281375728356499">"Tangentkod"</string>
- <string name="icon" msgid="8732339849035837289">"Ikon"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Vänster tangentkod"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Höger tangentkod"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Vänster ikon"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Höger ikon"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Lägg till rutor genom att dra"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Ta bort genom att dra här"</string>
<string name="qs_edit" msgid="2232596095725105230">"Redigera"</string>
@@ -648,7 +645,7 @@
<string name="accessibility_action_divider_top_50" msgid="6385859741925078668">"Övre 50 %"</string>
<string name="accessibility_action_divider_top_30" msgid="6201455163864841205">"Övre 30 %"</string>
<string name="accessibility_action_divider_bottom_full" msgid="301433196679548001">"Helskärm på nedre skärm"</string>
- <string name="accessibility_qs_edit_tile_label" msgid="8374924053307764245">"Position <xliff:g id="POSITION">%1$d</xliff:g>, <xliff:g id="TILE_NAME">%2$s</xliff:g>. Tryck snabbt två gånger om du vill redigera positionen."</string>
+ <string name="accessibility_qs_edit_tile_label" msgid="8374924053307764245">"Position <xliff:g id="POSITION">%1$d</xliff:g>, <xliff:g id="TILE_NAME">%2$s</xliff:g>. Tryck snabbt två gånger för att redigera positionen."</string>
<string name="accessibility_qs_edit_add_tile_label" msgid="8133209638023882667">"<xliff:g id="TILE_NAME">%1$s</xliff:g>. Lägg till genom att trycka snabbt två gånger."</string>
<string name="accessibility_qs_edit_position_label" msgid="5055306305919289819">"Position <xliff:g id="POSITION">%1$d</xliff:g>. Välj den genom att trycka snabbt två gånger."</string>
<string name="accessibility_qs_edit_move_tile" msgid="2461819993780159542">"Flytta <xliff:g id="TILE_NAME">%1$s</xliff:g>"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Öppna <xliff:g id="ID_1">%s</xliff:g>-inställningarna."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Ändra ordning på inställningarna."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Sida <xliff:g id="ID_1">%1$d</xliff:g> av <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Låsskärm"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Utöka"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimera"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Stäng"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Mobilen börjar bli varm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Vissa funktioner är begränsade medan mobilen svalnar"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Mobilen försöker svalna automatiskt. Du kan fortfarande använda mobilen, men den kan vara långsammare än vanligt.\n\nMobilen fungerar som vanligt när den har svalnat."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Vänster"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Höger"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Anpassa genväg"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Kortkommando"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Kräv lösenord"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Vänster genväg"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Höger genväg"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Lås även upp enheten med vänster genväg"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Lås även upp enheten med höger genväg"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Ingen"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Starta <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Andra appar"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Cirkel"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Vänster"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Höger"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Meny"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Appen <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Varningar"</string>
<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="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"Snabbappar behöver inte installeras."</string>
+ <string name="app_info" msgid="6856026610594615344">"Info om appen"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 2febaa1..f97a582 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Ukiwa na udhibiti wa arifa, unaweza kuweka kiwango cha umuhimu wa arifa za programu kuanzia 0 hadi 5. \n\n"<b>"Kiwango cha 5"</b>" \n- Onyesha katika sehemu ya juu ya orodha ya arifa \n- Ruhusu ukatizaji wa skrini nzima \n- Ruhusu arifa za kuchungulia kila wakati\n\n"<b>"Kiwango cha 4"</b>" \n- Zuia ukatizaji wa skrini nzima\n- Ruhusu arifa za kuchungulia kila wakati \n\n"<b>"Kiwango cha 3"</b>" \n- Zuia ukatizaji wa skrini nzima\n- Usiruhusu kamwe arifa za kuchungulia\n\n"<b>"Kiwango cha 2"</b>" \n- Zuia ukatizaji wa skrini nzima\n- Usiruhusu kamwe arifa za kuchungulia \n- Usiruhusu kamwe sauti au mtetemo \n\n"<b>"Kiwango cha 1"</b>" \n- Zuia ukatizaji wa skrini nzima \n- Usiruhusu kamwe arifa za kuchungulia \n- Usiruhusu kamwe sauti na mtetemo \n- Usionyeshe skrini iliyofungwa na sehemu ya arifa \n- Onyesha katika sehemu ya chini ya orodha ya arifa \n\n"<b>"Kiwango cha 0"</b>" \n- Zuia arifa zote kutoka programu"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Arifa"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Hutapokea arifa hizi tena."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Arifa za <xliff:g id="APP">%s</xliff:g> za"</string>
- <string name="min_importance" msgid="7559703098688382595">"Chini"</string>
- <string name="low_importance" msgid="6891335321576225228">"Wastani"</string>
- <string name="default_importance" msgid="6400766013567512061">"Juu"</string>
- <string name="high_importance" msgid="730741630855788381">"Dharura"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Hakuna kukatizwa kwa sauti au maonyesho"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Onyesha chinichini"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Toa sauti"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Toa sauti na ibukizi kwenye skrini"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">Aina 1 kati ya <xliff:g id="NUMBER_1">%d</xliff:g> kwenye programu hii</item>
+ <item quantity="one">Aina 1 kati ya <xliff:g id="NUMBER_0">%d</xliff:g> kwenye programu hii</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Aina Zote"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Mipangilio zaidi"</string>
<string name="notification_done" msgid="5279426047273930175">"Nimemaliza"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Imezimwa"</string>
<string name="nav_bar" msgid="1993221402773877607">"Sehemu ya viungo muhimu"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Mpangilio"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Kushoto"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Kulia"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Aina ya kitufe"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Aina ya kitufe cha kushoto cha ziada"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Aina ya kitufe cha kulia cha ziada"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(chaguo-msingi)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Ubao wa kunakili"</item>
<item msgid="5742013440802239414">"Msimbo wa ufunguo"</item>
- <item msgid="8748101184830239843">"Swichi ya Menyu / Kibodi"</item>
+ <item msgid="8802889973626281575">"Kibadilishaji cha kibodi"</item>
<item msgid="8175437057325747277">"Hamna"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Iliyogawanywa (chaguo-msingi)"</item>
- <item msgid="6210279084134579668">"Iliyopangiliwa katikati"</item>
- <item msgid="89143234390889289">"Iliyopangiliwa kushoto"</item>
- <item msgid="7715533883382410603">"Iliyopangiliwa kulia"</item>
+ <item msgid="8077901629964902399">"Ya Kawaida"</item>
+ <item msgid="8256205964297588988">"Kushikamana"</item>
+ <item msgid="8719936228094005878">"Inayoegemea kushoto"</item>
+ <item msgid="586019486955594690">"Inayoegemea kulia"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Swichi ya Menyu / Kibodi"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Kibadilishaji cha kibodi"</string>
<string name="save" msgid="2311877285724540644">"Hifadhi"</string>
<string name="reset" msgid="2448168080964209908">"Weka upya"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Rekebisha upana wa kitufe"</string>
<string name="clipboard" msgid="1313879395099896312">"Ubao klipu"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Kitufe maalum cha uelekezaji"</string>
- <string name="keycode" msgid="7335281375728356499">"Msimbo wa ufunguo"</string>
- <string name="icon" msgid="8732339849035837289">"Aikoni"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Msimbo wa ufunguo wa kushoto"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Msimbo wa ufunguo wa kulia"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Aikoni ya kushoto"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Aikoni ya kulia"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Buruta ili uongeze vigae"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Buruta hapa ili uondoe"</string>
<string name="qs_edit" msgid="2232596095725105230">"Badilisha"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Fungua mipangilio ya <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Badilisha orodha ya mipangilio."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Ukurasa wa <xliff:g id="ID_1">%1$d</xliff:g> kati ya <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Skrini iliyofungwa"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Panua"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Punguza"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Funga"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Joto la simu linaongezeka"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Baadhi ya vipengele havitatumika kwenye simu wakati inapoa"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Simu yako itajaribu kupoa kiotomatiki. Bado unaweza kutumia simu yako, lakini huenda ikafanya kazi polepole. \n\nPindi simu yako itakapopoa, itaendelea kufanya kazi kama kawaida."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Kushoto"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Kulia"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Njia ya mkato maalum"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Njia ya mkato"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Omba nenosiri"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Njia ya mkato ya kushoto"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Njia ya mkato ya kulia"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Njia ya mkato ya kushoto pia inafungua"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Njia ya mkato ya kulia pia inafungua"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Hamna"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Anzisha programu <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Programu zingine"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Mduara"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Alama ya kuongeza"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Alama ya kuondoa"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Kushoto"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Kulia"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menyu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Programu ya <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Arifa"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml
index 7e63cbf..c8ffe8f 100644
--- a/packages/SystemUI/res/values-sw600dp/dimens.xml
+++ b/packages/SystemUI/res/values-sw600dp/dimens.xml
@@ -18,7 +18,6 @@
<resources>
<!-- Standard notification width + gravity -->
<dimen name="notification_panel_width">@dimen/standard_notification_panel_width</dimen>
- <integer name="notification_panel_layout_gravity">@integer/standard_notification_panel_layout_gravity</integer>
<!-- Diameter of outer shape drawable shown in navbar search-->
<dimen name="navbar_search_outerring_diameter">430dip</dimen>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 857f297..c7166bd 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"இந்த அறிவிப்புகளை இனி பெறமாட்டீர்கள்."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> அறிவிப்புகள்"</string>
- <string name="min_importance" msgid="7559703098688382595">"குறைவான முக்கியத்துவம்"</string>
- <string name="low_importance" msgid="6891335321576225228">"நடுத்தர முக்கியத்துவம்"</string>
- <string name="default_importance" msgid="6400766013567512061">"அதிக முக்கியத்துவம்"</string>
- <string name="high_importance" msgid="730741630855788381">"அவசரம்"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"ஒலியெழுப்பாது அல்லது காட்சிக் குறுக்கீடு செய்யாது"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"ஒலிக்காமல் காட்டும்"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"ஒலியெழுப்பும்"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"ஒலியெழுப்பி, திரையில் காட்டும்"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <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="notification_all_categories" msgid="5407190218055113282">"எல்லா வகைகளும்"</string>
<string name="notification_more_settings" msgid="816306283396553571">"மேலும் அமைப்புகள்"</string>
<string name="notification_done" msgid="5279426047273930175">"முடிந்தது"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"இடது"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"வலது"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"பொத்தான் வகை"</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="8748101184830239843">"மெனு / விசைப்பலகை மாற்றி"</item>
+ <item msgid="8802889973626281575">"விசைப்பலகை மாற்றி"</item>
<item msgid="8175437057325747277">"ஏதுமில்லை"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"பிரிக்கப்பட்டது (இயல்பு)"</item>
- <item msgid="6210279084134579668">"மையப்படுத்தப்பட்டது"</item>
- <item msgid="89143234390889289">"இடப்புறமாகச் சீரமைக்கப்பட்டது"</item>
- <item msgid="7715533883382410603">"வலப்புறமாகச் சீரமைக்கப்பட்டது"</item>
+ <item msgid="8077901629964902399">"இயல்பானது"</item>
+ <item msgid="8256205964297588988">"சுருக்கமானது"</item>
+ <item msgid="8719936228094005878">"இடப்புறம் சாய்ந்தது"</item>
+ <item msgid="586019486955594690">"வலப்புறம் சாய்ந்தது"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"மெனு / விசைப்பலகை மாற்றி"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"விசைப்பலகை மாற்றி"</string>
<string name="save" msgid="2311877285724540644">"சேமி"</string>
<string name="reset" msgid="2448168080964209908">"மீட்டமை"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"பொத்தானின் அகலத்தை மாற்று"</string>
<string name="clipboard" msgid="1313879395099896312">"கிளிப்போர்டு"</string>
<string name="accessibility_key" msgid="5701989859305675896">"தனிப்பயன் வழிசெலுத்தல் பொத்தான்"</string>
- <string name="keycode" msgid="7335281375728356499">"விசைக்குறியீடு"</string>
- <string name="icon" msgid="8732339849035837289">"ஐகான்"</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="7058945779098711293">"கட்டங்களைச் சேர்க்க, இழுக்கவும்"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"அகற்ற, இங்கே இழுக்கவும்"</string>
<string name="qs_edit" msgid="2232596095725105230">"மாற்று"</string>
@@ -670,19 +667,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"சிறிதாக்கு"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"மூடு"</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_left" msgid="6806490081187499505">"இடது"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"வலது"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"குறுக்குவழியைத் தனிப்பயனாக்கு"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"குறுக்குவழி"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"கடவுச்சொல்லைக் கேள்"</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_screenshot" msgid="6314080179230000938">"ஸ்கிரீன் ஷாட்டுகள்"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"பொதுச் செய்திகள்"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"சேமிப்பிடம்"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"இன்ஸ்டண்ட் பயன்பாடுகள்"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"இன்ஸ்டண்ட் பயன்பாடுகளுக்கு நிறுவல் தேவையில்லை."</string>
+ <string name="app_info" msgid="6856026610594615344">"பயன்பாட்டுத் தகவல்"</string>
</resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 2000ea3..e55fa84 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"మీరు ఇకపై ఈ నోటిఫికేషన్లను పొందరు."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"దీని కోసం <xliff:g id="APP">%s</xliff:g> నోటిఫికేషన్లు"</string>
- <string name="min_importance" msgid="7559703098688382595">"తక్కువ"</string>
- <string name="low_importance" msgid="6891335321576225228">"మధ్యస్థం"</string>
- <string name="default_importance" msgid="6400766013567512061">"అధికం"</string>
- <string name="high_importance" msgid="730741630855788381">"అత్యవసరం"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"శబ్ద లేదా దృశ్య అంతరాయం కలిగించవద్దు"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"నిశ్శబ్దంగా చూపు"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"శబ్దం చేయి"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"శబ్దం చేసి, స్క్రీన్పై చూపు"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">ఈ అనువర్తనం నుండి <xliff:g id="NUMBER_1">%d</xliff:g> వర్గాలలో 1</item>
+ <item quantity="one">ఈ అనువర్తనం నుండి <xliff:g id="NUMBER_0">%d</xliff:g> వర్గంలో 1</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"అన్ని వర్గాలు"</string>
<string name="notification_more_settings" msgid="816306283396553571">"మరిన్ని సెట్టింగ్లు"</string>
<string name="notification_done" msgid="5279426047273930175">"పూర్తయింది"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"ఎడమ"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"కుడి"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"బటన్ రకం"</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="8748101184830239843">"మెను / కీబోర్డ్ స్విచర్"</item>
+ <item msgid="8802889973626281575">"కీబోర్డ్ స్విచర్"</item>
<item msgid="8175437057325747277">"ఏదీ వద్దు"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"విభజించినవి (డిఫాల్ట్)"</item>
- <item msgid="6210279084134579668">"మద్యస్తంగా ఉంచండి"</item>
- <item msgid="89143234390889289">"ఎడమవైపుకు సమలేఖనం చేయబడింది"</item>
- <item msgid="7715533883382410603">"కుడివైపుకు సమలేఖనం చేయబడింది"</item>
+ <item msgid="8077901629964902399">"సాధారణం"</item>
+ <item msgid="8256205964297588988">"సంక్షిప్తమైనది"</item>
+ <item msgid="8719936228094005878">"ఎడమవైపుకు వాలుగా"</item>
+ <item msgid="586019486955594690">"కుడివైపుకు వాలుగా"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"మెను / కీబోర్డ్ స్విచర్"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"కీబోర్డ్ స్విచర్"</string>
<string name="save" msgid="2311877285724540644">"సేవ్ చేయి"</string>
<string name="reset" msgid="2448168080964209908">"రీసెట్ చేయి"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"బటన్ వెడల్పును సర్దుబాటు చేయండి"</string>
<string name="clipboard" msgid="1313879395099896312">"క్లిప్బోర్డ్"</string>
<string name="accessibility_key" msgid="5701989859305675896">"అనుకూల నావిగేషన్ బటన్"</string>
- <string name="keycode" msgid="7335281375728356499">"కీకోడ్"</string>
- <string name="icon" msgid="8732339849035837289">"చిహ్నం"</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="7058945779098711293">"టైల్లను జోడించడానికి లాగండి"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"తీసివేయడానికి ఇక్కడికి లాగండి"</string>
<string name="qs_edit" msgid="2232596095725105230">"సవరించు"</string>
@@ -670,19 +667,32 @@
<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>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g>లో <xliff:g id="ID_1">%1$d</xliff:g>వ పేజీ"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"లాక్ స్క్రీన్"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"విస్తరింపజేయి"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"కనిష్టీకరించు"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"మూసివేయి"</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_left" msgid="6806490081187499505">"ఎడమ"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"కుడి"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"సత్వరమార్గాన్ని అనుకూలీకరించండి"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"సత్వరమార్గం"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"పాస్వర్డ్ కోసం ప్రాంప్ట్ చేయి"</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_screenshot" msgid="6314080179230000938">"స్క్రీన్షాట్లు"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"సాధారణ సందేశాలు"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"నిల్వ"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"తక్షణ అనువర్తనాలు"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"తక్షణ అనువర్తనాలకు ఇన్స్టాలేషన్ అవసరం లేదు."</string>
+ <string name="app_info" msgid="6856026610594615344">"అనువర్తన సమాచారం"</string>
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index ab6da21..c501195 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"คุณจะไม่ได้รับการแจ้งเตือนเหล่านี้อีก"</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"การแจ้งเตือนของ <xliff:g id="APP">%s</xliff:g> สำหรับ"</string>
- <string name="min_importance" msgid="7559703098688382595">"ต่ำ"</string>
- <string name="low_importance" msgid="6891335321576225228">"ปานกลาง"</string>
- <string name="default_importance" msgid="6400766013567512061">"สูง"</string>
- <string name="high_importance" msgid="730741630855788381">"ด่วน"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"ไม่มีภาพหรือเสียงรบกวน"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"แสดงโดยไม่ส่งเสียง"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"ส่งเสียง"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"ส่งเสียงและแสดงบนหน้าจอ"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 จาก <xliff:g id="NUMBER_1">%d</xliff:g> หมวดหมู่ของแอปนี้</item>
+ <item quantity="one">1 จาก <xliff:g id="NUMBER_0">%d</xliff:g> หมวดหมู่ของแอปนี้</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"ทุกหมวดหมู่"</string>
<string name="notification_more_settings" msgid="816306283396553571">"การตั้งค่าเพิ่มเติม"</string>
<string name="notification_done" msgid="5279426047273930175">"เสร็จสิ้น"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"ซ้าย"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"ขวา"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"ประเภทปุ่ม"</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">"Keycode"</item>
- <item msgid="8748101184830239843">"ปุ่มสลับเมนู/แป้นพิมพ์"</item>
+ <item msgid="8802889973626281575">"ปุ่มสลับแป้นพิมพ์"</item>
<item msgid="8175437057325747277">"ไม่มี"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"แยก (ค่าเริ่มต้น)"</item>
- <item msgid="6210279084134579668">"ตรงกลาง"</item>
- <item msgid="89143234390889289">"จัดข้อความชิดซ้าย"</item>
- <item msgid="7715533883382410603">"จัดข้อความชิดขวา"</item>
+ <item msgid="8077901629964902399">"ปกติ"</item>
+ <item msgid="8256205964297588988">"กะทัดรัด"</item>
+ <item msgid="8719936228094005878">"เอนไปทางซ้าย"</item>
+ <item msgid="586019486955594690">"เอนไปทางขวา"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"ปุ่มสลับเมนู/แป้นพิมพ์"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"ปุ่มสลับแป้นพิมพ์"</string>
<string name="save" msgid="2311877285724540644">"บันทึก"</string>
<string name="reset" msgid="2448168080964209908">"รีเซ็ต"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"ปรับความกว้างของปุ่ม"</string>
<string name="clipboard" msgid="1313879395099896312">"คลิปบอร์ด"</string>
<string name="accessibility_key" msgid="5701989859305675896">"ปุ่มนำทางที่กำหนดเอง"</string>
- <string name="keycode" msgid="7335281375728356499">"Keycode"</string>
- <string name="icon" msgid="8732339849035837289">"ไอคอน"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Keycode ทางซ้าย"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Keycode ทางขวา"</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_remove_tiles" msgid="3361212377437088062">"ลากมาที่นี่เพื่อนำออก"</string>
<string name="qs_edit" msgid="2232596095725105230">"แก้ไข"</string>
@@ -670,19 +667,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"ย่อเล็กสุด"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"ปิด"</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_left" msgid="6806490081187499505">"ซ้าย"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"ขวา"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"ปรับแต่งทางลัด"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"ทางลัด"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"แจ้งให้ป้อนรหัสผ่าน"</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_screenshot" msgid="6314080179230000938">"ภาพหน้าจอ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"ข้อความทั่วไป"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"พื้นที่เก็บข้อมูล"</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>
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index c9fd8a2..1789606 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Sa pamamagitan ng mga kontrol sa notification ng power, magagawa mong itakda ang antas ng kahalagahan ng mga notification ng isang app mula 0 hanggang 5. \n\n"<b>"Antas 5"</b>" \n- Ipakita sa itaas ng listahan ng notification \n- Payagan ang pag-istorbo kapag full screen \n- Palaging sumilip \n\n"<b>"Antas 4"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Palaging sumilip \n\n"<b>"Antas 3"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Huwag kailanman sumilip \n\n"<b>"Antas 2"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Huwag kailanman sumilip \n- Huwag kailanman tumunog o mag-vibrate \n\n"<b>"Antas 1"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Huwag kailanman sumilip \n- Huwag kailanman tumunog o mag-vibrate \n- Itago sa lock screen at status bar \n- Ipakita sa ibaba ng listahan ng notification \n\n"<b>"Antas 0"</b>" \n- I-block ang lahat ng notification mula sa app"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Mga Notification"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Hindi mo na matatanggap ang mga notification na ito."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Mga notification ng <xliff:g id="APP">%s</xliff:g> para sa"</string>
- <string name="min_importance" msgid="7559703098688382595">"Mababa"</string>
- <string name="low_importance" msgid="6891335321576225228">"Katamtaman"</string>
- <string name="default_importance" msgid="6400766013567512061">"Mataas"</string>
- <string name="high_importance" msgid="730741630855788381">"Kinakailangan"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Walang tunog o visual na pag-abala"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Ipakita nang tahimik"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Gumawa ng tunog"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Gumawa ng tunog at mag-pop up sa screen"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 sa <xliff:g id="NUMBER_1">%d</xliff:g> kategorya mula sa app na ito</item>
+ <item quantity="other">1 sa <xliff:g id="NUMBER_1">%d</xliff:g> na kategorya mula sa app na ito</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Lahat ng Kategorya"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Higit pang mga setting"</string>
<string name="notification_done" msgid="5279426047273930175">"Tapos Na"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"I-off"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigation bar"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Layout"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Kaliwa"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Kanan"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Uri ng button"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Uri ng extra na button ng kaliwa"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Uri ng extra na button ng kanan"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(default)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Clipboard"</item>
<item msgid="5742013440802239414">"Keycode"</item>
- <item msgid="8748101184830239843">"Menu / Keyboard Switcher"</item>
+ <item msgid="8802889973626281575">"Keyboard switcher"</item>
<item msgid="8175437057325747277">"Wala"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Hati-hati (default)"</item>
- <item msgid="6210279084134579668">"Nasa gitna"</item>
- <item msgid="89143234390889289">"Naka-align sa kaliwa"</item>
- <item msgid="7715533883382410603">"Naka-align sa kanan"</item>
+ <item msgid="8077901629964902399">"Karaniwan"</item>
+ <item msgid="8256205964297588988">"Compact"</item>
+ <item msgid="8719936228094005878">"Nakapanig sa kaliwa"</item>
+ <item msgid="586019486955594690">"Nakapanig sa kanan"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menu / Keyboard Switcher"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Keyboard switcher"</string>
<string name="save" msgid="2311877285724540644">"I-save"</string>
<string name="reset" msgid="2448168080964209908">"I-reset"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Isaayos ang lapad ng button"</string>
<string name="clipboard" msgid="1313879395099896312">"Clipboard"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Custom na button ng navigation"</string>
- <string name="keycode" msgid="7335281375728356499">"Keycode"</string>
- <string name="icon" msgid="8732339849035837289">"Icon"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Kaliwang keycode"</string>
+ <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_remove_tiles" msgid="3361212377437088062">"I-drag dito upang alisin"</string>
<string name="qs_edit" msgid="2232596095725105230">"I-edit"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Buksan ang mga setting ng <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"I-edit ang pagkakasunud-sunod ng mga setting."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Page <xliff:g id="ID_1">%1$d</xliff:g> ng <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Lock screen"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Palawakin"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"I-minimize"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Isara"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Umiinit ang telepono"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Limitado ang ilang feature habang nagku-cool down ang telepono"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Awtomatikong susubukan ng iyong telepono na mag-cool down. Magagamit mo pa rin ang iyong telepono, ngunit maaaring mas mabagal ang paggana nito.\n\nKapag nakapag-cool down na ang iyong telepono, gagana na ito nang normal."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Kaliwa"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Kanan"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"I-customize ang shortcut"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Shortcut"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Mag-prompt para sa password"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Kaliwang shortcut"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Kanang shortcut"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Ina-unlock din ng kaliwang shortcut ang"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Ina-unlock din ng kanang shortcut ang"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Wala"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Ilunsad ang <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Iba pang app"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Circle"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Kaliwa"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Kanan"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> app"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Mga Alerto"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 9baf375e..7675450 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Güç bildirim kontrolleriyle, bir uygulamanın bildirimleri için 0 ile 5 arasında bir önem düzeyi ayarlayabilirsiniz. \n\n"<b>"5. Düzey"</b>" \n- Bildirim listesinin en üstünde gösterilsin \n- Tam ekran kesintisine izin verilsin \n- Ekranda her zaman kısaca belirsin \n\n"<b>"4. Düzey"</b>" \n- Tam ekran kesintisi engellensin \n- Ekranda her zaman kısaca belirsin \n\n"<b>"3. Düzey"</b>" \n- Tam ekran kesintisi engellensin \n- Ekranda hiçbir zaman kısaca belirmesin \n\n"<b>"2. Düzey"</b>" \n- Tam ekran kesintisi engellensin \n- Ekranda hiçbir zaman belirmesin \n- Hiçbir zaman ses çıkarmasın ve titreştirmesin \n\n"<b>"1. Düzey"</b>" \n- Tam ekran kesintisi engellensin \n- Ekranda hiçbir zaman kısaca belirmesin \n- Hiçbir zaman ses çıkarmasın veya titreştirmesin \n- Kilit ekranından ve durum çubuğundan gizlensin \n- Bildirim listesinin en altında gösterilsin \n\n"<b>"0. Düzey"</b>" \n- Uygulamadan gelen tüm bildirimler engellensin"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Bildirimler"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Bu bildirimleri artık almayacaksınız."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Şunun için <xliff:g id="APP">%s</xliff:g> bildirimleri:"</string>
- <string name="min_importance" msgid="7559703098688382595">"Düşük"</string>
- <string name="low_importance" msgid="6891335321576225228">"Orta"</string>
- <string name="default_importance" msgid="6400766013567512061">"Yüksek"</string>
- <string name="high_importance" msgid="730741630855788381">"Acil"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Ses veya görsel kesme yok"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Sessiz bir şekilde göster"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Ses çıkar"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Ses çıkar ve ekranda göster"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">Bu uygulamadan 1 / <xliff:g id="NUMBER_1">%d</xliff:g> kategori</item>
+ <item quantity="one">Bu uygulamadan 1 / <xliff:g id="NUMBER_0">%d</xliff:g> kategori</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Tüm Kategoriler"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Diğer ayarlar"</string>
<string name="notification_done" msgid="5279426047273930175">"Bitti"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Kapalı"</string>
<string name="nav_bar" msgid="1993221402773877607">"Gezinme çubuğu"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Düzen"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Sol"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Sağ"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Düğme türü"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Ekstra sol düğme türü"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Ekstra sağ düğme türü"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(varsayılan)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Pano"</item>
<item msgid="5742013440802239414">"Tuş kodu"</item>
- <item msgid="8748101184830239843">"Menü / Klavye Değiştirici"</item>
+ <item msgid="8802889973626281575">"Klavye değiştirici"</item>
<item msgid="8175437057325747277">"Yok"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Bölünmüş (varsayılan)"</item>
- <item msgid="6210279084134579668">"Ortalanmış"</item>
- <item msgid="89143234390889289">"Sola hizalanmış"</item>
- <item msgid="7715533883382410603">"Sağa hizalanmış"</item>
+ <item msgid="8077901629964902399">"Normal"</item>
+ <item msgid="8256205964297588988">"Küçük boyutlu"</item>
+ <item msgid="8719936228094005878">"Sola yaslanmış"</item>
+ <item msgid="586019486955594690">"Sağa yaslanmış"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menü / Klavye Değiştirici"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Klavye değiştirici"</string>
<string name="save" msgid="2311877285724540644">"Kaydet"</string>
<string name="reset" msgid="2448168080964209908">"Sıfırla"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Düğme genişliğini düzenle"</string>
<string name="clipboard" msgid="1313879395099896312">"Pano"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Özel gezinme düğmesi"</string>
- <string name="keycode" msgid="7335281375728356499">"Tuş kodu"</string>
- <string name="icon" msgid="8732339849035837289">"Simge"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Sol tuş kodu"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Sağ tuş kodu"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Sol simge"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Sağ simge"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Blok eklemek için sürükleyin"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Kaldırmak için buraya sürükleyin"</string>
<string name="qs_edit" msgid="2232596095725105230">"Düzenle"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> ayarlarını aç."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Ayarların sırasını düzenle."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Sayfa <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">"Kilit ekranı"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Genişlet"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Simge durumuna getir"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Kapat"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefon ısınıyor"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Telefon soğurken bazı özellikler sınırlı olarak kullanılabilir"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefonunuz otomatik olarak soğumaya çalışacak. Bu sırada telefonunuzu kullanmaya devam edebilirsiniz ancak uygulamalar daha yavaş çalışabilir.\n\nTelefonunuz soğuduktan sonra normal şekilde çalışacaktır."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Sol"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Sağ"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Kısayolu özelleştir"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Kısayol"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Şifre sor"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Sol kısayol"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Sağ kısayol"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Sol kısayol aynı zamanda kilidi açar"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Sağ kısayol aynı zamanda kilidi açar"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Yok"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"<xliff:g id="APP">%1$s</xliff:g> uygulamasını başlat"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Diğer uygulamalar"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Daire"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Artı"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Eksi"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Sol"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Sağ"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menü"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> uygulaması"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Uyarılar"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index a74014c..774a663 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -522,15 +522,13 @@
<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="5805874247999578073">"Ви більше не отримуватимете ці сповіщення."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Сповіщення з додатка <xliff:g id="APP">%s</xliff:g>:"</string>
- <string name="min_importance" msgid="7559703098688382595">"Низький"</string>
- <string name="low_importance" msgid="6891335321576225228">"Середній"</string>
- <string name="default_importance" msgid="6400766013567512061">"Високий"</string>
- <string name="high_importance" msgid="730741630855788381">"Терміново"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Без звуку та візуальних сповіщень"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Показувати без звукового сигналу"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Зі звуком"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Зі звуком і спливаючими вікнами"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">1 з <xliff:g id="NUMBER_1">%d</xliff:g> категорії з цього додатка</item>
+ <item quantity="few">1 з <xliff:g id="NUMBER_1">%d</xliff:g> категорій із цього додатка</item>
+ <item quantity="many">1 з <xliff:g id="NUMBER_1">%d</xliff:g> категорій із цього додатка</item>
+ <item quantity="other">1 з <xliff:g id="NUMBER_1">%d</xliff:g> категорії з цього додатка</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Усі категорії"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Більше налаштувань"</string>
<string name="notification_done" msgid="5279426047273930175">"Готово"</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>
@@ -604,30 +602,31 @@
<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="nav_bar_left" msgid="731491280511316123">"Ліворуч"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Праворуч"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Тип кнопки"</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="8748101184830239843">"Вибір меню або клавіатури"</item>
+ <item msgid="8802889973626281575">"Вибір клавіатури"</item>
<item msgid="8175437057325747277">"Немає"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Розділений (за умовчанням)"</item>
- <item msgid="6210279084134579668">"Вирівнювання по центру"</item>
- <item msgid="89143234390889289">"Вирівнювання за лівим краєм"</item>
- <item msgid="7715533883382410603">"Вирівнювання за правим краєм"</item>
+ <item msgid="8077901629964902399">"Звичайна панель"</item>
+ <item msgid="8256205964297588988">"Компактна панель"</item>
+ <item msgid="8719936228094005878">"Панель ліворуч"</item>
+ <item msgid="586019486955594690">"Панель праворуч"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Вибір меню або клавіатури"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Вибір клавіатури"</string>
<string name="save" msgid="2311877285724540644">"Зберегти"</string>
<string name="reset" msgid="2448168080964209908">"Віднов."</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Змінити ширину кнопки"</string>
<string name="clipboard" msgid="1313879395099896312">"Буфер обміну"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Спеціальна кнопка навігації"</string>
- <string name="keycode" msgid="7335281375728356499">"Код клавіші"</string>
- <string name="icon" msgid="8732339849035837289">"Значок"</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="7058945779098711293">"Перетягуйте фрагменти, щоб додавати їх"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Перетягніть сюди, щоб видалити"</string>
<string name="qs_edit" msgid="2232596095725105230">"Редагувати"</string>
@@ -676,19 +675,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Згорнути"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Закрити"</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_left" msgid="6806490081187499505">"Ліворуч"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Праворуч"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Налаштувати ярлик"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Комбінація клавіш"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Запит пароля"</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_screenshot" msgid="6314080179230000938">"Знімки екрана"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Загальні повідомлення"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Пам’ять"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"Додатки з миттєвим запуском"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"Додатки з миттєвим запуском не потрібно встановлювати."</string>
+ <string name="app_info" msgid="6856026610594615344">"Про додаток"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 7ea1b1c..ee42e12 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -516,15 +516,11 @@
<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="5805874247999578073">"آپ کو یہ اطلاعات مزید نہیں ملیں گی۔"</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> کیلئے اطلاعات"</string>
- <string name="min_importance" msgid="7559703098688382595">"کم"</string>
- <string name="low_importance" msgid="6891335321576225228">"متوسط"</string>
- <string name="default_importance" msgid="6400766013567512061">"زیادہ"</string>
- <string name="high_importance" msgid="730741630855788381">"ارجنٹ"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"آواز یا بصری مداخلت نہیں ہے"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"خاموشی سے دکھائیں"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"آواز نکالیں"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"آواز نکالیں اور اسکرین پر پاپ کریں"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other"> اس ایپ کے <xliff:g id="NUMBER_1">%d</xliff:g> زمروں میں سے 1</item>
+ <item quantity="one"> اس ایپ کے <xliff:g id="NUMBER_0">%d</xliff:g> زمرہ میں سے 1</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"سبھی زمرے"</string>
<string name="notification_more_settings" msgid="816306283396553571">"مزید ترتیبات"</string>
<string name="notification_done" msgid="5279426047273930175">"ہوگیا"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"بائیں"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"دائیں"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"بٹن کی قسم"</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="8748101184830239843">"مینو/ کی بورڈ سوئچر"</item>
+ <item msgid="8802889973626281575">"کی بورڈ سوئچر"</item>
<item msgid="8175437057325747277">"کوئی نہیں"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"تقسیم شدہ (ڈیفالٹ)"</item>
- <item msgid="6210279084134579668">"بیچوں بیچ"</item>
- <item msgid="89143234390889289">"بائیں جانب موافق کردہ"</item>
- <item msgid="7715533883382410603">"دائیں جانب موافق کردہ"</item>
+ <item msgid="8077901629964902399">"حسب معمول"</item>
+ <item msgid="8256205964297588988">"مختصر"</item>
+ <item msgid="8719936228094005878">"بائیں جانب جھکاؤ"</item>
+ <item msgid="586019486955594690">"دائیں جانب جھکاؤ"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"مینو/ کی بورڈ سوئچر"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"کی بورڈ سوئچر"</string>
<string name="save" msgid="2311877285724540644">"محفوظ کریں"</string>
<string name="reset" msgid="2448168080964209908">"دوبارہ ترتیب دیں"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"بٹن کی چوڑائی ایڈجسٹ کریں"</string>
<string name="clipboard" msgid="1313879395099896312">"کلپ بورڈ"</string>
<string name="accessibility_key" msgid="5701989859305675896">"حسب ضرورت نیویگیشن بٹن"</string>
- <string name="keycode" msgid="7335281375728356499">"کی کوڈ"</string>
- <string name="icon" msgid="8732339849035837289">"آئیکن"</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="7058945779098711293">"ٹائٹلز شامل کرنے کیلئے گھسیٹیں"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"ہٹانے کیلئے یہاں گھسیٹیں؟"</string>
<string name="qs_edit" msgid="2232596095725105230">"ترمیم کریں"</string>
@@ -670,19 +667,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"چھوٹی کریں"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"بند کریں"</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_left" msgid="6806490081187499505">"بائیں"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"دائیں"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"شارٹ کٹ کو حسب ضرورت بنائیں"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"شارٹ کٹ"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"پاسورڈ کا اشارہ"</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_screenshot" msgid="6314080179230000938">"اسکرین شاٹس"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"عمومی پیغامات"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"اسٹوریج"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"فوری ایپس"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"فوری ایپس کو انسٹالیشن کی ضرورت نہیں ہے۔"</string>
+ <string name="app_info" msgid="6856026610594615344">"ایپ کی معلومات"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index ae51151..28bb21a 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -518,15 +518,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Bildirishnomalar uchun kengaytirilgan boshqaruv yordamida ilova bildirishnomalarining muhimlik darajasini (0-5) sozlash mumkin. \n\n"<b>"5-daraja"</b>" \n- Bildirishnomani ro‘yxatning boshida ko‘rsatish \n- To‘liq ekranli bildirishnomalarni ko‘rsatish \n- Qalqib chiquvchi bildirishnomalarni ko‘rsatish \n\n"<b>"4-daraja"</b>" \n- To‘liq ekranli bildirishnomalarni ko‘rsatmaslik \n- Qalqib chiquvchi bildirishnomalarni ko‘rsatish \n\n"<b>"3-daraja"</b>" \n- To‘liq ekranli bildirishnomalarni ko‘rsatmaslik \n- Qalqib chiquvchi bildirishnomalarni ko‘rsatmaslik \n\n"<b>"2-daraja"</b>" \n- To‘liq ekranli bildirishnomalarni ko‘rsatmaslik \n- Qalqib chiquvchi bildirishnomalarni ko‘rsatmaslik \n- Ovoz va tebranishdan foydalanmaslik \n\n"<b>"1-daraja"</b>" \n- To‘liq ekranli bildirishnomalarni ko‘rsatmaslik \n- Qalqib chiquvchi bildirishnomalarni ko‘rsatmaslik \n- Ovoz va tebranishdan foydalanmaslik \n- Ekran qulfi va holat qatorida ko‘rsatmaslik \n- Bildirishnomani ro‘yxatning oxirida ko‘rsatish \n\n"<b>"0-daraja"</b>" \n- Ilovadan keladigan barcha bildirishnomalarni bloklash"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Bildirishnomalar"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Ushbu bildirishnomalar endi ko‘rsatilmaydi."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> bildirishnomalari"</string>
- <string name="min_importance" msgid="7559703098688382595">"Muhim emas"</string>
- <string name="low_importance" msgid="6891335321576225228">"O‘rtacha"</string>
- <string name="default_importance" msgid="6400766013567512061">"O‘ta muhim"</string>
- <string name="high_importance" msgid="730741630855788381">"Shoshilinch"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Bildirishnomalarsiz"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Ovozsiz"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Ovozli"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Ovoz va qalqib chiquvchi oyna"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">Bu ilovadagi <xliff:g id="NUMBER_1">%d</xliff:g> ta turkumdan 1 tasi</item>
+ <item quantity="one">Bu ilovadagi <xliff:g id="NUMBER_0">%d</xliff:g> ta turkumdan 1 tasi</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Barcha turkumlar"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Boshqa sozlamalar"</string>
<string name="notification_done" msgid="5279426047273930175">"Tayyor"</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>
@@ -600,30 +596,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"O‘chiq"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigatsiya paneli"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Sxema"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Chap"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"O‘ng"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Tugma turi"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Qo‘shimcha Chapga tugmasi turi"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Qo‘shimcha O‘ngga tugmasi turi"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(standart)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Vaqtinchalik xotira"</item>
<item msgid="5742013440802239414">"Tugma kodi"</item>
- <item msgid="8748101184830239843">"Menyu/klaviaturani almashtirish"</item>
+ <item msgid="8802889973626281575">"Klaviaturani almashtirish"</item>
<item msgid="8175437057325747277">"Hech biri"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Alohida (standart)"</item>
- <item msgid="6210279084134579668">"Markazda"</item>
- <item msgid="89143234390889289">"Chapga tekislangan"</item>
- <item msgid="7715533883382410603">"O‘ngga tekislangan"</item>
+ <item msgid="8077901629964902399">"Odatiy"</item>
+ <item msgid="8256205964297588988">"Ixcham"</item>
+ <item msgid="8719936228094005878">"Chap tomonga qiya"</item>
+ <item msgid="586019486955594690">"O‘ng tomonga qiya"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Menyu yoki klaviatura"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Klaviaturani almashtirish"</string>
<string name="save" msgid="2311877285724540644">"Saqlash"</string>
<string name="reset" msgid="2448168080964209908">"Asliga qaytarish"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Tugma enini moslashtiring"</string>
<string name="clipboard" msgid="1313879395099896312">"Vaqtinchalik xotira"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Maxsus navigatsiya tugmasi"</string>
- <string name="keycode" msgid="7335281375728356499">"Tugma kodi"</string>
- <string name="icon" msgid="8732339849035837289">"Nishoncha"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Chapga tugmasi kodi"</string>
+ <string name="right_keycode" msgid="708447961000848163">"O‘ngga tugmasi kodi"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Chapga belgisi"</string>
+ <string name="right_icon" msgid="3952104823293824311">"O‘ngga belgisi"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Kerakli elementni tortib qo‘shing"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"O‘chirish uchun bu yerga torting"</string>
<string name="qs_edit" msgid="2232596095725105230">"Tahrirlash"</string>
@@ -672,19 +669,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> sozlamalarini ochish."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Sozlamalar tartibini o‘zgartirish."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_1">%1$d</xliff:g>-sahifa, jami: <xliff:g id="ID_2">%2$d</xliff:g> ta sahifa"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Ekran qulfi"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Yoyish"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Yig‘ish"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Yopish"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Telefon qizib ketdi"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Telefon sovish paytida ayrim funksiyalar ishlamasligi mumkin"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefon avtomatik ravishda o‘zini sovitadi. Telefoningizdan foydalanishda davom etishingiz mumkin, lekin u sekinroq ishlashi mumkin.\n\nTelefon sovishi bilan normal holatda ishlashni boshlaydi."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Chap"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"O‘ng"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Yorliqni sozlash"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Yorliq"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Parol uchun bildirgi"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Chapga yorlig‘i"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"O‘ngga yorlig‘i"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Chapga tugmasi ham qulfdan chiqaradi"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"O‘ngga tugmasi ham qulfdan chiqaradi"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Hech biri"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"<xliff:g id="APP">%1$s</xliff:g> ilovasini ishga tushirish"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Boshqa ilovalar"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Aylana"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Minus"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Chapga"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"O‘ngga"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menyu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> ilovasi"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Ogohlantirishlar"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 043f1ee..82b614d 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -518,15 +518,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Với các kiểm soát thông báo nguồn, bạn có thể đặt cấp độ quan trọng từ 0 đến 5 cho các thông báo của ứng dụng. \n\n"<b>"Cấp 5"</b>" \n- Hiển thị ở đầu danh sách thông báo \n- Cho phép gián đoạn ở chế độ toàn màn hình \n- Luôn xem nhanh \n\n"<b>"Cấp 4"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Luôn xem nhanh \n\n"<b>"Cấp 3"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Không bao giờ xem nhanh \n\n"<b>"Cấp 2"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Không bao giờ xem nhanh \n- Không bao giờ có âm báo và rung \n\n"<b>"Cấp 1"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Không bao giờ xem nhanh \n- Không bao giờ có âm báo và rung \n- Ẩn khỏi màn hình khóa và thanh trạng thái \n- Hiển thị ở cuối danh sách thông báo \n\n"<b>"Cấp 0"</b>" \n- Chặn tất cả các thông báo từ ứng dụng"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Thông báo"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Bạn sẽ không nhận được những thông báo này nữa."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"Thông báo của <xliff:g id="APP">%s</xliff:g> cho"</string>
- <string name="min_importance" msgid="7559703098688382595">"Thấp"</string>
- <string name="low_importance" msgid="6891335321576225228">"Trung bình"</string>
- <string name="default_importance" msgid="6400766013567512061">"Cao"</string>
- <string name="high_importance" msgid="730741630855788381">"Khẩn cấp"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Không làm gián đoạn bằng âm báo hoặc hình ảnh"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Hiển thị mà không phát âm báo"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Phát âm báo"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Phát âm báo và hiển thị trên màn hình"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 / <xliff:g id="NUMBER_1">%d</xliff:g> danh mục từ ứng dụng này</item>
+ <item quantity="one">1 / <xliff:g id="NUMBER_0">%d</xliff:g> danh mục từ ứng dụng này</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Tất cả danh mục"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Cài đặt khác"</string>
<string name="notification_done" msgid="5279426047273930175">"Xong"</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>
@@ -600,30 +596,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Tắt"</string>
<string name="nav_bar" msgid="1993221402773877607">"Thanh điều hướng"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Bố cục"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Bên trái"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Bên phải"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Loại nút"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Loại nút bổ sung bên trái"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Loại nút bổ sung bên phải"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(mặc định)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Khay nhớ tạm"</item>
<item msgid="5742013440802239414">"Mã phím"</item>
- <item msgid="8748101184830239843">"Trình chuyển đổi bàn phím / menu"</item>
+ <item msgid="8802889973626281575">"Trình chuyển đổi bàn phím"</item>
<item msgid="8175437057325747277">"Không có"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Đã căn đều (mặc định)"</item>
- <item msgid="6210279084134579668">"Đã căn giữa"</item>
- <item msgid="89143234390889289">"Đã căn trái"</item>
- <item msgid="7715533883382410603">"Đã căn phải"</item>
+ <item msgid="8077901629964902399">"Bình thường"</item>
+ <item msgid="8256205964297588988">"Cao"</item>
+ <item msgid="8719936228094005878">"Nghiêng sang trái"</item>
+ <item msgid="586019486955594690">"Nghiêng sang phải"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Trình chuyển đổi bàn phím / menu"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Trình chuyển đổi bàn phím"</string>
<string name="save" msgid="2311877285724540644">"Lưu"</string>
<string name="reset" msgid="2448168080964209908">"Đặt lại"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Điều chỉnh chiều rộng nút"</string>
<string name="clipboard" msgid="1313879395099896312">"Khay nhớ tạm"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Nút điều hướng tùy chỉnh"</string>
- <string name="keycode" msgid="7335281375728356499">"Mã phím"</string>
- <string name="icon" msgid="8732339849035837289">"Biểu tượng"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Mã phím bên trái"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Mã phím bên phải"</string>
+ <string name="left_icon" msgid="3096287125959387541">"Biểu tượng bên trái"</string>
+ <string name="right_icon" msgid="3952104823293824311">"Biểu tượng bên phải"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Kéo để thêm ô"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Kéo vào đây để xóa"</string>
<string name="qs_edit" msgid="2232596095725105230">"Chỉnh sửa"</string>
@@ -672,19 +669,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Mở cài đặt <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Chỉnh sửa thứ tự cài đặt."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Trang <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">"Màn hình khóa"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Mở rộng"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Thu nhỏ"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Đóng"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Điện thoại đang nóng lên"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Một số tính năng bị hạn chế trong khi điện thoại nguội dần"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Điện thoại của bạn sẽ tự động nguội dần. Bạn vẫn có thể sử dụng điện thoại, nhưng điện thoại có thể chạy chậm hơn. \n\nSau khi đã nguội, điện thoại sẽ chạy bình thường."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Bên trái"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Bên phải"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Tùy chỉnh lối tắt"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Lối tắt"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Lời nhắc nhập mật khẩu"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Lối tắt bên trái"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Lối tắt bên phải"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Lối tắt bên trái cũng mở khóa"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Lối tắt bên phải cũng mở khóa"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Không có"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Khởi chạy <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Ứng dụng khác"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Vòng kết nối"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Dấu cộng"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Dấu trừ"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Bên trái"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Bên phải"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"Ứng dụng <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Cảnh báo"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index bfaba9e..9c7435a 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -83,8 +83,7 @@
<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 />
+ <string name="accessibility_accessibility_button" msgid="7601252764577607915">"无障碍"</string>
<string name="accessibility_recent" msgid="5208608566793607626">"概览"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"搜索"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"相机"</string>
@@ -517,15 +516,11 @@
<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="5805874247999578073">"您将不会再收到这类通知。"</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"以下频道的<xliff:g id="APP">%s</xliff:g>通知:"</string>
- <string name="min_importance" msgid="7559703098688382595">"低"</string>
- <string name="low_importance" msgid="6891335321576225228">"中"</string>
- <string name="default_importance" msgid="6400766013567512061">"高"</string>
- <string name="high_importance" msgid="730741630855788381">"紧急"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"不发出提示音,也不在屏幕上弹出通知"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"显示通知但不发出提示音"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"发出提示音"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"发出提示音并在屏幕上弹出通知"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">由此应用定义的 1 个类别(共 <xliff:g id="NUMBER_1">%d</xliff:g> 个)</item>
+ <item quantity="one">由此应用定义的 1 个类别(共 <xliff:g id="NUMBER_0">%d</xliff:g> 个)</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"所有类别"</string>
<string name="notification_more_settings" msgid="816306283396553571">"更多设置"</string>
<string name="notification_done" msgid="5279426047273930175">"完成"</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>
@@ -599,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"左侧"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"右侧"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"按钮类型"</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="8748101184830239843">"菜单/键盘切换器"</item>
+ <item msgid="8802889973626281575">"键盘切换器"</item>
<item msgid="8175437057325747277">"无"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"分割(默认)"</item>
- <item msgid="6210279084134579668">"居中"</item>
- <item msgid="89143234390889289">"左对齐"</item>
- <item msgid="7715533883382410603">"右对齐"</item>
+ <item msgid="8077901629964902399">"一般"</item>
+ <item msgid="8256205964297588988">"紧凑"</item>
+ <item msgid="8719936228094005878">"靠左"</item>
+ <item msgid="586019486955594690">"靠右"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"菜单/键盘切换器"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"键盘切换器"</string>
<string name="save" msgid="2311877285724540644">"保存"</string>
<string name="reset" msgid="2448168080964209908">"重置"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"调整按钮宽度"</string>
<string name="clipboard" msgid="1313879395099896312">"剪贴板"</string>
<string name="accessibility_key" msgid="5701989859305675896">"自定义导航按钮"</string>
- <string name="keycode" msgid="7335281375728356499">"键码"</string>
- <string name="icon" msgid="8732339849035837289">"图标"</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="7058945779098711293">"拖动即可添加图块"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"拖动到此处即可移除"</string>
<string name="qs_edit" msgid="2232596095725105230">"修改"</string>
@@ -671,19 +667,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"最小化"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"关闭"</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_left" msgid="6806490081187499505">"左侧"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"右侧"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"自定义快捷方式"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"快捷方式"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"提示输入密码"</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_screenshot" msgid="6314080179230000938">"屏幕截图"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"常规消息"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"存储空间"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"免安装应用"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"免安装应用无需安装就能使用。"</string>
+ <string name="app_info" msgid="6856026610594615344">"应用信息"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 4cdc790..26fc99b 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -518,15 +518,11 @@
<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="5805874247999578073">"您不會再收到這些通知。"</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"以下頻道的「<xliff:g id="APP">%s</xliff:g>」通知:"</string>
- <string name="min_importance" msgid="7559703098688382595">"低"</string>
- <string name="low_importance" msgid="6891335321576225228">"中"</string>
- <string name="default_importance" msgid="6400766013567512061">"高"</string>
- <string name="high_importance" msgid="730741630855788381">"緊急"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"不發出音效或顯示通知"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"顯示通知但不發出音效"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"發出音效"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"發出音效並在螢幕上彈出通知"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">此應用程式的其中 1 個類別 (共 <xliff:g id="NUMBER_1">%d</xliff:g> 個)</item>
+ <item quantity="one">此應用程式的其中 1 個類別 (共 <xliff:g id="NUMBER_0">%d</xliff:g> 個)</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"所有類別"</string>
<string name="notification_more_settings" msgid="816306283396553571">"更多設定"</string>
<string name="notification_done" msgid="5279426047273930175">"完成"</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>
@@ -600,30 +596,31 @@
<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="nav_bar_left" msgid="731491280511316123">"左"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"右"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"按鈕類型"</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="8748101184830239843">"選單/鍵盤切換工具"</item>
+ <item msgid="8802889973626281575">"鍵盤切換工具"</item>
<item msgid="8175437057325747277">"無"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"分隔 (預設)"</item>
- <item msgid="6210279084134579668">"置中"</item>
- <item msgid="89143234390889289">"靠左對齊"</item>
- <item msgid="7715533883382410603">"靠右對齊"</item>
+ <item msgid="8077901629964902399">"一般"</item>
+ <item msgid="8256205964297588988">"精簡"</item>
+ <item msgid="8719936228094005878">"靠左"</item>
+ <item msgid="586019486955594690">"靠右"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"選單/鍵盤切換工具"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"鍵盤切換工具"</string>
<string name="save" msgid="2311877285724540644">"儲存"</string>
<string name="reset" msgid="2448168080964209908">"重設"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"調整按鈕寬度"</string>
<string name="clipboard" msgid="1313879395099896312">"剪貼簿"</string>
<string name="accessibility_key" msgid="5701989859305675896">"自訂導覽按鈕"</string>
- <string name="keycode" msgid="7335281375728356499">"按鍵碼"</string>
- <string name="icon" msgid="8732339849035837289">"圖示"</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="7058945779098711293">"拖曳即可新增圖塊"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"拖曳這裡即可移除"</string>
<string name="qs_edit" msgid="2232596095725105230">"編輯"</string>
@@ -672,19 +669,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"最小化"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"關閉"</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_left" msgid="6806490081187499505">"左"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"右"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"自訂捷徑"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"捷徑"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"輸入密碼提示"</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_screenshot" msgid="6314080179230000938">"螢幕擷取畫面"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"一般訊息"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"儲存空間"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"即時應用程式"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"即時應用程式無需安裝即可使用。"</string>
+ <string name="app_info" msgid="6856026610594615344">"應用程式資料"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 08c2a05..fc756f4 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -158,7 +158,7 @@
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"藍牙網路共用"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"飛行模式。"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"沒有 SIM 卡。"</string>
- <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"行動通訊業者網路正在變更。"</string>
+ <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"電信業者網路正在變更。"</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>
@@ -516,15 +516,11 @@
<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="5805874247999578073">"你不會再收到這類通知。"</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"以下頻道的「<xliff:g id="APP">%s</xliff:g>」通知:"</string>
- <string name="min_importance" msgid="7559703098688382595">"低"</string>
- <string name="low_importance" msgid="6891335321576225228">"中"</string>
- <string name="default_importance" msgid="6400766013567512061">"高"</string>
- <string name="high_importance" msgid="730741630855788381">"緊急"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"不發出音效或顯示通知"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"顯示通知但不發出音效"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"發出音效"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"發出音效並在畫面上彈出通知"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="other">1 個類別是來自這個應用程式 (共 <xliff:g id="NUMBER_1">%d</xliff:g> 個類別)</item>
+ <item quantity="one">1 個類別是來自這個應用程式 (共 <xliff:g id="NUMBER_0">%d</xliff:g> 個類別)</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"所有類別"</string>
<string name="notification_more_settings" msgid="816306283396553571">"更多設定"</string>
<string name="notification_done" msgid="5279426047273930175">"完成"</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>
@@ -598,30 +594,31 @@
<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="nav_bar_left" msgid="731491280511316123">"左側"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"右側"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"按鈕類型"</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="8748101184830239843">"選單/鍵盤切換工具"</item>
+ <item msgid="8802889973626281575">"鍵盤切換工具"</item>
<item msgid="8175437057325747277">"無"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"分割 (預設)"</item>
- <item msgid="6210279084134579668">"置中"</item>
- <item msgid="89143234390889289">"靠左對齊"</item>
- <item msgid="7715533883382410603">"靠右對齊"</item>
+ <item msgid="8077901629964902399">"一般"</item>
+ <item msgid="8256205964297588988">"精簡"</item>
+ <item msgid="8719936228094005878">"靠左"</item>
+ <item msgid="586019486955594690">"靠右"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"選單/鍵盤切換工具"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"鍵盤切換工具"</string>
<string name="save" msgid="2311877285724540644">"儲存"</string>
<string name="reset" msgid="2448168080964209908">"重設"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"調整按鈕寬度"</string>
<string name="clipboard" msgid="1313879395099896312">"剪貼簿"</string>
<string name="accessibility_key" msgid="5701989859305675896">"自訂導覽按鈕"</string>
- <string name="keycode" msgid="7335281375728356499">"按鍵碼"</string>
- <string name="icon" msgid="8732339849035837289">"圖示"</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="7058945779098711293">"拖曳即可新增圖塊"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"拖曳到這裡即可移除"</string>
<string name="qs_edit" msgid="2232596095725105230">"編輯"</string>
@@ -670,19 +667,32 @@
<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>
<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>
<string name="pip_phone_minimize" msgid="1079119422589131792">"最小化"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"關閉"</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_left" msgid="6806490081187499505">"左側"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"右側"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"自訂捷徑"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"捷徑"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"提示輸入密碼"</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_screenshot" msgid="6314080179230000938">"螢幕擷取畫面"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"一般訊息"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"儲存空間"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"免安裝應用程式"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"免安裝應用程式不必安裝就能使用。"</string>
+ <string name="app_info" msgid="6856026610594615344">"應用程式資訊"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 5a513d8..38580ec 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -516,15 +516,11 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Ngezilawuli zesaziso zamandla, ungasetha ileveli ebalulekile kusuka ku-0 kuya ku-5 kusuka kuzaziso zohlelo lokusebenza. \n\n"<b>"Ileveli 5"</b>" \n- Ibonisa phezulu kuhlu lwesaziso \n- Vumela ukuphazamiseka kwesikrini esigcwele \n- Ukuhlola njalo \n\n"<b>"Ileveli 4"</b>" \n- Gwema ukuphazamiseka kwesikrini esigcwele \n- Ukuhlola njalo \n\n"<b>"Ileveli 3"</b>" \n- Gwema ukuphazamiseka kwesikrini esigcwele \n- Ukungahloli \n\n"<b>"Ileveli 2"</b>" \n- Gwema ukuphazamiseka kwesikrini esigcwele \n- Ukungahloli \n- Ungenzi umsindo nokudlidliza \n\n"<b>"Ileveli 1"</b>" \n- Gwema ukuphazamiseka kwesikrini esigcwele \n- Ukungahloli \n- Ungenzi umsindo noma ukudlidliza \n- Fihla kusuka kusikrini sokukhiya nebha yesimo \n- Bonisa phansi kohlu lwesaziso \n\n"<b>"Ileveli 0"</b>" \n- Vimbela zonke izaziso kusuka kuhlelo lokusebenza"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Izaziso"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Ngeke usathola lezi zaziso."</string>
- <string name="notification_importance_header_app" msgid="3572576545406258751">"<xliff:g id="APP">%s</xliff:g> izaziso ze-"</string>
- <string name="min_importance" msgid="7559703098688382595">"Phansi"</string>
- <string name="low_importance" msgid="6891335321576225228">"Okulingene"</string>
- <string name="default_importance" msgid="6400766013567512061">"Okuphezulu"</string>
- <string name="high_importance" msgid="730741630855788381">"Okuphuthumayo"</string>
- <string name="notification_importance_min" msgid="3237794091374404537">"Awukho umsindo noma ukuphazamiseka okubukwayo"</string>
- <string name="notification_importance_low" msgid="8929105501798019743">"Bonisa ngokuthulile"</string>
- <string name="notification_importance_default" msgid="9025125660733917469">"Yenza umsindo"</string>
- <string name="notification_importance_high" msgid="3316555356062640222">"Yenza umsindo ne-pop kusikrini"</string>
+ <plurals name="notification_num_channels_desc" formatted="false" msgid="8808748716499517938">
+ <item quantity="one">isigaba esingu-1 kwezingu-<xliff:g id="NUMBER_1">%d</xliff:g> kusukela kulolu hlelo lokusebenza</item>
+ <item quantity="other">isigaba esingu-1 kwezingu-<xliff:g id="NUMBER_1">%d</xliff:g> kusukela kulolu hlelo lokusebenza</item>
+ </plurals>
+ <string name="notification_all_categories" msgid="5407190218055113282">"Zonke izigaba"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Izilungiselelo eziningi"</string>
<string name="notification_done" msgid="5279426047273930175">"Kwenziwe"</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>
@@ -598,30 +594,31 @@
<string name="switch_bar_off" msgid="8803270596930432874">"Valiwe"</string>
<string name="nav_bar" msgid="1993221402773877607">"Ibha yokuzula"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Isakhiwo"</string>
- <string name="nav_bar_left" msgid="731491280511316123">"Kwesobunxele"</string>
- <string name="nav_bar_right" msgid="2523774879720231974">"Kwesokudla"</string>
- <string name="nav_bar_button_type" msgid="6947806619897153791">"Uhlobo lwenkinobho"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Uhlobo lwenkinobho engakwesokunxele engeziwe"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Uhlobo lwenkinobho engakwesokudla engeziwe"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(okuzenzakalelayo)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Ibhodi lokumanathisela"</item>
<item msgid="5742013440802239414">"Ikhodi yokhiye"</item>
- <item msgid="8748101184830239843">"Isishintshi semenyu / sekhibhodi"</item>
+ <item msgid="8802889973626281575">"Isishintshi sekhibhodi"</item>
<item msgid="8175437057325747277">"Akunalutho"</item>
</string-array>
<string-array name="nav_bar_layouts">
- <item msgid="4967898371682516967">"Kwehlukanisiwe (okuzenzakalelayo)"</item>
- <item msgid="6210279084134579668">"Maphakathi"</item>
- <item msgid="89143234390889289">"Kuqondaniswe kwesokunxele"</item>
- <item msgid="7715533883382410603">"Kuqondaniswe kwesokudla"</item>
+ <item msgid="8077901629964902399">"Okujwayelekile"</item>
+ <item msgid="8256205964297588988">"Xinene"</item>
+ <item msgid="8719936228094005878">"Ukuncika ngakwesokunxele"</item>
+ <item msgid="586019486955594690">"Ukuncika ngakwesokudla"</item>
</string-array>
- <string name="menu_ime" msgid="4943221416525250684">"Isishintshi semenyu / sekhibhodi"</string>
+ <string name="menu_ime" msgid="4998010205321292416">"Isishintshi sekhibhodi"</string>
<string name="save" msgid="2311877285724540644">"Londoloza"</string>
<string name="reset" msgid="2448168080964209908">"Setha kabusha"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Lungisa ububanzi benkinobho"</string>
<string name="clipboard" msgid="1313879395099896312">"Ibhodi lokunamathisela"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Inkinobho yokuzula yangokwezifiso"</string>
- <string name="keycode" msgid="7335281375728356499">"Ikhodi yokhiye"</string>
- <string name="icon" msgid="8732339849035837289">"Isithonjana"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Ikhodi yokhiye engakwesokunxele"</string>
+ <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>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Hudula ukuze ungeze amathayili"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Hudulela lapha ukuze ususe"</string>
<string name="qs_edit" msgid="2232596095725105230">"Hlela"</string>
@@ -670,19 +667,32 @@
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Vula izilungiselelo ze-<xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Hlela uhlelo lwezilungiselelo."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Ikhasi <xliff:g id="ID_1">%1$d</xliff:g> kwangu-<xliff:g id="ID_2">%2$d</xliff:g>"</string>
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"Khiya isikrini"</string>
<string name="pip_phone_expand" msgid="5889780005575693909">"Nweba"</string>
<string name="pip_phone_minimize" msgid="1079119422589131792">"Nciphisa"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Vala"</string>
<string name="high_temp_title" msgid="4589508026407318374">"Ifoni iyafudumala"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Ezinye izici zikhawulelwe ngenkathi ifoni iphola"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Ifoni yakho izozama ngokuzenzakalela ukuphola. Ungasasebenzisa ifoni yakho, kodwa ingasebenza ngokungasheshi.\n\nUma ifoni yakho isipholile, izosebenza ngokuvamile."</string>
- <string name="lockscreen_left" msgid="6806490081187499505">"Kwesobunxele"</string>
- <string name="lockscreen_right" msgid="6093496261656102989">"Kwesokudla"</string>
- <string name="lockscreen_customize" msgid="1288691376862981950">"Yenza ngezifiso isinqamuleli"</string>
- <string name="lockscreen_shortcut" msgid="3734369277470360642">"Isinqamulelo"</string>
- <string name="lockscreen_unlock" msgid="4934466194763269051">"Yalela iphasiwedi"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Isinqamuleli sangakwesokunxele"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Isinqamuleli sangakwesokudla"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"Isinqamuleli sangakwesokunxele naso siyavula"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"Isinqamuleli sangakwesokudla naso siyavula"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Lutho"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Qalisa i-<xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"Ezinye izinhlelo zokusebenza"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"Indingiliza"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"Isengezo"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"Ukususa"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"Kwesokunxele"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"Kwesokudla"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"Imenyu"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> uhlelo lokusebenza"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Izexwayiso"</string>
<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="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>
</resources>
diff --git a/packages/SystemUI/res/values/arrays_tv.xml b/packages/SystemUI/res/values/arrays_tv.xml
new file mode 100644
index 0000000..e52c5db
--- /dev/null
+++ b/packages/SystemUI/res/values/arrays_tv.xml
@@ -0,0 +1,35 @@
+<?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>
+ <!-- List of package names or class names which are considered as Settings,
+ so PIP location should be adjusted to the left of the side panel.
+ If it should be applied for all activities in a package, add the package name.
+ If it should be applied for an activity in a package, add its class name with package name.
+ The class name must follow format 'package_name/.class_name' ('/.' in between).
+ This can be overriden in an overlay.
+ -->
+ <string-array name="tv_pip_settings_class_name" translatable="false">
+ <item>com.android.tv.settings</item>
+ <item>com.google.android.leanbacklauncher/.settings.HomeScreenSettingsActivity</item>
+ <item>com.google.android.apps.mediashell/.settings.CastSettingsActivity</item>
+ <item>com.google.android.katniss.setting/.SpeechSettingsActivity</item>
+ <item>com.google.android.katniss.setting/.SearchSettingsActivity</item>
+ <item>com.google.android.gsf.notouch/.UsageDiagnosticsSettingActivity</item>
+ </string-array>
+</resources>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 7f30c83..f461bb3 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -27,7 +27,6 @@
<color name="notification_list_shadow_top">#80000000</color>
<drawable name="heads_up_notification_bg_pressed">#ff33B5E5</drawable>
<color name="qs_batterymeter_frame_color">#FF404040</color>
- <color name="system_warning_color">@*android:color/system_error</color>
<color name="qs_tile_divider">#29ffffff</color><!-- 16% white -->
<color name="qs_subhead">#99FFFFFF</color><!-- 60% white -->
<color name="qs_detail_button">@*android:color/quaternary_device_default_settings</color>
@@ -147,4 +146,6 @@
<color name="ksh_key_item_color">@color/material_grey_600</color>
<color name="ksh_key_item_background">@color/material_grey_100</color>
+ <color name="instant_apps_color">#ff4d5a64</color>
+
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 2102e07..f42344e 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -201,8 +201,7 @@
<dimen name="volume_dialog_panel_width">@dimen/standard_notification_panel_width</dimen>
<!-- Gravity for the notification panel -->
- <integer name="standard_notification_panel_layout_gravity">0x31</integer><!-- top|center_horizontal -->
- <integer name="notification_panel_layout_gravity">0x37</integer><!-- fill_horizontal|top -->
+ <integer name="notification_panel_layout_gravity">0x31</integer><!-- center_horizontal|top -->
<!-- Height of the carrier/wifi name label -->
<dimen name="carrier_label_height">24dp</dimen>
@@ -219,8 +218,8 @@
<!-- The size of the gesture span needed to activate the "pull" notification expansion -->
<dimen name="pull_span_min">25dp</dimen>
- <dimen name="qs_tile_height">80dp</dimen>
- <dimen name="qs_tile_margin">36dp</dimen>
+ <dimen name="qs_tile_height">88dp</dimen>
+ <dimen name="qs_tile_margin">28dp</dimen>
<dimen name="qs_tile_margin_top">16dp</dimen>
<dimen name="qs_quick_tile_size">48dp</dimen>
<dimen name="qs_quick_tile_padding">12dp</dimen>
@@ -445,8 +444,8 @@
<!-- Amount the date/time move when emergency calls only is present -->
<dimen name="qs_date_time_translation">8dp</dimen>
- <!-- Battery level text padding end when in expanded QS and on Keyguard -->
- <dimen name="battery_level_padding_end">2dp</dimen>
+ <!-- Padding before battery level text in status bar, QS, and Keyguard -->
+ <dimen name="battery_level_padding_start">4dp</dimen>
<!-- The top padding of the clear all button -->
<dimen name="clear_all_padding_top">12dp</dimen>
@@ -600,8 +599,7 @@
<!-- Volume dialog root view bottom margin, at rest -->
<dimen name="volume_dialog_margin_bottom">4dp</dimen>
- <dimen name="volume_dialog_collapsed_padding_top">8dp</dimen>
- <dimen name="volume_dialog_expanded_spacer">14dp</dimen>
+ <dimen name="volume_dialog_padding_top">8dp</dimen>
<dimen name="volume_dialog_padding_end">40dp</dimen>
<dimen name="volume_row_padding_bottom">9.4dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 67def4f..815c41f 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1527,14 +1527,12 @@
<!-- SysUI Tuner: Button that controls layout of navigation bar [CHAR LIMIT=60] -->
<string name="nav_bar_layout">Layout</string>
- <!-- SysUI Tuner: Label for section of settings about the left nav button [CHAR LIMIT=60] -->
- <string name="nav_bar_left">Left</string>
-
- <!-- SysUI Tuner: Label for section of settings about the right nav button [CHAR LIMIT=60] -->
- <string name="nav_bar_right">Right</string>
+ <!-- SysUI Tuner: Setting for button type in nav bar [CHAR LIMIT=60] -->
+ <string name="left_nav_bar_button_type">Extra left button type</string>
<!-- SysUI Tuner: Setting for button type in nav bar [CHAR LIMIT=60] -->
- <string name="nav_bar_button_type">Button type</string>
+ <string name="right_nav_bar_button_type">Extra right button type</string>
+
<!-- SysUI Tuner: Added to nav bar option to indicate it is the default [CHAR LIMIT=60] -->
<string name="nav_bar_default"> (default)</string>
@@ -1543,7 +1541,7 @@
<string-array name="nav_bar_buttons">
<item>Clipboard</item>
<item>Keycode</item>
- <item>Menu / Keyboard Switcher</item>
+ <item>Keyboard switcher</item>
<item>None</item>
</string-array>
<string-array name="nav_bar_button_values" translatable="false">
@@ -1555,10 +1553,10 @@
<!-- SysUI Tuner: Labels for different types of navigation bar layouts [CHAR LIMIT=60] -->
<string-array name="nav_bar_layouts">
- <item>Divided (default)</item>
- <item>Centered</item>
- <item>Left-aligned</item>
- <item>Right-aligned</item>
+ <item>Normal</item>
+ <item>Compact</item>
+ <item>Left-leaning</item>
+ <item>Right-leaning</item>
</string-array>
<string-array name="nav_bar_layouts_values" translatable="false">
@@ -1569,7 +1567,7 @@
</string-array>
<!-- SysUI Tuner: Name of Combination Menu / Keyboard Switcher button [CHAR LIMIT=30] -->
- <string name="menu_ime">Menu / Keyboard Switcher</string>
+ <string name="menu_ime">Keyboard switcher</string>
<!-- SysUI Tuner: Save the current settings [CHAR LIMIT=30] -->
<string name="save">Save</string>
<!-- SysUI Tuner: Reset to default settings [CHAR LIMIT=30] -->
@@ -1585,10 +1583,16 @@
<string name="accessibility_key">Custom navigation button</string>
<!-- SysUI Tuner: Nav bar button that emulates a keycode [CHAR LIMIT=30] -->
- <string name="keycode">Keycode</string>
+ <string name="left_keycode">Left keycode</string>
+
+ <!-- SysUI Tuner: Nav bar button that emulates a keycode [CHAR LIMIT=30] -->
+ <string name="right_keycode">Right keycode</string>
<!-- SysUI Tuner: Settings to change nav bar icon [CHAR LIMIT=30] -->
- <string name="icon">Icon</string>
+ <string name="left_icon">Left icon</string>
+
+ <!-- SysUI Tuner: Settings to change nav bar icon [CHAR LIMIT=30] -->
+ <string name="right_icon">Right icon</string>
<!-- Label for area where tiles can be dragged out of [CHAR LIMIT=60] -->
<string name="drag_to_add_tiles">Drag to add tiles</string>
@@ -1721,10 +1725,17 @@
not appear on production builds ever. -->
<string name="tuner_doze" translatable="false">Ambient Display</string>
+ <!-- Ambient display, Sensors wake up device of the tuner. Non-translatable since it should
+ not appear on production builds ever. -->
+ <string name="tuner_doze_sensors_wake_up_fully" translatable="false">Wake up device on double tap or lift</string>
+
<!-- Ambient display always-on of the tuner. Non-translatable since it should
not appear on production builds ever. -->
<string name="tuner_doze_always_on" translatable="false">Always on</string>
+ <!-- SysUI Tuner: Section to customize lockscreen shortcuts [CHAR LIMIT=60] -->
+ <string name="tuner_lock_screen">Lock screen</string>
+
<!-- Making the PIP fullscreen [CHAR LIMIT=25] -->
<string name="pip_phone_expand">Expand</string>
@@ -1734,18 +1745,6 @@
<!-- Label for PIP the drag to close zone [CHAR LIMIT=NONE]-->
<string name="pip_phone_close">Close</string>
- <!-- PIP section of the tuner. Non-translatable since it should
- not appear on production builds ever. -->
- <string name="picture_in_picture" translatable="false">Picture-in-Picture</string>
-
- <!-- PIP drag to dismiss title. Non-translatable since it should
- not appear on production builds ever. -->
- <string name="pip_drag_to_dismiss_title" translatable="false">Drag to dismiss</string>
-
- <!-- PIP drag to dismiss description. Non-translatable since it should
- not appear on production builds ever. -->
- <string name="pip_drag_to_dismiss_summary" translatable="false">Drag to the dismiss target at the bottom of the screen to close the PIP</string>
-
<!-- Tuner string -->
<string name="change_theme_reboot" translatable="false">Changing the theme requires a restart.</string>
<!-- Tuner string -->
@@ -1760,20 +1759,47 @@
<!-- Text body for dialog alerting user that their phone has reached a certain temperature and may start to slow down in order to cool down. [CHAR LIMIT=300] -->
<string name="high_temp_dialog_message">Your phone will automatically try to cool down. You can still use your phone, but it may run slower.\n\nOnce your phone has cooled down, it will run normally.</string>
- <!-- SysUI Tuner: Group of settings for left lock screen affordance [CHAR LIMIT=60] -->
- <string name="lockscreen_left">Left</string>
-
- <!-- SysUI Tuner: Group of settings for right lock screen affordance [CHAR LIMIT=60] -->
- <string name="lockscreen_right">Right</string>
-
- <!-- SysUI Tuner: Switch controlling whether to customize lock screen button [CHAR LIMIT=60] -->
- <string name="lockscreen_customize">Customize shortcut</string>
+ <!-- SysUI Tuner: Button to select lock screen shortcut [CHAR LIMIT=60] -->
+ <string name="lockscreen_shortcut_left">Left shortcut</string>
<!-- SysUI Tuner: Button to select lock screen shortcut [CHAR LIMIT=60] -->
- <string name="lockscreen_shortcut">Shortcut</string>
+ <string name="lockscreen_shortcut_right">Right shortcut</string>
- <!-- SysUI Tuner: Switch to control if device gets unlocked [CHAR LIMIT=60] -->
- <string name="lockscreen_unlock">Prompt for password</string>
+ <!-- SysUI Tuner: Switch to control if device gets unlocked by left shortcut [CHAR LIMIT=60] -->
+ <string name="lockscreen_unlock_left">Left shortcut also unlocks</string>
+
+ <!-- SysUI Tuner: Switch to control if device gets unlocked by right shortcut [CHAR LIMIT=60] -->
+ <string name="lockscreen_unlock_right">Right shortcut also unlocks</string>
+
+ <!-- SysUI Tuner: Summary of no shortcut being selected [CHAR LIMIT=60] -->
+ <string name="lockscreen_none">None</string>
+
+ <!-- SysUI Tuner: Format string for describing launching an app [CHAR LIMIT=60] -->
+ <string name="tuner_launch_app">Launch <xliff:g id="app" example="Settings">%1$s</xliff:g></string>
+
+ <!-- SysUI Tuner: Label for section of other apps that can be launched [CHAR LIMIT=60] -->
+ <string name="tuner_other_apps">Other apps</string>
+
+ <!-- SysUI Tuner: Label for icon shaped like a circle [CHAR LIMIT=60] -->
+ <string name="tuner_circle">Circle</string>
+
+ <!-- SysUI Tuner: Label for icon shaped like a plus [CHAR LIMIT=60] -->
+ <string name="tuner_plus">Plus</string>
+
+ <!-- SysUI Tuner: Label for icon shaped like a minus [CHAR LIMIT=60] -->
+ <string name="tuner_minus">Minus</string>
+
+ <!-- SysUI Tuner: Label for icon shaped like a left [CHAR LIMIT=60] -->
+ <string name="tuner_left">Left</string>
+
+ <!-- SysUI Tuner: Label for icon shaped like a right [CHAR LIMIT=60] -->
+ <string name="tuner_right">Right</string>
+
+ <!-- SysUI Tuner: Label for icon shaped like a menu [CHAR LIMIT=60] -->
+ <string name="tuner_menu">Menu</string>
+
+ <!-- SysUI Tuner: App subheading for shortcut selection [CHAR LIMIT=60] -->
+ <string name="tuner_app"><xliff:g id="app">%1$s</xliff:g> app</string>
<!-- Title for the notification channel containing important alerts like low battery. [CHAR LIMIT=NONE] -->
<string name="notification_channel_alerts">Alerts</string>
@@ -1784,4 +1810,13 @@
<!-- Title for the notification channel for problems with storage (i.e. low disk). [CHAR LIMIT=NONE] -->
<string name="notification_channel_storage">Storage</string>
+ <!-- App label of the instant apps notification [CHAR LIMIT=60] -->
+ <string name="instant_apps">Instant Apps</string>
+
+ <!-- Message of the instant apps notification indicating they don't need install [CHAR LIMIT=NONE] -->
+ <string name="instant_apps_message">Instant apps don\'t require installation.</string>
+
+ <!-- Action label for launching app info on the specified app [CHAR LIMIT=20] -->
+ <string name="app_info">App info</string>
+
</resources>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 48b7664..9168256 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -30,7 +30,7 @@
<!-- Recents theme -->
<style name="RecentsTheme.Wallpaper">
- <item name="android:windowBackground">@color/transparent</item>
+ <item name="android:windowBackground">@*android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowShowWallpaper">true</item>
<item name="android:windowDisablePreview">true</item>
@@ -52,7 +52,7 @@
<!-- Theme used for the activity that shows when the system forced an app to be resizable -->
<style name="ForcedResizableTheme" parent="@android:style/Theme.Translucent.NoTitleBar">
<item name="android:windowBackground">@drawable/forced_resizable_background</item>
- <item name="android:statusBarColor">@color/transparent</item>
+ <item name="android:statusBarColor">@*android:color/transparent</item>
<item name="android:windowAnimationStyle">@style/Animation.ForcedResizable</item>
</style>
@@ -70,7 +70,7 @@
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@null</item>
<item name="android:colorBackgroundCacheHint">@null</item>
- <item name="android:statusBarColor">@color/transparent</item>
+ <item name="android:statusBarColor">@*android:color/transparent</item>
<item name="android:windowAnimationStyle">@style/Animation.PipPhoneOverlayControl</item>
</style>
@@ -164,7 +164,7 @@
<style name="TextAppearance.QS.Warning">
<item name="android:textSize">14sp</item>
- <item name="android:textColor">@color/system_warning_color</item>
+ <item name="android:textColor">?android:attr/colorError</item>
</style>
<style name="TextAppearance.QS.DetailButton">
@@ -366,7 +366,7 @@
</style>
<style name="TextAppearance.NotificationGuts.SecondaryWarning">
- <item name="android:textColor">@color/system_warning_color</item>
+ <item name="android:textColor">?android:attr/colorError</item>
<item name="android:textSize">12sp</item>
</style>
diff --git a/packages/SystemUI/res/xml/lockscreen_settings.xml b/packages/SystemUI/res/xml/lockscreen_settings.xml
index 73e29af..1e7d266 100644
--- a/packages/SystemUI/res/xml/lockscreen_settings.xml
+++ b/packages/SystemUI/res/xml/lockscreen_settings.xml
@@ -18,42 +18,25 @@
xmlns:sysui="http://schemas.android.com/apk/res-auto"
android:title="@string/other">
- <PreferenceCategory
- android:key="left"
- android:title="@string/lockscreen_left">
- <SwitchPreference
- android:key="customize"
- android:title="@string/lockscreen_customize" />
+ <Preference
+ android:key="sysui_keyguard_left"
+ android:title="@string/lockscreen_shortcut_left"
+ android:fragment="com.android.systemui.tuner.ShortcutPicker" />
- <Preference
- android:key="shortcut"
- android:title="@string/lockscreen_shortcut" />
+ <com.android.systemui.tuner.TunerSwitch
+ android:key="sysui_keyguard_left_unlock"
+ android:title="@string/lockscreen_unlock_left"
+ sysui:defValue="true" />
- <com.android.systemui.tuner.TunerSwitch
- android:key="sysui_keyguard_left_unlock"
- android:title="@string/lockscreen_unlock"
- sysui:defValue="true" />
+ <Preference
+ android:key="sysui_keyguard_right"
+ android:title="@string/lockscreen_shortcut_right"
+ android:fragment="com.android.systemui.tuner.ShortcutPicker" />
- </PreferenceCategory>
-
- <PreferenceCategory
- android:key="right"
- android:title="@string/lockscreen_right">
-
- <SwitchPreference
- android:key="customize"
- android:title="@string/lockscreen_customize" />
-
- <Preference
- android:key="shortcut"
- android:title="@string/lockscreen_shortcut" />
-
- <com.android.systemui.tuner.TunerSwitch
- android:key="sysui_keyguard_right_unlock"
- android:title="@string/lockscreen_unlock"
- sysui:defValue="true" />
-
- </PreferenceCategory>
+ <com.android.systemui.tuner.TunerSwitch
+ android:key="sysui_keyguard_right_unlock"
+ android:title="@string/lockscreen_unlock_right"
+ sysui:defValue="true" />
</PreferenceScreen>
diff --git a/packages/SystemUI/res/xml/nav_bar_tuner.xml b/packages/SystemUI/res/xml/nav_bar_tuner.xml
index 6fa8bec..68e8fad 100644
--- a/packages/SystemUI/res/xml/nav_bar_tuner.xml
+++ b/packages/SystemUI/res/xml/nav_bar_tuner.xml
@@ -18,7 +18,7 @@
xmlns:sysui="http://schemas.android.com/apk/res-auto"
android:title="@string/nav_bar">
- <ListPreference
+ <com.android.systemui.tuner.RadioListPreference
android:key="layout"
android:title="@string/nav_bar_layout"
android:summary="%s"
@@ -26,54 +26,42 @@
android:entries="@array/nav_bar_layouts"
android:entryValues="@array/nav_bar_layouts_values" />
- <PreferenceCategory
- android:key="left"
- android:title="@string/nav_bar_left">
+ <com.android.systemui.tuner.RadioListPreference
+ android:key="type_left"
+ android:title="@string/left_nav_bar_button_type"
+ android:persistent="false"
+ android:summary="%s"
+ android:entries="@array/nav_bar_buttons"
+ android:entryValues="@array/nav_bar_button_values" />
- <DropDownPreference
- android:key="type_left"
- android:title="@string/nav_bar_button_type"
- android:persistent="false"
- android:summary="%s"
- android:entries="@array/nav_bar_buttons"
- android:entryValues="@array/nav_bar_button_values" />
+ <Preference
+ android:key="keycode_left"
+ android:persistent="false"
+ android:title="@string/left_keycode" />
- <Preference
- android:key="keycode_left"
- android:persistent="false"
- android:title="@string/keycode" />
+ <com.android.systemui.tuner.RadioListPreference
+ android:key="icon_left"
+ android:persistent="false"
+ android:summary="%s"
+ android:title="@string/left_icon" />
- <com.android.systemui.tuner.BetterListPreference
- android:key="icon_left"
- android:persistent="false"
- android:summary="%s"
- android:title="@string/icon" />
+ <com.android.systemui.tuner.RadioListPreference
+ android:key="type_right"
+ android:title="@string/right_nav_bar_button_type"
+ android:summary="%s"
+ android:persistent="false"
+ android:entries="@array/nav_bar_buttons"
+ android:entryValues="@array/nav_bar_button_values" />
- </PreferenceCategory>
+ <Preference
+ android:key="keycode_right"
+ android:persistent="false"
+ android:title="@string/right_keycode" />
- <PreferenceCategory
- android:key="right"
- android:title="@string/nav_bar_right">
-
- <DropDownPreference
- android:key="type_right"
- android:title="@string/nav_bar_button_type"
- android:summary="%s"
- android:persistent="false"
- android:entries="@array/nav_bar_buttons"
- android:entryValues="@array/nav_bar_button_values" />
-
- <Preference
- android:key="keycode_right"
- android:persistent="false"
- android:title="@string/keycode" />
-
- <com.android.systemui.tuner.BetterListPreference
- android:key="icon_right"
- android:persistent="false"
- android:summary="%s"
- android:title="@string/icon" />
-
- </PreferenceCategory>
+ <com.android.systemui.tuner.RadioListPreference
+ android:key="icon_right"
+ android:persistent="false"
+ android:summary="%s"
+ android:title="@string/right_icon" />
</PreferenceScreen>
diff --git a/packages/SystemUI/res/xml/tuner_prefs.xml b/packages/SystemUI/res/xml/tuner_prefs.xml
index 6198ab7..41135f5 100644
--- a/packages/SystemUI/res/xml/tuner_prefs.xml
+++ b/packages/SystemUI/res/xml/tuner_prefs.xml
@@ -122,18 +122,6 @@
</PreferenceScreen>
<PreferenceScreen
- android:key="picture_in_picture"
- android:title="@string/picture_in_picture">
-
- <com.android.systemui.tuner.TunerSwitch
- android:key="pip_drag_to_dismiss"
- android:title="@string/pip_drag_to_dismiss_title"
- android:summary="@string/pip_drag_to_dismiss_summary"
- sysui:defValue="false" />
-
- </PreferenceScreen>
-
- <PreferenceScreen
android:key="doze"
android:title="@string/tuner_doze">
@@ -142,6 +130,11 @@
android:title="@string/tuner_doze_always_on"
sysui:defValue="false" />
+ <com.android.systemui.tuner.TunerSwitch
+ android:key="doze_sensors_wake_up_fully"
+ android:title="@string/tuner_doze_sensors_wake_up_fully"
+ sysui:defValue="false" />
+
</PreferenceScreen>
<Preference
@@ -151,15 +144,10 @@
<Preference
android:key="lockscreen"
- android:title="@string/accessibility_desc_lock_screen"
+ android:title="@string/tuner_lock_screen"
android:fragment="com.android.systemui.tuner.LockscreenFragment" />
<Preference
- android:key="other"
- android:title="@string/other"
- android:fragment="com.android.systemui.tuner.OtherPrefs" />
-
- <Preference
android:key="plugins"
android:title="@string/plugins"
android:fragment="com.android.systemui.tuner.PluginFragment" />
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 80d4a26..1f58d4c 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -595,6 +595,10 @@
}
}
+ public boolean isScreenOn() {
+ return mScreenOn;
+ }
+
static class DisplayClientState {
public int clientGeneration;
public boolean clearing;
diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
index 1518bdc..45f1686 100644
--- a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
+++ b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
@@ -89,7 +89,6 @@
setOnClickListener(mListener);
setOnHoverListener(new LiftToActivateListener(context));
- setAccessibilityDelegate(new ObscureSpeechDelegate(context));
mEnableHaptics = new LockPatternUtils(context).isTactileFeedbackEnabled();
@@ -134,14 +133,6 @@
}
@Override
- public void onDetachedFromWindow() {
- super.onDetachedFromWindow();
-
- // Reset the "announced headset" flag when detached.
- ObscureSpeechDelegate.sAnnouncedHeadset = false;
- }
-
- @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
measureChildren(widthMeasureSpec, heightMeasureSpec);
diff --git a/packages/SystemUI/src/com/android/keyguard/ObscureSpeechDelegate.java b/packages/SystemUI/src/com/android/keyguard/ObscureSpeechDelegate.java
deleted file mode 100644
index 410a43a..0000000
--- a/packages/SystemUI/src/com/android/keyguard/ObscureSpeechDelegate.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * 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 com.android.keyguard;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.media.AudioManager;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.view.View;
-import android.view.View.AccessibilityDelegate;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityNodeInfo;
-
-import com.android.internal.R;
-
-/**
- * Accessibility delegate that obscures speech for a view when the user has
- * not turned on the "speak passwords" preference and is not listening
- * through headphones.
- */
-class ObscureSpeechDelegate extends AccessibilityDelegate {
- /** Whether any client has announced the "headset" notification. */
- static boolean sAnnouncedHeadset = false;
-
- private final ContentResolver mContentResolver;
- private final AudioManager mAudioManager;
-
- public ObscureSpeechDelegate(Context context) {
- mContentResolver = context.getContentResolver();
- mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
- }
-
- @Override
- public void sendAccessibilityEvent(View host, int eventType) {
- super.sendAccessibilityEvent(host, eventType);
-
- // Play the "headset required" announcement the first time the user
- // places accessibility focus on a key.
- if ((eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED)
- && !sAnnouncedHeadset && shouldObscureSpeech()) {
- sAnnouncedHeadset = true;
- host.announceForAccessibility(host.getContext().getString(
- R.string.keyboard_headset_required_to_hear_password));
- }
- }
-
- @Override
- public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
- super.onPopulateAccessibilityEvent(host, event);
-
- if ((event.getEventType() != AccessibilityEvent.TYPE_ANNOUNCEMENT)
- && shouldObscureSpeech()) {
- event.getText().clear();
- event.setContentDescription(host.getContext().getString(
- R.string.keyboard_password_character_no_headset));
- }
- }
-
- @Override
- public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(host, info);
-
- if (shouldObscureSpeech()) {
- final Context ctx = host.getContext();
- info.setText(null);
- info.setContentDescription(
- ctx.getString(R.string.keyboard_password_character_no_headset));
- }
- }
-
- @SuppressWarnings("deprecation")
- private boolean shouldObscureSpeech() {
- // The user can optionally force speaking passwords.
- if (Settings.Secure.getIntForUser(mContentResolver,
- Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 0, UserHandle.USER_CURRENT) != 0) {
- return false;
- }
-
- // Always speak if the user is listening through headphones.
- if (mAudioManager.isWiredHeadsetOn() || mAudioManager.isBluetoothA2dpOn()) {
- return false;
- }
-
- // Don't speak since this key is used to type a password.
- return true;
- }
-}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java b/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java
index 48737f9..c43820d 100644
--- a/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java
+++ b/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java
@@ -40,6 +40,7 @@
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
+import android.widget.EditText;
import java.util.ArrayList;
import java.util.Stack;
@@ -306,9 +307,6 @@
int removedCount, int addedCount) {
if (AccessibilityManager.getInstance(mContext).isEnabled() &&
(isFocused() || isSelected() && isShown())) {
- if (!shouldSpeakPasswordsForAccessibility()) {
- beforeText = null;
- }
AccessibilityEvent event =
AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
event.setFromIndex(fromIndex);
@@ -324,48 +322,22 @@
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(event);
- event.setClassName(PasswordTextView.class.getName());
+ event.setClassName(EditText.class.getName());
event.setPassword(true);
}
@Override
- public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
- super.onPopulateAccessibilityEvent(event);
-
- if (shouldSpeakPasswordsForAccessibility()) {
- final CharSequence text = mText;
- if (!TextUtils.isEmpty(text)) {
- event.getText().add(text);
- }
- }
- }
-
- @Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
info.setClassName(PasswordTextView.class.getName());
info.setPassword(true);
- if (shouldSpeakPasswordsForAccessibility()) {
- info.setText(mText);
- }
-
info.setEditable(true);
info.setInputType(InputType.TYPE_NUMBER_VARIATION_PASSWORD);
}
- /**
- * @return true if the user has explicitly allowed accessibility services
- * to speak passwords.
- */
- private boolean shouldSpeakPasswordsForAccessibility() {
- return (Settings.Secure.getIntForUser(mContext.getContentResolver(),
- Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 0,
- UserHandle.USER_CURRENT_OR_SELF) == 1);
- }
-
private class CharState {
char whichChar;
ValueAnimator textAnimator;
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index f821308..ee8641b 100644
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -16,7 +16,6 @@
package com.android.systemui;
import android.content.Context;
-import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Rect;
@@ -27,8 +26,6 @@
import android.net.Uri;
import android.os.Handler;
import android.provider.Settings;
-import android.util.ArraySet;
-import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
@@ -36,7 +33,6 @@
import android.widget.ImageView;
import android.widget.LinearLayout;
-import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.settingslib.graph.BatteryMeterDrawableBase;
import com.android.systemui.statusbar.phone.StatusBarIconController;
@@ -65,6 +61,7 @@
private SettingObserver mSettingObserver;
private int mTextColor;
private int mLevel;
+ private boolean mForceShowPercent;
public BatteryMeterView(Context context) {
this(context, null, 0);
@@ -103,6 +100,11 @@
updateShowPercent();
}
+ public void setForceShowPercent(boolean show) {
+ mForceShowPercent = show;
+ updateShowPercent();
+ }
+
// StatusBarIconController reaches in here and adjusts the layout parameters of the icon
public ImageView getBatteryIconView() {
return mBatteryIconView;
@@ -173,13 +175,12 @@
private void updateShowPercent() {
final boolean showing = mBatteryPercentView != null;
if (0 != Settings.System.getInt(getContext().getContentResolver(),
- BatteryMeterView.SHOW_PERCENT_SETTING, 0)) {
+ BatteryMeterView.SHOW_PERCENT_SETTING, 0) || mForceShowPercent) {
if (!showing) {
mBatteryPercentView = loadPercentView();
if (mTextColor != 0) mBatteryPercentView.setTextColor(mTextColor);
updatePercentText();
addView(mBatteryPercentView,
- 0,
new ViewGroup.LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.MATCH_PARENT));
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java
index 273b5e3..ac7ab9d 100644
--- a/packages/SystemUI/src/com/android/systemui/Dependency.java
+++ b/packages/SystemUI/src/com/android/systemui/Dependency.java
@@ -25,6 +25,8 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
import com.android.systemui.assist.AssistManager;
+import com.android.systemui.fragments.FragmentHostManager;
+import com.android.systemui.fragments.FragmentService;
import com.android.systemui.plugins.PluginManager;
import com.android.systemui.statusbar.phone.ConfigurationControllerImpl;
import com.android.systemui.statusbar.phone.DarkIconDispatcherImpl;
@@ -45,6 +47,8 @@
import com.android.systemui.statusbar.policy.DataSaverController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.DeviceProvisionedControllerImpl;
+import com.android.systemui.statusbar.policy.ExtensionController;
+import com.android.systemui.statusbar.policy.ExtensionControllerImpl;
import com.android.systemui.statusbar.policy.FlashlightController;
import com.android.systemui.statusbar.policy.FlashlightControllerImpl;
import com.android.systemui.statusbar.policy.HotspotController;
@@ -74,6 +78,7 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.HashMap;
+import java.util.function.Consumer;
/**
* Class to handle ugly dependencies throughout sysui until we determine the
@@ -227,6 +232,12 @@
mProviders.put(StatusBarIconController.class, () ->
new StatusBarIconControllerImpl(mContext));
+ mProviders.put(FragmentService.class, () ->
+ new FragmentService(mContext));
+
+ mProviders.put(ExtensionController.class, () ->
+ new ExtensionControllerImpl());
+
// Put all dependencies above here so the factory can override them if it wants.
SystemUIFactory.getInstance().injectDependencies(mProviders, mContext);
}
@@ -282,17 +293,42 @@
T createDependency();
}
+ private <T> void destroyDependency(Class<T> cls, Consumer<T> destroy) {
+ T dep = (T) mDependencies.remove(cls);
+ if (dep != null && destroy != null) {
+ destroy.accept(dep);
+ }
+ }
+
/**
* Used in separate processes (like tuner settings) to init the dependencies.
*/
public static void initDependencies(Context context) {
if (sDependency != null) return;
Dependency d = new Dependency();
- d.mContext = context.getApplicationContext();
+ d.mContext = context;
d.mComponents = new HashMap<>();
d.start();
}
+ /**
+ * Used in separate process teardown to ensure the context isn't leaked.
+ *
+ * TODO: Remove once PreferenceFragment doesn't reference getActivity()
+ * anymore and these context hacks are no longer needed.
+ */
+ public static void clearDependencies() {
+ sDependency = null;
+ }
+
+ /**
+ * Checks to see if a dependency is instantiated, if it is it removes it from
+ * the cache and calls the destroy callback.
+ */
+ public static <T> void destroy(Class<T> cls, Consumer<T> destroy) {
+ sDependency.destroyDependency(cls, destroy);
+ }
+
public static <T> T get(Class<T> cls) {
return sDependency.getDependency(cls);
}
diff --git a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
index 8141b28..0b0ea720 100644
--- a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
@@ -571,6 +571,7 @@
public void onAnimationEnd(Animator animation) {
if (!mCancelled) {
mCallback.setUserExpandedChild(scaledView, expand);
+ mScaler.setView(null);
} else {
mCallback.setExpansionCancelled(scaledView);
}
@@ -592,6 +593,7 @@
}
mCallback.setUserExpandedChild(mResizedView, nowExpanded);
mCallback.setUserLockedChild(mResizedView, false);
+ mScaler.setView(null);
}
mExpanding = false;
diff --git a/packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java b/packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java
index 9cc6613..ddd4833 100644
--- a/packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java
@@ -53,8 +53,7 @@
private static final String TAG = "PluginInflateContainer";
- private String mAction;
- private int mVersion;
+ private Class<?> mClass;
private View mPluginView;
public PluginInflateContainer(Context context, @Nullable AttributeSet attrs) {
@@ -62,28 +61,25 @@
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PluginInflateContainer);
String viewType = a.getString(R.styleable.PluginInflateContainer_viewType);
try {
- Class c = Class.forName(viewType);
- mAction = (String) c.getDeclaredField("ACTION").get(null);
- mVersion = (int) c.getDeclaredField("VERSION").get(null);
+ mClass = Class.forName(viewType);
} catch (Exception e) {
Log.d(TAG, "Problem getting class info " + viewType, e);
- mAction = null;
- mVersion = 0;
+ mClass = null;
}
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- if (mAction != null) {
- Dependency.get(PluginManager.class).addPluginListener(mAction, this, mVersion);
+ if (mClass != null) {
+ Dependency.get(PluginManager.class).addPluginListener(this, mClass);
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
- if (mAction != null) {
+ if (mClass != null) {
Dependency.get(PluginManager.class).removePluginListener(this);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/Prefs.java b/packages/SystemUI/src/com/android/systemui/Prefs.java
index 19ae295..b9ae585 100644
--- a/packages/SystemUI/src/com/android/systemui/Prefs.java
+++ b/packages/SystemUI/src/com/android/systemui/Prefs.java
@@ -49,6 +49,7 @@
Key.QS_WORK_ADDED,
})
public @interface Key {
+ @Deprecated
String OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME = "OverviewLastStackTaskActiveTime";
String DEBUG_MODE_ENABLED = "debugModeEnabled";
String HOTSPOT_TILE_LAST_USED = "HotspotTileLastUsed";
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
index 187b557..be69867 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
@@ -36,6 +36,7 @@
import com.android.systemui.media.RingtonePlayer;
import com.android.systemui.pip.PipUI;
import com.android.systemui.plugins.OverlayPlugin;
+import com.android.systemui.plugins.Plugin;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.PluginManager;
import com.android.systemui.power.PowerUI;
@@ -67,7 +68,6 @@
*/
private final Class<?>[] SERVICES = new Class[] {
Dependency.class,
- FragmentService.class,
NotificationChannels.class,
CommandQueue.CommandQueueStart.class,
KeyguardViewMediator.class,
@@ -207,7 +207,7 @@
mServices[i].onBootCompleted();
}
}
- Dependency.get(PluginManager.class).addPluginListener(OverlayPlugin.ACTION,
+ Dependency.get(PluginManager.class).addPluginListener(
new PluginListener<OverlayPlugin>() {
private ArraySet<OverlayPlugin> mOverlays;
@@ -236,7 +236,7 @@
Dependency.get(StatusBarWindowManager.class).setForcePluginOpen(
mOverlays.size() != 0);
}
- }, OverlayPlugin.VERSION, true /* Allow multiple plugins */);
+ }, OverlayPlugin.class, true /* Allow multiple plugins */);
mServicesStarted = true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
index 7c15096..5d57daa 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
@@ -23,7 +23,6 @@
import android.hardware.SensorManager;
import android.os.Handler;
import android.os.PowerManager;
-import android.os.SystemClock;
import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.systemui.SystemUIApplication;
@@ -52,7 +51,10 @@
DozeFactory.WakeLock wakeLock = new DozeFactory.WakeLock(powerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, "Doze"));
- DozeMachine machine = new DozeMachine(dozeService, params, wakeLock);
+ DozeMachine machine = new DozeMachine(
+ DozeScreenStatePreventingAdapter.wrapIfNeeded(dozeService, params),
+ params,
+ wakeLock);
machine.setParts(new DozeMachine.Part[]{
createDozeTriggers(context, sensorManager, host, config, params, handler, wakeLock,
machine),
@@ -91,8 +93,7 @@
@Override
public void requestState(DozeProvider.DozeState state) {
if (state == DozeProvider.DozeState.WAKE_UP) {
- PowerManager pm = context.getSystemService(PowerManager.class);
- pm.wakeUp(SystemClock.uptimeMillis(), "com.android.systemui:NODOZE");
+ machine.wakeUp();
return;
}
machine.requestState(implState(state));
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
index 6a868d5..c9eb790 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
@@ -158,6 +158,11 @@
return mState;
}
+ /** Requests the PowerManager to wake up now. */
+ public void wakeUp() {
+ mDozeService.requestWakeUp();
+ }
+
private boolean isExecutingTransition() {
return !mQueuedRequests.isEmpty();
}
@@ -300,5 +305,8 @@
/** Request a display state. See {@link android.view.Display#STATE_DOZE}. */
void setDozeScreenState(int state);
+
+ /** Request waking up. */
+ void requestWakeUp();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenStatePreventingAdapter.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenStatePreventingAdapter.java
new file mode 100644
index 0000000..ad5897a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenStatePreventingAdapter.java
@@ -0,0 +1,66 @@
+/*
+ * 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.doze;
+
+import android.support.annotation.VisibleForTesting;
+import android.view.Display;
+
+import com.android.systemui.statusbar.phone.DozeParameters;
+
+/**
+ * Prevents usage of doze screen states on devices that don't support them.
+ */
+public class DozeScreenStatePreventingAdapter implements DozeMachine.Service {
+
+ private final DozeMachine.Service mInner;
+
+ @VisibleForTesting
+ DozeScreenStatePreventingAdapter(DozeMachine.Service inner) {
+ mInner = inner;
+ }
+
+ @Override
+ public void finish() {
+ mInner.finish();
+ }
+
+ @Override
+ public void setDozeScreenState(int state) {
+ if (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND) {
+ state = Display.STATE_ON;
+ }
+ mInner.setDozeScreenState(state);
+ }
+
+ @Override
+ public void requestWakeUp() {
+ mInner.requestWakeUp();
+ }
+
+ /**
+ * If the device supports the doze display state, return {@code inner}. Otherwise
+ * return a new instance of {@link DozeScreenStatePreventingAdapter} wrapping {@code inner}.
+ */
+ public static DozeMachine.Service wrapIfNeeded(DozeMachine.Service inner,
+ DozeParameters params) {
+ return isNeeded(params) ? new DozeScreenStatePreventingAdapter(inner) : inner;
+ }
+
+ private static boolean isNeeded(DozeParameters params) {
+ return !params.getDisplayStateSupported();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
index 94dc9a3..e55a597 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
@@ -16,6 +16,8 @@
package com.android.systemui.doze;
+import android.os.PowerManager;
+import android.os.SystemClock;
import android.service.dreams.DreamService;
import android.util.Log;
@@ -49,7 +51,7 @@
}
DozeProvider provider = Dependency.get(PluginManager.class)
- .getOneShotPlugin(DozeProvider.ACTION, DozeProvider.VERSION);
+ .getOneShotPlugin(DozeProvider.class);
mDozeMachine = new DozeFactory(provider).assembleMachine(this);
}
@@ -72,4 +74,10 @@
mDozeMachine.dump(pw);
}
}
+
+ @Override
+ public void requestWakeUp() {
+ PowerManager pm = getSystemService(PowerManager.class);
+ pm.wakeUp(SystemClock.uptimeMillis(), "com.android.systemui:NODOZE");
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index db5a392..b5c7dd3 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -97,7 +97,11 @@
}
private void onSensor(int pulseReason, boolean sensorPerformedProxCheck) {
- requestPulse(pulseReason, sensorPerformedProxCheck);
+ if (mDozeParameters.getSensorsWakeUpFully()) {
+ mMachine.wakeUp();
+ } else {
+ requestPulse(pulseReason, sensorPerformedProxCheck);
+ }
if (pulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP) {
final long timeSinceNotification =
diff --git a/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java b/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java
index 0c6bf52..57c75bf 100644
--- a/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java
+++ b/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java
@@ -32,6 +32,7 @@
import android.view.View;
import com.android.settingslib.applications.InterestingConfigChanges;
+import com.android.systemui.Dependency;
import com.android.systemui.SystemUIApplication;
import com.android.systemui.plugins.Plugin;
import com.android.systemui.plugins.PluginManager;
@@ -171,6 +172,10 @@
return mPlugins;
}
+ void destroy() {
+ mFragments.dispatchDestroy();
+ }
+
public interface FragmentListener {
void onFragmentViewCreated(String tag, Fragment fragment);
@@ -182,8 +187,7 @@
public static FragmentHostManager get(View view) {
try {
- return ((SystemUIApplication) view.getContext().getApplicationContext())
- .getComponent(FragmentService.class).getFragmentHostManager(view);
+ return Dependency.get(FragmentService.class).getFragmentHostManager(view);
} catch (ClassCastException e) {
// TODO: Some auto handling here?
throw e;
diff --git a/packages/SystemUI/src/com/android/systemui/fragments/FragmentService.java b/packages/SystemUI/src/com/android/systemui/fragments/FragmentService.java
index 85cde10..9a8512d 100644
--- a/packages/SystemUI/src/com/android/systemui/fragments/FragmentService.java
+++ b/packages/SystemUI/src/com/android/systemui/fragments/FragmentService.java
@@ -14,6 +14,7 @@
package com.android.systemui.fragments;
+import android.content.Context;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Handler;
@@ -21,6 +22,7 @@
import android.util.Log;
import android.view.View;
+import com.android.systemui.ConfigurationChangedReceiver;
import com.android.systemui.SystemUI;
import com.android.systemui.SystemUIApplication;
@@ -28,16 +30,16 @@
* Holds a map of root views to FragmentHostStates and generates them as needed.
* Also dispatches the configuration changes to all current FragmentHostStates.
*/
-public class FragmentService extends SystemUI {
+public class FragmentService implements ConfigurationChangedReceiver {
private static final String TAG = "FragmentService";
private final ArrayMap<View, FragmentHostState> mHosts = new ArrayMap<>();
private final Handler mHandler = new Handler();
+ private final Context mContext;
- @Override
- public void start() {
- putComponent(FragmentService.class, this);
+ public FragmentService(Context context) {
+ mContext = context;
}
public FragmentHostManager getFragmentHostManager(View view) {
@@ -50,8 +52,14 @@
return state.getFragmentHostManager();
}
+ public void destroyAll() {
+ for (FragmentHostState state : mHosts.values()) {
+ state.mFragmentHostManager.destroy();
+ }
+ }
+
@Override
- protected void onConfigurationChanged(Configuration newConfig) {
+ public void onConfigurationChanged(Configuration newConfig) {
for (FragmentHostState state : mHosts.values()) {
state.sendConfigurationChange(newConfig);
}
diff --git a/packages/SystemUI/src/com/android/systemui/fragments/PluginFragmentListener.java b/packages/SystemUI/src/com/android/systemui/fragments/PluginFragmentListener.java
index 1eaca6f..03bb73d 100644
--- a/packages/SystemUI/src/com/android/systemui/fragments/PluginFragmentListener.java
+++ b/packages/SystemUI/src/com/android/systemui/fragments/PluginFragmentListener.java
@@ -44,8 +44,9 @@
mDefaultClass = defaultFragment;
}
- public void startListening(String action, int version) {
- mPluginManager.addPluginListener(action, this, version, false /* Only allow one */);
+ public void startListening() {
+ mPluginManager.addPluginListener(this, mExpectedInterface,
+ false /* Only allow one */);
}
public void stopListening() {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java
index a49c482..5eb483d 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java
@@ -17,27 +17,37 @@
package com.android.systemui.keyguard;
import android.app.Activity;
+import android.app.ActivityManager;
import android.app.ActivityOptions;
+import android.app.IActivityManager;
import android.app.KeyguardManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
+import android.os.RemoteException;
import android.os.UserHandle;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.recents.events.EventBus;
import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.recents.misc.SystemServicesProxy.TaskStackListener;
public class WorkLockActivityController {
private final Context mContext;
- final SystemServicesProxy mSsp;
+ private final SystemServicesProxy mSsp;
+ private final IActivityManager mIam;
public WorkLockActivityController(Context context) {
- mContext = context;
- mSsp = SystemServicesProxy.getInstance(context);
+ this(context, SystemServicesProxy.getInstance(context), ActivityManager.getService());
+ }
- EventBus.getDefault().register(this);
+ @VisibleForTesting
+ WorkLockActivityController(Context context, SystemServicesProxy ssp, IActivityManager am) {
+ mContext = context;
+ mSsp = ssp;
+ mIam = am;
+
mSsp.registerTaskStackListener(mLockListener);
}
@@ -52,7 +62,40 @@
final ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchTaskId(taskId);
options.setTaskOverlay(true, false /* canResume */);
- mContext.startActivityAsUser(intent, options.toBundle(), UserHandle.CURRENT);
+
+ final int result = startActivityAsUser(intent, options.toBundle(), UserHandle.USER_CURRENT);
+ if (result >= ActivityManager.START_SUCCESS) {
+ // OK
+ } else {
+ // Starting the activity inside the task failed. We can't be sure why, so to be
+ // safe just remove the whole task if it still exists.
+ mSsp.removeTask(taskId);
+ }
+ }
+
+ /**
+ * Version of {@link Context#startActivityAsUser} which keeps the success code from
+ * IActivityManager, so we can read back whether ActivityManager thinks it started properly.
+ */
+ private int startActivityAsUser(Intent intent, Bundle options, int userId) {
+ try {
+ return mIam.startActivityAsUser(
+ mContext.getIApplicationThread() /*caller*/,
+ mContext.getBasePackageName() /*callingPackage*/,
+ intent /*intent*/,
+ intent.resolveTypeIfNeeded(mContext.getContentResolver()) /*resolvedType*/,
+ null /*resultTo*/,
+ null /*resultWho*/,
+ 0 /*requestCode*/,
+ Intent.FLAG_ACTIVITY_NEW_TASK /*flags*/,
+ null /*profilerInfo*/,
+ options /*options*/,
+ userId /*user*/);
+ } catch (RemoteException e) {
+ return ActivityManager.START_CANCELED;
+ } catch (Exception e) {
+ return ActivityManager.START_CANCELED;
+ }
}
private final TaskStackListener mLockListener = new TaskStackListener() {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
index 42f1b14..ae402ef 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
@@ -76,7 +76,7 @@
}
@Override
- public void onPinnedActivityRestartAttempt(ComponentName sourceComponent) {
+ public void onPinnedActivityRestartAttempt(String launchedFromPackage) {
if (!checkCurrentUserId(false /* debug */)) {
return;
}
@@ -84,11 +84,11 @@
// Expand the activity back to fullscreen only if it was attempted to be restarted from
// another package than the top activity in the stack
boolean expandPipToFullscreen = true;
- if (sourceComponent != null) {
+ if (launchedFromPackage != null) {
ComponentName topActivity = PipUtils.getTopPinnedActivity(mContext,
mActivityManager);
- if (topActivity != null && topActivity.getPackageName().equals(
- sourceComponent.getPackageName())) {
+ if (topActivity != null
+ && topActivity.getPackageName().equals(launchedFromPackage)) {
expandPipToFullscreen = false;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
index 9066977..4e28061 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
@@ -26,6 +26,7 @@
import android.app.RemoteAction;
import android.content.Intent;
import android.content.pm.ParceledListSlice;
+import android.graphics.Color;
import android.graphics.PointF;
import android.os.Bundle;
import android.os.Handler;
@@ -138,6 +139,24 @@
}
@Override
+ protected void onUserLeaveHint() {
+ super.onUserLeaveHint();
+
+ // If another task is starting on top of the menu, then finish it so that it can be
+ // recreated on the top next time it starts
+ finish();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ // Fallback, if we are destroyed for any other reason (like when the task is being reset),
+ // also reset the callback.
+ notifyActivityCallback(null);
+ }
+
+ @Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
if (!isInPictureInPictureMode) {
finish();
@@ -255,6 +274,7 @@
final ImageView actionView = (ImageView) inflater.inflate(
R.layout.pip_menu_action, actionsGroup, false);
action.getIcon().loadDrawableAsync(this, d -> {
+ d.setTint(Color.WHITE);
actionView.setImageDrawable(d);
}, mHandler);
actionView.setContentDescription(action.getContentDescription());
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 e8c0050..d832810 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
@@ -37,9 +37,7 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.policy.PipSnapAlgorithm;
-import com.android.systemui.Dependency;
import com.android.systemui.statusbar.FlingAnimationUtils;
-import com.android.systemui.tuner.TunerService;
import java.io.PrintWriter;
@@ -47,17 +45,18 @@
* Manages all the touch handling for PIP on the Phone, including moving, dismissing and expanding
* the PIP.
*/
-public class PipTouchHandler implements TunerService.Tunable {
+public class PipTouchHandler {
private static final String TAG = "PipTouchHandler";
// These values are used for metrics and should never change
private static final int METRIC_VALUE_DISMISSED_BY_TAP = 0;
private static final int METRIC_VALUE_DISMISSED_BY_DRAG = 1;
- private static final String TUNER_KEY_DRAG_TO_DISMISS = "pip_drag_to_dismiss";
-
private static final int SHOW_DISMISS_AFFORDANCE_DELAY = 200;
+ // Allow dragging the PIP to a location to close it
+ private static final boolean ENABLE_DRAG_TO_DISMISS = false;
+
private final Context mContext;
private final IActivityManager mActivityManager;
private final IWindowManager mWindowManager;
@@ -70,9 +69,6 @@
private final PipDismissViewController mDismissViewController;
private final PipSnapAlgorithm mSnapAlgorithm;
- // Allow dragging the PIP to a location to close it
- private boolean mEnableDragToDismiss = false;
-
// The current movement bounds
private Rect mMovementBounds = new Rect();
@@ -86,7 +82,7 @@
private Runnable mShowDismissAffordance = new Runnable() {
@Override
public void run() {
- if (mEnableDragToDismiss) {
+ if (ENABLE_DRAG_TO_DISMISS) {
mDismissViewController.showDismissTarget(mMotionHelper.getBounds());
}
}
@@ -183,23 +179,6 @@
mMotionHelper = new PipMotionHelper(mContext, mActivityManager, mSnapAlgorithm,
mFlingAnimationUtils);
registerInputConsumer();
-
- // Register any tuner settings changes
- Dependency.get(TunerService.class).addTunable(this, TUNER_KEY_DRAG_TO_DISMISS);
- }
-
- @Override
- public void onTuningChanged(String key, String newValue) {
- if (newValue == null) {
- // Reset back to default
- mEnableDragToDismiss = false;
- return;
- }
- switch (key) {
- case TUNER_KEY_DRAG_TO_DISMISS:
- mEnableDragToDismiss = Integer.parseInt(newValue) != 0;
- break;
- }
}
public void onActivityPinned() {
@@ -439,7 +418,7 @@
@Override
public void onDown(PipTouchState touchState) {
- if (mEnableDragToDismiss) {
+ if (ENABLE_DRAG_TO_DISMISS) {
mDismissViewController.createDismissTarget();
mHandler.postDelayed(mShowDismissAffordance, SHOW_DISMISS_AFFORDANCE_DELAY);
}
@@ -451,7 +430,7 @@
mSavedSnapFraction = -1f;
}
- if (touchState.startedDragging() && mEnableDragToDismiss) {
+ if (touchState.startedDragging() && ENABLE_DRAG_TO_DISMISS) {
mHandler.removeCallbacks(mShowDismissAffordance);
mDismissViewController.showDismissTarget(mMotionHelper.getBounds());
}
@@ -469,7 +448,7 @@
mTmpBounds.offsetTo((int) left, (int) top);
mMotionHelper.movePip(mTmpBounds);
- if (mEnableDragToDismiss) {
+ if (ENABLE_DRAG_TO_DISMISS) {
mDismissViewController.updateDismissTarget(mTmpBounds);
}
return true;
@@ -480,7 +459,7 @@
@Override
public boolean onUp(PipTouchState touchState) {
try {
- if (mEnableDragToDismiss) {
+ if (ENABLE_DRAG_TO_DISMISS) {
mHandler.removeCallbacks(mShowDismissAffordance);
PointF vel = mTouchState.getVelocity();
final float velocity = PointF.length(vel.x, vel.y);
@@ -583,7 +562,7 @@
pw.println(innerPrefix + "mIsImeShowing=" + mIsImeShowing);
pw.println(innerPrefix + "mImeHeight=" + mImeHeight);
pw.println(innerPrefix + "mSavedSnapFraction=" + mSavedSnapFraction);
- pw.println(innerPrefix + "mEnableDragToDismiss=" + mEnableDragToDismiss);
+ pw.println(innerPrefix + "mEnableDragToDismiss=" + ENABLE_DRAG_TO_DISMISS);
mSnapAlgorithm.dump(pw, innerPrefix);
mTouchState.dump(pw, innerPrefix);
mMotionHelper.dump(pw, innerPrefix);
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
index 112fedb..8f7a81c 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
@@ -68,34 +68,10 @@
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private static final boolean DEBUG_FORCE_ONBOARDING =
SystemProperties.getBoolean("debug.tv.pip_force_onboarding", false);
+ private static final String SETTINGS_PACKAGE_AND_CLASS_DELIMITER = "/";
private static PipManager sPipManager;
-
- /**
- * List of package and class name which are considered as Settings,
- * so PIP location should be adjusted to the left of the side panel.
- */
- private static final List<Pair<String, String>> sSettingsPackageAndClassNamePairList;
- static {
- sSettingsPackageAndClassNamePairList = new ArrayList<>();
- sSettingsPackageAndClassNamePairList.add(new Pair<String, String>(
- "com.android.tv.settings", null));
- sSettingsPackageAndClassNamePairList.add(new Pair<String, String>(
- "com.google.android.leanbacklauncher",
- "com.google.android.leanbacklauncher.settings.HomeScreenSettingsActivity"));
- sSettingsPackageAndClassNamePairList.add(new Pair<String, String>(
- "com.google.android.apps.mediashell",
- "com.google.android.apps.mediashell.settings.CastSettingsActivity"));
- sSettingsPackageAndClassNamePairList.add(new Pair<String, String>(
- "com.google.android.katniss",
- "com.google.android.katniss.setting.SpeechSettingsActivity"));
- sSettingsPackageAndClassNamePairList.add(new Pair<String, String>(
- "com.google.android.katniss",
- "com.google.android.katniss.setting.SearchSettingsActivity"));
- sSettingsPackageAndClassNamePairList.add(new Pair<String, String>(
- "com.google.android.gsf.notouch",
- "com.google.android.gsf.notouch.UsageDiagnosticsSettingActivity"));
- }
+ private static List<Pair<String, String>> sSettingsPackageAndClassNamePairList;
/**
* State when there's no PIP.
@@ -252,6 +228,36 @@
mOnboardingShown = Prefs.getBoolean(
mContext, TV_PICTURE_IN_PICTURE_ONBOARDING_SHOWN, false);
+ if (sSettingsPackageAndClassNamePairList == null) {
+ String[] settings = mContext.getResources().getStringArray(
+ R.array.tv_pip_settings_class_name);
+ sSettingsPackageAndClassNamePairList = new ArrayList<>();
+ if (settings != null) {
+ for (int i = 0; i < settings.length; i++) {
+ Pair<String, String> entry = null;
+ String[] packageAndClassName =
+ settings[i].split(SETTINGS_PACKAGE_AND_CLASS_DELIMITER);
+ switch (packageAndClassName.length) {
+ case 1:
+ entry = Pair.<String, String>create(packageAndClassName[0], null);
+ break;
+ case 2:
+ if (packageAndClassName[1] != null
+ && packageAndClassName[1].startsWith(".")) {
+ entry = Pair.<String, String>create(
+ packageAndClassName[0],
+ packageAndClassName[0] + packageAndClassName[1]);
+ }
+ }
+ if (entry != null) {
+ sSettingsPackageAndClassNamePairList.add(entry);
+ } else {
+ Log.w(TAG, "Ignoring malformed settings name " + settings[i]);
+ }
+ }
+ }
+ }
+
loadConfigurationsAndApply();
mPipRecentsOverlayManager = new PipRecentsOverlayManager(context);
mMediaSessionManager =
@@ -331,12 +337,11 @@
* Moves the PIPed activity to the fullscreen and closes PIP system UI.
*/
void movePipToFullscreen() {
- mState = STATE_NO_PIP;
mPipTaskId = TASK_ID_NO_PIP;
for (int i = mListeners.size() - 1; i >= 0; --i) {
mListeners.get(i).onMoveToFullscreen();
}
- resizePinnedStack(mState);
+ resizePinnedStack(STATE_NO_PIP);
updatePipVisibility(false);
}
@@ -382,6 +387,7 @@
if (DEBUG) Log.d(TAG, "resizePinnedStack() state=" + state);
boolean wasRecentsShown =
(mState == STATE_PIP_RECENTS || mState == STATE_PIP_RECENTS_FOCUSED);
+ boolean wasStateNoPip = (mState == STATE_NO_PIP);
mState = state;
for (int i = mListeners.size() - 1; i >= 0; --i) {
mListeners.get(i).onPipResizeAboutToStart();
@@ -395,6 +401,11 @@
switch (mState) {
case STATE_NO_PIP:
mCurrentPipBounds = null;
+ // If the state was already STATE_NO_PIP, then do not resize the stack below as it
+ // will not exist
+ if (wasStateNoPip) {
+ return;
+ }
break;
case STATE_PIP_MENU:
mCurrentPipBounds = mMenuModePipBounds;
@@ -412,18 +423,16 @@
mCurrentPipBounds = mPipBounds;
break;
}
- if (mCurrentPipBounds != null) {
- try {
- int animationDurationMs = -1;
- if (wasRecentsShown
- && (mState == STATE_PIP_RECENTS || mState == STATE_PIP_RECENTS_FOCUSED)) {
- animationDurationMs = mRecentsFocusChangedAnimationDurationMs;
- }
- mActivityManager.resizeStack(PINNED_STACK_ID, mCurrentPipBounds,
- true, true, true, animationDurationMs);
- } catch (RemoteException e) {
- Log.e(TAG, "resizeStack failed", e);
+ try {
+ int animationDurationMs = -1;
+ if (wasRecentsShown
+ && (mState == STATE_PIP_RECENTS || mState == STATE_PIP_RECENTS_FOCUSED)) {
+ animationDurationMs = mRecentsFocusChangedAnimationDurationMs;
}
+ mActivityManager.resizeStack(PINNED_STACK_ID, mCurrentPipBounds,
+ true, true, true, animationDurationMs);
+ } catch (RemoteException e) {
+ Log.e(TAG, "resizeStack failed", e);
}
}
@@ -695,7 +704,7 @@
}
@Override
- public void onPinnedActivityRestartAttempt(ComponentName sourceComponent) {
+ public void onPinnedActivityRestartAttempt(String launchedFromPackage) {
if (DEBUG) Log.d(TAG, "onPinnedActivityRestartAttempt()");
if (!checkCurrentUserId(DEBUG)) {
return;
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginInstanceManager.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginInstanceManager.java
similarity index 91%
rename from packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginInstanceManager.java
rename to packages/SystemUI/src/com/android/systemui/plugins/PluginInstanceManager.java
index dd1614b..e895fa2 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginInstanceManager.java
+++ b/packages/SystemUI/src/com/android/systemui/plugins/PluginInstanceManager.java
@@ -18,12 +18,10 @@
import android.app.Notification.Action;
import android.app.NotificationManager;
import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
-import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -40,6 +38,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
+import com.android.systemui.plugins.VersionInfo.InvalidVersionException;
import java.util.ArrayList;
import java.util.List;
@@ -55,7 +54,7 @@
private final PluginListener<T> mListener;
private final String mAction;
private final boolean mAllowMultiple;
- private final int mVersion;
+ private final VersionInfo mVersion;
@VisibleForTesting
final MainHandler mMainHandler;
@@ -66,14 +65,14 @@
private final PluginManager mManager;
PluginInstanceManager(Context context, String action, PluginListener<T> listener,
- boolean allowMultiple, Looper looper, int version, PluginManager manager) {
+ boolean allowMultiple, Looper looper, VersionInfo version, PluginManager manager) {
this(context, context.getPackageManager(), action, listener, allowMultiple, looper, version,
manager, Build.IS_DEBUGGABLE);
}
@VisibleForTesting
PluginInstanceManager(Context context, PackageManager pm, String action,
- PluginListener<T> listener, boolean allowMultiple, Looper looper, int version,
+ PluginListener<T> listener, boolean allowMultiple, Looper looper, VersionInfo version,
PluginManager manager, boolean debuggable) {
mMainHandler = new MainHandler(Looper.getMainLooper());
mPluginHandler = new PluginHandler(looper);
@@ -301,8 +300,14 @@
Context pluginContext = new PluginContextWrapper(
mContext.createApplicationContext(info, 0), classLoader);
Class<?> pluginClass = Class.forName(cls, true, classLoader);
+ // TODO: Only create the plugin before version check if we need it for
+ // legacy version check.
T plugin = (T) pluginClass.newInstance();
- if (plugin.getVersion() != mVersion) {
+ try {
+ checkVersion(pluginClass, plugin, mVersion);
+ if (DEBUG) Log.d(TAG, "createPlugin");
+ return new PluginInfo(pkg, cls, plugin, pluginContext);
+ } catch (InvalidVersionException e) {
final int icon = mContext.getResources().getIdentifier("tuner", "drawable",
mContext.getPackageName());
final int color = Resources.getSystem().getIdentifier(
@@ -318,20 +323,18 @@
String label = cls;
try {
label = mPm.getServiceInfo(component, 0).loadLabel(mPm).toString();
- } catch (NameNotFoundException e) {
+ } catch (NameNotFoundException e2) {
}
- if (plugin.getVersion() < mVersion) {
+ if (!e.isTooNew()) {
// Localization not required as this will never ever appear in a user build.
nb.setContentTitle("Plugin \"" + label + "\" is too old")
.setContentText("Contact plugin developer to get an updated"
- + " version.\nPlugin version: " + plugin.getVersion()
- + "\nSystem version: " + mVersion);
+ + " version.\n" + e.getMessage());
} else {
// Localization not required as this will never ever appear in a user build.
nb.setContentTitle("Plugin \"" + label + "\" is too new")
.setContentText("Check to see if an OTA is available.\n"
- + "Plugin version: " + plugin.getVersion()
- + "\nSystem version: " + mVersion);
+ + e.getMessage());
}
Intent i = new Intent(PluginManager.DISABLE_PLUGIN).setData(
Uri.parse("package://" + component.flattenToString()));
@@ -345,13 +348,24 @@
+ ", expected " + mVersion);
return null;
}
- if (DEBUG) Log.d(TAG, "createPlugin");
- return new PluginInfo(pkg, cls, plugin, pluginContext);
} catch (Exception e) {
Log.w(TAG, "Couldn't load plugin: " + pkg, e);
return null;
}
}
+
+ private void checkVersion(Class<?> pluginClass, T plugin, VersionInfo version)
+ throws InvalidVersionException {
+ VersionInfo pv = new VersionInfo().addClass(pluginClass);
+ if (pv.hasVersionInfo()) {
+ version.checkVersion(pv);
+ } else {
+ int fallbackVersion = plugin.getVersion();
+ if (fallbackVersion != version.getDefaultVersion()) {
+ throw new InvalidVersionException("Invalid legacy version", false);
+ }
+ }
+ }
}
public static class PluginContextWrapper extends ContextWrapper {
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginManager.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginManager.java
similarity index 88%
rename from packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginManager.java
rename to packages/SystemUI/src/com/android/systemui/plugins/PluginManager.java
index cef485e..0c3e40c 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginManager.java
+++ b/packages/SystemUI/src/com/android/systemui/plugins/PluginManager.java
@@ -33,6 +33,7 @@
import android.os.Looper;
import android.os.SystemProperties;
import android.os.UserHandle;
+import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -40,6 +41,7 @@
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.systemui.plugins.PluginInstanceManager.PluginContextWrapper;
import com.android.systemui.plugins.PluginInstanceManager.PluginInfo;
+import com.android.systemui.plugins.annotations.ProvidesInterface;
import dalvik.system.PathClassLoader;
@@ -93,7 +95,18 @@
Thread.setDefaultUncaughtExceptionHandler(uncaughtExceptionHandler);
}
- public <T extends Plugin> T getOneShotPlugin(String action, int version) {
+ public <T extends Plugin> T getOneShotPlugin(Class<T> cls) {
+ ProvidesInterface info = cls.getDeclaredAnnotation(ProvidesInterface.class);
+ if (info == null) {
+ throw new RuntimeException(cls + " doesn't provide an interface");
+ }
+ if (TextUtils.isEmpty(info.action())) {
+ throw new RuntimeException(cls + " doesn't provide an action");
+ }
+ return getOneShotPlugin(info.action(), cls);
+ }
+
+ public <T extends Plugin> T getOneShotPlugin(String action, Class<?> cls) {
if (!isDebuggable) {
// Never ever ever allow these on production builds, they are only for prototyping.
return null;
@@ -102,7 +115,7 @@
throw new RuntimeException("Must be called from UI thread");
}
PluginInstanceManager<T> p = mFactory.createPluginInstanceManager(mContext, action, null,
- false, mBackgroundThread.getLooper(), version, this);
+ false, mBackgroundThread.getLooper(), cls, this);
mPluginPrefs.addAction(action);
PluginInfo<T> info = p.getPlugin();
if (info != null) {
@@ -114,20 +127,29 @@
return null;
}
- public <T extends Plugin> void addPluginListener(String action, PluginListener<T> listener,
- int version) {
- addPluginListener(action, listener, version, false);
+ public <T extends Plugin> void addPluginListener(PluginListener<T> listener, Class<?> cls) {
+ addPluginListener(listener, cls, false);
+ }
+
+ public <T extends Plugin> void addPluginListener(PluginListener<T> listener, Class<?> cls,
+ boolean allowMultiple) {
+ addPluginListener(getAction(cls), listener, cls, allowMultiple);
}
public <T extends Plugin> void addPluginListener(String action, PluginListener<T> listener,
- int version, boolean allowMultiple) {
+ Class<?> cls) {
+ addPluginListener(action, listener, cls, false);
+ }
+
+ public <T extends Plugin> void addPluginListener(String action, PluginListener<T> listener,
+ Class cls, boolean allowMultiple) {
if (!isDebuggable) {
// Never ever ever allow these on production builds, they are only for prototyping.
return;
}
mPluginPrefs.addAction(action);
PluginInstanceManager p = mFactory.createPluginInstanceManager(mContext, action, listener,
- allowMultiple, mBackgroundThread.getLooper(), version, this);
+ allowMultiple, mBackgroundThread.getLooper(), cls, this);
p.loadAll();
mPluginMap.put(listener, p);
startListening();
@@ -256,6 +278,17 @@
return new PluginContextWrapper(mContext.createApplicationContext(info, 0), classLoader);
}
+ public static <P> String getAction(Class<P> cls) {
+ ProvidesInterface info = cls.getDeclaredAnnotation(ProvidesInterface.class);
+ if (info == null) {
+ throw new RuntimeException(cls + " doesn't provide an interface");
+ }
+ if (TextUtils.isEmpty(info.action())) {
+ throw new RuntimeException(cls + " doesn't provide an action");
+ }
+ return info.action();
+ }
+
private class AllPluginClassLoader extends ClassLoader {
public AllPluginClassLoader(ClassLoader classLoader) {
super(classLoader);
@@ -282,9 +315,9 @@
public static class PluginInstanceManagerFactory {
public <T extends Plugin> PluginInstanceManager createPluginInstanceManager(Context context,
String action, PluginListener<T> listener, boolean allowMultiple, Looper looper,
- int version, PluginManager manager) {
+ Class<?> cls, PluginManager manager) {
return new PluginInstanceManager(context, action, listener, allowMultiple, looper,
- version, manager);
+ new VersionInfo().addClass(cls), manager);
}
}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginPrefs.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginPrefs.java
similarity index 100%
rename from packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginPrefs.java
rename to packages/SystemUI/src/com/android/systemui/plugins/PluginPrefs.java
diff --git a/packages/SystemUI/src/com/android/systemui/plugins/VersionInfo.java b/packages/SystemUI/src/com/android/systemui/plugins/VersionInfo.java
new file mode 100644
index 0000000..84f7761
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/plugins/VersionInfo.java
@@ -0,0 +1,134 @@
+/*
+ * 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.plugins;
+
+import com.android.systemui.plugins.annotations.Dependencies;
+import com.android.systemui.plugins.annotations.DependsOn;
+import com.android.systemui.plugins.annotations.ProvidesInterface;
+import com.android.systemui.plugins.annotations.Requirements;
+import com.android.systemui.plugins.annotations.Requires;
+
+import android.util.ArrayMap;
+
+public class VersionInfo {
+
+ private final ArrayMap<Class<?>, Version> mVersions = new ArrayMap<>();
+ private Class<?> mDefault;
+
+ public boolean hasVersionInfo() {
+ return !mVersions.isEmpty();
+ }
+
+ public int getDefaultVersion() {
+ return mVersions.get(mDefault).mVersion;
+ }
+
+ public VersionInfo addClass(Class<?> cls) {
+ if (mDefault == null) {
+ // The legacy default version is from the first class we add.
+ mDefault = cls;
+ }
+ addClass(cls, false);
+ return this;
+ }
+
+ private void addClass(Class<?> cls, boolean required) {
+ ProvidesInterface provider = cls.getDeclaredAnnotation(ProvidesInterface.class);
+ if (provider != null) {
+ mVersions.put(cls, new Version(provider.version(), true));
+ }
+ Requires requires = cls.getDeclaredAnnotation(Requires.class);
+ if (requires != null) {
+ mVersions.put(requires.target(), new Version(requires.version(), required));
+ }
+ Requirements requirements = cls.getDeclaredAnnotation(Requirements.class);
+ if (requirements != null) {
+ for (Requires r : requirements.value()) {
+ mVersions.put(r.target(), new Version(r.version(), required));
+ }
+ }
+ DependsOn depends = cls.getDeclaredAnnotation(DependsOn.class);
+ if (depends != null) {
+ addClass(depends.target(), true);
+ }
+ Dependencies dependencies = cls.getDeclaredAnnotation(Dependencies.class);
+ if (dependencies != null) {
+ for (DependsOn d : dependencies.value()) {
+ addClass(d.target(), true);
+ }
+ }
+ }
+
+ public void checkVersion(VersionInfo plugin) throws InvalidVersionException {
+ ArrayMap<Class<?>, Version> versions = new ArrayMap<>(mVersions);
+ plugin.mVersions.forEach((aClass, version) -> {
+ Version v = versions.remove(aClass);
+ if (v == null) {
+ v = createVersion(aClass);
+ }
+ if (v == null) {
+ throw new InvalidVersionException(aClass.getSimpleName()
+ + " does not provide an interface", false);
+ }
+ if (v.mVersion != version.mVersion) {
+ throw new InvalidVersionException(aClass, v.mVersion < version.mVersion, v.mVersion,
+ version.mVersion);
+ }
+ });
+ versions.forEach((aClass, version) -> {
+ if (version.mRequired) {
+ throw new InvalidVersionException("Missing required dependency "
+ + aClass.getSimpleName(), false);
+ }
+ });
+ }
+
+ private Version createVersion(Class<?> cls) {
+ ProvidesInterface provider = cls.getDeclaredAnnotation(ProvidesInterface.class);
+ if (provider != null) {
+ return new Version(provider.version(), false);
+ }
+ return null;
+ }
+
+ public static class InvalidVersionException extends RuntimeException {
+ private final boolean mTooNew;
+
+ public InvalidVersionException(String str, boolean tooNew) {
+ super(str);
+ mTooNew = tooNew;
+ }
+
+ public InvalidVersionException(Class<?> cls, boolean tooNew, int expected, int actual) {
+ super(cls.getSimpleName() + " expected version " + expected + " but had " + actual);
+ mTooNew = tooNew;
+ }
+
+ public boolean isTooNew() {
+ return mTooNew;
+ }
+ }
+
+ private static class Version {
+
+ private final int mVersion;
+ private final boolean mRequired;
+
+ public Version(int version, boolean required) {
+ mVersion = version;
+ mRequired = required;
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
index 09ce2ad..daf0622 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
@@ -39,6 +39,7 @@
import android.util.Slog;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
+import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.SystemUI;
import com.android.systemui.statusbar.phone.StatusBar;
@@ -175,8 +176,7 @@
.setOnlyAlertOnce(true)
.setDeleteIntent(pendingBroadcast(ACTION_DISMISSED_WARNING))
.setVisibility(Notification.VISIBILITY_PUBLIC)
- .setColor(mContext.getColor(
- com.android.internal.R.color.battery_saver_mode_color));
+ .setColor(Utils.getColorAttr(mContext, android.R.attr.colorError));
if (hasBatterySettings()) {
nb.setContentIntent(pendingBroadcast(ACTION_SHOW_BATTERY_SETTINGS));
}
@@ -245,8 +245,7 @@
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setContentIntent(pendingBroadcast(ACTION_CLICKED_TEMP_WARNING))
.setDeleteIntent(pendingBroadcast(ACTION_DISMISSED_TEMP_WARNING))
- .setColor(mContext.getColor(
- com.android.internal.R.color.battery_saver_mode_color));
+ .setColor(Utils.getColorAttr(mContext, android.R.attr.colorError));
SystemUI.overrideNotificationAppName(mContext, nb);
final Notification n = nb.build();
mNoMan.notifyAsUser(TAG_TEMPERATURE, SystemMessage.NOTE_HIGH_TEMP, n, UserHandle.ALL);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
index a231e79..3559257 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
@@ -242,7 +242,7 @@
maxHeight = height;
}
}
- setMeasuredDimension(getMeasuredWidth(), maxHeight);
+ setMeasuredDimension(getMeasuredWidth(), maxHeight + getPaddingBottom());
}
private final Runnable mDistribute = new Runnable() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index c85f83b..e0d1cba 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -160,7 +160,9 @@
mAllViews.clear();
mTopFiveQs.clear();
- mAllViews.add((View) mQsPanel.getTileLayout());
+ QSTileLayout tileLayout = mQsPanel.getTileLayout();
+ mAllViews.add((View) tileLayout);
+ firstPageBuilder.addFloat(tileLayout, "translationY", mQsPanel.getHeight(), 0);
for (QSTile<?> tile : tiles) {
QSTileBaseView tileView = mQsPanel.getTileView(tile);
@@ -168,7 +170,6 @@
Log.e(TAG, "tileView is null " + tile.getTileSpec());
continue;
}
- final TextView label = ((QSTileView) tileView).getLabel();
final View tileIcon = tileView.getIcon().getIconView();
View view = mQs.getView();
if (count < mNumQuickTiles && mAllowFancy) {
@@ -187,12 +188,12 @@
// Counteract the parent translation on the tile. So we have a static base to
// animate the label position off from.
- firstPageBuilder.addFloat(tileView, "translationY", mQsPanel.getHeight(), 0);
+ //firstPageBuilder.addFloat(tileView, "translationY", mQsPanel.getHeight(), 0);
- // Move the real tile's label from the quick tile position to its final
+ // Move the real tile from the quick tile position to its final
// location.
- translationXBuilder.addFloat(label, "translationX", -xDiff, 0);
- translationYBuilder.addFloat(label, "translationY", -yDiff, 0);
+ translationXBuilder.addFloat(tileView, "translationX", -xDiff, 0);
+ translationYBuilder.addFloat(tileView, "translationY", -yDiff, 0);
mTopFiveQs.add(tileView.getIcon());
mAllViews.add(tileView.getIcon());
@@ -209,22 +210,22 @@
firstPageBuilder.addFloat(tileView, "translationY", mQsPanel.getHeight(), 0);
translationXBuilder.addFloat(tileView, "translationX", -xDiff, 0);
- translationYBuilder.addFloat(label, "translationY", -yDiff, 0);
+ translationYBuilder.addFloat(tileView, "translationY", -yDiff, 0);
translationYBuilder.addFloat(tileIcon, "translationY", -yDiff, 0);
mAllViews.add(tileIcon);
} else {
firstPageBuilder.addFloat(tileView, "alpha", 0, 1);
+ firstPageBuilder.addFloat(tileView, "translationY", -mQsPanel.getHeight(), 0);
}
mAllViews.add(tileView);
- mAllViews.add(label);
count++;
}
if (mAllowFancy) {
// Make brightness appear static position and alpha in through second half.
View brightness = mQsPanel.getBrightnessView();
if (brightness != null) {
-// firstPageBuilder.addFloat(brightness, "translationY", mQsPanel.getHeight(), 0);
+ firstPageBuilder.addFloat(brightness, "translationY", mQsPanel.getHeight(), 0);
mBrightnessAnimator = new TouchAnimator.Builder()
.addFloat(brightness, "alpha", 0, 1)
.addFloat(mQsPanel.getPageIndicator(), "alpha", 0, 1)
@@ -240,7 +241,7 @@
// Fade in the tiles/labels as we reach the final position.
mFirstPageDelayedAnimator = new TouchAnimator.Builder()
.setStartDelay(EXPANDED_TILE_DELAY)
- .addFloat(mQsPanel.getTileLayout(), "alpha", 0, 1)
+ .addFloat(tileLayout, "alpha", 0, 1)
.addFloat(mQsPanel.getFooter().getView(), "alpha", 0, 1).build();
mAllViews.add(mQsPanel.getFooter().getView());
float px = 0;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetailItems.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetailItems.java
index dad8bea..65238b1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSDetailItems.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetailItems.java
@@ -203,16 +203,28 @@
}
}
});
- final ImageView disconnect = (ImageView) view.findViewById(android.R.id.icon2);
- disconnect.setVisibility(item.canDisconnect ? VISIBLE : GONE);
- disconnect.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mCallback != null) {
- mCallback.onDetailItemDisconnect(item);
+
+ final ImageView icon2 = (ImageView) view.findViewById(android.R.id.icon2);
+ if (item.canDisconnect) {
+ icon2.setImageResource(R.drawable.ic_qs_cancel);
+ icon2.setVisibility(VISIBLE);
+ icon2.setClickable(true);
+ icon2.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mCallback != null) {
+ mCallback.onDetailItemDisconnect(item);
+ }
}
- }
- });
+ });
+ } else if (item.icon2 != -1) {
+ icon2.setVisibility(VISIBLE);
+ icon2.setImageResource(item.icon2);
+ icon2.setClickable(false);
+ } else {
+ icon2.setVisibility(GONE);
+ }
+
return view;
}
};
@@ -245,6 +257,7 @@
public CharSequence line2;
public Object tag;
public boolean canDisconnect;
+ public int icon2 = -1;
}
public interface Callback {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 504678c..e8d5ece 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -86,6 +86,10 @@
setOrientation(VERTICAL);
+ mBrightnessView = LayoutInflater.from(context).inflate(
+ R.layout.quick_settings_brightness_dialog, this, false);
+ addView(mBrightnessView);
+
setupTileLayout();
mFooter = new QSFooter(this, context);
@@ -100,10 +104,6 @@
updateResources();
- mBrightnessView = LayoutInflater.from(context).inflate(
- R.layout.quick_settings_brightness_dialog, this, false);
- addView(mBrightnessView);
-
mBrightnessController = new BrightnessController(getContext(),
(ImageView) findViewById(R.id.brightness_icon),
(ToggleSliderView) findViewById(R.id.brightness_slider));
@@ -441,8 +441,15 @@
}
r.tile.setDetailListening(show);
int x = r.tileView.getLeft() + r.tileView.getWidth() / 2;
- int y = r.tileView.getTop() + mTileLayout.getOffsetTop(r) + r.tileView.getHeight() / 2
- + getTop();
+ int y;
+ if (r.tileView instanceof QSTileView) {
+ View labelContainer = (View) ((QSTileView) r.tileView).getLabel().getParent();
+ y = r.tileView.getTop() + mTileLayout.getOffsetTop(r) + getTop()
+ + labelContainer.getTop() + labelContainer.getHeight() / 2;
+ } else {
+ y = r.tileView.getTop() + mTileLayout.getOffsetTop(r) + r.tileView.getHeight() / 2
+ + getTop();
+ }
handleShowDetailImpl(r, show, x, y);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileBaseView.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileBaseView.java
index 0e04d0a..c750fdc 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileBaseView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileBaseView.java
@@ -15,38 +15,30 @@
*/
package com.android.systemui.qs;
-import android.animation.ValueAnimator;
import android.content.Context;
-import android.content.res.ColorStateList;
import android.content.res.TypedArray;
-import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.RippleDrawable;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
-import android.service.quicksettings.Tile;
import android.text.TextUtils;
-import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.Switch;
-import com.android.settingslib.Utils;
-
import com.android.systemui.R;
public class QSTileBaseView extends LinearLayout {
private static final String TAG = "QSTileBaseView";
private final H mHandler = new H();
+ private final FrameLayout mIconFrame;
protected QSIconView mIcon;
protected RippleDrawable mRipple;
private Drawable mTileBackground;
@@ -63,15 +55,15 @@
// Default to Quick Tile padding, and QSTileView will specify its own padding.
int padding = context.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_padding);
- FrameLayout frame = new FrameLayout(context);
- frame.setForegroundGravity(Gravity.CENTER);
+ mIconFrame = new FrameLayout(context);
+ mIconFrame.setForegroundGravity(Gravity.CENTER);
int size = context.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size);
- addView(frame, new LayoutParams(size, size));
+ addView(mIconFrame, new LayoutParams(size, size));
mIcon = icon;
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(0, padding, 0, padding);
- frame.addView(mIcon, params);
+ mIconFrame.addView(mIcon, params);
mTileBackground = newTileBackground();
if (mTileBackground instanceof RippleDrawable) {
@@ -105,7 +97,7 @@
private void updateRippleSize(int width, int height) {
// center the touch feedback on the center of the icon, and dial it down a bit
final int cx = width / 2;
- final int cy = height / 2;
+ final int cy = mIconFrame.getMeasuredHeight() / 2;
final int rad = (int) (mIcon.getHeight() * .85f);
mRipple.setHotspotBounds(cx - rad, cy - rad, cx + rad, cy + rad);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java
index 232941d..428fe9b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java
@@ -20,6 +20,7 @@
import android.content.Context;
import android.content.res.Configuration;
+import android.graphics.drawable.RippleDrawable;
import android.service.quicksettings.Tile;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
@@ -28,6 +29,7 @@
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.TextView;
@@ -43,8 +45,7 @@
protected TextView mLabel;
private ImageView mPadLock;
private int mState;
- private OnClickListener mClick;
- private OnClickListener mSecondaryClick;
+ private ViewGroup mLabelContainer;
public QSTileView(Context context, QSIconView icon) {
this(context, icon, false);
@@ -76,13 +77,15 @@
}
protected void createLabel() {
- ViewGroup view = (ViewGroup) LayoutInflater.from(getContext())
- .inflate(R.layout.qs_tile_label, null);
- view.setClipChildren(false);
- view.setClipToPadding(false);
- mLabel = (TextView) view.findViewById(R.id.tile_label);
- mPadLock = (ImageView) view.findViewById(R.id.restricted_padlock);
- addView(view);
+ mLabelContainer = (ViewGroup) LayoutInflater.from(getContext())
+ .inflate(R.layout.qs_tile_label, this, false);
+ mLabelContainer.setClipChildren(false);
+ mLabelContainer.setClipToPadding(false);
+ mLabel = (TextView) mLabelContainer.findViewById(R.id.tile_label);
+ mPadLock = (ImageView) mLabelContainer.findViewById(R.id.restricted_padlock);
+
+ mLabelContainer.setBackground(newTileBackground());
+ addView(mLabelContainer);
}
@Override
@@ -104,17 +107,10 @@
}
@Override
- public void init(OnClickListener click, OnClickListener secondaryClick, OnLongClickListener longClick) {
- mClick = click;
- mSecondaryClick = secondaryClick;
+ public void init(OnClickListener click, OnClickListener secondaryClick,
+ OnLongClickListener longClick) {
super.init(click, secondaryClick, longClick);
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- if (event.getActionMasked() == MotionEvent.ACTION_UP) {
- setOnClickListener(event.getY() < (getMeasuredHeight() / 2) ? mClick : mSecondaryClick);
- }
- return super.onTouchEvent(event);
+ mLabelContainer.setClickable(true);
+ mLabelContainer.setOnClickListener(secondaryClick);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index d789b44..c2c6f7a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -49,6 +49,9 @@
public QuickQSPanel(Context context, AttributeSet attrs) {
super(context, attrs);
+ if (mFooter != null) {
+ removeView((View) mFooter.getView());
+ }
if (mTileLayout != null) {
for (int i = 0; i < mRecords.size(); i++) {
mTileLayout.removeTile(mRecords.get(i));
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
index f2c3e61..4e30797 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
@@ -301,6 +301,7 @@
if (position == mEditIndex) position--;
move(mAccessibilityFromIndex, position, v);
+
notifyDataSetChanged();
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
index dea56aa1..cdde6ea 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
@@ -87,7 +87,7 @@
private void setTileIcon() {
try {
PackageManager pm = mContext.getPackageManager();
- int flags = PackageManager.MATCH_ENCRYPTION_AWARE_AND_UNAWARE;
+ int flags = PackageManager.MATCH_DIRECT_BOOT_UNAWARE | PackageManager.MATCH_DIRECT_BOOT_AWARE;
if (isSystemApp(pm)) {
flags |= PackageManager.MATCH_DISABLED_COMPONENTS;
}
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 ce72942..ec4ca7a6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
@@ -102,12 +102,7 @@
mTokenMap.remove(service.getToken());
mTiles.remove(tile.getComponent());
final String slot = tile.getComponent().getClassName();
- mMainHandler.post(new Runnable() {
- @Override
- public void run() {
- mHost.getIconController().removeIcon(slot);
- }
- });
+ mMainHandler.post(() -> mHost.getIconController().removeIcon(slot));
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java
index 8227f8f..f7bfc1e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java
@@ -104,11 +104,6 @@
}
@Override
- protected void handleSecondaryClick() {
- showDetail(true);
- }
-
- @Override
public CharSequence getTileLabel() {
return mContext.getString(R.string.battery);
}
@@ -118,7 +113,6 @@
int level = (arg != null) ? (Integer) arg : mLevel;
String percentage = NumberFormat.getPercentInstance().format((double) level / 100.0);
- state.dualTarget = true;
state.state = mCharging ? Tile.STATE_UNAVAILABLE
: mPowerSave ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
state.icon = ResourceIcon.get(R.drawable.ic_qs_battery_saver);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
index b48b829..3c28f76 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
@@ -123,7 +123,6 @@
@Override
protected void handleUpdateState(BooleanState state, Object arg) {
- state.dualTarget = true;
state.label = mContext.getString(R.string.quick_settings_cast_title);
state.contentDescription = state.label;
state.value = false;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java
index c7b6aea..9cd79f8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java
@@ -91,7 +91,7 @@
formatBytes(info.usageLevel));
bottom = res.getString(R.string.quick_settings_cellular_detail_data_limit,
formatBytes(info.limitLevel));
- usageColor = mContext.getColor(R.color.system_warning_color);
+ usageColor = Utils.getDefaultColor(mContext, android.R.attr.colorError);
}
if (usageColor == 0) {
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 90a9db6..796967c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -372,9 +372,9 @@
item.icon = mWifiController.getIcon(ap);
item.line1 = ap.getSsid();
item.line2 = ap.isActive() ? ap.getSummary() : null;
- item.overlay = ap.getSecurity() != AccessPoint.SECURITY_NONE
- ? mContext.getDrawable(R.drawable.qs_ic_wifi_lock)
- : null;
+ item.icon2 = ap.getSecurity() != AccessPoint.SECURITY_NONE
+ ? R.drawable.qs_ic_wifi_lock
+ : -1;
items[i] = item;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index a6fe0ea..c9debb2 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -31,6 +31,7 @@
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
+import android.provider.Settings.Secure;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
@@ -44,7 +45,6 @@
import com.android.systemui.DejankUtils;
import com.android.systemui.Interpolators;
import com.android.keyguard.LatencyTracker;
-import com.android.systemui.Prefs;
import com.android.systemui.R;
import com.android.systemui.recents.events.EventBus;
import com.android.systemui.recents.events.activity.CancelEnterRecentsWindowAnimationEvent;
@@ -181,8 +181,10 @@
// is still valid. Otherwise, we need to reset the lastStackactiveTime to the
// currentTime and remove the old tasks in between which would not be previously
// visible, but currently would be in the new currentTime
- long oldLastStackActiveTime = Prefs.getLong(RecentsActivity.this,
- Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, -1);
+ int currentUser = SystemServicesProxy.getInstance(RecentsActivity.this)
+ .getCurrentUser();
+ long oldLastStackActiveTime = Settings.Secure.getLongForUser(getContentResolver(),
+ Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, -1, currentUser);
if (oldLastStackActiveTime != -1) {
long currentTime = System.currentTimeMillis();
if (currentTime < oldLastStackActiveTime) {
@@ -200,8 +202,8 @@
Recents.getSystemServices().removeTask(task.persistentId);
}
}
- Prefs.putLong(RecentsActivity.this,
- Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, currentTime);
+ Settings.Secure.putLongForUser(RecentsActivity.this.getContentResolver(),
+ Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, currentTime, currentUser);
}
}
}
@@ -834,8 +836,9 @@
Recents.getTaskLoader().dump(prefix, writer);
String id = Integer.toHexString(System.identityHashCode(this));
- long lastStackActiveTime = Prefs.getLong(this,
- Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, -1);
+ long lastStackActiveTime = Settings.Secure.getLongForUser(getContentResolver(),
+ Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, -1,
+ SystemServicesProxy.getInstance(this).getCurrentUser());
writer.print(prefix); writer.print(TAG);
writer.print(" visible="); writer.print(mIsVisible ? "Y" : "N");
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
index 8de4e58..33ad7fb 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
@@ -375,6 +375,10 @@
MutableBoolean isHomeStackVisible = new MutableBoolean(true);
if (!ssp.isRecentsActivityVisible(isHomeStackVisible)) {
ActivityManager.RunningTaskInfo runningTask = ssp.getRunningTask();
+ if (runningTask == null) {
+ return;
+ }
+
RecentsTaskLoader loader = Recents.getTaskLoader();
sInstanceLoadPlan = loader.createLoadPlan(mContext);
sInstanceLoadPlan.preloadRawTasks(!isHomeStackVisible.value);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
index eae1b81..cda902b 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -153,7 +153,7 @@
public void onTaskStackChanged() { }
public void onTaskSnapshotChanged(int taskId, TaskSnapshot snapshot) { }
public void onActivityPinned() { }
- public void onPinnedActivityRestartAttempt(ComponentName sourceComponent) { }
+ public void onPinnedActivityRestartAttempt(String launchedFromPackage) { }
public void onPinnedStackAnimationEnded() { }
public void onActivityForcedResizable(String packageName, int taskId) { }
public void onActivityDismissingDockedStack() { }
@@ -198,10 +198,10 @@
}
@Override
- public void onPinnedActivityRestartAttempt(ComponentName sourceComponent)
+ public void onPinnedActivityRestartAttempt(String launchedFromPackage)
throws RemoteException{
mHandler.removeMessages(H.ON_PINNED_ACTIVITY_RESTART_ATTEMPT);
- mHandler.obtainMessage(H.ON_PINNED_ACTIVITY_RESTART_ATTEMPT, sourceComponent)
+ mHandler.obtainMessage(H.ON_PINNED_ACTIVITY_RESTART_ATTEMPT, launchedFromPackage)
.sendToTarget();
}
@@ -1244,8 +1244,7 @@
}
case ON_PINNED_ACTIVITY_RESTART_ATTEMPT: {
for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
- mTaskStackListeners.get(i).onPinnedActivityRestartAttempt(
- (ComponentName) msg.obj);
+ mTaskStackListeners.get(i).onPinnedActivityRestartAttempt((String) msg.obj);
}
break;
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
index 11b5984..12c10df 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
@@ -26,6 +26,8 @@
import android.graphics.drawable.Drawable;
import android.os.UserHandle;
import android.os.UserManager;
+import android.provider.Settings;
+import android.provider.Settings.Secure;
import android.util.ArraySet;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
@@ -130,6 +132,7 @@
preloadRawTasks(includeFrontMostExcludedTask);
}
+ SystemServicesProxy ssp = SystemServicesProxy.getInstance(mContext);
SparseArray<Task.TaskKey> affiliatedTasks = new SparseArray<>();
SparseIntArray affiliatedTaskCounts = new SparseIntArray();
SparseBooleanArray lockedUsers = new SparseBooleanArray();
@@ -137,8 +140,10 @@
R.string.accessibility_recents_item_will_be_dismissed);
String appInfoDescFormat = mContext.getString(
R.string.accessibility_recents_item_open_app_info);
- long lastStackActiveTime = Prefs.getLong(mContext,
- Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, 0);
+ int currentUserId = ssp.getCurrentUser();
+ long legacyLastStackActiveTime = migrateLegacyLastStackActiveTime(currentUserId);
+ long lastStackActiveTime = Settings.Secure.getLongForUser(mContext.getContentResolver(),
+ Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, legacyLastStackActiveTime, currentUserId);
if (RecentsDebugFlags.Static.EnableMockTasks) {
lastStackActiveTime = 0;
}
@@ -205,8 +210,8 @@
affiliatedTasks.put(taskKey.id, taskKey);
}
if (newLastStackActiveTime != -1) {
- Prefs.putLong(mContext, Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME,
- newLastStackActiveTime);
+ Settings.Secure.putLongForUser(mContext.getContentResolver(),
+ Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, newLastStackActiveTime, currentUserId);
}
// Initialize the stacks
@@ -285,4 +290,36 @@
private boolean isHistoricalTask(ActivityManager.RecentTaskInfo t) {
return t.lastActiveTime < (System.currentTimeMillis() - SESSION_BEGIN_TIME);
}
+
+
+ /**
+ * Migrate the last active time from the prefs to the secure settings.
+ *
+ * The first time this runs, it will:
+ * 1) fetch the last stack active time from the prefs
+ * 2) set the prefs to the last stack active time for all users
+ * 3) clear the pref
+ * 4) return the last stack active time
+ *
+ * Subsequent calls to this will return zero.
+ */
+ private long migrateLegacyLastStackActiveTime(int currentUserId) {
+ long legacyLastStackActiveTime = Prefs.getLong(mContext,
+ Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, -1);
+ if (legacyLastStackActiveTime != -1) {
+ Prefs.remove(mContext, Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME);
+ UserManager userMgr = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ List<UserInfo> users = userMgr.getUsers();
+ for (int i = 0; i < users.size(); i++) {
+ int userId = users.get(i).id;
+ if (userId != currentUserId) {
+ Settings.Secure.putLongForUser(mContext.getContentResolver(),
+ Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, legacyLastStackActiveTime,
+ userId);
+ }
+ }
+ return legacyLastStackActiveTime;
+ }
+ return 0;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java
index 02b0113..e0dac09 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java
@@ -197,6 +197,7 @@
bm.getHeight() - thumbnailData.insets.top - thumbnailData.insets.bottom);
mThumbnailData = thumbnailData;
updateThumbnailMatrix();
+ updateThumbnailPaintFilter();
} else {
mBitmapShader = null;
mDrawPaint.setShader(null);
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
index 9a4b45a..2d47c7b 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
@@ -21,6 +21,7 @@
import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.app.admin.DevicePolicyManager;
import android.app.Notification;
import android.app.Notification.BigPictureStyle;
import android.app.NotificationManager;
@@ -46,6 +47,7 @@
import android.os.Bundle;
import android.os.Environment;
import android.os.Process;
+import android.os.UserHandle;
import android.provider.MediaStore;
import android.util.DisplayMetrics;
import android.view.Display;
@@ -866,6 +868,16 @@
.setAutoCancel(true)
.setColor(context.getColor(
com.android.internal.R.color.system_notification_accent_color));
+ final DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
+ Context.DEVICE_POLICY_SERVICE);
+ final Intent intent = dpm.createAdminSupportIntent(
+ DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE);
+ if (intent != null) {
+ final PendingIntent pendingIntent = PendingIntent.getActivityAsUser(
+ context, 0, intent, 0, null, UserHandle.CURRENT);
+ b.setContentIntent(pendingIntent);
+ }
+
SystemUI.overrideNotificationAppName(context, b);
Notification n = new Notification.BigTextStyle(b)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
index 0bd6491..98787f7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
@@ -38,6 +38,7 @@
import com.android.systemui.classifier.FalsingManager;
import com.android.systemui.statusbar.notification.FakeShadowView;
import com.android.systemui.statusbar.notification.NotificationUtils;
+import com.android.systemui.statusbar.phone.DoubleTapHelper;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.stack.StackStateAnimator;
@@ -47,7 +48,6 @@
*/
public abstract class ActivatableNotificationView extends ExpandableOutlineView {
- private static final long DOUBLETAP_TIMEOUT_MS = 1200;
private static final int BACKGROUND_ANIMATION_LENGTH_MS = 220;
private static final int ACTIVATE_ANIMATION_LENGTH = 220;
private static final int DARK_ANIMATION_LENGTH = 170;
@@ -101,6 +101,7 @@
private final int mLowPriorityRippleColor;
protected final int mNormalRippleColor;
private final AccessibilityManager mAccessibilityManager;
+ private final DoubleTapHelper mDoubleTapHelper;
private boolean mDimmed;
private boolean mDark;
@@ -114,14 +115,6 @@
*/
private boolean mActivated;
- private float mDownX;
- private float mDownY;
- private final float mTouchSlop;
-
- private float mActivationX;
- private float mActivationY;
- private final float mDoubleTapSlop;
-
private OnActivatedListener mOnActivatedListener;
private final Interpolator mSlowOutFastInInterpolator;
@@ -143,7 +136,6 @@
private final int mLowPriorityColor;
private boolean mIsBelowSpeedBump;
private FalsingManager mFalsingManager;
- private boolean mTrackTouch;
private float mNormalBackgroundVisibilityAmount;
private ValueAnimator mFadeInFromDarkAnimator;
@@ -183,8 +175,6 @@
public ActivatableNotificationView(Context context, AttributeSet attrs) {
super(context, attrs);
- mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
- mDoubleTapSlop = context.getResources().getDimension(R.dimen.double_tap_slop);
mSlowOutFastInInterpolator = new PathInterpolator(0.8f, 0.0f, 0.6f, 1.0f);
mSlowOutLinearInInterpolator = new PathInterpolator(0.8f, 0.0f, 1.0f, 1.0f);
setClipChildren(false);
@@ -200,6 +190,14 @@
R.color.notification_ripple_untinted_color);
mFalsingManager = FalsingManager.getInstance(context);
mAccessibilityManager = AccessibilityManager.getInstance(mContext);
+
+ mDoubleTapHelper = new DoubleTapHelper(this, (active) -> {
+ if (active) {
+ makeActive();
+ } else {
+ makeInactive(true /* animate */);
+ }
+ }, this::performClick, this::handleSlideBack, mFalsingManager::onNotificationDoubleTap);
}
@Override
@@ -284,60 +282,7 @@
}
private boolean handleTouchEventDimmed(MotionEvent event) {
- int action = event.getActionMasked();
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- mDownX = event.getX();
- mDownY = event.getY();
- mTrackTouch = true;
- if (mDownY > getActualHeight()) {
- mTrackTouch = false;
- }
- break;
- case MotionEvent.ACTION_MOVE:
- if (!isWithinTouchSlop(event)) {
- makeInactive(true /* animate */);
- mTrackTouch = false;
- }
- break;
- case MotionEvent.ACTION_UP:
- if (isWithinTouchSlop(event)) {
- if (handleSlideBack()) {
- return true;
- }
- if (!mActivated) {
- makeActive();
- postDelayed(mTapTimeoutRunnable, DOUBLETAP_TIMEOUT_MS);
- mActivationX = event.getX();
- mActivationY = event.getY();
- } else {
- boolean withinDoubleTapSlop = isWithinDoubleTapSlop(event);
- mFalsingManager.onNotificationDoubleTap(
- withinDoubleTapSlop,
- event.getX() - mActivationX,
- event.getY() - mActivationY);
- if (withinDoubleTapSlop) {
- if (!performClick()) {
- return false;
- }
- } else {
- makeInactive(true /* animate */);
- mTrackTouch = false;
- }
- }
- } else {
- makeInactive(true /* animate */);
- mTrackTouch = false;
- }
- break;
- case MotionEvent.ACTION_CANCEL:
- makeInactive(true /* animate */);
- mTrackTouch = false;
- break;
- default:
- break;
- }
- return mTrackTouch;
+ return mDoubleTapHelper.onTouchEvent(event, getActualHeight());
}
private void makeActive() {
@@ -425,21 +370,6 @@
removeCallbacks(mTapTimeoutRunnable);
}
- private boolean isWithinTouchSlop(MotionEvent event) {
- return Math.abs(event.getX() - mDownX) < mTouchSlop
- && Math.abs(event.getY() - mDownY) < mTouchSlop;
- }
-
- private boolean isWithinDoubleTapSlop(MotionEvent event) {
- if (!mActivated) {
- // If we're not activated there's no double tap slop to satisfy.
- return true;
- }
-
- return Math.abs(event.getX() - mActivationX) < mDoubleTapSlop
- && Math.abs(event.getY() - mActivationY) < mDoubleTapSlop;
- }
-
public void setDimmed(boolean dimmed, boolean fade) {
if (mDimmed != dimmed) {
mDimmed = dimmed;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
index 19132da..334991f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
@@ -133,6 +133,7 @@
mDragDownCallback.setEmptyDragAmount(0f);
} else {
mCallback.setUserLockedChild(mStartingChild, false);
+ mStartingChild = null;
}
mDraggingDown = false;
} else {
@@ -214,6 +215,7 @@
mFalsingManager.onNotificatonStopDraggingDown();
if (mStartingChild != null) {
cancelExpansion(mStartingChild);
+ mStartingChild = null;
} else {
cancelExpansion();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 3bbaf99..bfe4bb2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -22,7 +22,6 @@
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.Nullable;
import android.content.Context;
-import android.content.res.ColorStateList;
import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.ColorDrawable;
@@ -331,10 +330,11 @@
boolean isPreL = Boolean.TRUE.equals(expandedIcon.getTag(R.id.icon_is_pre_L));
boolean colorize = !isPreL || NotificationUtils.isGrayscale(expandedIcon,
NotificationColorUtil.getInstance(mContext));
+ int color = StatusBarIconView.NO_COLOR;
if (colorize) {
- int color = mEntry.getContrastedColor(mContext, mIsLowPriority && !isExpanded());
- expandedIcon.setImageTintList(ColorStateList.valueOf(color));
+ color = mEntry.getContrastedColor(mContext, mIsLowPriority && !isExpanded());
}
+ expandedIcon.setStaticDrawableColor(color);
}
private void updateLimits() {
@@ -462,6 +462,7 @@
updateBackgroundForGroupState();
updateClickAndFocus();
if (mNotificationParent != null) {
+ setOverrideTintColor(NO_COLOR, 0.0f);
mNotificationParent.updateBackgroundForGroupState();
}
updateIconVisibilities();
@@ -901,6 +902,9 @@
* @return whether the notification is currently showing a view with an icon.
*/
public boolean isShowingIcon() {
+ if (areGutsExposed()) {
+ return false;
+ }
if (mIsSummaryWithChildren) {
return true;
}
@@ -1990,7 +1994,7 @@
mAboveShelf = aboveShelf;
}
- public class NotificationViewState extends ExpandableViewState {
+ public static class NotificationViewState extends ExpandableViewState {
private final StackScrollState mOverallState;
@@ -2011,8 +2015,11 @@
@Override
protected void onYTranslationAnimationFinished(View view) {
super.onYTranslationAnimationFinished(view);
- if (mHeadsupDisappearRunning) {
- setHeadsUpAnimatingAway(false);
+ if (view instanceof ExpandableNotificationRow) {
+ ExpandableNotificationRow row = (ExpandableNotificationRow) view;
+ if (row.isHeadsUpAnimatingAway()) {
+ row.setHeadsUpAnimatingAway(false);
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index d599ec1..fb92a67 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -42,6 +42,7 @@
import com.android.internal.app.IBatteryStats;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
+import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.statusbar.phone.KeyguardIndicationTextView;
@@ -87,6 +88,7 @@
private KeyguardUpdateMonitorCallback mUpdateMonitor;
private final DevicePolicyManager mDevicePolicyManager;
+ private boolean mDozing;
public KeyguardIndicationController(Context context, ViewGroup indicationArea,
LockIcon lockIcon) {
@@ -139,7 +141,7 @@
return;
}
- if (mDevicePolicyManager.isDeviceManaged()) {
+ if (!mDozing && mDevicePolicyManager.isDeviceManaged()) {
final CharSequence organizationName =
mDevicePolicyManager.getDeviceOwnerOrganizationName();
if (organizationName != null) {
@@ -224,6 +226,18 @@
if (mVisible) {
// Walk down a precedence-ordered list of what should indication
// should be shown based on user or device state
+ if (mDozing) {
+ // If we're dozing, never show a persistent indication.
+ if (!TextUtils.isEmpty(mTransientIndication)) {
+ mTextView.switchIndication(mTransientIndication);
+ mTextView.setTextColor(mTransientTextColor);
+
+ } else {
+ mTextView.switchIndication(null);
+ }
+ return;
+ }
+
if (!mUserManager.isUserUnlocked(ActivityManager.getCurrentUser())) {
mTextView.switchIndication(com.android.internal.R.string.lockscreen_storage_locked);
mTextView.setTextColor(Color.WHITE);
@@ -319,6 +333,12 @@
}
};
+ public void setDozing(boolean dozing) {
+ mDozing = dozing;
+ updateIndication();
+ updateDisclosure();
+ }
+
protected class BaseKeyguardCallback extends KeyguardUpdateMonitorCallback {
private int mLastSuccessiveErrorMessage = -1;
@@ -346,10 +366,11 @@
if (!updateMonitor.isUnlockingWithFingerprintAllowed()) {
return;
}
- int errorColor = mContext.getResources().getColor(R.color.system_warning_color, null);
+ int errorColor = Utils.getColorError(mContext);
if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
mStatusBarKeyguardViewManager.showBouncerMessage(helpString, errorColor);
- } else if (updateMonitor.isDeviceInteractive()) {
+ } else if (updateMonitor.isDeviceInteractive()
+ || mDozing && updateMonitor.isScreenOn()) {
mLockIcon.setTransientFpError(true);
showTransientIndication(helpString, errorColor);
mHandler.removeMessages(MSG_CLEAR_FP_MSG);
@@ -368,7 +389,7 @@
|| msgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED) {
return;
}
- int errorColor = mContext.getResources().getColor(R.color.system_warning_color, null);
+ int errorColor = Utils.getColorError(mContext);
if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
// When swiping up right after receiving a fingerprint error, the bouncer calls
// authenticate leading to the same message being shown again on the bouncer.
@@ -391,8 +412,7 @@
@Override
public void onScreenTurnedOn() {
if (mMessageToShowOnScreenOn != null) {
- int errorColor = mContext.getResources().getColor(R.color.system_warning_color,
- null);
+ int errorColor = Utils.getColorError(mContext);
showTransientIndication(mMessageToShowOnScreenOn, errorColor);
// We want to keep this message around in case the screen was off
mHandler.removeMessages(MSG_HIDE_TRANSIENT);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java
index b36cfdc..fd1317e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java
@@ -244,6 +244,10 @@
}
}
+ public boolean willBeRemoved() {
+ return mGutsContent != null ? mGutsContent.willBeRemoved() : false;
+ }
+
public boolean isExposed() {
return mExposed;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
index 5d13e61..9703235 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
@@ -274,6 +274,11 @@
}
@Override
+ public boolean willBeRemoved() {
+ return !mChannelEnabledSwitch.isChecked();
+ }
+
+ @Override
public View getContentView() {
return this;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
index 355022f..534a719 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
@@ -90,8 +90,7 @@
protected void onAttachedToWindow() {
super.onAttachedToWindow();
Dependency.get(PluginManager.class).addPluginListener(
- NotificationMenuRowProvider.ACTION, this,
- NotificationMenuRowProvider.VERSION, false /* Allow multiple */);
+ this, NotificationMenuRowProvider.class, false /* Allow multiple */);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
index 2425076..1cd909ea 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
@@ -23,6 +23,7 @@
import android.view.View;
import android.view.ViewGroup;
+import com.android.internal.widget.CachingIconView;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.ViewInvertHelper;
@@ -379,11 +380,12 @@
: 0.0f;
row.setContentTransformationAmount(contentTransformationAmount, isLastChild);
setIconTransformationAmount(row, transitionAmount, iconTransformDistance,
- clampedAmount != transitionAmount);
+ clampedAmount != transitionAmount, isLastChild);
}
private void setIconTransformationAmount(ExpandableNotificationRow row,
- float transitionAmount, float iconTransformDistance, boolean usingLinearInterpolation) {
+ float transitionAmount, float iconTransformDistance, boolean usingLinearInterpolation,
+ boolean isLastChild) {
StatusBarIconView icon = row.getEntry().expandedIcon;
NotificationIconContainer.IconState iconState = getIconState(icon);
@@ -414,7 +416,8 @@
transitionAmount);
float shelfIconSize = icon.getHeight() * icon.getIconScale();
float alpha = 1.0f;
- if (!row.isShowingIcon()) {
+ boolean noIcon = !row.isShowingIcon();
+ if (noIcon) {
// The view currently doesn't have an icon, lets transform it in!
alpha = transitionAmount;
notificationIconSize = shelfIconSize / 2.0f;
@@ -435,9 +438,16 @@
iconState.scaleY = 1.0f;
iconState.hidden = false;
}
- if (row.isAboveShelf()) {
+ if (row.isAboveShelf() || (!row.isInShelf() && isLastChild && row.areGutsExposed())) {
iconState.hidden = true;
}
+ int shelfColor = icon.getStaticDrawableColor();
+ if (!noIcon && shelfColor != StatusBarIconView.NO_COLOR) {
+ int notificationColor = row.getNotificationHeader().getOriginalNotificationColor();
+ shelfColor = NotificationUtils.interpolateColors(notificationColor, shelfColor,
+ iconState.iconAppearAmount);
+ }
+ iconState.iconColor = shelfColor;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
index 0657dc1..6b1e62d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
@@ -56,6 +56,7 @@
private TextView mUndoButton;
private ViewGroup mSnoozeOptionView;
private List<SnoozeOption> mSnoozeOptions;
+ private boolean mSnoozing;
private SnoozeOption mSelectedOption;
@@ -175,6 +176,11 @@
}
@Override
+ public boolean willBeRemoved() {
+ return mSnoozing;
+ }
+
+ @Override
public View getContentView() {
return this;
}
@@ -199,6 +205,7 @@
// When snooze is closed (i.e. there was interaction outside of the notification)
// then we commit the snooze action.
if (mSnoozeListener != null && mSelectedOption != null) {
+ mSnoozing = true;
mSnoozeListener.snoozeNotification(mSbn, mSelectedOption);
return true;
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index 89041f9..67be99e5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -83,6 +83,8 @@
private int mWifiStrengthId = 0;
private int mLastWifiBadgeId = -1;
private int mLastWifiStrengthId = -1;
+ private int mWifiActivityId = 0;
+ private int mLastWifiActivityId = -1;
private boolean mIsAirplaneMode = false;
private int mAirplaneIconId = 0;
private int mLastAirplaneIconId = -1;
@@ -97,6 +99,7 @@
ViewGroup mEthernetGroup, mWifiGroup;
View mNoSimsCombo;
ImageView mVpn, mEthernet, mWifi, mAirplane, mNoSims, mEthernetDark, mWifiDark, mNoSimsDark;
+ ImageView mWifiActivity;
View mWifiAirplaneSpacer;
View mWifiSignalSpacer;
LinearLayout mMobileSignalGroup;
@@ -177,6 +180,7 @@
mWifiGroup = (ViewGroup) findViewById(R.id.wifi_combo);
mWifi = (ImageView) findViewById(R.id.wifi_signal);
mWifiDark = (ImageView) findViewById(R.id.wifi_signal_dark);
+ mWifiActivity = (ImageView) findViewById(R.id.wifi_inout);
mAirplane = (ImageView) findViewById(R.id.airplane);
mNoSims = (ImageView) findViewById(R.id.no_sims);
mNoSimsDark = (ImageView) findViewById(R.id.no_sims_dark);
@@ -267,6 +271,10 @@
mWifiStrengthId = statusIcon.icon;
mWifiBadgeId = statusIcon.iconOverlay;
mWifiDescription = statusIcon.contentDescription;
+ mWifiActivityId = activityIn && activityOut ? R.drawable.stat_sys_wifi_inout
+ : activityIn ? R.drawable.stat_sys_wifi_in
+ : activityOut ? R.drawable.stat_sys_wifi_out
+ : 0;
apply();
}
@@ -286,6 +294,10 @@
state.mMobileTypeDescription = typeContentDescription;
state.mIsMobileTypeIconWide = statusType != 0 && isWide;
state.mRoaming = roaming;
+ state.mMobileActivityId = activityIn && activityOut ? R.drawable.stat_sys_signal_inout
+ : activityIn ? R.drawable.stat_sys_signal_in
+ : activityOut ? R.drawable.stat_sys_signal_out
+ : 0;
apply();
}
@@ -409,6 +421,10 @@
mLastWifiStrengthId = -1;
mLastWifiBadgeId = -1;
}
+ if (mWifiActivity != null) {
+ mWifiActivity.setImageDrawable(null);
+ mLastWifiActivityId = -1;
+ }
for (PhoneState state : mPhoneStates) {
if (state.mMobile != null) {
@@ -425,6 +441,10 @@
state.mMobileType.setImageDrawable(null);
state.mLastMobileTypeId = -1;
}
+ if (state.mMobileActivity != null) {
+ state.mMobileActivity.setImageDrawable(null);
+ state.mLastMobileActivityId = -1;
+ }
}
if (mAirplane != null) {
@@ -484,6 +504,12 @@
mLastWifiStrengthId = mWifiStrengthId;
mLastWifiBadgeId = mWifiBadgeId;
}
+ if (mWifiActivityId != mLastWifiActivityId) {
+ if (mWifiActivityId != 0) {
+ setIconForView(mWifiActivity, mWifiActivityId);
+ }
+ mLastWifiActivityId = mWifiActivityId;
+ }
mWifiGroup.setContentDescription(mWifiDescription);
mWifiGroup.setVisibility(View.VISIBLE);
} else {
@@ -495,6 +521,8 @@
(mWifiVisible ? "VISIBLE" : "GONE"),
mWifiStrengthId));
+ mWifiActivity.setVisibility(mWifiActivityId != 0 ? View.VISIBLE : View.GONE);
+
boolean anyMobileVisible = false;
int firstMobileTypeId = 0;
for (PhoneState state : mPhoneStates) {
@@ -603,6 +631,8 @@
applyDarkIntensity(
DarkIconDispatcher.getDarkIntensity(mTintArea, mWifi, mDarkIntensity),
mWifi, mWifiDark);
+ setTint(mWifiActivity,
+ DarkIconDispatcher.getTint(mTintArea, mWifiActivity, mIconTint));
applyDarkIntensity(
DarkIconDispatcher.getDarkIntensity(mTintArea, mEthernet, mDarkIntensity),
mEthernet, mEthernetDark);
@@ -627,15 +657,17 @@
private class PhoneState {
private final int mSubId;
private boolean mMobileVisible = false;
- private int mMobileStrengthId = 0, mMobileTypeId = 0;
+ private int mMobileStrengthId = 0, mMobileTypeId = 0, mMobileActivityId = 0;
private int mLastMobileStrengthId = -1;
private int mLastMobileTypeId = -1;
+ private int mLastMobileActivityId = -1;
private boolean mIsMobileTypeIconWide;
private String mMobileDescription, mMobileTypeDescription;
private ViewGroup mMobileGroup;
private ImageView mMobile, mMobileDark, mMobileType, mMobileRoaming;
public boolean mRoaming;
+ private ImageView mMobileActivity;
public PhoneState(int subId, Context context) {
ViewGroup root = (ViewGroup) LayoutInflater.from(context)
@@ -650,6 +682,7 @@
mMobileDark = (ImageView) root.findViewById(R.id.mobile_signal_dark);
mMobileType = (ImageView) root.findViewById(R.id.mobile_type);
mMobileRoaming = (ImageView) root.findViewById(R.id.mobile_roaming);
+ mMobileActivity = (ImageView) root.findViewById(R.id.mobile_inout);
}
public boolean apply(boolean isSecondaryIcon) {
@@ -664,6 +697,11 @@
mMobileType.setImageResource(mMobileTypeId);
mLastMobileTypeId = mMobileTypeId;
}
+
+ if (mLastMobileActivityId != mMobileActivityId) {
+ mMobileActivity.setImageResource(mMobileActivityId);
+ mLastMobileActivityId = mMobileActivityId;
+ }
mMobileGroup.setContentDescription(mMobileTypeDescription
+ " " + mMobileDescription);
mMobileGroup.setVisibility(View.VISIBLE);
@@ -686,6 +724,7 @@
mMobileType.setVisibility(mMobileTypeId != 0 ? View.VISIBLE : View.GONE);
mMobileRoaming.setVisibility(mRoaming ? View.VISIBLE : View.GONE);
+ mMobileActivity.setVisibility(mMobileActivityId != 0 ? View.VISIBLE : View.GONE);
return mMobileVisible;
}
@@ -747,6 +786,8 @@
setTint(mMobileType, DarkIconDispatcher.getTint(tintArea, mMobileType, tint));
setTint(mMobileRoaming, DarkIconDispatcher.getTint(tintArea, mMobileRoaming,
tint));
+ setTint(mMobileActivity,
+ DarkIconDispatcher.getTint(tintArea, mMobileActivity, tint));
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 6283148..aec9a4b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -19,9 +19,11 @@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
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;
@@ -37,7 +39,6 @@
import android.util.Log;
import android.util.Property;
import android.util.TypedValue;
-import android.view.View;
import android.view.ViewDebug;
import android.view.accessibility.AccessibilityEvent;
import android.view.animation.Interpolator;
@@ -50,6 +51,9 @@
import java.text.NumberFormat;
public class StatusBarIconView extends AnimatedImageView {
+ public static final int NO_COLOR = 0;
+ private final int ANIMATION_DURATION_FAST = 100;
+
public static final int STATE_ICON = 0;
public static final int STATE_DOT = 1;
public static final int STATE_HIDDEN = 2;
@@ -104,6 +108,17 @@
private ObjectAnimator mDotAnimator;
private float mDotAppearAmount;
private OnVisibilityChangedListener mOnVisibilityChangedListener;
+ private int mDrawableColor;
+ private int mIconColor;
+ private ValueAnimator mColorAnimator;
+ private int mCurrentSetColor = NO_COLOR;
+ private int mAnimationStartColor = NO_COLOR;
+ private final ValueAnimator.AnimatorUpdateListener mColorUpdater
+ = animation -> {
+ int newColor = NotificationUtils.interpolateColors(mAnimationStartColor, mIconColor,
+ animation.getAnimatedFraction());
+ setColorInternal(newColor);
+ };
public StatusBarIconView(Context context, String slot, Notification notification) {
this(context, slot, notification, false);
@@ -123,7 +138,7 @@
setScaleType(ScaleType.CENTER);
mDensity = context.getResources().getDisplayMetrics().densityDpi;
if (mNotification != null) {
- setIconTint(getContext().getColor(
+ setDecorColor(getContext().getColor(
com.android.internal.R.color.notification_icon_default_color));
}
reloadDimens();
@@ -446,10 +461,66 @@
return c.getString(R.string.accessibility_desc_notification_icon, appName, desc);
}
- public void setIconTint(int iconTint) {
+ /**
+ * Set the color that is used to draw decoration like the overflow dot. This will not be applied
+ * to the drawable.
+ */
+ public void setDecorColor(int iconTint) {
mDotPaint.setColor(iconTint);
}
+ /**
+ * Set the static color that should be used for the drawable of this icon if it's not
+ * transitioning this also immediately sets the color.
+ */
+ public void setStaticDrawableColor(int color) {
+ mDrawableColor = color;
+ setColorInternal(color);
+ mIconColor = color;
+ }
+
+ private void setColorInternal(int color) {
+ if (color != NO_COLOR) {
+ setImageTintList(ColorStateList.valueOf(color));
+ } else {
+ setImageTintList(null);
+ }
+ mCurrentSetColor = color;
+ }
+
+ public void setIconColor(int iconColor, boolean animate) {
+ if (mIconColor != iconColor) {
+ mIconColor = iconColor;
+ if (mColorAnimator != null) {
+ mColorAnimator.cancel();
+ }
+ if (mCurrentSetColor == iconColor) {
+ return;
+ }
+ if (animate && mCurrentSetColor != NO_COLOR) {
+ mAnimationStartColor = mCurrentSetColor;
+ mColorAnimator = ValueAnimator.ofFloat(0.0f, 1.0f);
+ mColorAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
+ mColorAnimator.setDuration(ANIMATION_DURATION_FAST);
+ mColorAnimator.addUpdateListener(mColorUpdater);
+ mColorAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mColorAnimator = null;
+ mAnimationStartColor = NO_COLOR;
+ }
+ });
+ mColorAnimator.start();
+ } else {
+ setColorInternal(iconColor);
+ }
+ }
+ }
+
+ public int getStaticDrawableColor() {
+ return mDrawableColor;
+ }
+
public void setVisibleState(int state) {
setVisibleState(state, true /* animate */, null /* endRunnable */);
}
@@ -467,10 +538,13 @@
boolean runnableAdded = false;
if (visibleState != mVisibleState) {
mVisibleState = visibleState;
+ if (mIconAppearAnimator != null) {
+ mIconAppearAnimator.cancel();
+ }
+ if (mDotAnimator != null) {
+ mDotAnimator.cancel();
+ }
if (animate) {
- if (mIconAppearAnimator != null) {
- mIconAppearAnimator.cancel();
- }
float targetAmount = 0.0f;
Interpolator interpolator = Interpolators.FAST_OUT_LINEAR_IN;
if (visibleState == STATE_ICON) {
@@ -482,7 +556,7 @@
mIconAppearAnimator = ObjectAnimator.ofFloat(this, ICON_APPEAR_AMOUNT,
currentAmount, targetAmount);
mIconAppearAnimator.setInterpolator(interpolator);
- mIconAppearAnimator.setDuration(100);
+ mIconAppearAnimator.setDuration(ANIMATION_DURATION_FAST);
mIconAppearAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
@@ -494,9 +568,6 @@
runnableAdded = true;
}
- if (mDotAnimator != null) {
- mDotAnimator.cancel();
- }
targetAmount = visibleState == STATE_ICON ? 2.0f : 0.0f;
interpolator = Interpolators.FAST_OUT_LINEAR_IN;
if (visibleState == STATE_DOT) {
@@ -508,7 +579,7 @@
mDotAnimator = ObjectAnimator.ofFloat(this, DOT_APPEAR_AMOUNT,
currentAmount, targetAmount);
mDotAnimator.setInterpolator(interpolator);
- mDotAnimator.setDuration(100);
+ mDotAnimator.setDuration(ANIMATION_DURATION_FAST);
final boolean runRunnable = !runnableAdded;
mDotAnimator.addListener(new AnimatorListenerAdapter() {
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
index ed71e57..f3c2bc5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
@@ -33,6 +33,7 @@
import android.util.Log;
import android.view.View;
+import com.android.settingslib.Utils;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
@@ -167,7 +168,7 @@
mSemiTransparent = context.getColor(
com.android.internal.R.color.system_bar_background_semi_transparent);
mTransparent = context.getColor(R.color.system_bar_background_transparent);
- mWarning = context.getColor(com.android.internal.R.color.battery_saver_mode_color);
+ mWarning = Utils.getColorAttr(context, android.R.attr.colorError);
}
mGradient = context.getDrawable(gradientResourceId);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DoubleTapHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DoubleTapHelper.java
new file mode 100644
index 0000000..dcb6a38
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DoubleTapHelper.java
@@ -0,0 +1,174 @@
+/*
+ * 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.view.MotionEvent;
+import android.view.View;
+import android.view.ViewConfiguration;
+
+import com.android.systemui.R;
+
+/**
+ * Detects a double tap.
+ */
+public class DoubleTapHelper {
+
+ private static final long DOUBLETAP_TIMEOUT_MS = 1200;
+
+ private final View mView;
+ private final ActivationListener mActivationListener;
+ private final DoubleTapListener mDoubleTapListener;
+ private final SlideBackListener mSlideBackListener;
+ private final DoubleTapLogListener mDoubleTapLogListener;
+
+ private float mTouchSlop;
+ private float mDoubleTapSlop;
+
+ private boolean mActivated;
+
+ private float mDownX;
+ private float mDownY;
+ private boolean mTrackTouch;
+
+ private float mActivationX;
+ private float mActivationY;
+ private Runnable mTapTimeoutRunnable = this::makeInactive;
+
+ public DoubleTapHelper(View view, ActivationListener activationListener,
+ DoubleTapListener doubleTapListener, SlideBackListener slideBackListener,
+ DoubleTapLogListener doubleTapLogListener) {
+ mTouchSlop = ViewConfiguration.get(view.getContext()).getScaledTouchSlop();
+ mDoubleTapSlop = view.getResources().getDimension(R.dimen.double_tap_slop);
+ mView = view;
+
+ mActivationListener = activationListener;
+ mDoubleTapListener = doubleTapListener;
+ mSlideBackListener = slideBackListener;
+ mDoubleTapLogListener = doubleTapLogListener;
+ }
+
+ public boolean onTouchEvent(MotionEvent event) {
+ return onTouchEvent(event, Integer.MAX_VALUE);
+ }
+
+ public boolean onTouchEvent(MotionEvent event, int maxTouchableHeight) {
+ int action = event.getActionMasked();
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ mDownX = event.getX();
+ mDownY = event.getY();
+ mTrackTouch = true;
+ if (mDownY > maxTouchableHeight) {
+ mTrackTouch = false;
+ }
+ break;
+ case MotionEvent.ACTION_MOVE:
+ if (!isWithinTouchSlop(event)) {
+ makeInactive();
+ mTrackTouch = false;
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ if (isWithinTouchSlop(event)) {
+ if (mSlideBackListener != null && mSlideBackListener.onSlideBack()) {
+ return true;
+ }
+ if (!mActivated) {
+ makeActive();
+ mView.postDelayed(mTapTimeoutRunnable, DOUBLETAP_TIMEOUT_MS);
+ mActivationX = event.getX();
+ mActivationY = event.getY();
+ } else {
+ boolean withinDoubleTapSlop = isWithinDoubleTapSlop(event);
+ if (mDoubleTapLogListener != null) {
+ mDoubleTapLogListener.onDoubleTapLog(withinDoubleTapSlop,
+ event.getX() - mActivationX,
+ event.getY() - mActivationY);
+ }
+ if (withinDoubleTapSlop) {
+ if (!mDoubleTapListener.onDoubleTap()) {
+ return false;
+ }
+ } else {
+ makeInactive();
+ mTrackTouch = false;
+ }
+ }
+ } else {
+ makeInactive();
+ mTrackTouch = false;
+ }
+ break;
+ case MotionEvent.ACTION_CANCEL:
+ makeInactive();
+ mTrackTouch = false;
+ break;
+ default:
+ break;
+ }
+ return mTrackTouch;
+ }
+
+ private void makeActive() {
+ if (!mActivated) {
+ mActivated = true;
+ mActivationListener.onActiveChanged(true);
+ }
+ }
+
+ private void makeInactive() {
+ if (mActivated) {
+ mActivated = false;
+ mActivationListener.onActiveChanged(false);
+ }
+ }
+
+ private boolean isWithinTouchSlop(MotionEvent event) {
+ return Math.abs(event.getX() - mDownX) < mTouchSlop
+ && Math.abs(event.getY() - mDownY) < mTouchSlop;
+ }
+
+ private boolean isWithinDoubleTapSlop(MotionEvent event) {
+ if (!mActivated) {
+ // If we're not activated there's no double tap slop to satisfy.
+ return true;
+ }
+
+ return Math.abs(event.getX() - mActivationX) < mDoubleTapSlop
+ && Math.abs(event.getY() - mActivationY) < mDoubleTapSlop;
+ }
+
+ @FunctionalInterface
+ public interface ActivationListener {
+ void onActiveChanged(boolean active);
+ }
+
+ @FunctionalInterface
+ public interface DoubleTapListener {
+ boolean onDoubleTap();
+ }
+
+ @FunctionalInterface
+ public interface SlideBackListener {
+ boolean onSlideBack();
+ }
+
+ @FunctionalInterface
+ public interface DoubleTapLogListener {
+ void onDoubleTapLog(boolean accepted, float dx, float dy);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
index 0e074c7..938e76a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
@@ -31,6 +31,8 @@
public class DozeParameters {
private static final int MAX_DURATION = 60 * 1000;
+ public static final String DOZE_SENSORS_WAKE_UP_FULLY = "doze_sensors_wake_up_fully";
+ public static final boolean ALWAYS_ON_AVAILABLE = Build.IS_DEBUGGABLE;
private final Context mContext;
@@ -56,6 +58,10 @@
pw.print(" getPickupVibrationThreshold(): "); pw.println(getPickupVibrationThreshold());
pw.print(" getPickupSubtypePerformsProxCheck(): ");pw.println(
dumpPickupSubtypePerformsProxCheck());
+ if (ALWAYS_ON_AVAILABLE) {
+ pw.print(" getAlwaysOn(): "); pw.println(getAlwaysOn());
+ pw.print(" getSensorsWakeUpFully(): "); pw.println(getSensorsWakeUpFully());
+ }
}
private String dumpPickupSubtypePerformsProxCheck() {
@@ -113,11 +119,17 @@
}
public boolean getAlwaysOn() {
- return Build.IS_DEBUGGABLE
+ return ALWAYS_ON_AVAILABLE
&& Settings.Secure.getIntForUser(mContext.getContentResolver(),
Settings.Secure.DOZE_ALWAYS_ON, 0, UserHandle.USER_CURRENT) != 0;
}
+ public boolean getSensorsWakeUpFully() {
+ return ALWAYS_ON_AVAILABLE
+ && Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ DOZE_SENSORS_WAKE_UP_FULLY, 0, UserHandle.USER_CURRENT) != 0;
+ }
+
private boolean getBoolean(String propName, int resId) {
return SystemProperties.getBoolean(propName, mContext.getResources().getBoolean(resId));
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index 2836f41..2538bdd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -19,9 +19,10 @@
import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK;
import static android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
+import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_LEFT_BUTTON;
import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_LEFT_UNLOCK;
+import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_RIGHT_BUTTON;
import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_RIGHT_UNLOCK;
-import static com.android.systemui.tuner.LockscreenFragment.getIntentButton;
import android.app.ActivityManager;
import android.app.ActivityOptions;
@@ -79,9 +80,12 @@
import com.android.systemui.statusbar.KeyguardAffordanceView;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.policy.AccessibilityController;
+import com.android.systemui.statusbar.policy.ExtensionController;
+import com.android.systemui.statusbar.policy.ExtensionController.Extension;
import com.android.systemui.statusbar.policy.FlashlightController;
import com.android.systemui.statusbar.policy.PreviewInflater;
import com.android.systemui.tuner.LockscreenFragment;
+import com.android.systemui.tuner.LockscreenFragment.LockButtonFactory;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
@@ -91,8 +95,7 @@
*/
public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickListener,
UnlockMethodCache.OnUnlockMethodChangedListener,
- AccessibilityController.AccessibilityStateChangedCallback, View.OnLongClickListener,
- Tunable {
+ AccessibilityController.AccessibilityStateChangedCallback, View.OnLongClickListener {
final static String TAG = "StatusBar/KeyguardBottomAreaView";
@@ -159,14 +162,13 @@
private Drawable mLeftAssistIcon;
private IntentButton mRightButton = new DefaultRightButton();
- private IntentButton mRightDefault = mRightButton;
- private IntentButton mRightPlugin;
+ private Extension<IntentButton> mRightExtension;
private String mRightButtonStr;
private IntentButton mLeftButton = new DefaultLeftButton();
- private IntentButton mLeftDefault = mLeftButton;
- private IntentButton mLeftPlugin;
+ private Extension<IntentButton> mLeftExtension;
private String mLeftButtonStr;
private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger();
+ private boolean mDozing;
public KeyguardBottomAreaView(Context context) {
this(context, null);
@@ -260,21 +262,28 @@
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mAccessibilityController.addStateChangedCallback(this);
- Dependency.get(PluginManager.class).addPluginListener(RIGHT_BUTTON_PLUGIN,
- mRightListener, IntentButtonProvider.VERSION, false /* Only allow one */);
- Dependency.get(PluginManager.class).addPluginListener(LEFT_BUTTON_PLUGIN,
- mLeftListener, IntentButtonProvider.VERSION, false /* Only allow one */);
- Dependency.get(TunerService.class).addTunable(this, LockscreenFragment.LOCKSCREEN_LEFT_BUTTON,
- LockscreenFragment.LOCKSCREEN_RIGHT_BUTTON);
+ mRightExtension = Dependency.get(ExtensionController.class).newExtension(IntentButton.class)
+ .withPlugin(IntentButtonProvider.class, RIGHT_BUTTON_PLUGIN,
+ p -> p.getIntentButton())
+ .withTunerFactory(new LockButtonFactory(mContext, LOCKSCREEN_RIGHT_BUTTON))
+ .withDefault(() -> new DefaultRightButton())
+ .withCallback(button -> setRightButton(button))
+ .build();
+ mLeftExtension = Dependency.get(ExtensionController.class).newExtension(IntentButton.class)
+ .withPlugin(IntentButtonProvider.class, LEFT_BUTTON_PLUGIN,
+ p -> p.getIntentButton())
+ .withTunerFactory(new LockButtonFactory(mContext, LOCKSCREEN_LEFT_BUTTON))
+ .withDefault(() -> new DefaultLeftButton())
+ .withCallback(button -> setLeftButton(button))
+ .build();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mAccessibilityController.removeStateChangedCallback(this);
- Dependency.get(PluginManager.class).removePluginListener(mRightListener);
- Dependency.get(PluginManager.class).removePluginListener(mLeftListener);
- Dependency.get(TunerService.class).removeTunable(this);
+ mRightExtension.destroy();
+ mLeftExtension.destroy();
}
private void initAccessibility() {
@@ -361,7 +370,7 @@
// Things are not set up yet; reply hazy, ask again later
return;
}
- mRightAffordanceView.setVisibility(mRightButton.getIcon().isVisible
+ mRightAffordanceView.setVisibility(!mDozing && mRightButton.getIcon().isVisible
? View.VISIBLE : View.GONE);
}
@@ -375,7 +384,7 @@
private void updateLeftAffordanceIcon() {
IconState state = mLeftButton.getIcon();
- mLeftAffordanceView.setVisibility(state.isVisible ? View.VISIBLE : View.GONE);
+ mLeftAffordanceView.setVisibility(!mDozing && state.isVisible ? View.VISIBLE : View.GONE);
mLeftAffordanceView.setImageDrawable(state.drawable, state.tint);
mLeftAffordanceView.setContentDescription(state.contentDescription);
}
@@ -789,62 +798,36 @@
inflateCameraPreview();
}
- @Override
- public void onTuningChanged(String key, String newValue) {
- if (LockscreenFragment.LOCKSCREEN_LEFT_BUTTON.equals(key)) {
- mLeftButtonStr = newValue;
- mLeftIsVoiceAssist = TextUtils.isEmpty(mLeftButtonStr) && mLeftPlugin == null;
- mLeftButton = getIntentButton(mContext, mLeftButtonStr, mLeftPlugin, mLeftDefault);
- updateLeftAffordance();
- } else {
- mRightButtonStr = newValue;
- mRightButton = getIntentButton(mContext, mRightButtonStr, mRightPlugin, mRightDefault);
- updateRightAffordanceIcon();
- updateCameraVisibility();
- inflateCameraPreview();
- }
- }
-
private void setRightButton(IntentButton button) {
- mRightPlugin = button;
- mRightButton = getIntentButton(mContext, mRightButtonStr, mRightPlugin, mRightDefault);
+ mRightButton = button;
updateRightAffordanceIcon();
updateCameraVisibility();
inflateCameraPreview();
}
private void setLeftButton(IntentButton button) {
- mLeftPlugin = button;
- mLeftButton = getIntentButton(mContext, mLeftButtonStr, mLeftPlugin, mLeftDefault);
- mLeftIsVoiceAssist = false;
+ mLeftButton = button;
+ if (!(mLeftButton instanceof DefaultLeftButton)) {
+ mLeftIsVoiceAssist = false;
+ }
updateLeftAffordance();
}
- private final PluginListener<IntentButtonProvider> mRightListener =
- new PluginListener<IntentButtonProvider>() {
- @Override
- public void onPluginConnected(IntentButtonProvider plugin, Context pluginContext) {
- setRightButton(plugin.getIntentButton());
- }
+ public void setDozing(boolean dozing, boolean animate) {
+ mDozing = dozing;
- @Override
- public void onPluginDisconnected(IntentButtonProvider plugin) {
- setRightButton(null);
- }
- };
+ updateCameraVisibility();
+ updateLeftAffordanceIcon();
- private final PluginListener<IntentButtonProvider> mLeftListener =
- new PluginListener<IntentButtonProvider>() {
- @Override
- public void onPluginConnected(IntentButtonProvider plugin, Context pluginContext) {
- setLeftButton(plugin.getIntentButton());
+ if (dozing) {
+ mLockIcon.setVisibility(INVISIBLE);
+ } else {
+ mLockIcon.setVisibility(VISIBLE);
+ if (animate) {
+ startFinishDozeAnimation();
+ }
}
-
- @Override
- public void onPluginDisconnected(IntentButtonProvider plugin) {
- setLeftButton(null);
- }
- };
+ }
private class DefaultLeftButton implements IntentButton {
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 ff58e54..42b09df 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -28,6 +28,7 @@
import android.widget.RelativeLayout;
import android.widget.TextView;
+import com.android.systemui.BatteryMeterView;
import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
@@ -39,8 +40,6 @@
import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener;
import com.android.systemui.statusbar.policy.UserSwitcherController;
-import java.text.NumberFormat;
-
/**
* The header group on Keyguard.
*/
@@ -55,7 +54,7 @@
private View mSystemIconsSuperContainer;
private MultiUserSwitch mMultiUserSwitch;
private ImageView mMultiUserAvatar;
- private TextView mBatteryLevel;
+ private BatteryMeterView mBatteryView;
private BatteryController mBatteryController;
private KeyguardUserSwitcher mKeyguardUserSwitcher;
@@ -76,8 +75,9 @@
mSystemIconsContainer = findViewById(R.id.system_icons_container);
mMultiUserSwitch = (MultiUserSwitch) findViewById(R.id.multi_user_switch);
mMultiUserAvatar = (ImageView) findViewById(R.id.multi_user_avatar);
- mBatteryLevel = (TextView) findViewById(R.id.battery_level);
mCarrierLabel = (TextView) findViewById(R.id.keyguard_carrier_text);
+ mBatteryView = (BatteryMeterView) mSystemIconsContainer.findViewById(R.id.battery);
+
loadDimens();
updateUserSwitcher();
mBatteryController = Dependency.get(BatteryController.class);
@@ -115,17 +115,6 @@
R.dimen.status_bar_height);
mSystemIconsContainer.setLayoutParams(lp);
- lp = (MarginLayoutParams) mBatteryLevel.getLayoutParams();
- lp.setMarginStart(
- getResources().getDimensionPixelSize(R.dimen.header_battery_margin_keyguard));
- mBatteryLevel.setLayoutParams(lp);
- mBatteryLevel.setPaddingRelative(mBatteryLevel.getPaddingStart(),
- mBatteryLevel.getPaddingTop(),
- getResources().getDimensionPixelSize(R.dimen.battery_level_padding_end),
- mBatteryLevel.getPaddingBottom());
- mBatteryLevel.setTextSize(TypedValue.COMPLEX_UNIT_PX,
- getResources().getDimensionPixelSize(R.dimen.battery_level_text_size));
-
// Respect font size setting.
mCarrierLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX,
getResources().getDimensionPixelSize(
@@ -168,7 +157,7 @@
mMultiUserSwitch.setVisibility(View.GONE);
}
}
- mBatteryLevel.setVisibility(mBatteryCharging ? View.VISIBLE : View.GONE);
+ mBatteryView.setForceShowPercent(mBatteryCharging);
}
private void updateSystemIconsLayoutParams() {
@@ -233,11 +222,8 @@
@Override
public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
- String percentage = NumberFormat.getPercentInstance().format((double) level / 100.0);
- mBatteryLevel.setText(percentage);
- boolean changed = mBatteryCharging != charging;
- mBatteryCharging = charging;
- if (changed) {
+ if (mBatteryCharging != charging) {
+ mBatteryCharging = charging;
updateVisibilities();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
index 5fb99da..720ca14 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
@@ -138,8 +138,8 @@
super.onAttachedToWindow();
Dependency.get(TunerService.class).addTunable(this, NAV_BAR_VIEWS, NAV_BAR_LEFT,
NAV_BAR_RIGHT);
- Dependency.get(PluginManager.class).addPluginListener(NavBarButtonProvider.ACTION, this,
- NavBarButtonProvider.VERSION, true /* Allow multiple */);
+ Dependency.get(PluginManager.class).addPluginListener(this,
+ NavBarButtonProvider.class, true /* Allow multiple */);
}
@Override
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 5d13289..ad875f1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -783,8 +783,8 @@
protected void onAttachedToWindow() {
super.onAttachedToWindow();
onPluginDisconnected(null); // Create default gesture helper
- Dependency.get(PluginManager.class).addPluginListener(NavGesture.ACTION, this,
- NavGesture.VERSION, false /* Only one */);
+ Dependency.get(PluginManager.class).addPluginListener(this,
+ NavGesture.class, false /* Only one */);
}
@Override
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 6d7ab47..707997d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
@@ -1,7 +1,6 @@
package com.android.systemui.statusbar.phone;
import android.content.Context;
-import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Rect;
@@ -226,12 +225,13 @@
for (int i = 0; i < mNotificationIcons.getChildCount(); i++) {
StatusBarIconView v = (StatusBarIconView) mNotificationIcons.getChildAt(i);
boolean isPreL = Boolean.TRUE.equals(v.getTag(R.id.icon_is_pre_L));
+ int color = StatusBarIconView.NO_COLOR;
boolean colorize = !isPreL || NotificationUtils.isGrayscale(v, mNotificationColorUtil);
if (colorize) {
- v.setImageTintList(ColorStateList.valueOf(
- DarkIconDispatcher.getTint(mTintArea, v, mIconTint)));
+ color = DarkIconDispatcher.getTint(mTintArea, v, mIconTint);
}
- v.setIconTint(mIconTint);
+ v.setStaticDrawableColor(color);
+ v.setDecorColor(mIconTint);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
index 571ae26..dc5f98c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
@@ -446,6 +446,7 @@
public boolean useFullTransitionAmount;
public boolean useLinearTransitionAmount;
public boolean translateContent;
+ public int iconColor = StatusBarIconView.NO_COLOR;
@Override
public void applyToView(View view) {
@@ -505,6 +506,7 @@
}
}
icon.setVisibleState(visibleState, animationsAllowed);
+ icon.setIconColor(iconColor, needsCannedAnimation && animationsAllowed);
if (animate) {
animateTo(icon, animationProperties);
} else {
@@ -515,6 +517,14 @@
needsCannedAnimation = false;
}
+ @Override
+ public void initFrom(View view) {
+ super.initFrom(view);
+ if (view instanceof StatusBarIconView) {
+ iconColor = ((StatusBarIconView) view).getStaticDrawableColor();
+ }
+ }
+
protected void onYTranslationAnimationFinished(View view) {
if (hidden) {
view.setVisibility(INVISIBLE);
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 5da3a10..468fb57 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -292,7 +292,7 @@
int panelGravity = getResources().getInteger(R.integer.notification_panel_layout_gravity);
FrameLayout.LayoutParams lp =
(FrameLayout.LayoutParams) mQsFrame.getLayoutParams();
- if (lp.width != panelWidth) {
+ if (lp.width != panelWidth || lp.gravity != panelGravity) {
lp.width = panelWidth;
lp.gravity = panelGravity;
mQsFrame.setLayoutParams(lp);
@@ -300,7 +300,7 @@
}
lp = (FrameLayout.LayoutParams) mNotificationStackScroller.getLayoutParams();
- if (lp.width != panelWidth) {
+ if (lp.width != panelWidth || lp.gravity != panelGravity) {
lp.width = panelWidth;
lp.gravity = panelGravity;
mNotificationStackScroller.setLayoutParams(lp);
@@ -766,16 +766,17 @@
mIsExpansionFromHeadsUp = true;
MetricsLogger.count(mContext, COUNTER_PANEL_OPEN_PEEK, 1);
}
+ boolean handled = false;
if ((!mIsExpanding || mHintAnimationRunning)
&& !mQsExpanded
&& mStatusBar.getBarState() != StatusBarState.SHADE
&& !mDozing) {
- mAffordanceHelper.onTouchEvent(event);
+ handled |= mAffordanceHelper.onTouchEvent(event);
}
if (mOnlyAffordanceInThisMotion) {
return true;
}
- mHeadsUpTouchHelper.onTouchEvent(event);
+ handled |= mHeadsUpTouchHelper.onTouchEvent(event);
if (mQsOverscrollExpansionEnabled && !mHeadsUpTouchHelper.isTrackingHeadsUp()
&& handleQsTouch(event)) {
@@ -784,9 +785,10 @@
if (event.getActionMasked() == MotionEvent.ACTION_DOWN && isFullyCollapsed()) {
MetricsLogger.count(mContext, COUNTER_PANEL_OPEN, 1);
updateVerticalPanelPosition(event.getX());
+ handled = true;
}
- super.onTouchEvent(event);
- return true;
+ handled |= super.onTouchEvent(event);
+ return mDozing ? handled : true;
}
private boolean handleQsTouch(MotionEvent event) {
@@ -1151,9 +1153,7 @@
.start();
} else if (statusBarState == StatusBarState.KEYGUARD
|| statusBarState == StatusBarState.SHADE_LOCKED) {
- if (!mDozing) {
- mKeyguardBottomArea.setVisibility(View.VISIBLE);
- }
+ mKeyguardBottomArea.setVisibility(View.VISIBLE);
mKeyguardBottomArea.setAlpha(1f);
} else {
mKeyguardBottomArea.setVisibility(View.GONE);
@@ -2103,13 +2103,12 @@
private void updateDozingVisibilities(boolean animate) {
if (mDozing) {
mKeyguardStatusBar.setVisibility(View.INVISIBLE);
- mKeyguardBottomArea.setVisibility(View.INVISIBLE);
+ mKeyguardBottomArea.setDozing(mDozing, animate);
} else {
- mKeyguardBottomArea.setVisibility(View.VISIBLE);
mKeyguardStatusBar.setVisibility(View.VISIBLE);
+ mKeyguardBottomArea.setDozing(mDozing, animate);
if (animate) {
animateKeyguardStatusBarIn(DOZE_ANIMATION_DURATION);
- mKeyguardBottomArea.startFinishDozeAnimation();
}
}
}
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 93f874d..9e93ed3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -17,30 +17,57 @@
package com.android.systemui.statusbar.phone;
import android.app.ActivityManager;
+import android.app.ActivityManager.RunningAppProcessInfo;
+import android.app.ActivityManager.StackId;
+import android.app.ActivityManager.StackInfo;
import android.app.AlarmManager;
import android.app.AlarmManager.AlarmClockInfo;
+import android.app.AppGlobals;
+import android.app.Notification;
+import android.app.Notification.Action;
+import android.app.Notification.BigTextStyle;
+import android.app.Notification.Style;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
import android.app.SynchronousUserSwitchObserver;
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.IPackageManager;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.UserInfo;
+import android.graphics.drawable.Icon;
import android.media.AudioManager;
+import android.net.Uri;
+import android.os.Bundle;
import android.os.Handler;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
+import android.provider.Settings;
import android.provider.Settings.Global;
+import android.service.notification.StatusBarNotification;
import android.telecom.TelecomManager;
+import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.Log;
+import android.util.Pair;
+import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.TelephonyIntents;
import com.android.systemui.Dependency;
import com.android.systemui.R;
+import com.android.systemui.R.string;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.qs.tiles.DndTile;
import com.android.systemui.qs.tiles.RotationLockTile;
+import com.android.systemui.recents.Recents;
+import com.android.systemui.recents.misc.SystemServicesProxy;
+import com.android.systemui.recents.misc.SystemServicesProxy.TaskStackListener;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
import com.android.systemui.statusbar.policy.BluetoothController;
@@ -58,6 +85,10 @@
import com.android.systemui.statusbar.policy.RotationLockController.RotationLockControllerCallback;
import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.statusbar.policy.ZenModeController;
+import com.android.systemui.util.NotificationChannels;
+
+import java.util.ArrayList;
+import java.util.List;
/**
* This class contains all of the policy about which icons are installed in the status
@@ -96,6 +127,7 @@
private final ZenModeController mZenController;
private final DeviceProvisionedController mProvisionedController;
private final KeyguardMonitor mKeyguardMonitor;
+ private final ArraySet<Pair<String, Integer>> mCurrentNotifs = new ArraySet<>();
// Assume it's all good unless we hear otherwise. We don't always seem
// to get broadcasts that it *is* there.
@@ -163,7 +195,7 @@
}
// TTY status
- mIconController.setIcon(mSlotTty, R.drawable.stat_sys_tty_mode, null);
+ mIconController.setIcon(mSlotTty, R.drawable.stat_sys_tty_mode, null);
mIconController.setIconVisibility(mSlotTty, false);
// bluetooth status
@@ -212,6 +244,15 @@
mKeyguardMonitor.addCallback(this);
SysUiServiceProvider.getComponent(mContext, CommandQueue.class).addCallbacks(this);
+ SystemServicesProxy.getInstance(mContext).registerTaskStackListener(mTaskListener);
+
+ // Clear out all old notifications on startup (only present in the case where sysui dies)
+ NotificationManager noMan = mContext.getSystemService(NotificationManager.class);
+ for (StatusBarNotification notification : noMan.getActiveNotifications()) {
+ if (notification.getId() == SystemMessage.NOTE_INSTANT_APPS) {
+ noMan.cancel(notification.getTag(), notification.getId());
+ }
+ }
}
public void destroy() {
@@ -226,6 +267,10 @@
mKeyguardMonitor.removeCallback(this);
SysUiServiceProvider.getComponent(mContext, CommandQueue.class).removeCallbacks(this);
mContext.unregisterReceiver(mIntentReceiver);
+
+ NotificationManager noMan = mContext.getSystemService(NotificationManager.class);
+ mCurrentNotifs.forEach(v -> noMan.cancelAsUser(v.first, SystemMessage.NOTE_INSTANT_APPS,
+ new UserHandle(v.second)));
}
@Override
@@ -423,8 +468,10 @@
}
private void updateManagedProfile() {
- if (DEBUG) Log.v(TAG, "updateManagedProfile: mManagedProfileFocused: "
- + mManagedProfileFocused);
+ if (DEBUG) {
+ Log.v(TAG, "updateManagedProfile: mManagedProfileFocused: "
+ + mManagedProfileFocused);
+ }
final boolean showIcon;
if (mManagedProfileFocused && !mKeyguardMonitor.isShowing()) {
showIcon = true;
@@ -445,6 +492,77 @@
}
}
+ private void updateForegroundInstantApps() {
+ NotificationManager noMan = mContext.getSystemService(NotificationManager.class);
+ ArraySet<Pair<String, Integer>> notifs = new ArraySet<>(mCurrentNotifs);
+ IPackageManager pm = AppGlobals.getPackageManager();
+ mCurrentNotifs.clear();
+ try {
+ int[] STACKS_TO_CHECK = new int[]{
+ StackId.FULLSCREEN_WORKSPACE_STACK_ID,
+ StackId.DOCKED_STACK_ID,
+ };
+ for (int i = 0; i < STACKS_TO_CHECK.length; i++) {
+ StackInfo info = ActivityManager.getService().getStackInfo(STACKS_TO_CHECK[i]);
+ if (info == null || info.topActivity == null) continue;
+ String pkg = info.topActivity.getPackageName();
+ if (!hasNotif(notifs, pkg, info.userId)) {
+ // TODO: Optimize by not always needing to get application info.
+ // Maybe cache non-ephemeral packages?
+ ApplicationInfo appInfo = pm.getApplicationInfo(pkg,
+ PackageManager.MATCH_UNINSTALLED_PACKAGES, info.userId);
+ if (appInfo.isInstantApp()) {
+ postEphemeralNotif(pkg, info.userId, appInfo, noMan);
+ }
+ }
+ }
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ // Cancel all the leftover notifications that don't have a foreground process anymore.
+ notifs.forEach(v -> noMan.cancelAsUser(v.first, SystemMessage.NOTE_INSTANT_APPS,
+ new UserHandle(v.second)));
+ }
+
+ private void postEphemeralNotif(String pkg, int userId, ApplicationInfo appInfo,
+ NotificationManager noMan) {
+ final Bundle extras = new Bundle();
+ extras.putString(Notification.EXTRA_SUBSTITUTE_APP_NAME,
+ mContext.getString(R.string.instant_apps));
+ mCurrentNotifs.add(new Pair<>(pkg, userId));
+ String message = mContext.getString(R.string.instant_apps_message);
+ PendingIntent appInfoAction = PendingIntent.getActivity(mContext, 0,
+ new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
+ .setData(Uri.fromParts("package", pkg, null)), 0);
+ // TODO: Add action for go to web as well.
+ Action action = new Notification.Action.Builder(null, mContext.getString(R.string.app_info),
+ appInfoAction).build();
+
+ noMan.notifyAsUser(pkg, SystemMessage.NOTE_INSTANT_APPS,
+ new Notification.Builder(mContext, NotificationChannels.GENERAL)
+ .addExtras(extras)
+ .addAction(action)
+ .setContentIntent(appInfoAction)
+ .setColor(mContext.getColor(R.color.instant_apps_color))
+ .setContentTitle(appInfo.loadLabel(mContext.getPackageManager()))
+ .setLargeIcon(Icon.createWithResource(pkg, appInfo.icon))
+ .setSmallIcon(Icon.createWithResource(mContext.getPackageName(),
+ R.drawable.instant_icon))
+ .setContentText(message)
+ .setOngoing(true)
+ .build(),
+ new UserHandle(userId));
+ }
+
+ private boolean hasNotif(ArraySet<Pair<String, Integer>> notifs, String pkg, int userId) {
+ Pair<String, Integer> key = new Pair<>(pkg, userId);
+ if (notifs.remove(key)) {
+ mCurrentNotifs.add(key);
+ return true;
+ }
+ return false;
+ }
+
private final SynchronousUserSwitchObserver mUserSwitchListener =
new SynchronousUserSwitchObserver() {
@Override
@@ -466,6 +584,7 @@
profileChanged(newUserId);
updateQuietState();
updateManagedProfile();
+ updateForegroundInstantApps();
}
});
}
@@ -497,20 +616,22 @@
private final NextAlarmController.NextAlarmChangeCallback mNextAlarmCallback =
new NextAlarmController.NextAlarmChangeCallback() {
- @Override
- public void onNextAlarmChanged(AlarmManager.AlarmClockInfo nextAlarm) {
- updateAlarm();
- }
- };
+ @Override
+ public void onNextAlarmChanged(AlarmManager.AlarmClockInfo nextAlarm) {
+ updateAlarm();
+ }
+ };
@Override
public void appTransitionStarting(long startTime, long duration, boolean forced) {
updateManagedProfile();
+ updateForegroundInstantApps();
}
@Override
public void onKeyguardShowingChanged() {
updateManagedProfile();
+ updateForegroundInstantApps();
}
@Override
@@ -524,6 +645,11 @@
}
@Override
+ public void preloadRecentApps() {
+ updateForegroundInstantApps();
+ }
+
+ @Override
public void onRotationLockStateChanged(boolean rotationLocked, boolean affordanceVisible) {
boolean portrait = RotationLockTile.isCurrentOrientationLockPortrait(
mRotationLockController, mContext);
@@ -561,6 +687,14 @@
mIconController.setIconVisibility(mSlotDataSaver, isDataSaving);
}
+ private final TaskStackListener mTaskListener = new TaskStackListener() {
+ @Override
+ public void onTaskStackChanged() {
+ // Listen for changes to stacks and then check which instant apps are foreground.
+ updateForegroundInstantApps();
+ }
+ };
+
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
index 457ed6c..c070869 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
@@ -26,10 +26,10 @@
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.RippleDrawable;
-import android.icu.text.NumberFormat;
import android.os.UserManager;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
+import android.telephony.SubscriptionInfo;
import android.util.AttributeSet;
import android.util.SparseBooleanArray;
import android.view.View;
@@ -55,7 +55,6 @@
import com.android.systemui.qs.TouchAnimator;
import com.android.systemui.qs.TouchAnimator.Builder;
import com.android.systemui.statusbar.SignalClusterView;
-import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
@@ -66,9 +65,11 @@
import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener;
import com.android.systemui.tuner.TunerService;
+import java.util.List;
+
public class QuickStatusBarHeader extends BaseStatusBarHeader implements
NextAlarmChangeCallback, OnClickListener, OnUserInfoChangedListener, EmergencyListener,
- BatteryStateChangeCallback, SignalCallback {
+ SignalCallback {
private static final float EXPAND_INDICATOR_THRESHOLD = .93f;
private ActivityStarter mActivityStarter;
@@ -110,7 +111,6 @@
private boolean mShowFullAlarm;
private float mDateTimeTranslation;
- private TextView mBatteryLevel;
private SparseBooleanArray mRoamingsBySubId = new SparseBooleanArray();
private boolean mIsRoaming;
@@ -161,8 +161,6 @@
mAlarmStatus = (TextView) findViewById(R.id.alarm_status);
mAlarmStatus.setOnClickListener(this);
- mBatteryLevel = (TextView) findViewById(R.id.battery_level);
-
mMultiUserSwitch = (MultiUserSwitch) findViewById(R.id.multi_user_switch);
mMultiUserAvatar = (ImageView) mMultiUserSwitch.findViewById(R.id.multi_user_avatar);
mAlwaysShowMultiUserSwitch = res.getBoolean(R.bool.config_alwaysShowMultiUserSwitcher);
@@ -179,7 +177,9 @@
int colorForeground = Utils.getColorAttr(getContext(), android.R.attr.colorForeground);
float intensity = colorForeground == Color.WHITE ? 0 : 1;
cluster.onDarkChanged(new Rect(0, 0, 0, 0), intensity, colorForeground);
+
BatteryMeterView battery = (BatteryMeterView) findViewById(R.id.battery);
+ battery.setForceShowPercent(true);
int colorSecondary = Utils.getColorAttr(getContext(), android.R.attr.textColorSecondary);
battery.setRawColors(colorForeground, colorSecondary);
@@ -444,20 +444,19 @@
}
@Override
- public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
- String percentage = NumberFormat.getPercentInstance().format((double) level / 100.0);
- mBatteryLevel.setText(percentage);
- }
-
- @Override
- public void onPowerSaveChanged(boolean isPowerSave) {
- // Don't care.
+ public void setSubs(List<SubscriptionInfo> subs) {
+ mRoamingsBySubId.clear();
+ updateRoaming();
}
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) {
mRoamingsBySubId.put(subId, roaming);
+ updateRoaming();
+ }
+
+ private void updateRoaming() {
boolean isRoaming = calculateRoaming();
if (mIsRoaming != isRoaming) {
mIsRoaming = isRoaming;
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 ac13cf4..a6b145e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -1129,7 +1129,7 @@
.replace(R.id.qs_frame, new QSFragment(), QS.TAG)
.commit();
new PluginFragmentListener(container, QS.TAG, QSFragment.class, QS.class)
- .startListening(QS.ACTION, QS.VERSION);
+ .startListening();
final QSTileHost qsh = SystemUIFactory.getInstance().createQSTileHost(mContext, this,
mIconController);
mBrightnessMirrorController = new BrightnessMirrorController(mStatusBarWindow);
@@ -1684,6 +1684,7 @@
if (entry != null && entry.row != null) {
entry.row.setRemoved();
+ mStackScroller.cleanUpViewState(entry.row);
}
// Let's remove the children if this was a summary
handleGroupSummaryRemoved(key, ranking);
@@ -1740,12 +1741,6 @@
// animations
toRemove.get(i).setRemoved();
}
- for (int i = 0; i < toRemove.size(); i++) {
- removeNotification(toRemove.get(i).getStatusBarNotification().getKey(), ranking);
- // we need to ensure that the view is actually properly removed from the viewstate
- // as this won't happen anymore when kept in the parent.
- mStackScroller.removeViewStateForView(toRemove.get(i));
- }
}
}
@@ -4322,6 +4317,7 @@
mNotificationPanel.setDozing(mDozing, animate);
mStackScroller.setDark(mDozing, animate, mWakeUpTouchLocation);
mScrimController.setDozing(mDozing);
+ mKeyguardIndicationController.setDozing(mDozing);
// Immediately abort the dozing from the doze scrim controller in case of wake-and-unlock
// for pulsing so the Keyguard fade-out animation scrim can take over.
@@ -4876,7 +4872,7 @@
}
public void wakeUpIfDozing(long time, View where) {
- if (mDozing && mDozeScrimController.isPulsing()) {
+ if (mDozing) {
PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
pm.wakeUp(time, "com.android.systemui:NODOZE");
mWakeUpComingFromTouch = true;
@@ -5746,9 +5742,8 @@
if (snoozeOption.criterion != null) {
mNotificationListener.snoozeNotification(sbn.getKey(), snoozeOption.criterion.getId());
} else {
- GregorianCalendar snoozeUntil = new GregorianCalendar();
- snoozeUntil.add(Calendar.MINUTE, snoozeOption.snoozeForMinutes);
- mNotificationListener.snoozeNotification(sbn.getKey(), snoozeUntil.getTimeInMillis());
+ mNotificationListener.snoozeNotification(sbn.getKey(),
+ snoozeOption.snoozeForMinutes * 60 * 1000);
}
}
@@ -5759,7 +5754,7 @@
row.setTag(sbn.getPackageName());
final NotificationGuts guts = row.getGuts();
guts.setClosedListener((NotificationGuts g) -> {
- if (!row.isRemoved()) {
+ if (!g.willBeRemoved() && !row.isRemoved()) {
mStackScroller.onHeightChanged(row, !isPanelFullyCollapsed() /* needsAnimation */);
}
mNotificationGutsExposed = null;
@@ -6937,7 +6932,10 @@
return false;
}
- if (mNotificationData.getImportance(sbn.getKey()) < NotificationManager.IMPORTANCE_HIGH) {
+ // Allow peeking for DEFAULT notifications only if we're on Ambient Display.
+ int importanceLevel = isDozing() ? NotificationManager.IMPORTANCE_DEFAULT
+ : NotificationManager.IMPORTANCE_HIGH;
+ if (mNotificationData.getImportance(sbn.getKey()) < importanceLevel) {
if (DEBUG) Log.d(TAG, "No peeking: unimportant notification: " + sbn.getKey());
return false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index 7c42d00..1848d4e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -34,6 +34,7 @@
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
+import android.os.SystemClock;
import android.util.AttributeSet;
import android.view.ActionMode;
import android.view.InputQueue;
@@ -65,6 +66,7 @@
public static final boolean DEBUG = StatusBar.DEBUG;
private DragDownHelper mDragDownHelper;
+ private DoubleTapHelper mDoubleTapHelper;
private NotificationStackScrollLayout mStackScrollLayout;
private NotificationPanelView mNotificationPanel;
private View mBrightnessMirror;
@@ -89,6 +91,10 @@
mTransparentSrcPaint.setColor(0);
mTransparentSrcPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
mFalsingManager = FalsingManager.getInstance(context);
+ mDoubleTapHelper = new DoubleTapHelper(this, active -> {}, () -> {
+ mService.wakeUpIfDozing(SystemClock.uptimeMillis(), this);
+ return true;
+ }, null, null);
}
@Override
@@ -256,7 +262,7 @@
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (mService.isDozing() && !mService.isPulsing()) {
- // Discard all touch events in always-on.
+ // Capture all touch events in always-on.
return true;
}
boolean intercept = false;
@@ -282,7 +288,11 @@
@Override
public boolean onTouchEvent(MotionEvent ev) {
- boolean handled = mService.isDozing() && !mService.isPulsing();
+ boolean handled = false;
+ if (mService.isDozing()) {
+ mDoubleTapHelper.onTouchEvent(ev);
+ handled = true;
+ }
if (mService.getBarState() == StatusBarState.KEYGUARD
&& (!handled || mDragDownHelper.isDraggingDown())) {
// we still want to finish our drag down gesture when locking the screen
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedController.java
index aa4eaa7..21f9a79 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedController.java
@@ -26,7 +26,9 @@
interface DeviceProvisionedListener {
default void onDeviceProvisionedChanged() { }
- default void onUserSwitched() { }
+ default void onUserSwitched() {
+ onUserSetupChanged();
+ }
default void onUserSetupChanged() { }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java
index 528fefe..cfaca0d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java
@@ -66,6 +66,8 @@
if (mListeners.size() == 1) {
startListening(getCurrentUser());
}
+ listener.onUserSetupChanged();
+ listener.onDeviceProvisionedChanged();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java
new file mode 100644
index 0000000..eaf8925
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java
@@ -0,0 +1,56 @@
+/*
+ * 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.policy;
+
+import com.android.systemui.Dependency;
+import com.android.systemui.plugins.Plugin;
+
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+/**
+ * Utility class used to select between a plugin, tuner settings, and a default implementation
+ * of an interface.
+ */
+public interface ExtensionController {
+
+ <T> ExtensionBuilder<T> newExtension(Class<T> cls);
+
+ interface Extension<T> {
+ T get();
+ void destroy();
+ }
+
+ interface ExtensionBuilder<T> {
+ ExtensionBuilder<T> withTunerFactory(TunerFactory<T> factory);
+ <P extends T> ExtensionBuilder<T> withPlugin(Class<P> cls);
+ <P extends T> ExtensionBuilder<T> withPlugin(Class<P> cls, String action);
+ <P> ExtensionBuilder<T> withPlugin(Class<P> cls, String action,
+ PluginConverter<T, P> converter);
+ ExtensionBuilder<T> withDefault(Supplier<T> def);
+ ExtensionBuilder<T> withCallback(Consumer<T> callback);
+ Extension build();
+ }
+
+ public interface PluginConverter<T, P> {
+ T getInterfaceFromPlugin(P plugin);
+ }
+
+ public interface TunerFactory<T> {
+ String[] keys();
+ T create(Map<String, String> settings);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
new file mode 100644
index 0000000..fefbaa3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
@@ -0,0 +1,236 @@
+/*
+ * 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.policy;
+
+import com.android.systemui.Dependency;
+import com.android.systemui.plugins.Plugin;
+import com.android.systemui.plugins.PluginListener;
+import com.android.systemui.plugins.PluginManager;
+import com.android.systemui.tuner.TunerService;
+import com.android.systemui.tuner.TunerService.Tunable;
+
+import android.content.Context;
+import android.util.ArrayMap;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+public class ExtensionControllerImpl implements ExtensionController {
+
+ @Override
+ public <T> ExtensionBuilder<T> newExtension(Class<T> cls) {
+ return new ExtensionBuilder<>();
+ }
+
+ private interface Producer<T> {
+ T get();
+ void destroy();
+ }
+
+ private class ExtensionBuilder<T> implements ExtensionController.ExtensionBuilder<T> {
+
+ private ExtensionImpl<T> mExtension = new ExtensionImpl<>();
+
+ @Override
+ public ExtensionController.ExtensionBuilder<T> withTunerFactory(TunerFactory<T> factory) {
+ mExtension.addTunerFactory(factory, factory.keys());
+ return this;
+ }
+
+ @Override
+ public <P extends T> ExtensionController.ExtensionBuilder<T> withPlugin(Class<P> cls) {
+ return withPlugin(cls, PluginManager.getAction(cls));
+ }
+
+ @Override
+ public <P extends T> ExtensionController.ExtensionBuilder<T> withPlugin(Class<P> cls,
+ String action) {
+ return withPlugin(cls, action, null);
+ }
+
+ @Override
+ public <P> ExtensionController.ExtensionBuilder<T> withPlugin(Class<P> cls,
+ String action, PluginConverter<T, P> converter) {
+ mExtension.addPlugin(action, cls, converter);
+ return this;
+ }
+
+ @Override
+ public ExtensionController.ExtensionBuilder<T> withDefault(Supplier<T> def) {
+ mExtension.addDefault(def);
+ return this;
+ }
+
+ @Override
+ public ExtensionController.ExtensionBuilder<T> withCallback(
+ Consumer<T> callback) {
+ mExtension.mCallbacks.add(callback);
+ return this;
+ }
+
+ @Override
+ public ExtensionController.Extension build() {
+ // Manually sort, plugins first, tuners second, defaults last.
+ Collections.sort(mExtension.mProducers, (o1, o2) -> {
+ if (o1 instanceof ExtensionImpl.PluginItem) {
+ if (o2 instanceof ExtensionImpl.PluginItem) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+ if (o1 instanceof ExtensionImpl.TunerItem) {
+ if (o2 instanceof ExtensionImpl.PluginItem) {
+ return 1;
+ } else if (o2 instanceof ExtensionImpl.TunerItem) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+ return 0;
+ });
+ mExtension.notifyChanged();
+ return mExtension;
+ }
+ }
+
+ private class ExtensionImpl<T> implements ExtensionController.Extension<T> {
+ private final ArrayList<Producer<T>> mProducers = new ArrayList<>();
+ private final ArrayList<Consumer<T>> mCallbacks = new ArrayList<>();
+ private T mItem;
+
+ @Override
+ public T get() {
+ return mItem;
+ }
+
+ @Override
+ public void destroy() {
+ for (int i = 0; i < mProducers.size(); i++) {
+ mProducers.get(i).destroy();
+ }
+ }
+
+ private void notifyChanged() {
+ for (int i = 0; i < mProducers.size(); i++) {
+ final T item = mProducers.get(i).get();
+ if (item != null) {
+ mItem = item;
+ break;
+ }
+ }
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ mCallbacks.get(i).accept(mItem);
+ }
+ }
+
+ public void addDefault(Supplier<T> def) {
+ mProducers.add(new Default(def));
+ }
+
+ public <P> void addPlugin(String action, Class<P> cls, PluginConverter<T, P> converter) {
+ mProducers.add(new PluginItem(action, cls, converter));
+ }
+
+ public void addTunerFactory(TunerFactory<T> factory, String[] keys) {
+ mProducers.add(new TunerItem(factory, factory.keys()));
+ }
+
+ private class PluginItem<P extends Plugin> implements Producer<T>, PluginListener<P> {
+ private final PluginConverter<T, P> mConverter;
+ private T mItem;
+
+ public PluginItem(String action, Class<P> cls, PluginConverter<T, P> converter) {
+ mConverter = converter;
+ Dependency.get(PluginManager.class).addPluginListener(action, this, cls);
+ }
+
+ @Override
+ public void onPluginConnected(P plugin, Context pluginContext) {
+ if (mConverter != null) {
+ mItem = mConverter.getInterfaceFromPlugin(plugin);
+ } else {
+ mItem = (T) plugin;
+ }
+ notifyChanged();
+ }
+
+ @Override
+ public void onPluginDisconnected(P plugin) {
+ mItem = null;
+ notifyChanged();
+ }
+
+ @Override
+ public T get() {
+ return mItem;
+ }
+
+ @Override
+ public void destroy() {
+ Dependency.get(PluginManager.class).removePluginListener(this);
+ }
+ }
+
+ private class TunerItem<T> implements Producer<T>, Tunable {
+ private final TunerFactory<T> mFactory;
+ private final ArrayMap<String, String> mSettings = new ArrayMap<>();
+ private T mItem;
+
+ public TunerItem(TunerFactory<T> factory, String... setting) {
+ mFactory = factory;
+ Dependency.get(TunerService.class).addTunable(this, setting);
+ }
+
+ @Override
+ public T get() {
+ return mItem;
+ }
+
+ @Override
+ public void destroy() {
+ Dependency.get(TunerService.class).removeTunable(this);
+ }
+
+ @Override
+ public void onTuningChanged(String key, String newValue) {
+ mSettings.put(key, newValue);
+ mItem = mFactory.create(mSettings);
+ notifyChanged();
+ }
+ }
+
+ private class Default<T> implements Producer<T> {
+ private final Supplier<T> mSupplier;
+
+ public Default(Supplier<T> supplier) {
+ mSupplier = supplier;
+ }
+
+ @Override
+ public T get() {
+ return mSupplier.get();
+ }
+
+ @Override
+ public void destroy() {
+
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
index 03c46e8..91acf04 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
@@ -17,8 +17,11 @@
import android.content.Context;
import android.content.Intent;
+import android.database.ContentObserver;
import android.net.NetworkCapabilities;
+import android.os.Handler;
import android.os.Looper;
+import android.provider.Settings.Global;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
@@ -49,6 +52,7 @@
private final SubscriptionDefaults mDefaults;
private final String mNetworkNameDefault;
private final String mNetworkNameSeparator;
+ private final ContentObserver mObserver;
@VisibleForTesting
final PhoneStateListener mPhoneStateListener;
// Save entire info for logging, we only use the id.
@@ -97,6 +101,12 @@
mLastState.iconGroup = mCurrentState.iconGroup = mDefaultIcons;
// Get initial data sim state.
updateDataSim();
+ mObserver = new ContentObserver(new Handler(receiverLooper)) {
+ @Override
+ public void onChange(boolean selfChange) {
+ updateTelephony();
+ }
+ };
}
public void setConfiguration(Config config) {
@@ -144,6 +154,11 @@
| PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
| PhoneStateListener.LISTEN_DATA_ACTIVITY
| PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE);
+ mContext.getContentResolver().registerContentObserver(Global.getUriFor(Global.MOBILE_DATA),
+ true, mObserver);
+ mContext.getContentResolver().registerContentObserver(Global.getUriFor(
+ Global.MOBILE_DATA + mSubscriptionInfo.getSubscriptionId()),
+ true, mObserver);
}
/**
@@ -151,6 +166,7 @@
*/
public void unregisterListener() {
mPhone.listen(mPhoneStateListener, 0);
+ mContext.getContentResolver().unregisterContentObserver(mObserver);
}
/**
@@ -242,11 +258,11 @@
description = mCurrentState.isEmergency ? null : mCurrentState.networkName;
}
boolean activityIn = mCurrentState.dataConnected
- && !mCurrentState.carrierNetworkChangeMode
- && mCurrentState.activityIn;
+ && !mCurrentState.carrierNetworkChangeMode
+ && mCurrentState.activityIn;
boolean activityOut = mCurrentState.dataConnected
- && !mCurrentState.carrierNetworkChangeMode
- && mCurrentState.activityOut;
+ && !mCurrentState.carrierNetworkChangeMode
+ && mCurrentState.activityOut;
showDataIcon &= mCurrentState.isDefault || dataDisabled;
int typeIcon = showDataIcon ? icons.mDataType : 0;
callback.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon,
@@ -294,7 +310,7 @@
final int iconMode = mServiceState.getCdmaEriIconMode();
return mServiceState.getCdmaEriIconIndex() != EriInfo.ROAMING_INDICATOR_OFF
&& (iconMode == EriInfo.ROAMING_ICON_MODE_NORMAL
- || iconMode == EriInfo.ROAMING_ICON_MODE_FLASH);
+ || iconMode == EriInfo.ROAMING_ICON_MODE_FLASH);
} else {
return mServiceState != null && mServiceState.getRoaming();
}
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 eb47a3c..5657560 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -43,7 +43,6 @@
void addEmergencyListener(EmergencyListener listener);
void removeEmergencyListener(EmergencyListener listener);
- void setUserSetupComplete(boolean userSetup);
boolean hasEmergencyCryptKeeperText();
boolean isRadioOn();
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 d7c919d..51d931e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -551,17 +551,11 @@
updateAirplaneMode(true /* force */);
}
- public void setUserSetupComplete(final boolean userSetup) {
- mReceiverHandler.post(new Runnable() {
- @Override
- public void run() {
- handleSetUserSetupComplete(userSetup);
- }
- });
+ private void setUserSetupComplete(final boolean userSetup) {
+ mReceiverHandler.post(() -> handleSetUserSetupComplete(userSetup));
}
- @VisibleForTesting
- void handleSetUserSetupComplete(boolean userSetup) {
+ private void handleSetUserSetupComplete(boolean userSetup) {
mUserSetup = userSetup;
for (MobileSignalController controller : mMobileSignalControllers.values()) {
controller.setUserSetupComplete(mUserSetup);
@@ -723,6 +717,7 @@
mDemoMode = true;
mDemoInetCondition = mInetCondition;
mDemoWifiState = mWifiSignalController.getState();
+ mDemoWifiState.ssid = "DemoMode";
} else if (mDemoMode && command.equals(COMMAND_EXIT)) {
if (DEBUG) Log.d(TAG, "Exiting demo mode");
mDemoMode = false;
@@ -768,6 +763,25 @@
: Math.min(Integer.parseInt(level), WifiIcons.WIFI_LEVEL_COUNT - 1);
mDemoWifiState.connected = mDemoWifiState.level >= 0;
}
+ String activity = args.getString("activity");
+ if (activity != null) {
+ switch (activity) {
+ case "inout":
+ mWifiSignalController.setActivity(WifiManager.DATA_ACTIVITY_INOUT);
+ break;
+ case "in":
+ mWifiSignalController.setActivity(WifiManager.DATA_ACTIVITY_IN);
+ break;
+ case "out":
+ mWifiSignalController.setActivity(WifiManager.DATA_ACTIVITY_OUT);
+ break;
+ default:
+ mWifiSignalController.setActivity(WifiManager.DATA_ACTIVITY_NONE);
+ break;
+ }
+ } else {
+ mWifiSignalController.setActivity(WifiManager.DATA_ACTIVITY_NONE);
+ }
mDemoWifiState.enabled = show;
mWifiSignalController.notifyListeners();
}
@@ -837,7 +851,23 @@
}
String activity = args.getString("activity");
if (activity != null) {
- controller.setActivity(Integer.parseInt(activity));
+ controller.getState().dataConnected = true;
+ switch (activity) {
+ case "inout":
+ controller.setActivity(TelephonyManager.DATA_ACTIVITY_INOUT);
+ break;
+ case "in":
+ controller.setActivity(TelephonyManager.DATA_ACTIVITY_IN);
+ break;
+ case "out":
+ controller.setActivity(TelephonyManager.DATA_ACTIVITY_OUT);
+ break;
+ default:
+ controller.setActivity(TelephonyManager.DATA_ACTIVITY_NONE);
+ break;
+ }
+ } else {
+ controller.setActivity(TelephonyManager.DATA_ACTIVITY_NONE);
}
controller.getState().enabled = show;
controller.notifyListeners();
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 886b8be..12b7098 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
@@ -15,10 +15,10 @@
*/
package com.android.systemui.statusbar.policy;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.ContentObserver;
+import android.net.NetworkBadging;
import android.net.NetworkCapabilities;
import android.net.NetworkKey;
import android.net.NetworkScoreManager;
@@ -155,7 +155,7 @@
@Override
public int getCurrentIconId() {
- if (mCurrentState.badgeEnum != ScoredNetwork.BADGING_NONE) {
+ if (mCurrentState.badgeEnum != NetworkBadging.BADGING_NONE) {
return Utils.WIFI_PIE_FOR_BADGING[mCurrentState.level];
}
return super.getCurrentIconId();
@@ -201,14 +201,14 @@
*/
private int getWifiBadgeEnum() {
if (!mScoringUiEnabled || mWifiTracker.networkKey == null) {
- return ScoredNetwork.BADGING_NONE;
+ return NetworkBadging.BADGING_NONE;
}
ScoredNetwork score = mScoreCache.getScoredNetwork(mWifiTracker.networkKey);
if (score != null) {
return score.calculateBadge(mWifiTracker.rssi);
}
- return ScoredNetwork.BADGING_NONE;
+ return NetworkBadging.BADGING_NONE;
}
@VisibleForTesting
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 67cc5e3..48dbe49 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -2473,6 +2473,17 @@
}
}
+ /**
+ * Called when a notification is removed from the shade. This cleans up the state for a given
+ * view.
+ */
+ public void cleanUpViewState(View child) {
+ if (child == mTranslatingParentView) {
+ mTranslatingParentView = null;
+ }
+ mCurrentStackScrollState.removeViewStateForView(child);
+ }
+
@Override
public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
super.requestDisallowInterceptTouchEvent(disallowIntercept);
@@ -2803,7 +2814,7 @@
}
mNeedsAnimation = true;
}
- if (isHeadsUp(child) && !mChangePositionInProgress) {
+ if (isHeadsUp(child) && mAnimationsEnabled && !mChangePositionInProgress) {
mAddedHeadsUpChildren.add(child);
mChildrenToAddAnimated.remove(child);
}
@@ -4070,15 +4081,6 @@
setFadingOut(alpha != 1.0f);
}
- /**
- * Remove the a given view from the viewstate. This is currently used when the children are
- * kept in the parent artificially to have a nicer animation.
- * @param view the view to remove
- */
- public void removeViewStateForView(View view) {
- mCurrentStackScrollState.removeViewStateForView(view);
- }
-
public void setQsExpanded(boolean qsExpanded) {
mQsExpanded = qsExpanded;
updateAlgorithmLayoutMinHeight();
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/CustomListPreference.java b/packages/SystemUI/src/com/android/systemui/tuner/CustomListPreference.java
new file mode 100644
index 0000000..e50fd5e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/tuner/CustomListPreference.java
@@ -0,0 +1,173 @@
+/*
+ * 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.tuner;
+
+import android.annotation.Nullable;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.os.Bundle;
+import android.support.v14.preference.ListPreferenceDialogFragment;
+import android.support.v7.preference.ListPreference;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+public class CustomListPreference extends ListPreference {
+
+ public CustomListPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public CustomListPreference(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ protected void onPrepareDialogBuilder(AlertDialog.Builder builder,
+ OnClickListener listener) {
+ }
+
+ protected void onDialogClosed(boolean positiveResult) {
+ }
+
+ protected Dialog onDialogCreated(DialogFragment fragment, Dialog dialog) {
+ return dialog;
+ }
+
+ protected boolean isAutoClosePreference() {
+ return true;
+ }
+
+ /**
+ * Called when a user is about to choose the given value, to determine if we
+ * should show a confirmation dialog.
+ *
+ * @param value the value the user is about to choose
+ * @return the message to show in a confirmation dialog, or {@code null} to
+ * not request confirmation
+ */
+ protected CharSequence getConfirmationMessage(String value) {
+ return null;
+ }
+
+ protected void onDialogStateRestored(DialogFragment fragment, Dialog dialog,
+ Bundle savedInstanceState) {
+ }
+
+ public static class CustomListPreferenceDialogFragment extends ListPreferenceDialogFragment {
+
+ private static final String KEY_CLICKED_ENTRY_INDEX
+ = "settings.CustomListPrefDialog.KEY_CLICKED_ENTRY_INDEX";
+
+ private int mClickedDialogEntryIndex;
+
+ public static ListPreferenceDialogFragment newInstance(String key) {
+ final ListPreferenceDialogFragment fragment = new CustomListPreferenceDialogFragment();
+ final Bundle b = new Bundle(1);
+ b.putString(ARG_KEY, key);
+ fragment.setArguments(b);
+ return fragment;
+ }
+
+ public CustomListPreference getCustomizablePreference() {
+ return (CustomListPreference) getPreference();
+ }
+
+ @Override
+ protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
+ super.onPrepareDialogBuilder(builder);
+ mClickedDialogEntryIndex = getCustomizablePreference()
+ .findIndexOfValue(getCustomizablePreference().getValue());
+ getCustomizablePreference().onPrepareDialogBuilder(builder, getOnItemClickListener());
+ if (!getCustomizablePreference().isAutoClosePreference()) {
+ builder.setPositiveButton(com.android.internal.R.string.ok, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ onItemConfirmed();
+ }
+ });
+ }
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ Dialog dialog = super.onCreateDialog(savedInstanceState);
+ if (savedInstanceState != null) {
+ mClickedDialogEntryIndex = savedInstanceState.getInt(KEY_CLICKED_ENTRY_INDEX,
+ mClickedDialogEntryIndex);
+ }
+ return getCustomizablePreference().onDialogCreated(this, dialog);
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putInt(KEY_CLICKED_ENTRY_INDEX, mClickedDialogEntryIndex);
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ getCustomizablePreference().onDialogStateRestored(this, getDialog(), savedInstanceState);
+ }
+
+ protected OnClickListener getOnItemClickListener() {
+ return new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ setClickedDialogEntryIndex(which);
+ if (getCustomizablePreference().isAutoClosePreference()) {
+ onItemConfirmed();
+ }
+ }
+ };
+ }
+
+ protected void setClickedDialogEntryIndex(int which) {
+ mClickedDialogEntryIndex = which;
+ }
+
+ private String getValue() {
+ final ListPreference preference = getCustomizablePreference();
+ if (mClickedDialogEntryIndex >= 0 && preference.getEntryValues() != null) {
+ return preference.getEntryValues()[mClickedDialogEntryIndex].toString();
+ } else {
+ return null;
+ }
+ }
+
+ protected void onItemConfirmed() {
+ onClick(getDialog(), DialogInterface.BUTTON_POSITIVE);
+ getDialog().dismiss();
+ }
+
+ @Override
+ public void onDialogClosed(boolean positiveResult) {
+ getCustomizablePreference().onDialogClosed(positiveResult);
+ final ListPreference preference = getCustomizablePreference();
+ final String value = getValue();
+ if (positiveResult && value != null) {
+ if (preference.callChangeListener(value)) {
+ preference.setValue(value);
+ }
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java
index 0a962f1..7c98e13 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java
@@ -163,7 +163,7 @@
intent.putExtra("sims", "1");
intent.putExtra("nosim", "false");
intent.putExtra("level", "4");
- intent.putExtra("datatypel", "");
+ intent.putExtra("datatype", "lte");
getContext().sendBroadcast(intent);
// Need to send this after so that the sim controller already exists.
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/LockscreenFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/LockscreenFragment.java
index 6f4a3a4..2df1793 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/LockscreenFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/LockscreenFragment.java
@@ -52,11 +52,13 @@
import com.android.systemui.plugins.IntentButtonProvider.IntentButton;
import com.android.systemui.statusbar.ScalingDrawableWrapper;
import com.android.systemui.statusbar.phone.ExpandableIndicator;
+import com.android.systemui.statusbar.policy.ExtensionController.TunerFactory;
import com.android.systemui.tuner.ShortcutParser.Shortcut;
import com.android.systemui.tuner.TunerService.Tunable;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.function.Consumer;
public class LockscreenFragment extends PreferenceFragment {
@@ -80,10 +82,8 @@
mTunerService = Dependency.get(TunerService.class);
mHandler = new Handler();
addPreferencesFromResource(R.xml.lockscreen_settings);
- setupGroup((PreferenceGroup) findPreference(KEY_LEFT), LOCKSCREEN_LEFT_BUTTON,
- LOCKSCREEN_LEFT_UNLOCK);
- setupGroup((PreferenceGroup) findPreference(KEY_RIGHT), LOCKSCREEN_RIGHT_BUTTON,
- LOCKSCREEN_RIGHT_UNLOCK);
+ setupGroup(LOCKSCREEN_LEFT_BUTTON, LOCKSCREEN_LEFT_UNLOCK);
+ setupGroup(LOCKSCREEN_RIGHT_BUTTON, LOCKSCREEN_RIGHT_UNLOCK);
}
@Override
@@ -92,30 +92,14 @@
mTunables.forEach(t -> mTunerService.removeTunable(t));
}
- private void setupGroup(PreferenceGroup group, String buttonSetting, String unlockKey) {
- SwitchPreference customize = (SwitchPreference) group.findPreference(KEY_CUSTOMIZE);
- Preference shortcut = group.findPreference(KEY_SHORTCUT);
- SwitchPreference unlock = (SwitchPreference) group.findPreference(unlockKey);
+ private void setupGroup(String buttonSetting, String unlockKey) {
+ Preference shortcut = findPreference(buttonSetting);
+ SwitchPreference unlock = (SwitchPreference) findPreference(unlockKey);
addTunable((k, v) -> {
- boolean visible = v != null;
- customize.setChecked(visible);
- shortcut.setVisible(visible);
+ boolean visible = !TextUtils.isEmpty(v);
unlock.setVisible(visible);
- if (visible) {
- setSummary(shortcut, v);
- }
+ setSummary(shortcut, v);
}, buttonSetting);
- customize.setOnPreferenceChangeListener((preference, newValue) -> {
- boolean hasSetting = mTunerService.getValue(buttonSetting) != null;
- if (hasSetting != (boolean) newValue) {
- mHandler.post(() -> mTunerService.setValue(buttonSetting, hasSetting ? null : ""));
- }
- return true;
- });
- shortcut.setOnPreferenceClickListener(preference -> {
- showSelectDialog(buttonSetting);
- return true;
- });
}
private void showSelectDialog(String buttonSetting) {
@@ -129,24 +113,15 @@
mTunerService.setValue(buttonSetting, item.getSettingValue());
dialog.dismiss();
});
- LauncherApps apps = getContext().getSystemService(LauncherApps.class);
- List<LauncherActivityInfo> activities = apps.getActivityList(null,
- Process.myUserHandle());
-
- activities.forEach(info -> {
- App app = new App(getContext(), info);
- try {
- new ShortcutParser(getContext(), info.getComponentName()).getShortcuts().forEach(
- shortcut -> app.addChild(new StaticShortcut(getContext(), shortcut)));
- } catch (NameNotFoundException e) {
- }
- adapter.addItem(app);
- });
v.setAdapter(adapter);
}
private void setSummary(Preference shortcut, String value) {
+ if (value == null) {
+ shortcut.setSummary(R.string.lockscreen_none);
+ return;
+ }
if (value.contains("::")) {
Shortcut info = getShortcutInfo(getContext(), value);
shortcut.setSummary(info != null ? info.label : null);
@@ -155,7 +130,7 @@
shortcut.setSummary(info != null ? info.loadLabel(getContext().getPackageManager())
: null);
} else {
- shortcut.setSummary(null);
+ shortcut.setSummary(R.string.lockscreen_none);
}
}
@@ -340,26 +315,39 @@
}
}
- public static IntentButton getIntentButton(Context context, String buttonStr,
- IntentButton plugin, IntentButton def) {
- // Plugin wins.
- if (plugin != null) return plugin;
- // Then tuner options.
- if (!TextUtils.isEmpty(buttonStr)) {
- if (buttonStr.contains("::")) {
- Shortcut shortcut = getShortcutInfo(context, buttonStr);
- if (shortcut != null) {
- return new ShortcutButton(context, shortcut);
- }
- } else if (buttonStr.contains("/")) {
- ActivityInfo info = getActivityinfo(context, buttonStr);
- if (info != null) {
- return new ActivityButton(context, info);
+ public static class LockButtonFactory implements TunerFactory<IntentButton> {
+
+ private final String mKey;
+ private final Context mContext;
+
+ public LockButtonFactory(Context context, String key) {
+ mContext = context;
+ mKey = key;
+ }
+
+ @Override
+ public String[] keys() {
+ return new String[]{mKey};
+ }
+
+ @Override
+ public IntentButton create(Map<String, String> settings) {
+ String buttonStr = settings.get(mKey);
+ if (!TextUtils.isEmpty(buttonStr)) {
+ if (buttonStr.contains("::")) {
+ Shortcut shortcut = getShortcutInfo(mContext, buttonStr);
+ if (shortcut != null) {
+ return new ShortcutButton(mContext, shortcut);
+ }
+ } else if (buttonStr.contains("/")) {
+ ActivityInfo info = getActivityinfo(mContext, buttonStr);
+ if (info != null) {
+ return new ActivityButton(mContext, info);
+ }
}
}
+ return null;
}
- // Then default.
- return def;
}
private static class ShortcutButton implements IntentButton {
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/NavBarTuner.java b/packages/SystemUI/src/com/android/systemui/tuner/NavBarTuner.java
index 28a0057..45abd45 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/NavBarTuner.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/NavBarTuner.java
@@ -33,6 +33,9 @@
import android.content.DialogInterface.OnClickListener;
import android.content.res.Resources;
import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Paint.FontMetricsInt;
+import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.os.Bundle;
@@ -58,7 +61,7 @@
import java.util.ArrayList;
-public class NavBarTuner extends PreferenceFragment {
+public class NavBarTuner extends TunerPreferenceFragment {
private static final String LAYOUT = "layout";
private static final String LEFT = "left";
@@ -68,13 +71,13 @@
private static final String KEYCODE = "keycode";
private static final String ICON = "icon";
- private static final int[] ICONS = new int[]{
- R.drawable.ic_qs_circle,
- R.drawable.ic_add,
- R.drawable.ic_remove,
- R.drawable.ic_left,
- R.drawable.ic_right,
- R.drawable.ic_menu,
+ private static final int[][] ICONS = new int[][]{
+ {R.drawable.ic_qs_circle, R.string.tuner_circle},
+ {R.drawable.ic_add, R.string.tuner_plus},
+ {R.drawable.ic_remove, R.string.tuner_minus},
+ {R.drawable.ic_left, R.string.tuner_left},
+ {R.drawable.ic_right, R.string.tuner_right},
+ {R.drawable.ic_menu, R.string.tuner_menu},
};
private final ArrayList<Tunable> mTunables = new ArrayList<>();
@@ -96,10 +99,8 @@
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.nav_bar_tuner);
bindLayout((ListPreference) findPreference(LAYOUT));
- bindButton((PreferenceCategory) findPreference(LEFT),
- NAV_BAR_LEFT, NAVSPACE);
- bindButton((PreferenceCategory) findPreference(RIGHT),
- NAV_BAR_RIGHT, MENU_IME);
+ bindButton(NAV_BAR_LEFT, NAVSPACE, LEFT);
+ bindButton(NAV_BAR_RIGHT, MENU_IME, RIGHT);
}
@Override
@@ -129,9 +130,8 @@
});
}
- private void bindButton(PreferenceCategory parent, String setting, String def) {
- String k = parent.getKey();
- DropDownPreference type = (DropDownPreference) findPreference(TYPE + "_" + k);
+ private void bindButton(String setting, String def, String k) {
+ ListPreference type = (ListPreference) findPreference(TYPE + "_" + k);
Preference keycode = findPreference(KEYCODE + "_" + k);
ListPreference icon = (ListPreference) findPreference(ICON + "_" + k);
setupIcons(icon);
@@ -195,8 +195,14 @@
.loadDrawable(getContext());
d.setTint(Color.BLACK);
d.setBounds(0, 0, size, size);
- ImageSpan span = new ImageSpan(d);
+ ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
builder.append(" ", span, 0);
+ builder.append(" ");
+ for (int i = 0; i < ICONS.length; i++) {
+ if (ICONS[i][0] == id) {
+ builder.append(getString(ICONS[i][1]));
+ }
+ }
icon.setSummary(builder);
} catch (Exception e) {
Log.d("NavButton", "Problem with summary", e);
@@ -204,7 +210,7 @@
}
}
- private void setValue(String setting, DropDownPreference type, Preference keycode,
+ private void setValue(String setting, ListPreference type, Preference keycode,
ListPreference icon) {
String button = type.getValue();
if (KEY.equals(button)) {
@@ -226,14 +232,16 @@
getContext().getResources().getDisplayMetrics());
for (int i = 0; i < ICONS.length; i++) {
SpannableStringBuilder builder = new SpannableStringBuilder();
- Drawable d = Icon.createWithResource(getContext().getPackageName(), ICONS[i])
+ Drawable d = Icon.createWithResource(getContext().getPackageName(), ICONS[i][0])
.loadDrawable(getContext());
d.setTint(Color.BLACK);
d.setBounds(0, 0, size, size);
- ImageSpan span = new ImageSpan(d);
+ ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
builder.append(" ", span, 0);
+ builder.append(" ");
+ builder.append(getString(ICONS[i][1]));
labels[i] = builder;
- values[i] = getContext().getPackageName() + "/" + ICONS[i];
+ values[i] = getContext().getPackageName() + "/" + ICONS[i][0];
}
icon.setEntries(labels);
icon.setEntryValues(values);
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java b/packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java
new file mode 100644
index 0000000..dc0d8bf
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java
@@ -0,0 +1,145 @@
+/*
+ * 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.tuner;
+
+import android.app.AlertDialog.Builder;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.Fragment;
+import android.content.Context;
+import android.content.DialogInterface.OnClickListener;
+import android.os.Bundle;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.widget.Toolbar;
+
+import com.android.settingslib.Utils;
+import com.android.systemui.fragments.FragmentHostManager;
+import com.android.systemui.R;
+
+import libcore.util.Objects;
+
+public class RadioListPreference extends CustomListPreference {
+
+ private OnClickListener mOnClickListener;
+ private CharSequence mSummary;
+
+ public RadioListPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onPrepareDialogBuilder(Builder builder, OnClickListener listener) {
+ mOnClickListener = listener;
+ }
+
+ @Override
+ public void setSummary(CharSequence summary) {
+ super.setSummary(summary);
+ mSummary = summary;
+ }
+
+ @Override
+ public CharSequence getSummary() {
+ if (mSummary == null || mSummary.toString().contains("%s")) {
+ return super.getSummary();
+ }
+ return mSummary;
+ }
+
+ @Override
+ protected Dialog onDialogCreated(DialogFragment fragment, Dialog dialog) {
+ Dialog d = new Dialog(getContext(), android.R.style.Theme_DeviceDefault_Settings);
+ Toolbar t = (Toolbar) d.findViewById(com.android.internal.R.id.action_bar);
+ View v = new View(getContext());
+ v.setId(R.id.content);
+ d.setContentView(v);
+ t.setTitle(getTitle());
+ t.setNavigationIcon(Utils.getDrawable(d.getContext(), android.R.attr.homeAsUpIndicator));
+ t.setNavigationOnClickListener(view -> d.dismiss());
+
+ RadioFragment f = new RadioFragment();
+ f.setPreference(this);
+ FragmentHostManager.get(v).getFragmentManager()
+ .beginTransaction()
+ .add(android.R.id.content, f)
+ .commit();
+ return d;
+ }
+
+ @Override
+ protected void onDialogStateRestored(DialogFragment fragment, Dialog dialog,
+ Bundle savedInstanceState) {
+ super.onDialogStateRestored(fragment, dialog, savedInstanceState);
+ View view = dialog.findViewById(R.id.content);
+ RadioFragment radioFragment = (RadioFragment) FragmentHostManager.get(view)
+ .getFragmentManager().findFragmentById(R.id.content);
+ if (radioFragment != null) {
+ radioFragment.setPreference(this);
+ }
+ }
+
+ @Override
+ protected void onDialogClosed(boolean positiveResult) {
+ super.onDialogClosed(positiveResult);
+ }
+
+ public static class RadioFragment extends TunerPreferenceFragment {
+ private RadioListPreference mListPref;
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ Context context = getPreferenceManager().getContext();
+ PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(context);
+ setPreferenceScreen(screen);
+ if (mListPref != null) {
+ update();
+ }
+ }
+
+ private void update() {
+ Context context = getPreferenceManager().getContext();
+
+ CharSequence[] entries = mListPref.getEntries();
+ CharSequence[] values = mListPref.getEntryValues();
+ CharSequence current = mListPref.getValue();
+ for (int i = 0; i < entries.length; i++) {
+ CharSequence entry = entries[i];
+ SelectablePreference pref = new SelectablePreference(context);
+ getPreferenceScreen().addPreference(pref);
+ pref.setTitle(entry);
+ pref.setChecked(Objects.equal(current, values[i]));
+ pref.setKey(String.valueOf(i));
+ }
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(Preference preference) {
+ mListPref.mOnClickListener.onClick(null, Integer.parseInt(preference.getKey()));
+ return true;
+ }
+
+ public void setPreference(RadioListPreference radioListPreference) {
+ mListPref = radioListPreference;
+ if (getPreferenceManager() != null) {
+ update();
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/SelectablePreference.java b/packages/SystemUI/src/com/android/systemui/tuner/SelectablePreference.java
new file mode 100644
index 0000000..1d15708
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/tuner/SelectablePreference.java
@@ -0,0 +1,45 @@
+/*
+ * 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.tuner;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.support.v7.preference.CheckBoxPreference;
+import android.util.TypedValue;
+
+import com.android.systemui.statusbar.ScalingDrawableWrapper;
+
+public class SelectablePreference extends CheckBoxPreference {
+ private final int mSize;
+
+ public SelectablePreference(Context context) {
+ super(context);
+ setWidgetLayoutResource(com.android.systemui.R.layout.preference_widget_radiobutton);
+ setSelectable(true);
+ mSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32,
+ context.getResources().getDisplayMetrics());
+ }
+
+ @Override
+ public void setIcon(Drawable icon) {
+ super.setIcon(new ScalingDrawableWrapper(icon,
+ mSize / (float) icon.getIntrinsicWidth()));
+ }
+
+ @Override
+ public String toString() {
+ return "";
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/ShortcutPicker.java b/packages/SystemUI/src/com/android/systemui/tuner/ShortcutPicker.java
new file mode 100644
index 0000000..533388a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/tuner/ShortcutPicker.java
@@ -0,0 +1,200 @@
+/*
+ * 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.tuner;
+
+import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_LEFT_BUTTON;
+
+import android.content.Context;
+import android.content.pm.LauncherActivityInfo;
+import android.content.pm.LauncherApps;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Bundle;
+import android.os.Process;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceCategory;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.preference.PreferenceViewHolder;
+
+import com.android.systemui.Dependency;
+import com.android.systemui.R;
+import com.android.systemui.tuner.ShortcutParser.Shortcut;
+import com.android.systemui.tuner.TunerService.Tunable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ShortcutPicker extends PreferenceFragment implements Tunable {
+
+ private final ArrayList<SelectablePreference> mSelectablePreferences = new ArrayList<>();
+ private String mKey;
+ private SelectablePreference mNonePreference;
+ private TunerService mTunerService;
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ Context context = getPreferenceManager().getContext();
+ PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(context);
+ screen.setOrderingAsAdded(true);
+ PreferenceCategory otherApps = new PreferenceCategory(context);
+ otherApps.setTitle(R.string.tuner_other_apps);
+
+ mNonePreference = new SelectablePreference(context);
+ mSelectablePreferences.add(mNonePreference);
+ mNonePreference.setTitle(R.string.lockscreen_none);
+ mNonePreference.setIcon(R.drawable.ic_remove_circle);
+ screen.addPreference(mNonePreference);
+
+ LauncherApps apps = getContext().getSystemService(LauncherApps.class);
+ List<LauncherActivityInfo> activities = apps.getActivityList(null,
+ Process.myUserHandle());
+
+ screen.addPreference(otherApps);
+ activities.forEach(info -> {
+ try {
+ List<Shortcut> shortcuts = new ShortcutParser(getContext(),
+ info.getComponentName()).getShortcuts();
+ AppPreference appPreference = new AppPreference(context, info);
+ mSelectablePreferences.add(appPreference);
+ if (shortcuts.size() != 0) {
+ //PreferenceCategory category = new PreferenceCategory(context);
+ //screen.addPreference(category);
+ //category.setTitle(info.getLabel());
+ screen.addPreference(appPreference);
+ shortcuts.forEach(shortcut -> {
+ ShortcutPreference shortcutPref = new ShortcutPreference(context, shortcut,
+ info.getLabel());
+ mSelectablePreferences.add(shortcutPref);
+ screen.addPreference(shortcutPref);
+ });
+ return;
+ }
+ otherApps.addPreference(appPreference);
+ } catch (NameNotFoundException e) {
+ }
+ });
+ // Move other apps to the bottom.
+ screen.removePreference(otherApps);
+ for (int i = 0; i < otherApps.getPreferenceCount(); i++) {
+ Preference p = otherApps.getPreference(0);
+ otherApps.removePreference(p);
+ p.setOrder(Preference.DEFAULT_ORDER);
+ screen.addPreference(p);
+ }
+ //screen.addPreference(otherApps);
+
+ setPreferenceScreen(screen);
+ mKey = getArguments().getString(ARG_PREFERENCE_ROOT);
+ mTunerService = Dependency.get(TunerService.class);
+ mTunerService.addTunable(this, mKey);
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(Preference preference) {
+ mTunerService.setValue(mKey, preference.toString());
+ getActivity().onBackPressed();
+ return true;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ if (LOCKSCREEN_LEFT_BUTTON.equals(mKey)) {
+ getActivity().setTitle(R.string.lockscreen_shortcut_left);
+ } else {
+ getActivity().setTitle(R.string.lockscreen_shortcut_right);
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ mTunerService.removeTunable(this);
+ }
+
+ @Override
+ public void onTuningChanged(String key, String newValue) {
+ String v = newValue != null ? newValue : "";
+ mSelectablePreferences.forEach(p -> p.setChecked(v.equals(p.toString())));
+ }
+
+ private static class AppPreference extends SelectablePreference {
+ private final LauncherActivityInfo mInfo;
+ private boolean mBinding;
+
+ public AppPreference(Context context, LauncherActivityInfo info) {
+ super(context);
+ mInfo = info;
+ setTitle(context.getString(R.string.tuner_launch_app, info.getLabel()));
+ setSummary(context.getString(R.string.tuner_app, info.getLabel()));
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ mBinding = true;
+ if (getIcon() == null) {
+ setIcon(mInfo.getBadgedIcon(
+ getContext().getResources().getConfiguration().densityDpi));
+ }
+ mBinding = false;
+ super.onBindViewHolder(holder);
+ }
+
+ @Override
+ protected void notifyChanged() {
+ if (mBinding) return;
+ super.notifyChanged();
+ }
+
+ @Override
+ public String toString() {
+ return mInfo.getComponentName().flattenToString();
+ }
+ }
+
+ private static class ShortcutPreference extends SelectablePreference {
+ private final Shortcut mShortcut;
+ private boolean mBinding;
+
+ public ShortcutPreference(Context context, Shortcut shortcut, CharSequence appLabel) {
+ super(context);
+ mShortcut = shortcut;
+ setTitle(shortcut.label);
+ setSummary(context.getString(R.string.tuner_app, appLabel));
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ mBinding = true;
+ if (getIcon() == null) {
+ setIcon(mShortcut.icon.loadDrawable(getContext()));
+ }
+ mBinding = false;
+ super.onBindViewHolder(holder);
+ }
+
+ @Override
+ protected void notifyChanged() {
+ if (mBinding) return;
+ super.notifyChanged();
+ }
+
+ @Override
+ public String toString() {
+ return mShortcut.toString();
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
index 74280a3..4eb1db6 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
@@ -22,10 +22,12 @@
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.util.Log;
+import android.view.MenuItem;
import com.android.settingslib.drawer.SettingsDrawerActivity;
import com.android.systemui.Dependency;
import com.android.systemui.R;
+import com.android.systemui.fragments.FragmentService;
public class TunerActivity extends SettingsDrawerActivity implements
PreferenceFragment.OnPreferenceStartFragmentCallback,
@@ -51,6 +53,22 @@
}
@Override
+ protected void onDestroy() {
+ super.onDestroy();
+ Dependency.destroy(FragmentService.class, s -> s.destroyAll());
+ Dependency.clearDependencies();
+ }
+
+ @Override
+ public boolean onMenuItemSelected(int featureId, MenuItem item) {
+ if (item.getItemId() == android.R.id.home) {
+ onBackPressed();
+ return true;
+ }
+ return super.onMenuItemSelected(featureId, item);
+ }
+
+ @Override
public void onBackPressed() {
if (!getFragmentManager().popBackStackImmediate()) {
super.onBackPressed();
@@ -62,6 +80,9 @@
try {
Class<?> cls = Class.forName(pref.getFragment());
Fragment fragment = (Fragment) cls.newInstance();
+ final Bundle b = new Bundle(1);
+ b.putString(PreferenceFragment.ARG_PREFERENCE_ROOT, pref.getKey());
+ fragment.setArguments(b);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
setTitle(pref.getTitle());
transaction.replace(R.id.content_frame, fragment);
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java
index f835e7d..209b439 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java
@@ -30,6 +30,7 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.R;
import com.android.systemui.plugins.PluginPrefs;
+import com.android.systemui.statusbar.phone.DozeParameters;
public class TunerFragment extends PreferenceFragment {
@@ -37,6 +38,7 @@
private static final String KEY_BATTERY_PCT = "battery_pct";
private static final String KEY_PLUGINS = "plugins";
+ private static final CharSequence KEY_DOZE = "doze";
public static final String SETTING_SEEN_TUNER_WARNING = "seen_tuner_warning";
@@ -63,6 +65,9 @@
if (!PluginPrefs.hasPlugins(getContext())) {
getPreferenceScreen().removePreference(findPreference(KEY_PLUGINS));
}
+ if (!DozeParameters.ALWAYS_ON_AVAILABLE) {
+ getPreferenceScreen().removePreference(findPreference(KEY_DOZE));
+ }
if (Settings.Secure.getInt(getContext().getContentResolver(), SETTING_SEEN_TUNER_WARNING,
0) == 0) {
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerPreferenceFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerPreferenceFragment.java
new file mode 100644
index 0000000..06d40da
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerPreferenceFragment.java
@@ -0,0 +1,36 @@
+/*
+ * 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.tuner;
+
+import android.app.DialogFragment;
+import android.os.Bundle;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.Preference;
+
+public abstract class TunerPreferenceFragment extends PreferenceFragment {
+
+ @Override
+ public void onDisplayPreferenceDialog(Preference preference) {
+ DialogFragment f = null;
+ if (preference instanceof CustomListPreference) {
+ f = CustomListPreference.CustomListPreferenceDialogFragment
+ .newInstance(preference.getKey());
+ } else {
+ super.onDisplayPreferenceDialog(preference);
+ }
+ f.setTargetFragment(this, 0);
+ f.show(getFragmentManager(), "dialog_preference");
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
index b9cb575..b320d60 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
@@ -622,7 +622,6 @@
if (!mShowing) {
trimObsoleteH();
}
- Util.setVisOrGone(mDialogRowsView.findViewById(R.id.spacer), mExpanded);
// apply changes to all rows
for (final VolumeRow row : mRows) {
final boolean isActive = row == activeRow;
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogMotion.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogMotion.java
index 8144ea4..d6d0f75 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogMotion.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogMotion.java
@@ -140,7 +140,17 @@
final float v = (Float) mChevronPositionAnimator.getAnimatedValue();
final int posY = chevronPosY();
mChevron.setTranslationY(posY + v + -mDialogView.getTranslationY());
- }})
+ }
+ })
+ .withEndAction(new Runnable() {
+ @Override
+ public void run() {
+ if (mChevronPositionAnimator == null) return;
+ // reposition chevron
+ final int posY = chevronPosY();
+ mChevron.setTranslationY(posY + -mDialogView.getTranslationY());
+ }
+ })
.start();
mContentsPositionAnimator = ValueAnimator.ofFloat(-chevronDistance(), 0)
diff --git a/packages/SystemUI/tests/Android.mk b/packages/SystemUI/tests/Android.mk
index 8f5df7b..760d875 100644
--- a/packages/SystemUI/tests/Android.mk
+++ b/packages/SystemUI/tests/Android.mk
@@ -19,6 +19,7 @@
LOCAL_MODULE_TAGS := tests
LOCAL_JACK_FLAGS := --multi-dex native
+LOCAL_DX_FLAGS := --multi-dex
LOCAL_PROTOC_OPTIMIZE_TYPE := nano
LOCAL_PROTOC_FLAGS := -I$(LOCAL_PATH)/..
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
index 6c454e1..c0e7e80 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
@@ -23,7 +23,6 @@
import android.os.MessageQueue;
import android.support.test.InstrumentationRegistry;
import android.util.ArrayMap;
-import android.util.Log;
import com.android.systemui.Dependency.DependencyKey;
import com.android.systemui.utils.TestableContext;
@@ -32,8 +31,6 @@
import org.junit.After;
import org.junit.Before;
-import java.lang.Thread.UncaughtExceptionHandler;
-
/**
* Base class that does System UI specific setup.
*/
@@ -92,8 +89,10 @@
return null;
}
- public <T> void injectMockDependency(Class<T> cls) {
- injectTestDependency(cls, mock(cls));
+ public <T> T injectMockDependency(Class<T> cls) {
+ final T mock = mock(cls);
+ mDependency.injectTestDependency(cls, mock);
+ return mock;
}
public <T> void injectTestDependency(Class<T> cls, T obj) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
index c3948258..32afee9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
@@ -289,4 +289,12 @@
assertEquals(DOZE_PULSING, mMachine.getState());
}
+
+ @Test
+ @UiThreadTest
+ public void testWakeUp_wakesUp() {
+ mMachine.wakeUp();
+
+ assertTrue(mServiceFake.requestedWakeup);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
new file mode 100644
index 0000000..ada8ac0
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
@@ -0,0 +1,97 @@
+/*
+ * 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.doze;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.support.test.filters.SmallTest;
+import android.view.Display;
+
+import com.android.systemui.statusbar.phone.DozeParameters;
+
+import org.junit.Before;
+import org.junit.Test;
+
+@SmallTest
+public class DozeScreenStatePreventingAdapterTest {
+
+ private DozeMachine.Service mInner;
+ private DozeScreenStatePreventingAdapter mWrapper;
+
+ @Before
+ public void setup() throws Exception {
+ mInner = mock(DozeMachine.Service.class);
+ mWrapper = new DozeScreenStatePreventingAdapter(mInner);
+ }
+
+ @Test
+ public void forwards_finish() throws Exception {
+ mWrapper.finish();
+ verify(mInner).finish();
+ }
+
+ @Test
+ public void forwards_setDozeScreenState_on() throws Exception {
+ mWrapper.setDozeScreenState(Display.STATE_ON);
+ verify(mInner).setDozeScreenState(Display.STATE_ON);
+ }
+
+ @Test
+ public void forwards_setDozeScreenState_off() throws Exception {
+ mWrapper.setDozeScreenState(Display.STATE_OFF);
+ verify(mInner).setDozeScreenState(Display.STATE_OFF);
+ }
+
+ @Test
+ public void forwards_setDozeScreenState_doze() throws Exception {
+ mWrapper.setDozeScreenState(Display.STATE_DOZE);
+ verify(mInner).setDozeScreenState(Display.STATE_ON);
+ }
+
+ @Test
+ public void forwards_setDozeScreenState_doze_suspend() throws Exception {
+ mWrapper.setDozeScreenState(Display.STATE_DOZE_SUSPEND);
+ verify(mInner).setDozeScreenState(Display.STATE_ON);
+ }
+
+ @Test
+ public void forwards_requestWakeUp() throws Exception {
+ mWrapper.requestWakeUp();
+ verify(mInner).requestWakeUp();
+ }
+
+ @Test
+ public void wrapIfNeeded_needed() throws Exception {
+ DozeParameters params = mock(DozeParameters.class);
+ when(params.getDisplayStateSupported()).thenReturn(false);
+
+ assertEquals(DozeScreenStatePreventingAdapter.class,
+ DozeScreenStatePreventingAdapter.wrapIfNeeded(mInner, params).getClass());
+ }
+
+ @Test
+ public void wrapIfNeeded_not_needed() throws Exception {
+ DozeParameters params = mock(DozeParameters.class);
+ when(params.getDisplayStateSupported()).thenReturn(true);
+
+ assertSame(mInner, DozeScreenStatePreventingAdapter.wrapIfNeeded(mInner, params));
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeServiceFake.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeServiceFake.java
index d12fc2c..c1e7fe4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeServiceFake.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeServiceFake.java
@@ -22,6 +22,7 @@
public boolean finished;
public int screenState;
+ public boolean requestedWakeup;
public DozeServiceFake() {
reset();
@@ -41,4 +42,9 @@
finished = false;
screenState = Display.STATE_UNKNOWN;
}
+
+ @Override
+ public void requestWakeUp() {
+ requestedWakeup = true;
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
new file mode 100644
index 0000000..0f2878b
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
@@ -0,0 +1,169 @@
+/*
+ * 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.keyguard;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.argThat;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.ActivityOptions;
+import android.app.IActivityManager;
+import android.app.IApplicationThread;
+import android.app.ProfilerInfo;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.UserHandle;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.systemui.keyguard.WorkLockActivity;
+import com.android.systemui.keyguard.WorkLockActivityController;
+import com.android.systemui.recents.misc.SystemServicesProxy;
+import com.android.systemui.recents.misc.SystemServicesProxy.TaskStackListener;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.ArgumentMatcher;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * runtest systemui -c com.android.systemui.keyguard.WorkLockActivityControllerTest
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class WorkLockActivityControllerTest {
+ private static final int USER_ID = 333;
+ private static final int TASK_ID = 444;
+
+ private @Mock Context mContext;
+ private @Mock SystemServicesProxy mSystemServicesProxy;
+ private @Mock IActivityManager mIActivityManager;
+
+ private WorkLockActivityController mController;
+ private TaskStackListener mTaskStackListener;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ // Set a package name to use for checking ComponentName well-formedness in tests.
+ doReturn("com.example.test").when(mContext).getPackageName();
+
+ // Construct controller. Save the TaskStackListener for injecting events.
+ final ArgumentCaptor<TaskStackListener> listenerCaptor =
+ ArgumentCaptor.forClass(TaskStackListener.class);
+ mController =
+ new WorkLockActivityController(mContext, mSystemServicesProxy, mIActivityManager);
+
+ verify(mSystemServicesProxy).registerTaskStackListener(listenerCaptor.capture());
+ mTaskStackListener = listenerCaptor.getValue();
+ }
+
+ @Test
+ public void testOverlayStartedWhenLocked() throws Exception {
+ // When starting an activity succeeds,
+ setActivityStartCode(TASK_ID, true /*taskOverlay*/, ActivityManager.START_SUCCESS);
+
+ // And the controller receives a message saying the profile is locked,
+ mTaskStackListener.onTaskProfileLocked(TASK_ID, USER_ID);
+
+ // The overlay should start and the task the activity started in should not be removed.
+ verifyStartActivity(TASK_ID, true /*taskOverlay*/);
+ verify(mSystemServicesProxy, never()).removeTask(anyInt() /*taskId*/);
+ }
+
+ @Test
+ public void testRemoveTaskOnFailureToStartOverlay() throws Exception {
+ // When starting an activity fails,
+ setActivityStartCode(TASK_ID, true /*taskOverlay*/, ActivityManager.START_CLASS_NOT_FOUND);
+
+ // And the controller receives a message saying the profile is locked,
+ mTaskStackListener.onTaskProfileLocked(TASK_ID, USER_ID);
+
+ // The task the activity started in should be removed to prevent the locked task from
+ // being shown.
+ verifyStartActivity(TASK_ID, true /*taskOverlay*/);
+ verify(mSystemServicesProxy).removeTask(TASK_ID);
+ }
+
+ // End of tests, start of helpers
+ // ------------------------------
+
+ private void setActivityStartCode(int taskId, boolean taskOverlay, int code) throws Exception {
+ doReturn(code).when(mIActivityManager).startActivityAsUser(
+ eq((IApplicationThread) null),
+ eq((String) null),
+ any(Intent.class),
+ eq((String) null),
+ eq((IBinder) null),
+ eq((String) null),
+ anyInt(),
+ anyInt(),
+ eq((ProfilerInfo) null),
+ argThat(hasOptions(taskId, taskOverlay)),
+ eq(UserHandle.USER_CURRENT));
+ }
+
+ private void verifyStartActivity(int taskId, boolean taskOverlay) throws Exception {
+ verify(mIActivityManager).startActivityAsUser(
+ eq((IApplicationThread) null),
+ eq((String) null),
+ any(Intent.class),
+ eq((String) null),
+ eq((IBinder) null),
+ eq((String) null),
+ anyInt(),
+ anyInt(),
+ eq((ProfilerInfo) null),
+ argThat(hasOptions(taskId, taskOverlay)),
+ eq(UserHandle.USER_CURRENT));
+ }
+
+ private static ArgumentMatcher<Intent> hasComponent(final Context context,
+ final Class<? extends Activity> activityClass) {
+ return new ArgumentMatcher<Intent>() {
+ @Override
+ public boolean matches(Intent intent) {
+ return new ComponentName(context, activityClass).equals(intent.getComponent());
+ }
+ };
+ }
+
+ private static ArgumentMatcher<Bundle> hasOptions(final int taskId, final boolean overlay) {
+ return new ArgumentMatcher<Bundle>() {
+ @Override
+ public boolean matches(Bundle item) {
+ final ActivityOptions options = ActivityOptions.fromBundle(item);
+ return (options.getLaunchTaskId() == taskId)
+ && (options.getTaskOverlay() == overlay);
+ }
+ };
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginInstanceManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginInstanceManagerTest.java
index 3715df2..658966c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginInstanceManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginInstanceManagerTest.java
@@ -17,14 +17,27 @@
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
-
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.plugins.PluginInstanceManager.PluginInfo;
+import com.android.systemui.plugins.VersionInfo.InvalidVersionException;
+import com.android.systemui.plugins.annotations.Requires;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+
import android.app.Activity;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
@@ -35,7 +48,6 @@
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.HandlerThread;
@@ -44,17 +56,6 @@
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.plugins.PluginInstanceManager.PluginInfo;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mockito;
-
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -72,6 +73,7 @@
private PluginListener mMockListener;
private PluginInstanceManager mPluginInstanceManager;
private PluginManager mMockManager;
+ private VersionInfo mMockVersionInfo;
@Before
public void setup() throws Exception {
@@ -83,8 +85,10 @@
mMockManager = mock(PluginManager.class);
when(mMockManager.getClassLoader(any(), any()))
.thenReturn(getClass().getClassLoader());
+ mMockVersionInfo = mock(VersionInfo.class);
mPluginInstanceManager = new PluginInstanceManager(mContextWrapper, mMockPm, "myAction",
- mMockListener, true, mHandlerThread.getLooper(), 1, mMockManager, true);
+ mMockListener, true, mHandlerThread.getLooper(), mMockVersionInfo,
+ mMockManager, true);
sMockPlugin = mock(Plugin.class);
when(sMockPlugin.getVersion()).thenReturn(1);
}
@@ -145,7 +149,7 @@
NotificationManager nm = mock(NotificationManager.class);
mContext.addMockSystemService(Context.NOTIFICATION_SERVICE, nm);
setupFakePmQuery();
- when(sMockPlugin.getVersion()).thenReturn(2);
+ doThrow(new InvalidVersionException("", false)).when(mMockVersionInfo).checkVersion(any());
mPluginInstanceManager.loadAll();
@@ -181,7 +185,8 @@
public void testNonDebuggable() throws Exception {
// Create a version that thinks the build is not debuggable.
mPluginInstanceManager = new PluginInstanceManager(mContextWrapper, mMockPm, "myAction",
- mMockListener, true, mHandlerThread.getLooper(), 1, mMockManager, false);
+ mMockListener, true, mHandlerThread.getLooper(), mMockVersionInfo,
+ mMockManager, false);
setupFakePmQuery();
mPluginInstanceManager.loadAll();
@@ -270,6 +275,9 @@
}
}
+ // This target class doesn't matter, it just needs to have a Requires to hit the flow where
+ // the mock version info is called.
+ @Requires(target = PluginManagerTest.class, version = 1)
public static class TestPlugin implements Plugin {
@Override
public int getVersion() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java
index a58407b..09ac5a6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java
@@ -32,6 +32,7 @@
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.plugins.annotations.ProvidesInterface;
import com.android.systemui.plugins.PluginInstanceManager.PluginInfo;
import com.android.systemui.plugins.PluginManager.PluginInstanceManagerFactory;
@@ -63,7 +64,7 @@
mMockFactory = mock(PluginInstanceManagerFactory.class);
mMockPluginInstance = mock(PluginInstanceManager.class);
when(mMockFactory.createPluginInstanceManager(Mockito.any(), Mockito.any(), Mockito.any(),
- Mockito.anyBoolean(), Mockito.any(), Mockito.anyInt(), Mockito.any()))
+ Mockito.anyBoolean(), Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(mMockPluginInstance);
mPluginManager = new PluginManager(getContext(), mMockFactory, true, mMockExceptionHandler);
resetExceptionHandler();
@@ -76,20 +77,20 @@
Plugin mockPlugin = mock(Plugin.class);
when(mMockPluginInstance.getPlugin()).thenReturn(new PluginInfo(null, null, mockPlugin,
null));
- Plugin result = mPluginManager.getOneShotPlugin("myAction", 1);
+ Plugin result = mPluginManager.getOneShotPlugin("myAction", TestPlugin.class);
assertTrue(result == mockPlugin);
}
@Test
public void testAddListener() {
- mPluginManager.addPluginListener("myAction", mMockListener, 1);
+ mPluginManager.addPluginListener("myAction", mMockListener, TestPlugin.class);
verify(mMockPluginInstance).loadAll();
}
@Test
public void testRemoveListener() {
- mPluginManager.addPluginListener("myAction", mMockListener, 1);
+ mPluginManager.addPluginListener("myAction", mMockListener, TestPlugin.class);
mPluginManager.removePluginListener(mMockListener);
verify(mMockPluginInstance).destroy();
@@ -101,16 +102,16 @@
mMockExceptionHandler);
resetExceptionHandler();
- mPluginManager.addPluginListener("myAction", mMockListener, 1);
+ mPluginManager.addPluginListener("myAction", mMockListener, TestPlugin.class);
verify(mMockPluginInstance, Mockito.never()).loadAll();
- assertNull(mPluginManager.getOneShotPlugin("myPlugin", 1));
+ assertNull(mPluginManager.getOneShotPlugin("myPlugin", TestPlugin.class));
verify(mMockPluginInstance, Mockito.never()).getPlugin();
}
@Test
public void testExceptionHandler_foundPlugin() {
- mPluginManager.addPluginListener("myAction", mMockListener, 1);
+ mPluginManager.addPluginListener("myAction", mMockListener, TestPlugin.class);
when(mMockPluginInstance.checkAndDisable(Mockito.any())).thenReturn(true);
mPluginExceptionHandler.uncaughtException(Thread.currentThread(), new Throwable());
@@ -125,7 +126,7 @@
@Test
public void testExceptionHandler_noFoundPlugin() {
- mPluginManager.addPluginListener("myAction", mMockListener, 1);
+ mPluginManager.addPluginListener("myAction", mMockListener, TestPlugin.class);
when(mMockPluginInstance.checkAndDisable(Mockito.any())).thenReturn(false);
mPluginExceptionHandler.uncaughtException(Thread.currentThread(), new Throwable());
@@ -161,4 +162,10 @@
// Set back the real exception handler so the test can crash if it wants to.
Thread.setDefaultUncaughtExceptionHandler(mRealExceptionHandler);
}
+
+ @ProvidesInterface(action = TestPlugin.ACTION, version = TestPlugin.VERSION)
+ public static interface TestPlugin extends Plugin {
+ public static final String ACTION = "testAction";
+ public static final int VERSION = 1;
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java
new file mode 100644
index 0000000..0d87d6b
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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.plugins;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.plugins.VersionInfo.InvalidVersionException;
+import com.android.systemui.plugins.annotations.Requires;
+import com.android.systemui.plugins.qs.QS;
+import com.android.systemui.plugins.qs.QS.Callback;
+import com.android.systemui.plugins.qs.QS.DetailAdapter;
+import com.android.systemui.plugins.qs.QS.HeightListener;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class VersionInfoTest extends SysuiTestCase {
+
+ @Rule
+ public ExpectedException mThrown = ExpectedException.none();
+
+ @Test
+ public void testHasInfo() {
+ VersionInfo info = new VersionInfo();
+ info.addClass(VersionInfoTest.class); // Has no annotations.
+ assertFalse(info.hasVersionInfo());
+
+ info.addClass(OverlayPlugin.class);
+ assertTrue(info.hasVersionInfo());
+ }
+
+ @Test
+ public void testSingleProvides() {
+ VersionInfo overlay = new VersionInfo().addClass(OverlayPlugin.class);
+ VersionInfo impl = new VersionInfo().addClass(OverlayImpl.class);
+ overlay.checkVersion(impl);
+ }
+
+ @Test
+ public void testIncorrectVersion() {
+ VersionInfo overlay = new VersionInfo().addClass(OverlayPlugin.class);
+ VersionInfo impl = new VersionInfo().addClass(OverlayImplIncorrectVersion.class);
+ mThrown.expect(InvalidVersionException.class);
+ overlay.checkVersion(impl);
+ }
+
+ @Test
+ public void testMissingRequired() {
+ VersionInfo overlay = new VersionInfo().addClass(OverlayPlugin.class);
+ VersionInfo impl = new VersionInfo();
+ mThrown.expect(InvalidVersionException.class);
+ overlay.checkVersion(impl);
+ }
+
+ @Test
+ public void testMissingDependencies() {
+ VersionInfo overlay = new VersionInfo().addClass(QS.class);
+ VersionInfo impl = new VersionInfo().addClass(QSImplNoDeps.class);
+ mThrown.expect(InvalidVersionException.class);
+ overlay.checkVersion(impl);
+ }
+
+ @Test
+ public void testHasDependencies() {
+ VersionInfo overlay = new VersionInfo().addClass(QS.class);
+ VersionInfo impl = new VersionInfo().addClass(QSImpl.class);
+ overlay.checkVersion(impl);
+ }
+
+ @Requires(target = OverlayPlugin.class, version = OverlayPlugin.VERSION)
+ public static class OverlayImpl {
+ }
+
+ @Requires(target = OverlayPlugin.class, version = 0)
+ public static class OverlayImplIncorrectVersion {
+ }
+
+ @Requires(target = QS.class, version = QS.VERSION)
+ public static class QSImplNoDeps {
+ }
+
+ @Requires(target = QS.class, version = QS.VERSION)
+ @Requires(target = Callback.class, version = Callback.VERSION)
+ @Requires(target = HeightListener.class, version = HeightListener.VERSION)
+ @Requires(target = DetailAdapter.class, version = DetailAdapter.VERSION)
+ public static class QSImpl {
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
index 4146cb81..70c7d3e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
@@ -18,26 +18,32 @@
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
import android.content.ComponentName;
-import android.content.Context;
import android.os.Looper;
import android.service.quicksettings.Tile;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.systemui.SysUIRunner;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.QSTileHost;
-import com.android.systemui.statusbar.policy.DataSaverController;
-import com.android.systemui.statusbar.policy.HotspotController;
-import com.android.systemui.statusbar.policy.NetworkController;
-import java.util.ArrayList;
+import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.utils.TestableLooper;
+import com.android.systemui.utils.TestableLooper.RunWithLooper;
+
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
+import java.util.ArrayList;
+
@SmallTest
-@RunWith(AndroidJUnit4.class)
+@RunWith(SysUIRunner.class)
+@RunWithLooper(setAsMainLooper = true)
public class TileServicesTest extends SysuiTestCase {
private static int NUM_FAKES = TileServices.DEFAULT_MAX_BOUND * 2;
@@ -46,16 +52,24 @@
@Before
public void setUp() throws Exception {
+ TestableLooper.get(this).setAsMainLooper();
mManagers = new ArrayList<>();
- QSTileHost host = new QSTileHost(mContext, null, null);
+ QSTileHost host = new QSTileHost(mContext, null,
+ mock(StatusBarIconController.class));
mTileService = new TestTileServices(host, Looper.getMainLooper());
}
+ @After
+ public void tearDown() throws Exception {
+ mTileService.getHost().destroy();
+ TestableLooper.get(this).processAllMessages();
+ }
+
@Test
public void testRecalculateBindAllowance() {
// Add some fake tiles.
for (int i = 0; i < NUM_FAKES; i++) {
- mTileService.getTileWrapper(Mockito.mock(CustomTile.class));
+ mTileService.getTileWrapper(mock(CustomTile.class));
}
assertEquals(NUM_FAKES, mManagers.size());
@@ -91,7 +105,7 @@
@Test
public void testCalcFew() {
for (int i = 0; i < TileServices.DEFAULT_MAX_BOUND - 1; i++) {
- mTileService.getTileWrapper(Mockito.mock(CustomTile.class));
+ mTileService.getTileWrapper(mock(CustomTile.class));
}
mTileService.recalculateBindAllowance();
@@ -115,7 +129,7 @@
@Override
protected TileServiceManager onCreateTileService(ComponentName component, Tile qsTile) {
- TileServiceManager manager = Mockito.mock(TileServiceManager.class);
+ TileServiceManager manager = mock(TileServiceManager.class);
mManagers.add(manager);
return manager;
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java
index 72f6ca8..b8be4fa 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java
@@ -25,7 +25,7 @@
import org.junit.runner.RunWith;
@RunWith(SysUIRunner.class)
-@RunWithLooper
+@RunWithLooper(setAsMainLooper = true)
public class NotificationMenuRowTest extends LeakCheckedTest {
@Before
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStatusBarHeaderTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStatusBarHeaderTest.java
new file mode 100644
index 0000000..99cecff
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStatusBarHeaderTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import android.os.Handler;
+import android.os.Looper;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+import com.android.systemui.R.layout;
+import com.android.systemui.SysUIRunner;
+import com.android.systemui.utils.TestableLooper;
+import com.android.systemui.utils.TestableLooper.RunWithLooper;
+import com.android.systemui.utils.ViewUtils;
+import com.android.systemui.utils.leaks.LeakCheckedTest;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+
+@RunWith(SysUIRunner.class)
+@RunWithLooper(setAsMainLooper = true)
+public class QuickStatusBarHeaderTest extends LeakCheckedTest {
+
+ @Before
+ public void setup() throws NoSuchFieldException, IllegalAccessException {
+ injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES);
+ }
+
+ @Test
+ @Ignore("Flaky")
+ public void testRoamingStuck() throws Exception {
+ TestableLooper looper = TestableLooper.get(this);
+ assertEquals(Looper.myLooper(), looper.getLooper());
+ assertEquals(Looper.myLooper(), Looper.getMainLooper());
+ QuickStatusBarHeader header = (QuickStatusBarHeader) LayoutInflater.from(mContext).inflate(
+ layout.quick_status_bar_expanded_header, null);
+ header.setExpanded(true);
+
+ ViewUtils.attachView(header);
+ looper.processMessages(1);
+ TextView emergencyText = (TextView) header.findViewById(
+ R.id.header_emergency_calls_only);
+ int subId = 0;
+ header.setMobileDataIndicators(null, null, 0, 0, false,
+ false, null, null, false, subId, true);
+ looper.processAllMessages();
+ assertEquals(mContext.getString(R.string.accessibility_data_connection_roaming),
+ emergencyText.getText());
+ assertEquals(View.VISIBLE, emergencyText.getVisibility());
+
+ header.setSubs(new ArrayList<>());
+ subId = 1;
+ header.setMobileDataIndicators(null, null, 0, 0, false,
+ false, null, null, false, subId, false);
+ looper.processAllMessages();
+
+ assertNotEquals(View.VISIBLE, emergencyText.getVisibility());
+ assertEquals(Looper.myLooper(), Looper.getMainLooper());
+ ViewUtils.detachView(header);
+ looper.processAllMessages();
+ }
+
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java
new file mode 100644
index 0000000..e3a5ef0
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java
@@ -0,0 +1,105 @@
+/*
+ * 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.policy;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import com.android.systemui.Dependency;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.plugins.OverlayPlugin;
+import com.android.systemui.plugins.PluginManager;
+import com.android.systemui.statusbar.policy.ExtensionController.Extension;
+import com.android.systemui.statusbar.policy.ExtensionController.TunerFactory;
+import com.android.systemui.tuner.TunerService;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Map;
+import java.util.function.Consumer;
+
+public class ExtensionControllerTest extends SysuiTestCase {
+
+ private PluginManager mPluginManager;
+ private TunerService mTunerService;
+ private ExtensionController mExtensionController;
+
+ @Before
+ public void setup() {
+ mPluginManager = injectMockDependency(PluginManager.class);
+ mTunerService = injectMockDependency(TunerService.class);
+ mExtensionController = Dependency.get(ExtensionController.class);
+ }
+
+ @Test
+ public void testPlugin() {
+ Extension ext = mExtensionController.newExtension(OverlayPlugin.class)
+ .withPlugin(OverlayPlugin.class)
+ .build();
+ verify(mPluginManager).addPluginListener(eq(OverlayPlugin.ACTION), any(),
+ eq(OverlayPlugin.class));
+
+ ext.destroy();
+ verify(mPluginManager).removePluginListener(any());
+ }
+
+ @Test
+ public void testTuner() {
+ String[] keys = new String[] { "key1", "key2" };
+ TunerFactory<Object> factory = new ExtensionController.TunerFactory() {
+ @Override
+ public String[] keys() {
+ return keys;
+ }
+
+ @Override
+ public Object create(Map settings) {
+ return null;
+ }
+ };
+ Extension ext = mExtensionController.newExtension(Object.class)
+ .withTunerFactory(factory)
+ .build();
+ verify(mTunerService).addTunable(any(), eq(keys[0]), eq(keys[1]));
+
+ ext.destroy();
+ verify(mTunerService).removeTunable(any());
+ }
+
+ @Test
+ public void testDefault() {
+ Object o = new Object();
+ Extension ext = mExtensionController.newExtension(Object.class)
+ .withDefault(() -> o)
+ .build();
+ assertEquals(o, ext.get());
+ }
+
+ @Test
+ public void testCallback() {
+ Consumer<Object> callback = mock(Consumer.class);
+ final Object o = new Object();
+ mExtensionController.newExtension(Object.class)
+ .withDefault(() -> o)
+ .withCallback(callback)
+ .build();
+ verify(callback).accept(eq(o));
+ }
+
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
index 0e5f513..19b4b17 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
@@ -31,6 +31,7 @@
import android.util.Log;
import com.android.internal.telephony.cdma.EriInfo;
import com.android.settingslib.net.DataUsageController;
+import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;
@@ -43,6 +44,8 @@
import org.junit.runner.Description;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -56,6 +59,7 @@
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -82,6 +86,8 @@
protected CallbackHandler mCallbackHandler;
protected SubscriptionDefaults mMockSubDefaults;
protected NetworkScoreManager mMockNetworkScoreManager;
+ protected DeviceProvisionedController mMockProvisionController;
+ protected DeviceProvisionedListener mUserCallback;
protected int mSubId;
@@ -120,11 +126,21 @@
mConfig = new Config();
mConfig.hspaDataDistinguishable = true;
mCallbackHandler = mock(CallbackHandler.class);
+
+ mMockProvisionController = mock(DeviceProvisionedController.class);
+ when(mMockProvisionController.isUserSetup(anyInt())).thenReturn(true);
+ doAnswer(invocation -> {
+ mUserCallback = (DeviceProvisionedListener) invocation.getArguments()[0];
+ mUserCallback.onUserSetupChanged();
+ mUserCallback.onDeviceProvisionedChanged();
+ return null;
+ }).when(mMockProvisionController).addCallback(any());
+
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockNetworkScoreManager,
mMockTm, mMockWm, mMockSm,
mConfig, Looper.getMainLooper(), mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
- mMockSubDefaults, mock(DeviceProvisionedController.class));
+ mMockSubDefaults, mMockProvisionController);
setupNetworkController();
// Trigger blank callbacks to always get the current state (some tests don't trigger
@@ -139,7 +155,6 @@
when(mMockTm.getDataEnabled(mSubId)).thenReturn(true);
setDefaultSubId(mSubId);
setSubscriptions(mSubId);
- mNetworkController.handleSetUserSetupComplete(true);
mMobileSignalController = mNetworkController.mMobileSignalControllers.get(mSubId);
mPhoneStateListener = mMobileSignalController.mPhoneStateListener;
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
index d7f961c..ba20999 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
@@ -1,16 +1,19 @@
package com.android.systemui.statusbar.policy;
+import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import android.net.NetworkCapabilities;
import android.os.Looper;
import android.support.test.runner.AndroidJUnit4;
import android.telephony.TelephonyManager;
import android.test.suitebuilder.annotation.SmallTest;
+
import com.android.settingslib.net.DataUsageController;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mockito;
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -106,7 +109,7 @@
@Test
public void testDataDisabledIcon() {
setupNetworkController();
- Mockito.when(mMockTm.getDataEnabled(mSubId)).thenReturn(false);
+ when(mMockTm.getDataEnabled(mSubId)).thenReturn(false);
setupDefaultSignal();
updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0);
setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
@@ -118,11 +121,12 @@
@Test
public void testDataDisabledIcon_UserNotSetup() {
setupNetworkController();
- Mockito.when(mMockTm.getDataEnabled(mSubId)).thenReturn(false);
+ when(mMockTm.getDataEnabled(mSubId)).thenReturn(false);
setupDefaultSignal();
updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0);
setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
- mNetworkController.handleSetUserSetupComplete(false);
+ when(mMockProvisionController.isUserSetup(anyInt())).thenReturn(false);
+ mUserCallback.onUserSetupChanged();
// Don't show the X until the device is setup.
verifyDataIndicators(0, 0);
@@ -154,7 +158,7 @@
verifyDataIndicators(TelephonyIcons.DATA_LTE[1][0 /* No direction */],
TelephonyIcons.QS_DATA_LTE);
- Mockito.when(mServiceState.getDataNetworkType())
+ when(mServiceState.getDataNetworkType())
.thenReturn(TelephonyManager.NETWORK_TYPE_HSPA);
updateServiceState();
verifyDataIndicators(TelephonyIcons.DATA_H[1][0 /* No direction */],
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 9b382f6..8cbf95b 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
@@ -1,6 +1,7 @@
package com.android.systemui.statusbar.policy;
import android.content.Intent;
+import android.net.NetworkBadging;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.NetworkKey;
@@ -12,7 +13,6 @@
import android.net.wifi.WifiNetworkScoreCache;
import android.os.Bundle;
import android.provider.Settings;
-import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
@@ -106,7 +106,7 @@
setWifiState(true, TEST_SSID, TEST_BSSID);
mRequestScoresLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS);
- when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) ScoredNetwork.BADGING_SD);
+ when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) NetworkBadging.BADGING_SD);
ArgumentCaptor<WifiNetworkScoreCache> scoreCacheCaptor =
ArgumentCaptor.forClass(WifiNetworkScoreCache.class);
@@ -129,7 +129,7 @@
Utils.WIFI_PIE_FOR_BADGING[testLevel],
iconState.icon);
assertEquals("SD Badge is set",
- Utils.getWifiBadgeResource(ScoredNetwork.BADGING_SD),
+ Utils.getWifiBadgeResource(NetworkBadging.BADGING_SD),
iconState.iconOverlay);
settingsOverrider.release();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java
index 96a9bee..1194849 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java
@@ -30,6 +30,7 @@
import org.junit.After;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -71,18 +72,21 @@
mLeakDir.delete();
}
+ @Ignore("slow")
@Test
public void testDump_postsNotification() {
mLeakReporter.dumpLeak(5);
verify(mNotificationManager).notify(any(), anyInt(), any());
}
+ @Ignore("slow")
@Test
public void testDump_Repeated() {
mLeakReporter.dumpLeak(1);
mLeakReporter.dumpLeak(2);
}
+ @Ignore("slow")
@Test
public void testDump_ProducesNonZeroFiles() {
mLeakReporter.dumpLeak(5);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/TestableLooper.java b/packages/SystemUI/tests/src/com/android/systemui/utils/TestableLooper.java
index d275973..8902e0c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/utils/TestableLooper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/TestableLooper.java
@@ -244,9 +244,11 @@
mLooper.setAsMainLooper();
}
- mBase.evaluate();
-
- mLooper.destroy();
+ try {
+ mBase.evaluate();
+ } finally {
+ mLooper.destroy();
+ }
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/ViewUtils.java b/packages/SystemUI/tests/src/com/android/systemui/utils/ViewUtils.java
index 07e5f66..678b9f4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/utils/ViewUtils.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/ViewUtils.java
@@ -14,9 +14,11 @@
package com.android.systemui.utils;
+import android.content.pm.ApplicationInfo;
import android.graphics.PixelFormat;
import android.os.Handler;
import android.os.Looper;
+import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
@@ -27,18 +29,19 @@
public class ViewUtils {
public static void attachView(View view) {
+ // Make sure hardware acceleration isn't turned on.
+ view.getContext().getApplicationInfo().flags &=
+ ~(ApplicationInfo.FLAG_HARDWARE_ACCELERATED);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,
LayoutParams.TYPE_APPLICATION_OVERLAY,
0, PixelFormat.TRANSLUCENT);
- Handler handler = new Handler(Looper.getMainLooper());
- handler.post(() -> InstrumentationRegistry.getContext()
- .getSystemService(WindowManager.class).addView(view, lp));
+ InstrumentationRegistry.getContext()
+ .getSystemService(WindowManager.class).addView(view, lp);
}
public static void detachView(View view) {
- Handler handler = new Handler(Looper.getMainLooper());
- handler.post(() -> InstrumentationRegistry.getContext()
- .getSystemService(WindowManager.class).removeView(view));
+ InstrumentationRegistry.getContext()
+ .getSystemService(WindowManager.class).removeViewImmediate(view);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java
new file mode 100644
index 0000000..c0f5783
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java
@@ -0,0 +1,100 @@
+/*
+ * 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.utils.leaks;
+
+import static org.mockito.Mockito.mock;
+
+import com.android.systemui.statusbar.policy.ExtensionController;
+
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+public class FakeExtensionController implements ExtensionController {
+
+ private final Tracker mTracker;
+
+ public FakeExtensionController(LeakCheckedTest test) {
+ mTracker = test.getTracker("extension");
+ }
+
+ @Override
+ public <T> ExtensionBuilder<T> newExtension(Class<T> cls) {
+ final Object o = new Object();
+ mTracker.getLeakInfo(o).addAllocation(new Throwable());
+ return new FakeExtensionBuilder(o);
+ }
+
+ private class FakeExtensionBuilder<T> implements ExtensionBuilder<T> {
+ private final Object mAllocation;
+
+ public FakeExtensionBuilder(Object o) {
+ mAllocation = o;
+ }
+
+ @Override
+ public ExtensionBuilder<T> withTunerFactory(TunerFactory<T> factory) {
+ return this;
+ }
+
+ @Override
+ public <P extends T> ExtensionBuilder<T> withPlugin(Class<P> cls) {
+ return this;
+ }
+
+ @Override
+ public <P extends T> ExtensionBuilder<T> withPlugin(Class<P> cls, String action) {
+ return this;
+ }
+
+ @Override
+ public <P> ExtensionBuilder<T> withPlugin(Class<P> cls, String action, PluginConverter<T, P> converter) {
+ return this;
+ }
+
+ @Override
+ public ExtensionBuilder<T> withDefault(Supplier<T> def) {
+ return this;
+ }
+
+ @Override
+ public ExtensionBuilder<T> withCallback(Consumer<T> callback) {
+ return this;
+ }
+
+ @Override
+ public Extension build() {
+ return new FakeExtension(mAllocation);
+ }
+ }
+
+ private class FakeExtension<T> implements Extension<T> {
+ private final Object mAllocation;
+
+ public FakeExtension(Object allocation) {
+ mAllocation = allocation;
+ }
+
+ @Override
+ public T get() {
+ // TODO: Support defaults or things.
+ return null;
+ }
+
+ @Override
+ public void destroy() {
+ mTracker.getLeakInfo(mAllocation).clearAllocations();
+ }
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeNetworkController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeNetworkController.java
index 5497686..47ed5ca 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeNetworkController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeNetworkController.java
@@ -47,11 +47,6 @@
}
@Override
- public void setUserSetupComplete(boolean userSetup) {
-
- }
-
- @Override
public boolean hasEmergencyCryptKeeperText() {
return false;
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java
index d1abcca..59a9361 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java
@@ -31,13 +31,7 @@
@Override
public <T extends Plugin> void addPluginListener(String action, PluginListener<T> listener,
- int version) {
- mLeakChecker.addCallback(listener);
- }
-
- @Override
- public <T extends Plugin> void addPluginListener(String action, PluginListener<T> listener,
- int version, boolean allowMultiple) {
+ Class cls, boolean allowMultiple) {
mLeakChecker.addCallback(listener);
}
@@ -47,7 +41,7 @@
}
@Override
- public <T extends Plugin> T getOneShotPlugin(String action, int version) {
+ public <T extends Plugin> T getOneShotPlugin(String action, Class<?> cls) {
return null;
}
}
diff --git a/packages/WallpaperCropper/Android.mk b/packages/WallpaperCropper/Android.mk
index d8fb7a4..09b41fd 100644
--- a/packages/WallpaperCropper/Android.mk
+++ b/packages/WallpaperCropper/Android.mk
@@ -6,7 +6,7 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := telephony-common
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 junit
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4
LOCAL_PACKAGE_NAME := WallpaperCropper
LOCAL_CERTIFICATE := platform
diff --git a/packages/WallpaperCropper/src/com/android/gallery3d/glrenderer/BitmapTexture.java b/packages/WallpaperCropper/src/com/android/gallery3d/glrenderer/BitmapTexture.java
index 100b0b3b..f8b01cb 100644
--- a/packages/WallpaperCropper/src/com/android/gallery3d/glrenderer/BitmapTexture.java
+++ b/packages/WallpaperCropper/src/com/android/gallery3d/glrenderer/BitmapTexture.java
@@ -18,7 +18,7 @@
import android.graphics.Bitmap;
-import junit.framework.Assert;
+import com.android.gallery3d.common.Utils;
// BitmapTexture is a texture whose content is specified by a fixed Bitmap.
//
@@ -34,7 +34,7 @@
public BitmapTexture(Bitmap bitmap, boolean hasBorder) {
super(hasBorder);
- Assert.assertTrue(bitmap != null && !bitmap.isRecycled());
+ Utils.assertTrue(bitmap != null && !bitmap.isRecycled());
mContentBitmap = bitmap;
}
diff --git a/packages/WallpaperCropper/src/com/android/gallery3d/glrenderer/GLPaint.java b/packages/WallpaperCropper/src/com/android/gallery3d/glrenderer/GLPaint.java
index 16b2206..b26e9ab 100644
--- a/packages/WallpaperCropper/src/com/android/gallery3d/glrenderer/GLPaint.java
+++ b/packages/WallpaperCropper/src/com/android/gallery3d/glrenderer/GLPaint.java
@@ -16,7 +16,7 @@
package com.android.gallery3d.glrenderer;
-import junit.framework.Assert;
+import com.android.gallery3d.common.Utils;
public class GLPaint {
private float mLineWidth = 1f;
@@ -31,7 +31,7 @@
}
public void setLineWidth(float width) {
- Assert.assertTrue(width >= 0);
+ Utils.assertTrue(width >= 0);
mLineWidth = width;
}
diff --git a/packages/WallpaperCropper/src/com/android/gallery3d/glrenderer/UploadedTexture.java b/packages/WallpaperCropper/src/com/android/gallery3d/glrenderer/UploadedTexture.java
index f41a979..417102a 100644
--- a/packages/WallpaperCropper/src/com/android/gallery3d/glrenderer/UploadedTexture.java
+++ b/packages/WallpaperCropper/src/com/android/gallery3d/glrenderer/UploadedTexture.java
@@ -20,7 +20,7 @@
import android.graphics.Bitmap.Config;
import android.opengl.GLUtils;
-import junit.framework.Assert;
+import com.android.gallery3d.common.Utils;
import java.util.HashMap;
@@ -144,7 +144,7 @@
}
private void freeBitmap() {
- Assert.assertTrue(mBitmap != null);
+ Utils.assertTrue(mBitmap != null);
onFreeBitmap(mBitmap);
mBitmap = null;
}
@@ -219,7 +219,7 @@
int texWidth = getTextureWidth();
int texHeight = getTextureHeight();
- Assert.assertTrue(bWidth <= texWidth && bHeight <= texHeight);
+ Utils.assertTrue(bWidth <= texWidth && bHeight <= texHeight);
// Upload the bitmap to a new texture.
mId = canvas.getGLId().generateTexture();
diff --git a/preloaded-classes b/preloaded-classes
index 7dc5a25..a72a042 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -3919,6 +3919,18 @@
org.apache.http.message.BasicHttpResponse
org.apache.http.message.BasicStatusLine
org.apache.http.message.HeaderGroup
+org.ccil.cowan.tagsoup.AttributesImpl
+org.ccil.cowan.tagsoup.AutoDetector
+org.ccil.cowan.tagsoup.Element
+org.ccil.cowan.tagsoup.ElementType
+org.ccil.cowan.tagsoup.HTMLModels
+org.ccil.cowan.tagsoup.HTMLScanner
+org.ccil.cowan.tagsoup.HTMLSchema
+org.ccil.cowan.tagsoup.Parser
+org.ccil.cowan.tagsoup.Parser$1
+org.ccil.cowan.tagsoup.ScanHandler
+org.ccil.cowan.tagsoup.Scanner
+org.ccil.cowan.tagsoup.Schema
org.json.JSON
org.json.JSONArray
org.json.JSONException
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 653e80a..c1c385a 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -41,6 +41,9 @@
// The view or control was dismissed.
TYPE_DISMISS = 5;
+
+ // The view or control was updated.
+ TYPE_UPDATE = 6;
}
// Known visual elements: views or controls.
@@ -3397,6 +3400,78 @@
// ACTION: A tile in Settings information architecture is clicked
ACTION_SETTINGS_TILE_CLICK = 830;
+ // OPEN: Notification unsnoozed. CLOSE: Notification snoozed. UPDATE: snoozed notification
+ // updated
+ // CATEGORY: NOTIFICATION
+ // OS: O
+ NOTIFICATION_SNOOZED = 831;
+
+ // Tagged data for NOTIFICATION_SNOOZED. TRUE: snoozed until context, FALSE: snoozed for time.
+ // OS: O
+ NOTIFICATION_SNOOZED_CRITERIA = 832;
+
+ // FIELD - The context (source) from which an action is performed
+ FIELD_CONTEXT = 833;
+
+ // ACTION: Settings advanced button is expanded
+ ACTION_SETTINGS_ADVANCED_BUTTON_EXPAND = 834;
+
+ // ACTION: Logs the number of times the saved network evaluator was used to
+ // recommend a wifi network
+ WIFI_NETWORK_RECOMMENDATION_SAVED_NETWORK_EVALUATOR = 835;
+
+ // ACTION: Logs the number of times the recommended network evaluator was
+ // used to recommend a wifi network
+ WIFI_NETWORK_RECOMMENDATION_RECOMMENDED_NETWORK_EVALUATOR = 836;
+
+ // ACTION: Logs the number of times a recommended network was resulted in a
+ // successful connection
+ // VALUE: true if the connection was successful, false if the connection failed
+ WIFI_NETWORK_RECOMMENDATION_CONNECTION_SUCCESS = 837;
+
+ // OPEN: Settings > Storage > Games
+ // CATEGORY: SETTINGS
+ // OS: O
+ APPLICATIONS_STORAGE_GAMES = 838;
+
+ // OPEN: Settings > Storage > Audio and Music
+ // CATEGORY: SETTINGS
+ // OS: O
+ APPLICATIONS_STORAGE_MUSIC = 839;
+
+ // ACTION: Settings > Storage > Free Up Space to launch Deletion Helper
+ // CATEGORY: SETTINGS
+ // OS: O
+ STORAGE_FREE_UP_SPACE_NOW = 840;
+
+ // ACTION: Settings > Storage > Files to open the File Manager
+ // CATEGORY: SETTINGS
+ // OS: O
+ STORAGE_FILES = 841;
+
+ // FIELD - Rank of the clicked Settings search result
+ FIELD_SETTINGS_SERACH_RESULT_RANK = 842;
+
+ // OPEN: Settings > Apps > Default Apps > Assist > Default assist
+ DEFAULT_ASSIST_PICKER = 843;
+
+ // OPEN: Settings > Apps > Default Apps > Assist > Default voice input
+ DEFAULT_VOICE_INPUT_PICKER = 844;
+
+ // OPEN: Settings > Storage > [Profile]
+ SETTINGS_STORAGE_PROFILE = 845;
+
+ // OPEN: Settings > Security & screen lock -> Encryption & crendentials
+ // CATEGORY: SETTINGS
+ // OS: O
+ ENCRYPTION_AND_CREDENTIAL = 846;
+
+ // ACTION: Settings > About device > Build number
+ ACTION_SETTINGS_BUILD_NUMBER_PREF = 847;
+
+ // FIELD: Whether developer mode has already been enabled when clicking build number preference
+ FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED = 848;
+
// ---- End O Constants, all O constants go above this line ----
// Add new aosp constants above this line.
diff --git a/proto/src/system_messages.proto b/proto/src/system_messages.proto
index 5b91776..74f5cf5 100644
--- a/proto/src/system_messages.proto
+++ b/proto/src/system_messages.proto
@@ -52,6 +52,10 @@
// Package: com.android.systemui
NOTE_PLUGIN = 6;
+ // Notify the user that instant app is running.
+ // Package: com.android.systemui
+ NOTE_INSTANT_APPS = 7;
+
// Confirm that the user wants to remove the guest account.
// Package: com.android.systemui
NOTE_REMOVE_GUEST = 1010;
diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto
index 9416ac1..7eefb7e 100644
--- a/proto/src/wifi.proto
+++ b/proto/src/wifi.proto
@@ -435,9 +435,28 @@
// Number of occurrences of a soft AP session return code
message SoftApReturnCodeCount {
- // Return code of the soft AP session
- optional int32 return_code = 1;
+
+ enum SoftApStartResult {
+
+ // SoftApManager return code unknown
+ SOFT_AP_RETURN_CODE_UNKNOWN = 0;
+
+ // SoftAp started successfully
+ SOFT_AP_STARTED_SUCCESSFULLY = 1;
+
+ // Catch all for failures with no specific failure reason
+ SOFT_AP_FAILED_GENERAL_ERROR = 2;
+
+ // SoftAp failed to start due to NO_CHANNEL error
+ SOFT_AP_FAILED_NO_CHANNEL = 3;
+ }
+
+ // Historical, no longer used for writing as of 01/2017.
+ optional int32 return_code = 1 [deprecated = true];
// Occurrences of this soft AP return code
optional int32 count = 2;
+
+ // Result of attempt to start SoftAp
+ optional SoftApStartResult start_result = 3;
}
diff --git a/rs/jni/Android.mk b/rs/jni/Android.mk
index bf3681b..447a47d 100644
--- a/rs/jni/Android.mk
+++ b/rs/jni/Android.mk
@@ -19,22 +19,17 @@
LOCAL_STATIC_LIBRARIES :=
-rs_generated_include_dir := $(call intermediates-dir-for,SHARED_LIBRARIES,libRS,,)
-
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE) \
frameworks/rs \
frameworks/base/core/jni \
- frameworks/base/libs/hwui \
- $(rs_generated_include_dir)
+ frameworks/base/libs/hwui
LOCAL_CFLAGS += -Wno-unused-parameter
LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
-LOCAL_ADDITIONAL_DEPENDENCIES := $(addprefix $(rs_generated_include_dir)/,rsgApiFuncDecl.h)
LOCAL_MODULE:= librs_jni
-LOCAL_ADDITIONAL_DEPENDENCIES += $(rs_generated_source)
LOCAL_MODULE_TAGS := optional
-LOCAL_REQUIRED_MODULES := libRS libRSDriver
+LOCAL_REQUIRED_MODULES := libRS
include $(BUILD_SHARED_LIBRARY)
diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp
index af370ff..2300da3 100644
--- a/rs/jni/android_renderscript_RenderScript.cpp
+++ b/rs/jni/android_renderscript_RenderScript.cpp
@@ -35,8 +35,8 @@
#include "android_runtime/android_util_AssetManager.h"
#include "android/graphics/GraphicsJNI.h"
-#include <rs.h>
#include <rsEnv.h>
+#include <rsApiStubs.h>
#include <gui/Surface.h>
#include <gui/GLConsumer.h>
#include <android_runtime/android_graphics_SurfaceTexture.h>
@@ -1134,7 +1134,7 @@
// we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
assert(dataSize == 5);
- uintptr_t elementData[5];
+ uint32_t elementData[5];
rsaElementGetNativeData((RsContext)con, (RsElement)id, elementData, dataSize);
for(jint i = 0; i < dataSize; i ++) {
@@ -1157,7 +1157,7 @@
uintptr_t *ids = (uintptr_t*)malloc(dataSize * sizeof(uintptr_t));
const char **names = (const char **)malloc(dataSize * sizeof(const char *));
- uint32_t *arraySizes = (uint32_t *)malloc(dataSize * sizeof(uint32_t));
+ size_t *arraySizes = (size_t *)malloc(dataSize * sizeof(size_t));
rsaElementGetSubElements((RsContext)con, (RsElement)id, ids, names, arraySizes,
(uint32_t)dataSize);
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index aae5dd8..44afe1d 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -912,8 +912,21 @@
*/
// TODO: (multi-display) Make sure this works for multiple displays.
boolean getAccessibilityFocusClickPointInScreen(Point outPoint) {
- return getInteractionBridgeLocked()
- .getAccessibilityFocusClickPointInScreenNotLocked(outPoint);
+ return getInteractionBridge().getAccessibilityFocusClickPointInScreenNotLocked(outPoint);
+ }
+
+ /**
+ * Perform an accessibility action on the view that currently has accessibility focus.
+ * Has no effect if no item has accessibility focus, if the item with accessibility
+ * focus does not expose the specified action, or if the action fails.
+ *
+ * @param actionId The id of the action to perform.
+ *
+ * @return {@code true} if the action was performed. {@code false} if it was not.
+ */
+ public boolean performActionOnAccessibilityFocusedItem(
+ AccessibilityNodeInfo.AccessibilityAction action) {
+ return getInteractionBridge().performActionOnAccessibilityFocusedItemNotLocked(action);
}
/**
@@ -1029,11 +1042,13 @@
onUserStateChangedLocked(userState);
}
- private InteractionBridge getInteractionBridgeLocked() {
- if (mInteractionBridge == null) {
- mInteractionBridge = new InteractionBridge();
+ private InteractionBridge getInteractionBridge() {
+ synchronized (mLock) {
+ if (mInteractionBridge == null) {
+ mInteractionBridge = new InteractionBridge();
+ }
+ return mInteractionBridge;
}
- return mInteractionBridge;
}
private boolean notifyGestureLocked(int gestureId, boolean isDefault) {
@@ -1991,23 +2006,26 @@
private void updateFingerprintGestureHandling(UserState userState) {
final List<Service> services;
synchronized (mLock) {
- // Only create the controller when a service wants to use the feature
services = userState.mBoundServices;
- int numServices = services.size();
- for (int i = 0; i < numServices; i++) {
- if (services.get(i).isCapturingFingerprintGestures()) {
- final long identity = Binder.clearCallingIdentity();
- IFingerprintService service = null;
- try {
- service = IFingerprintService.Stub.asInterface(
- ServiceManager.getService(Context.FINGERPRINT_SERVICE));
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- if (service != null) {
- mFingerprintGestureDispatcher = new FingerprintGestureDispatcher(
- service, mLock);
- break;
+ if ((mFingerprintGestureDispatcher == null)
+ && mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
+ // Only create the controller when a service wants to use the feature
+ int numServices = services.size();
+ for (int i = 0; i < numServices; i++) {
+ if (services.get(i).isCapturingFingerprintGestures()) {
+ final long identity = Binder.clearCallingIdentity();
+ IFingerprintService service = null;
+ try {
+ service = IFingerprintService.Stub.asInterface(
+ ServiceManager.getService(Context.FINGERPRINT_SERVICE));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ if (service != null) {
+ mFingerprintGestureDispatcher = new FingerprintGestureDispatcher(
+ service, mLock);
+ break;
+ }
}
}
}
@@ -2274,11 +2292,7 @@
case MSG_CLEAR_ACCESSIBILITY_FOCUS: {
final int windowId = msg.arg1;
- InteractionBridge bridge;
- synchronized (mLock) {
- bridge = getInteractionBridgeLocked();
- }
- bridge.clearAccessibilityFocusNotLocked(windowId);
+ getInteractionBridge().clearAccessibilityFocusNotLocked(windowId);
} break;
case MSG_SEND_SERVICES_STATE_CHANGED_TO_CLIENTS: {
@@ -4051,6 +4065,24 @@
}
}
+ /**
+ * Perform an accessibility action on the view that currently has accessibility focus.
+ * Has no effect if no item has accessibility focus, if the item with accessibility
+ * focus does not expose the specified action, or if the action fails.
+ *
+ * @param actionId The id of the action to perform.
+ *
+ * @return {@code true} if the action was performed. {@code false} if it was not.
+ */
+ public boolean performActionOnAccessibilityFocusedItemNotLocked(
+ AccessibilityNodeInfo.AccessibilityAction action) {
+ AccessibilityNodeInfo focus = getAccessibilityFocusNotLocked();
+ if ((focus == null) || !focus.getActionList().contains(action)) {
+ return false;
+ }
+ return focus.performAction(action.getId());
+ }
+
public boolean getAccessibilityFocusClickPointInScreenNotLocked(Point outPoint) {
AccessibilityNodeInfo focus = getAccessibilityFocusNotLocked();
if (focus == null) {
diff --git a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
index ecba245..6e87f88 100644
--- a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
@@ -29,6 +29,7 @@
import android.view.WindowManagerPolicy;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityNodeInfo;
import java.util.ArrayList;
import java.util.Arrays;
@@ -407,6 +408,13 @@
mSendTouchInteractionEndDelayed.forceSendAndRemove();
}
+ // Try to use the standard accessibility API to click
+ if (mAms.performActionOnAccessibilityFocusedItem(
+ AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK)) {
+ return true;
+ }
+ Slog.e(LOG_TAG, "ACTION_CLICK failed. Dispatching motion events to simulate click.");
+
final int pointerIndex = event.getActionIndex();
final int pointerId = event.getPointerId(pointerIndex);
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index 4d2b106..c50623e 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -709,7 +709,7 @@
}
private boolean isUserRunningAndUnlocked(@UserIdInt int userId) {
- return mUserManager.isUserRunning(userId) && StorageManager.isUserKeyUnlocked(userId);
+ return mUserManager.isUserUnlockingOrUnlocked(userId);
}
@Override
diff --git a/services/autofill/java/com/android/server/autofill/AnchoredWindow.java b/services/autofill/java/com/android/server/autofill/AnchoredWindow.java
deleted file mode 100644
index 64c6abd..0000000
--- a/services/autofill/java/com/android/server/autofill/AnchoredWindow.java
+++ /dev/null
@@ -1,292 +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.autofill;
-
-import static com.android.server.autofill.Helper.DEBUG;
-
-import android.annotation.Nullable;
-import android.content.Context;
-import android.graphics.PixelFormat;
-import android.graphics.Rect;
-import android.os.IBinder;
-import android.util.Slog;
-import android.view.Gravity;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.MeasureSpec;
-import android.view.WindowManager;
-import android.view.WindowManager.LayoutParams;
-import android.widget.FrameLayout;
-
-/**
- * A window above the application that is smartly anchored to a rectangular region.
- */
-final class AnchoredWindow implements View.OnLayoutChangeListener, View.OnTouchListener {
- private static final String TAG = "AutoFill";
-
- private static final int NULL_HEIGHT = -1;
-
- private final WindowManager mWm;
- private final IBinder mAppToken;
- private final View mContentView;
-
- private final View mWindowSizeListenerView;
- private final int mMinMargin;
-
- private int mLastHeight = NULL_HEIGHT;
- @Nullable
- private Rect mLastBounds;
- @Nullable
- private Rect mLastDisplayBounds;
-
- /**
- * Constructor.
- *
- * @param wm window manager that draws the content on a window
- * @param appToken token to pass to window manager
- * @param contentView content of the window
- */
- AnchoredWindow(WindowManager wm, IBinder appToken, View contentView) {
- mWm = wm;
- mAppToken = appToken;
- mContentView = contentView;
-
- mContentView.addOnLayoutChangeListener(this);
-
- Context context = contentView.getContext();
-
- mWindowSizeListenerView = new FrameLayout(context);
- mWindowSizeListenerView.addOnLayoutChangeListener(this);
-
- mMinMargin = context.getResources().getDimensionPixelSize(
- com.android.internal.R.dimen.autofill_fill_min_margin);
- }
-
- /**
- * Shows the window.
- *
- * @param bounds the region the window should be anchored to
- */
- void show(Rect bounds) {
- if (DEBUG) Slog.d(TAG, "show bounds=" + bounds);
-
- if (!mWindowSizeListenerView.isAttachedToWindow()) {
- if (DEBUG) Slog.d(TAG, "adding mWindowSizeListenerView");
- LayoutParams params = createWindowLayoutParams(
- mAppToken,
- LayoutParams.FLAG_NOT_TOUCHABLE); // not touchable
- params.gravity = Gravity.LEFT | Gravity.TOP;
- params.x = 0;
- params.y = 0;
- params.width = LayoutParams.MATCH_PARENT;
- params.height = LayoutParams.MATCH_PARENT;
- mWm.addView(mWindowSizeListenerView, params);
- }
-
- updateBounds(bounds);
- }
-
- /**
- * Hides the window.
- */
- void hide() {
- if (DEBUG) Slog.d(TAG, "hide");
-
- mLastHeight = NULL_HEIGHT;
- mLastBounds = null;
- mLastDisplayBounds = null;
-
- if (mWindowSizeListenerView.isAttachedToWindow()) {
- if (DEBUG) Slog.d(TAG, "removing mWindowSizeListenerView");
- mWm.removeView(mWindowSizeListenerView);
- }
-
- if (mContentView.isAttachedToWindow()) {
- if (DEBUG) Slog.d(TAG, "removing mContentView");
- mContentView.setOnTouchListener(null);
- mWm.removeView(mContentView);
- }
- }
-
- @Override
- public void onLayoutChange(View view, int left, int top, int right, int bottom,
- int oldLeft, int oldTop, int oldRight, int oldBottom) {
- if (view == mWindowSizeListenerView) {
- if (DEBUG) Slog.d(TAG, "onLayoutChange() for mWindowSizeListenerView");
- // mWindowSizeListenerView layout changed, get the size of the display bounds and updateLocked
- // the window.
- final Rect displayBounds = new Rect();
- view.getBoundsOnScreen(displayBounds);
- updateDisplayBounds(displayBounds);
- } else if (view == mContentView) {
- // mContentView layout changed, updateLocked the window in case its height changed.
- if (DEBUG) Slog.d(TAG, "onLayoutChange() for mContentView");
- updateHeight();
- }
- }
-
- // When the window is touched outside, hide the window.
- @Override
- public boolean onTouch(View view, MotionEvent event) {
- if (view == mContentView && event.getAction() == MotionEvent.ACTION_OUTSIDE) {
- hide();
- return true;
- }
- return false;
- }
-
- private boolean updateHeight() {
- final Rect displayBounds = mLastDisplayBounds;
- if (displayBounds == null) {
- return false;
- }
-
- mContentView.measure(
- MeasureSpec.makeMeasureSpec(displayBounds.width(), MeasureSpec.AT_MOST),
- MeasureSpec.makeMeasureSpec(displayBounds.height(), MeasureSpec.AT_MOST));
- int height = mContentView.getMeasuredHeight();
- if (height != mLastHeight) {
- if (DEBUG) Slog.d(TAG, "updateLocked height=" + height);
- mLastHeight = height;
- update(height, mLastBounds, displayBounds);
- return true;
- } else {
- return false;
- }
- }
-
- private void updateBounds(Rect bounds) {
- if (!bounds.equals(mLastBounds)) {
- if (DEBUG) Slog.d(TAG, "updateLocked bounds=" + bounds);
- mLastBounds = bounds;
-
- update(mLastHeight, bounds, mLastDisplayBounds);
- }
- }
-
- private void updateDisplayBounds(Rect displayBounds) {
- if (!displayBounds.equals(mLastDisplayBounds)) {
- if (DEBUG) Slog.d(TAG, "updateLocked displayBounds=" + displayBounds);
- mLastDisplayBounds = displayBounds;
-
- if (!updateHeight()) {
- update(mLastHeight, mLastBounds, displayBounds);
- }
- }
- }
-
- // Updates the window if height, bounds, and displayBounds are not null.
- // Caller should ensure that something changed before calling.
- private void update(int height, @Nullable Rect bounds, @Nullable Rect displayBounds) {
- if (height == NULL_HEIGHT || bounds == null || displayBounds == null) {
- return;
- }
-
- if (DEBUG) Slog.d(TAG, "updateLocked height=" + height + ", bounds=" + bounds
- + ", displayBounds=" + displayBounds);
-
- final LayoutParams params = createWindowLayoutParams(mAppToken,
- LayoutParams.FLAG_NOT_TOUCH_MODAL // outside touches go to windows behind us
- | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); // outside touches trigger MotionEvent
- params.setTitle("AutoFill Fill"); // used for debugging
- updatePosition(params, height, mMinMargin, bounds, displayBounds);
- if (!mContentView.isAttachedToWindow()) {
- if (DEBUG) Slog.d(TAG, "adding mContentView");
- mWm.addView(mContentView, params);
- mContentView.setOnTouchListener(this);
- } else {
- if (DEBUG) Slog.d(TAG, "updating mContentView");
- mWm.updateViewLayout(mContentView, params);
- }
- }
-
- /**
- * Updates the position of the window by altering the {@link LayoutParams}.
- *
- * <p>The window can be anchored either above or below the bounds. Anchoring the window below
- * the bounds is preferred, if it fits. Otherwise, anchor the window on the side with more
- * space.
- *
- * @param params the params to updateLocked
- * @param height the requested height of the window
- * @param minMargin the minimum margin between the window and the display bounds
- * @param bounds the region the window should be anchored to
- * @param displayBounds the region in which the window may be displayed
- */
- private static void updatePosition(
- LayoutParams params,
- int height,
- int minMargin,
- Rect bounds,
- Rect displayBounds) {
- boolean below;
- int verticalSpace;
- final int verticalSpaceBelow = displayBounds.bottom - bounds.bottom - minMargin;
- if (height <= verticalSpaceBelow) {
- // Fits below bounds.
- below = true;
- verticalSpace = height;
- } else {
- final int verticalSpaceAbove = bounds.top - displayBounds.top - minMargin;
- if (height <= verticalSpaceAbove) {
- // Fits above bounds.
- below = false;
- verticalSpace = height;
- } else {
- // Pick above/below based on which has the most space.
- if (verticalSpaceBelow >= verticalSpaceAbove) {
- below = true;
- verticalSpace = verticalSpaceBelow;
- } else {
- below = false;
- verticalSpace = verticalSpaceAbove;
- }
- }
- }
-
- int gravity;
- int y;
- if (below) {
- if (DEBUG) Slog.d(TAG, "anchorBelow");
- gravity = Gravity.TOP | Gravity.LEFT;
- y = bounds.bottom - displayBounds.top;
- } else {
- if (DEBUG) Slog.d(TAG, "anchorAbove");
- gravity = Gravity.BOTTOM | Gravity.LEFT;
- y = displayBounds.bottom - bounds.top;
- }
-
- final int x = bounds.left - displayBounds.left;
-
- params.gravity = gravity;
- params.x = x;
- params.y = y;
- params.width = bounds.width();
- params.height = verticalSpace;
- }
-
- private static LayoutParams createWindowLayoutParams(IBinder appToken, int flags) {
- final LayoutParams params = new LayoutParams();
- params.token = appToken;
- params.type = LayoutParams.TYPE_PHONE;
- params.flags =
- flags
- | LayoutParams.FLAG_NOT_FOCUSABLE // don't receive input events
- | LayoutParams.FLAG_ALT_FOCUSABLE_IM; // resize for soft input
- params.format = PixelFormat.TRANSLUCENT;
- return params;
- }
-}
diff --git a/services/autofill/java/com/android/server/autofill/AutoFillManagerService.java b/services/autofill/java/com/android/server/autofill/AutoFillManagerService.java
index 3257812..7a85d4e 100644
--- a/services/autofill/java/com/android/server/autofill/AutoFillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutoFillManagerService.java
@@ -18,7 +18,6 @@
import static android.Manifest.permission.MANAGE_AUTO_FILL;
import static android.content.Context.AUTO_FILL_MANAGER_SERVICE;
-import static com.android.server.autofill.Helper.DEBUG;
import static com.android.server.autofill.Helper.VERBOSE;
import android.Manifest;
@@ -57,6 +56,7 @@
import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.SystemService;
+import com.android.server.autofill.ui.AutoFillUI;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -100,14 +100,16 @@
private SparseArray<AutoFillManagerServiceImpl> mServicesCache = new SparseArray<>();
// TODO(b/33197203): set a different max (or disable it) on low-memory devices.
- private final LocalLog mRequestsHistory = new LocalLog(100);
+ private final LocalLog mRequestsHistory = new LocalLog(20);
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
final String reason = intent.getStringExtra("reason");
- if (DEBUG) Slog.d(TAG, "close system dialogs: " + reason);
+ if (VERBOSE) {
+ Slog.v(TAG, "close system dialogs: " + reason);
+ }
mUi.hideAll();
}
}
@@ -246,7 +248,9 @@
private IBinder getTopActivityForUser() {
final List<IBinder> topActivities = LocalServices
.getService(ActivityManagerInternal.class).getTopVisibleActivities();
- if (DEBUG) Slog.d(TAG, "Top activities (" + topActivities.size() + "): " + topActivities);
+ if (VERBOSE) {
+ Slog.v(TAG, "Top activities (" + topActivities.size() + "): " + topActivities);
+ }
if (topActivities.isEmpty()) {
Slog.w(TAG, "Could not get top activity");
return null;
@@ -271,29 +275,20 @@
}
@Override
- public void startSession(IBinder activityToken, IBinder appCallback, AutoFillId autoFillId,
- Rect bounds, AutoFillValue value, int userId) {
+ public void startSession(IBinder activityToken, IBinder windowToken, IBinder appCallback,
+ AutoFillId autoFillId, Rect bounds, AutoFillValue value, int userId) {
// TODO(b/33197203): make sure it's called by resumed / focused activity
- if (VERBOSE) {
- Slog.v(TAG, "startSession: autoFillId=" + autoFillId + ", bounds=" + bounds
- + ", value=" + value);
- }
-
synchronized (mLock) {
final AutoFillManagerServiceImpl service = getServiceForUserLocked(userId);
- service.startSessionLocked(activityToken, appCallback, autoFillId, bounds, value);
+ service.startSessionLocked(activityToken, windowToken, appCallback,
+ autoFillId, bounds, value);
}
}
@Override
public void updateSession(IBinder activityToken, AutoFillId id, Rect bounds,
AutoFillValue value, int flags, int userId) {
- if (DEBUG) {
- Slog.d(TAG, "updateSession: flags=" + flags + ", autoFillId=" + id
- + ", bounds=" + bounds + ", value=" + value);
- }
-
synchronized (mLock) {
final AutoFillManagerServiceImpl service = mServicesCache.get(
UserHandle.getCallingUserId());
@@ -305,8 +300,6 @@
@Override
public void finishSession(IBinder activityToken, int userId) {
- if (VERBOSE) Slog.v(TAG, "finishSession(): " + activityToken);
-
synchronized (mLock) {
final AutoFillManagerServiceImpl service = mServicesCache.get(
UserHandle.getCallingUserId());
diff --git a/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java
index 85bf5c2..bfc6e83 100644
--- a/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java
@@ -56,6 +56,7 @@
import android.service.autofill.Dataset;
import android.service.autofill.FillResponse;
import android.service.autofill.IAutoFillService;
+import android.service.autofill.SaveInfo;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -70,6 +71,7 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.HandlerCaller;
import com.android.internal.os.IResultReceiver;
+import com.android.server.autofill.ui.AutoFillUI;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -103,7 +105,7 @@
handleSessionSave((IBinder) msg.obj);
break;
default:
- Slog.d(TAG, "invalid msg: " + msg);
+ Slog.w(TAG, "invalid msg on handler: " + msg);
}
};
@@ -127,17 +129,18 @@
private final IResultReceiver mAssistReceiver = new IResultReceiver.Stub() {
@Override
public void send(int resultCode, Bundle resultData) throws RemoteException {
- if (DEBUG) Slog.d(TAG, "resultCode on mAssistReceiver: " + resultCode);
+ if (VERBOSE) {
+ Slog.v(TAG, "resultCode on mAssistReceiver: " + resultCode);
+ }
final AssistStructure structure = resultData.getParcelable(KEY_STRUCTURE);
if (structure == null) {
- Slog.w(TAG, "no assist structure for id " + resultCode);
+ Slog.wtf(TAG, "no assist structure for id " + resultCode);
return;
}
final Bundle receiverExtras = resultData.getBundle(KEY_RECEIVER_EXTRAS);
if (receiverExtras == null) {
- // Should not happen
Slog.wtf(TAG, "No " + KEY_RECEIVER_EXTRAS + " on receiver");
return;
}
@@ -194,7 +197,7 @@
final ApplicationInfo info = pm.getApplicationInfo(packageName, 0);
return pm.getApplicationLabel(info);
} catch (Exception e) {
- Slog.w(TAG, "Could not get label for " + packageName + ": " + e);
+ Slog.e(TAG, "Could not get label for " + packageName + ": " + e);
return packageName;
}
}
@@ -210,7 +213,7 @@
serviceInfo = AppGlobals.getPackageManager().getServiceInfo(serviceComponent,
0, mUserId);
} catch (RuntimeException | RemoteException e) {
- Slog.e(TAG, "Bad auto-fill service name " + componentName, e);
+ Slog.e(TAG, "Bad auto-fill service name " + componentName + ": " + e);
return;
}
}
@@ -234,7 +237,7 @@
sendStateToClients();
}
} catch (PackageManager.NameNotFoundException e) {
- Slog.e(TAG, "Bad auto-fill service name " + componentName, e);
+ Slog.e(TAG, "Bad auto-fill service name " + componentName + ": " + e);
}
}
@@ -272,15 +275,15 @@
}
}
- void startSessionLocked(IBinder activityToken, IBinder appCallbackToken, AutoFillId autoFillId,
- Rect bounds, AutoFillValue value) {
+ void startSessionLocked(IBinder activityToken, IBinder windowToken, IBinder appCallbackToken,
+ AutoFillId autoFillId, Rect bounds, AutoFillValue value) {
if (!hasService()) {
return;
}
- final String historyItem = "s=" + new ComponentName(mInfo.getServiceInfo().packageName,
- mInfo.getServiceInfo().name) + " u=" + mUserId + " a=" + activityToken
- + " i=" + autoFillId + " b=" + bounds + " v=" + value;
+ final String historyItem = "s=" + mInfo.getServiceInfo().packageName
+ + " u=" + mUserId + " a=" + activityToken
+ + " i=" + autoFillId + " b=" + bounds;
mRequestsHistory.log(historyItem);
// TODO(b/33197203): Handle partitioning
@@ -290,7 +293,8 @@
return;
}
- final Session newSession = createSessionByTokenLocked(activityToken, appCallbackToken);
+ final Session newSession = createSessionByTokenLocked(activityToken,
+ windowToken, appCallbackToken);
newSession.updateLocked(autoFillId, bounds, value, FLAG_START_SESSION);
}
@@ -308,8 +312,10 @@
session.showSaveLocked();
}
- private Session createSessionByTokenLocked(IBinder activityToken, IBinder appCallbackToken) {
- final Session newSession = new Session(mContext, activityToken, appCallbackToken);
+ private Session createSessionByTokenLocked(IBinder activityToken, IBinder windowToken,
+ IBinder appCallbackToken) {
+ final Session newSession = new Session(mContext, activityToken,
+ windowToken, appCallbackToken);
mSessions.put(activityToken, newSession);
/*
@@ -327,8 +333,6 @@
try {
if (!ActivityManager.getService().requestAutoFillData(mAssistReceiver,
receiverExtras, activityToken)) {
- // TODO(b/33197203): might need a way to warn user (perhaps a new method on
- // AutoFillService).
Slog.w(TAG, "failed to request auto-fill data for " + activityToken);
}
} finally {
@@ -345,7 +349,9 @@
// TODO(b/33197203): add MetricsLogger call
final Session session = mSessions.get(activityToken);
if (session == null) {
- Slog.w(TAG, "updateSessionLocked(): session gone for " + activityToken);
+ if (VERBOSE) {
+ Slog.v(TAG, "updateSessionLocked(): session gone for " + activityToken);
+ }
return;
}
@@ -365,7 +371,9 @@
}
void destroyLocked() {
- if (VERBOSE) Slog.v(TAG, "destroyLocked()");
+ if (VERBOSE) {
+ Slog.v(TAG, "destroyLocked()");
+ }
for (Session session : mSessions.values()) {
session.destroyLocked();
@@ -376,7 +384,7 @@
void dumpLocked(String prefix, PrintWriter pw) {
final String prefix2 = prefix + " ";
- pw.print(prefix); pw.println("Component:"); pw.println(mInfo != null
+ pw.print(prefix); pw.print("Component:"); pw.println(mInfo != null
? mInfo.getServiceInfo().getComponentName() : null);
if (VERBOSE) {
@@ -451,7 +459,7 @@
* Called when the fill UI is ready to be shown for this view.
*/
void onFillReady(ViewState viewState, FillResponse fillResponse, Rect bounds,
- @Nullable AutoFillValue value);
+ AutoFillId focusedId, @Nullable AutoFillValue value);
}
final AutoFillId mId;
@@ -509,19 +517,19 @@
}
/**
- * Calls {@link Listener#onFillReady(ViewState, FillResponse, Rect, AutoFillValue)} if the
+ * Calls {@link
+ * Listener#onFillReady(ViewState, FillResponse, Rect, AutoFillId, AutoFillValue)} if the
* fill UI is ready to be displayed (i.e. when response and bounds are set).
*/
void maybeCallOnFillReady() {
- if (mResponse != null && mBounds != null) {
- mListener.onFillReady(this, mResponse, mBounds, mAutoFillValue);
+ if (mResponse != null && (mResponse.getAuthentication() != null
+ || mResponse.getDatasets() != null) && mBounds != null) {
+ mListener.onFillReady(this, mResponse, mBounds, mId, mAutoFillValue);
}
}
@Override
public String toString() {
- if (!DEBUG) return super.toString();
-
return "ViewState: [id=" + mId + ", value=" + mAutoFillValue + ", bounds=" + mBounds
+ ", updated = " + mValueUpdated + "]";
}
@@ -554,6 +562,7 @@
final class Session implements RemoteFillService.FillServiceCallbacks, ViewState.Listener,
AutoFillUI.AutoFillUiCallback {
private final IBinder mActivityToken;
+ private final IBinder mWindowToken;
@GuardedBy("mLock")
private final Map<AutoFillId, ViewState> mViewStates = new ArrayMap<>();
@@ -585,15 +594,19 @@
@GuardedBy("mLock")
private AssistStructure mStructure;
- private Session(Context context, IBinder activityToken, IBinder client) {
+ private Session(Context context, IBinder activityToken, IBinder windowToken,
+ IBinder client) {
mRemoteFillService = new RemoteFillService(context,
mInfo.getServiceInfo().getComponentName(), mUserId, this);
mActivityToken = activityToken;
+ mWindowToken = windowToken;
mClient = IAutoFillManagerClient.Stub.asInterface(client);
try {
client.linkToDeath(() -> {
- if (DEBUG) Slog.d(TAG, "app binder died");
+ if (DEBUG) {
+ Slog.d(TAG, "app binder died");
+ }
removeSelf();
}, 0);
@@ -641,8 +654,14 @@
// FillServiceCallbacks
@Override
- public void authenticate(IntentSender intent, Intent fillInIntent) {
- startAuthentication(intent, fillInIntent);
+ public void authenticate(IntentSender intent) {
+ final Intent fillInIntent;
+ synchronized (mLock) {
+ fillInIntent = createAuthFillInIntent(mStructure);
+ }
+ mHandlerCaller.getHandler().post(() -> {
+ startAuthentication(intent, fillInIntent);
+ });
}
// FillServiceCallbacks
@@ -654,7 +673,9 @@
// AutoFillUiCallback
@Override
public void fill(Dataset dataset) {
- autoFill(dataset);
+ mHandlerCaller.getHandler().post(() -> {
+ autoFill(dataset);
+ });
}
// AutoFillUiCallback
@@ -675,15 +696,10 @@
processResponseLocked(mCurrentResponse);
} else if (result instanceof Dataset) {
Dataset dataset = (Dataset) result;
- final int datasetIndex = Helper.indexOfDataset(
- dataset.getName(), mCurrentResponse);
- if (datasetIndex <= 0) {
- Slog.e(TAG, "Response for a dataset auth has"
- + " an invalid dataset result: " + dataset.getName());
- }
- mCurrentResponse.getDatasets().removeAt(datasetIndex);
+ mCurrentResponse.getDatasets().remove(mAutoFilledDataset);
mCurrentResponse.getDatasets().add(dataset);
- autoFill(dataset);
+ mAutoFilledDataset = dataset;
+ processResponseLocked(mCurrentResponse);
}
}
}
@@ -693,26 +709,30 @@
*/
public void showSaveLocked() {
if (mStructure == null) {
- // Sanity check; should not happen...
Slog.wtf(TAG, "showSaveLocked(): no mStructure");
return;
}
if (mCurrentResponse == null) {
- // Happens when the activity / session was finished before the service replied.
- Slog.d(TAG, "showSaveLocked(): no mCurrentResponse yet");
+ // Happens when the activity / session was finished before the service replied, or
+ // when the service cannot auto-fill it (and returned a null response).
+ if (DEBUG) {
+ Slog.d(TAG, "showSaveLocked(): no mCurrentResponse");
+ }
return;
}
- final ArraySet<AutoFillId> savableIds = mCurrentResponse.getSavableIds();
- if (VERBOSE) Slog.v(TAG, "showSaveLocked(): savableIds=" + savableIds);
+ final SaveInfo saveInfo = mCurrentResponse.getSaveInfo();
+ if (DEBUG) {
+ Slog.d(TAG, "showSaveLocked(): saveInfo=" + saveInfo);
+ }
- if (savableIds.isEmpty()) {
- if (DEBUG) Slog.d(TAG, "showSaveLocked(): service doesn't want to save");
+ if (saveInfo == null || saveInfo.getSavableIds() == null
+ || saveInfo.getSavableIds().isEmpty()) {
return;
}
- final int size = savableIds.size();
+ final int size = saveInfo.getSavableIds().size();
for (int i = 0; i < size; i++) {
- final AutoFillId id = savableIds.valueAt(i);
+ final AutoFillId id = saveInfo.getSavableIds().valueAt(i);
final ViewState state = mViewStates.get(id);
if (state != null && state.mValueUpdated) {
final AutoFillValue filledValue = findValue(mAutoFilledDataset, id);
@@ -723,48 +743,35 @@
Slog.d(TAG, "finishSessionLocked(): found a change on " + id + ": "
+ state.mAutoFillValue);
}
- mUi.showSaveUi();
+ getUiForShowing().showSaveUi(
+ mInfo.getServiceInfo().loadLabel(mContext.getPackageManager()),
+ saveInfo);
return;
}
}
+
// Nothing changed...
- if (DEBUG) Slog.d(TAG, "showSaveLocked(): with no changes, comes no responsibilities");
+ if (DEBUG) {
+ Slog.d(TAG, "showSaveLocked(): with no changes, comes no responsibilities");
+ }
}
/**
* Calls service when user requested save.
*/
private void callSaveLocked() {
- if (DEBUG) Slog.d(TAG, "callSaveLocked(): mViewStates=" + mViewStates);
+ if (DEBUG) {
+ Slog.d(TAG, "callSaveLocked(): mViewStates=" + mViewStates);
+ }
- // TODO(b/33197203): hookup extras and make sure they're tested by CTS
- final Bundle extras = null;
-// // TODO(b/33197203): make sure the extras are tested by CTS
-// final Bundle responseExtras = mCurrentResponse == null ? null
-// : mCurrentResponse.getExtras();
-// final Bundle datasetExtras = mAutoFilledDataset == null ? null
-// : mAutoFilledDataset.getExtras();
-// final Bundle extras = (responseExtras == null && datasetExtras == null)
-// ? null : new Bundle();
-// if (responseExtras != null) {
-// if (DEBUG) {
-// Slog.d(TAG, "response extras on save extras: "
-// + bundleToString(responseExtras));
-// }
-// extras.putBundle(AutoFillService.EXTRA_RESPONSE_EXTRAS, responseExtras);
-// }
-// if (datasetExtras != null) {
-// if (DEBUG) {
-// Slog.d(TAG, "dataset extras on save extras: " + bundleToString(datasetExtras));
-// }
-// extras.putBundle(AutoFillService.EXTRA_DATASET_EXTRAS, datasetExtras);
-// }
-
+ final Bundle extras = this.mCurrentResponse.getExtras();
for (Entry<AutoFillId, ViewState> entry : mViewStates.entrySet()) {
final AutoFillValue value = entry.getValue().mAutoFillValue;
if (value == null) {
- if (VERBOSE) Slog.v(TAG, "callSaveLocked(): skipping " + entry.getKey());
+ if (VERBOSE) {
+ Slog.v(TAG, "callSaveLocked(): skipping " + entry.getKey());
+ }
continue;
}
final AutoFillId id = entry.getKey();
@@ -773,7 +780,9 @@
Slog.w(TAG, "callSaveLocked(): did not find node with id " + id);
continue;
}
- if (DEBUG) Slog.d(TAG, "callSaveLocked(): updating " + id + " to " + value);
+ if (VERBOSE) {
+ Slog.v(TAG, "callSaveLocked(): updating " + id + " to " + value);
+ }
node.updateAutoFillValue(value);
}
@@ -789,11 +798,9 @@
}
void updateLocked(AutoFillId id, Rect bounds, AutoFillValue value, int flags) {
- if (DEBUG) Slog.d(TAG, "updateLocked(): id=" + id + ", flags=" + flags);
-
if (mAutoFilledDataset != null && (flags & FLAG_VALUE_CHANGED) == 0) {
// TODO(b/33197203): ignoring because we don't support partitions yet
- if (DEBUG) Slog.d(TAG, "updateLocked(): ignoring " + flags + " after auto-filled");
+ Slog.d(TAG, "updateLocked(): ignoring " + flags + " after app was auto-filled");
return;
}
@@ -810,22 +817,27 @@
return;
}
- if ((flags & FLAG_VALUE_CHANGED) != 0 && value != null &&
- !value.equals(viewState.mAutoFillValue)) {
- viewState.mValueUpdated = true;
+ if ((flags & FLAG_VALUE_CHANGED) != 0) {
+ if (value != null && !value.equals(viewState.mAutoFillValue)) {
+ viewState.mValueUpdated = true;
- // Must check if this update was caused by auto-filling the view, in which
- // case we just update the value, but not the UI.
- if (mAutoFilledDataset != null) {
- final AutoFillValue filledValue = findValue(mAutoFilledDataset, id);
- if (value.equals(filledValue)) {
- viewState.mAutoFillValue = value;
- return;
+ // Must check if this update was caused by auto-filling the view, in which
+ // case we just update the value, but not the UI.
+ if (mAutoFilledDataset != null) {
+ final AutoFillValue filledValue = findValue(mAutoFilledDataset, id);
+ if (value.equals(filledValue)) {
+ viewState.mAutoFillValue = value;
+ return;
+ }
}
+
+ // Change value
+ viewState.mAutoFillValue = value;
+
+ // Update the chooser UI
+ getUiForShowing().filterFillUi(value.coerceToString());
}
- // Just change value, don't update the UI
- viewState.mAutoFillValue = value;
return;
}
@@ -855,12 +867,12 @@
return;
}
- Slog.w(TAG, "unknown flags " + flags);
+ Slog.w(TAG, "updateLocked(): unknown flags " + flags);
}
@Override
public void onFillReady(ViewState viewState, FillResponse response, Rect bounds,
- @Nullable AutoFillValue value) {
+ AutoFillId filledId, @Nullable AutoFillValue value) {
String filterText = "";
if (value != null) {
// TODO(b/33197203): Handle other AutoFillValue types
@@ -870,13 +882,14 @@
}
}
- getUiForShowing().showFillUi(mActivityToken, viewState, response.getDatasets(),
- bounds, filterText);
+ getUiForShowing().showFillUi(filledId, response, bounds, filterText);
}
private void processResponseLocked(FillResponse response) {
- if (DEBUG) Slog.d(TAG, "processResponseLocked(authRequired="
- + response.getAuthentication() + "):" + response);
+ if (DEBUG) {
+ Slog.d(TAG, "processResponseLocked(auth=" + response.getAuthentication()
+ + "):" + response);
+ }
// TODO(b/33197203): add MetricsLogger calls
@@ -891,26 +904,17 @@
if (mCurrentResponse.getAuthentication() != null) {
// Handle authentication.
final Intent fillInIntent = createAuthFillInIntent(mStructure);
-
mCurrentViewState.setResponse(mCurrentResponse, fillInIntent);
return;
}
- final ArraySet<AutoFillId> savableIds = mCurrentResponse.getSavableIds();
- if (savableIds == null || savableIds.isEmpty()) {
- // NOTE: it's assuming the response has no datasets, since when a dataset is added
- // it's view id is automatically added to savable_ids
- if (DEBUG) Slog.d(TAG, "processResponseLocked(): nothing to do");
-
- removeSelf();
- return;
- }
-
mCurrentViewState.setResponse(mCurrentResponse);
}
void autoFill(Dataset dataset) {
synchronized (mLock) {
+ mAutoFilledDataset = dataset;
+
// Autofill it directly...
if (dataset.getAuthentication() == null) {
autoFillApp(dataset);
@@ -969,10 +973,10 @@
void autoFillApp(Dataset dataset) {
synchronized (mLock) {
try {
- if (DEBUG) Slog.d(TAG, "autoFillApp(): the buck is on the app: " + dataset);
-
+ if (DEBUG) {
+ Slog.d(TAG, "autoFillApp(): the buck is on the app: " + dataset);
+ }
mClient.autoFill(dataset.getFieldIds(), dataset.getFieldValues());
- mAutoFilledDataset = dataset;
} catch (RemoteException e) {
Slog.w(TAG, "Error auto-filling activity: " + e);
}
@@ -981,7 +985,7 @@
private AutoFillUI getUiForShowing() {
synchronized (mLock) {
- mUi.setCallbackLocked(this, mActivityToken);
+ mUi.setCallback(this, mWindowToken);
return mUi;
}
}
@@ -1021,12 +1025,13 @@
private void destroyLocked() {
mRemoteFillService.destroy();
- mUi.hideAll();
- mUi.setCallbackLocked(null, null);
+ mUi.setCallback(null, null);
}
private void removeSelf() {
- if (VERBOSE) Slog.v(TAG, "removeSelf()");
+ if (VERBOSE) {
+ Slog.v(TAG, "removeSelf()");
+ }
synchronized (mLock) {
destroyLocked();
diff --git a/services/autofill/java/com/android/server/autofill/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/AutoFillUI.java
deleted file mode 100644
index e83dc1e..0000000
--- a/services/autofill/java/com/android/server/autofill/AutoFillUI.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * 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.
- */
-package com.android.server.autofill;
-
-import static com.android.server.autofill.Helper.DEBUG;
-
-import android.annotation.Nullable;
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.app.StatusBarManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.IntentSender;
-import android.graphics.Rect;
-import android.os.Binder;
-import android.os.IBinder;
-import android.service.autofill.Dataset;
-import android.util.ArraySet;
-import android.os.Looper;
-import android.text.format.DateUtils;
-import android.util.Slog;
-import android.view.Gravity;
-import android.view.View;
-import android.view.WindowManager;
-import android.view.WindowManager.LayoutParams;
-import android.widget.Toast;
-
-import com.android.internal.os.HandlerCaller;
-import com.android.server.UiThread;
-import com.android.server.autofill.AutoFillManagerServiceImpl.ViewState;
-
-import java.io.PrintWriter;
-
-/**
- * Handles all auto-fill related UI tasks.
- */
-// TODO(b/33197203): document exactly what once the auto-fill bar is implemented
-final class AutoFillUI {
- private static final String TAG = "AutoFillUI";
- private static final long SNACK_BAR_LIFETIME_MS = 30 * DateUtils.SECOND_IN_MILLIS;
- private static final int MSG_HIDE_SNACK_BAR = 1;
-
- private final Context mContext;
- private final WindowManager mWm;
-
- // TODO(b/33197203) Fix locking - some state requires lock and some not - requires refactoring
- private final Object mLock = new Object();
-
- // Fill UI variables
- private AnchoredWindow mFillWindow;
- private View mFillView;
- private ViewState mViewState;
-
- private AutoFillUiCallback mCallback;
- private IBinder mActivityToken;
-
- private final HandlerCaller.Callback mHandlerCallback = (msg) -> {
- switch (msg.what) {
- case MSG_HIDE_SNACK_BAR: {
- hideSnackbarUiThread();
- return;
- }
- default: {
- Slog.w(TAG, "Invalid message: " + msg);
- }
- }
- };
- private final HandlerCaller mHandlerCaller = new HandlerCaller(null, Looper.getMainLooper(),
- mHandlerCallback, true);
-
- /**
- * Custom snackbar UI used for saving autofill or other informational messages.
- */
- private View mSnackbar;
-
- AutoFillUI(Context context) {
- mContext = context;
- mWm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
- }
-
- void setCallbackLocked(AutoFillUiCallback callback, IBinder activityToken) {
- hideAll();
- mCallback = callback;
- mActivityToken = activityToken;
- }
-
- /**
- * Displays an error message to the user.
- */
- void showError(CharSequence message) {
- if (!hasCallback()) {
- return;
- }
- hideAll();
- // TODO(b/33197203): proper implementation
- UiThread.getHandler().runWithScissors(() -> {
- Toast.makeText(mContext, "AutoFill error: " + message, Toast.LENGTH_LONG).show();
- }, 0);
- }
-
- /**
- * Hides the fill UI.
- */
- void hideFillUi() {
- UiThread.getHandler().runWithScissors(() -> {
- hideFillUiUiThread();
- }, 0);
- }
-
- @android.annotation.UiThread
- private void hideFillUiUiThread() {
- if (mFillWindow != null) {
- if (DEBUG) Slog.d(TAG, "hideFillUiUiThread(): hide" + mFillWindow);
- mFillWindow.hide();
- }
-
- mViewState = null;
- mFillView = null;
- mFillWindow = null;
- }
-
- /**
- * Shows the fill UI, removing the previous fill UI if the has changed.
- *
- * @param appToken the token of the app to be autofilled
- * @param viewState the view state, compared by reference to know if new UI should be shown
- * @param datasets the datasets to show, not used if viewState is the same
- * @param bounds bounds of the view to be filled, used if changed
- * @param filterText text of the view to be filled, used if changed
- */
- void showFillUi(IBinder appToken, ViewState viewState, @Nullable ArraySet<Dataset> datasets,
- Rect bounds, String filterText) {
- if (!hasCallback()) {
- return;
- }
-
- UiThread.getHandler().runWithScissors(() -> {
- hideSnackbarUiThread();
- }, 0);
-
- if (datasets == null && viewState.mAuthIntent == null) {
- // TODO(b/33197203): shouldn't be called, but keeping the WTF for a while just to be
- // safe, otherwise it would crash system server...
- Slog.wtf(TAG, "showFillUI(): no dataset");
- return;
- }
-
- // TODO(b/33197203): should not display UI after we launched an authentication intent, since
- // we have no warranty the provider will call onFailure() if the authentication failed or
- // user dismissed the auth window
- // because if the service does not handle calling the callback,
-
-
- UiThread.getHandler().runWithScissors(() -> {
- // The dataset picker is only shown when authentication is not required...
- DatasetPicker datasetPicker = null;
-
- if (mViewState == null || !mViewState.mId.equals(viewState.mId)) {
- hideFillUiUiThread();
-
- mViewState = viewState;
- if (viewState.mAuthIntent != null) {
- final CharSequence serviceName = viewState.getServiceName();
-
- mFillView = new SignInPrompt(mContext, serviceName, (e) -> {
- final IntentSender intentSender = viewState.mResponse.getAuthentication();
- final AutoFillUiCallback callback;
- final Intent authIntent;
- synchronized (mLock) {
- callback = mCallback;
- authIntent = viewState.mAuthIntent;
- // Must reset the authentication intent so UI display the datasets after
- // the user authenticated.
- viewState.mAuthIntent = null;
- }
- if (callback != null) {
- callback.authenticate(intentSender, authIntent);
- } else {
- // TODO(b/33197203): need to figure out why it's null sometimes
- Slog.w(TAG, "no callback on showFillUi().auth for " + viewState.mId);
- }
- });
-
- } else {
- mFillView = datasetPicker = new DatasetPicker(mContext, datasets,
- (dataset) -> {
- final AutoFillUiCallback callback;
- synchronized (mLock) {
- callback = mCallback;
- }
- if (callback != null) {
- callback.fill(dataset);
- } else {
- // TODO(b/33197203): need to figure out why it's null sometimes
- Slog.w(TAG, "no callback on showFillUi() for " + viewState.mId);
- }
- hideFillUiUiThread();
- });
- }
- mFillWindow = new AnchoredWindow(mWm, appToken, mFillView);
-
- if (DEBUG) Slog.d(TAG, "showFillUi(): view changed for: " + viewState.mId);
- }
- if (datasetPicker != null) {
- datasetPicker.update(filterText);
- }
- mFillWindow.show(bounds);
-
- }, 0);
- }
-
- /**
- * Shows the UI asking the user to save for auto-fill.
- */
- void showSaveUi() {
- if (!hasCallback()) {
- return;
- }
- hideAll();
- UiThread.getHandler().runWithScissors(() -> {
- showSnackbarUiThread(new SavePrompt(mContext,
- new SavePrompt.OnSaveListener() {
- @Override
- public void onSaveClick() {
- hideSnackbarUiThread();
- // TODO(b/33197203): add MetricsLogger call
- mCallback.save();
- }
-
- @Override
- public void onCancelClick() {
- // TODO(b/33197203): add MetricsLogger call
- hideSnackbarUiThread();
- }
- }));
- }, 0);
- }
-
- /**
- * Hides all UI affordances.
- */
- void hideAll() {
- UiThread.getHandler().runWithScissors(() -> {
- hideSnackbarUiThread();
- hideFillUiUiThread();
- }, 0);
- }
-
- void dump(PrintWriter pw) {
- pw.println("AufoFill UI");
- final String prefix = " ";
- pw.print(prefix); pw.print("mActivityToken: "); pw.println(mActivityToken);
- pw.print(prefix); pw.print("mSnackBar: "); pw.println(mSnackbar);
- pw.print(prefix); pw.print("mViewState: "); pw.println(mViewState);
- }
-
- //similar to a snackbar, but can be a bit custom since it is more than just text. This will
- //allow two buttons for saving or not saving the autofill for instance as well.
- private void showSnackbarUiThread(View snackBar) {
- final LayoutParams params = new LayoutParams();
- params.setTitle("AutoFill Save");
- params.type = LayoutParams.TYPE_PHONE; // TODO(b/33197203) use app window token
- params.flags =
- LayoutParams.FLAG_NOT_FOCUSABLE // don't receive input events,
- | LayoutParams.FLAG_ALT_FOCUSABLE_IM // resize for soft input
- | LayoutParams.FLAG_NOT_TOUCH_MODAL; // outside touches go to windows behind us
- params.softInputMode =
- LayoutParams.SOFT_INPUT_ADJUST_PAN; // pan with soft input
- params.gravity = Gravity.BOTTOM | Gravity.START;
- params.width = LayoutParams.MATCH_PARENT;
- params.height = LayoutParams.WRAP_CONTENT;
-
- UiThread.getHandler().runWithScissors(() -> {
- mSnackbar = snackBar;
- mWm.addView(mSnackbar, params);
- }, 0);
-
- if (DEBUG) {
- Slog.d(TAG, "showSnackbar(): auto dismissing it in " + SNACK_BAR_LIFETIME_MS + " ms");
- }
- mHandlerCaller.sendMessageDelayed(mHandlerCaller.obtainMessage(MSG_HIDE_SNACK_BAR),
- SNACK_BAR_LIFETIME_MS);
- }
-
- private void hideSnackbarUiThread() {
- mHandlerCaller.getHandler().removeMessages(MSG_HIDE_SNACK_BAR);
- if (mSnackbar != null) {
- mWm.removeView(mSnackbar);
- mSnackbar = null;
- }
- }
-
- private boolean hasCallback() {
- synchronized (mLock) {
- return mCallback != null;
- }
- }
-
- interface AutoFillUiCallback {
- void authenticate(IntentSender intent, Intent fillInIntent);
- void fill(Dataset dataset);
- void save();
- }
-}
diff --git a/services/autofill/java/com/android/server/autofill/DatasetPicker.java b/services/autofill/java/com/android/server/autofill/DatasetPicker.java
deleted file mode 100644
index a54cab9..0000000
--- a/services/autofill/java/com/android/server/autofill/DatasetPicker.java
+++ /dev/null
@@ -1,119 +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.autofill;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.service.autofill.Dataset;
-import android.text.TextUtils;
-import android.util.ArraySet;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ArrayAdapter;
-import android.widget.Filter.FilterListener;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * View for dataset picker.
- *
- * <p>A fill session starts when a View is clicked and FillResponse is supplied.
- * <p>A fill session ends when 1) the user takes action in the UI, 2) another View is clicked, or
- * 3) the View is detached.
- */
-final class DatasetPicker extends ListView implements OnItemClickListener {
- interface Listener {
- void onDatasetPicked(Dataset dataset);
- }
-
- private final Listener mListener;
-
- DatasetPicker(Context context, ArraySet<Dataset> datasets, Listener listener) {
- super(context);
- mListener = listener;
-
- final List<ViewItem> items = new ArrayList<>(datasets.size());
- for (Dataset dataset : datasets) {
- items.add(new ViewItem(dataset));
- }
-
- final ArrayAdapter<ViewItem> adapter = new ArrayAdapter<ViewItem>(
- context,
- android.R.layout.simple_list_item_1,
- android.R.id.text1,
- items) {
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- final TextView textView = (TextView) super.getView(position, convertView, parent);
- textView.setSingleLine();
- textView.setEllipsize(TextUtils.TruncateAt.END);
- textView.setMinHeight(
- getDimen(com.android.internal.R.dimen.autofill_fill_item_height));
- return textView;
- }
- };
- setAdapter(adapter);
- setBackgroundColor(Color.WHITE);
- setDivider(null);
- setElevation(getDimen(com.android.internal.R.dimen.autofill_fill_elevation));
- setOnItemClickListener(this);
- }
-
- public void update(String prefix) {
- final ArrayAdapter<ViewItem> adapter = (ArrayAdapter) getAdapter();
- adapter.getFilter().filter(prefix, new FilterListener() {
- @Override
- public void onFilterComplete(int count) {
- setVisibility(count > 0 ? View.VISIBLE : View.GONE);
- }
- });
- }
-
- @Override
- public void onItemClick(AdapterView<?> adapterView, View view, int pos, long id) {
- if (mListener != null) {
- final ViewItem vi = (ViewItem) adapterView.getItemAtPosition(pos);
- mListener.onDatasetPicked(vi.getData());
- }
- }
-
- private int getDimen(int resId) {
- return getContext().getResources().getDimensionPixelSize(resId);
- }
-
- private static class ViewItem {
- private final Dataset mData;
-
- ViewItem(Dataset data) {
- mData = data;
- }
-
- public Dataset getData() {
- return mData;
- }
-
- @Override
- public String toString() {
- // used by ArrayAdapter
- return mData.getName().toString();
- }
- }
-}
diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java
index 48ae635..2f600c2 100644
--- a/services/autofill/java/com/android/server/autofill/Helper.java
+++ b/services/autofill/java/com/android/server/autofill/Helper.java
@@ -19,8 +19,6 @@
import android.annotation.Nullable;
import android.os.Bundle;
import android.service.autofill.Dataset;
-import android.service.autofill.FillResponse;
-import android.util.ArraySet;
import android.view.autofill.AutoFillId;
import android.view.autofill.AutoFillValue;
@@ -77,28 +75,6 @@
return null;
}
- /**
- * Finds the index of a data set given its name.
- *
- * @param name The dataset name.
- * @param response The response to search.
- * @return The index of dataset if found or -1.
- */
- static int indexOfDataset(CharSequence name, FillResponse response) {
- ArraySet<Dataset> datasets = response.getDatasets();
- if (datasets == null || datasets.isEmpty()) {
- return -1;
- }
- final int datasetCount = datasets.size();
- for (int i = 0; i < datasetCount; i++) {
- Dataset dataset = datasets.valueAt(i);
- if (dataset.getName().toString().equals(name.toString())) {
- return i;
- }
- }
- return -1;
- }
-
private Helper() {
throw new UnsupportedOperationException("contains static members only");
}
diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
index 767fb46..c469718 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
@@ -191,7 +191,7 @@
ensureBound();
} else {
if (DEBUG) {
- Slog.d(LOG_TAG, "[user: " + mUserId + "] handleOnFillRequest()");
+ Slog.d(LOG_TAG, "[user: " + mUserId + "] handlePendingRequest()");
}
pendingRequest.run();
}
@@ -235,8 +235,19 @@
}
mBinding = false;
if (isBound()) {
- mAutoFillService.asBinder().unlinkToDeath(this, 0);
- mAutoFillService = null;
+ // TODO(b/33197203, b/35395043): synchronize access instead
+ // Need to double check if it's null, since it could be set on onServiceDisconnected()
+ if (mAutoFillService != null) {
+ try {
+ mAutoFillService.onDisconnected();
+ } catch (Exception e) {
+ Slog.w(LOG_TAG, "Exception calling onDisconnected(): " + e);
+ }
+ }
+ if (mAutoFillService != null) {
+ mAutoFillService.asBinder().unlinkToDeath(this, 0);
+ mAutoFillService = null;
+ }
}
mContext.unbindService(mServiceConnection);
}
@@ -305,6 +316,18 @@
return;
}
+ try {
+ // TODO(b/33197203, b/35395043): synchronize access instead
+ // Need to double check if it's null, since it could be set on
+ // onServiceDisconnected()
+ if (mAutoFillService != null) {
+ mAutoFillService.onConnected();
+ }
+ } catch (RemoteException e) {
+ Slog.w(LOG_TAG, "Exception calling onConnected(): " + e);
+ }
+
+
if (mPendingRequest != null) {
handlePendingRequest(mPendingRequest);
}
diff --git a/services/autofill/java/com/android/server/autofill/SavePrompt.java b/services/autofill/java/com/android/server/autofill/SavePrompt.java
deleted file mode 100644
index f0b51e2..0000000
--- a/services/autofill/java/com/android/server/autofill/SavePrompt.java
+++ /dev/null
@@ -1,60 +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.autofill;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.widget.RelativeLayout;
-import android.widget.RelativeLayout.LayoutParams;
-import android.widget.TextView;
-import android.view.LayoutInflater;
-import android.view.View;
-
-import com.android.internal.R;
-
-/**
- * Autofill Save Prompt
- */
-final class SavePrompt extends RelativeLayout {
- public interface OnSaveListener {
- void onSaveClick();
- void onCancelClick();
- }
-
- private final TextView mNoButton;
- private final TextView mYesButton;
- private final OnSaveListener mListener;
-
- SavePrompt(Context context, OnSaveListener listener) {
- super(context);
- mListener = listener;
- LayoutInflater inflater = LayoutInflater.from(context);
- View view = inflater.inflate(R.layout.autofill_save, this);
-
- mNoButton = (TextView) view.findViewById(R.id.autofill_save_no);
- mNoButton.setOnClickListener((v) -> {
- mListener.onCancelClick();
- });
-
- mYesButton = (TextView) view.findViewById(R.id.autofill_save_yes);
- mYesButton.setOnClickListener((v) -> {
- mListener.onSaveClick();
- });
-
- //addView(view);
- }
-}
diff --git a/services/autofill/java/com/android/server/autofill/SignInPrompt.java b/services/autofill/java/com/android/server/autofill/SignInPrompt.java
deleted file mode 100644
index 6d17acd..0000000
--- a/services/autofill/java/com/android/server/autofill/SignInPrompt.java
+++ /dev/null
@@ -1,38 +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.autofill;
-
-import android.content.Context;
-import android.view.View;
-import android.widget.Button;
-
-/**
- * A view displaying the sign-in prompt for an auto-fill service.
- */
-final class SignInPrompt extends Button {
-
- SignInPrompt(Context context, CharSequence serviceName, View.OnClickListener listener) {
- super(context);
- // TODO(b/33197203): use strings.xml
- final String text = serviceName != null
- ? "Sign in to " + serviceName + " to autofill"
- : "Sign in to autofill";
-
- // TODO(b/33197203): polish UI / use better altenative than a button...
- setText(text);
- setOnClickListener(listener);
- }
-}
diff --git a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
new file mode 100644
index 0000000..949a80c
--- /dev/null
+++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
@@ -0,0 +1,241 @@
+/*
+ * 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.
+ */
+package com.android.server.autofill.ui;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.IntentSender;
+import android.graphics.Rect;
+import android.os.Handler;
+import android.os.IBinder;
+import android.service.autofill.Dataset;
+import android.service.autofill.FillResponse;
+import android.service.autofill.SaveInfo;
+import android.text.TextUtils;
+import android.view.autofill.AutoFillId;
+import android.widget.Toast;
+
+import com.android.server.UiThread;
+
+import java.io.PrintWriter;
+
+/**
+ * Handles all auto-fill related UI tasks. The UI has two components:
+ * fill UI that shows a popup style window anchored at the focused
+ * input field for choosing a dataset to fill or trigger the response
+ * authentication flow; save UI that shows a toast style window for
+ * managing saving of user edits.
+ */
+public final class AutoFillUI {
+ private final Handler mHandler = UiThread.getHandler();
+ private final @NonNull Context mContext;
+
+ private @Nullable FillUi mFillUi;
+ private @Nullable SaveUi mSaveUi;
+
+ private @Nullable AutoFillUiCallback mCallback;
+ private @Nullable IBinder mWindowToken;
+
+ public interface AutoFillUiCallback {
+ void authenticate(@NonNull IntentSender intent);
+ void fill(@NonNull Dataset dataset);
+ void save();
+ }
+
+ public AutoFillUI(@NonNull Context context) {
+ mContext = context;
+ }
+
+ public void setCallback(@Nullable AutoFillUiCallback callback,
+ @Nullable IBinder windowToken) {
+ mHandler.post(() -> {
+ if (mCallback != callback || mWindowToken != windowToken) {
+ hideAllUiThread();
+ mCallback = callback;
+ mWindowToken = windowToken;
+ }
+ });
+ }
+
+ /**
+ * Displays an error message to the user.
+ */
+ public void showError(@Nullable CharSequence message) {
+ mHandler.post(() -> {
+ if (!hasCallback()) {
+ return;
+ }
+ hideAllUiThread();
+ if (!TextUtils.isEmpty(message)) {
+ Toast.makeText(mContext, message, Toast.LENGTH_LONG).show();
+ }
+ });
+ }
+
+ /**
+ * Hides the fill UI.
+ */
+ public void hideFillUi() {
+ mHandler.post(this::hideFillUiUiThread);
+ }
+
+ /**
+ * Filters the options in the fill UI.
+ *
+ * @param filterText The filter prefix.
+ */
+ public void filterFillUi(@Nullable String filterText) {
+ mHandler.post(() -> {
+ if (!hasCallback()) {
+ return;
+ }
+ hideSaveUiUiThread();
+ if (mFillUi != null) {
+ mFillUi.filter(filterText);
+ }
+ });
+ }
+
+ /**
+ * Updates the position of the fill UI.
+ *
+ * @param anchoredBounds The bounds of the anchor view.
+ */
+ public void updateFillUi(@NonNull Rect anchoredBounds) {
+ mHandler.post(() -> {
+ if (!hasCallback()) {
+ return;
+ }
+ hideSaveUiUiThread();
+ if (mFillUi != null) {
+ mFillUi.update(anchoredBounds);
+ }
+ });
+ }
+
+ /**
+ * Shows the fill UI, removing the previous fill UI if the has changed.
+ *
+ * @param focusedId the currently focused field
+ * @param response the current fill response
+ * @param anchorBounds bounds of the focused view
+ * @param filterText text of the view to be filled
+ */
+ public void showFillUi(@NonNull AutoFillId focusedId, @NonNull FillResponse response,
+ @NonNull Rect anchorBounds, @Nullable String filterText) {
+ mHandler.post(() -> {
+ if (!hasCallback()) {
+ return;
+ }
+ hideAllUiThread();
+ mFillUi = new FillUi(mContext, response, focusedId,
+ mWindowToken, anchorBounds, filterText, new FillUi.Callback() {
+ @Override
+ public void onResponsePicked(FillResponse response) {
+ hideFillUiUiThread();
+ if (mCallback != null) {
+ mCallback.authenticate(response.getAuthentication());
+ }
+ }
+
+ @Override
+ public void onDatasetPicked(Dataset dataset) {
+ hideFillUiUiThread();
+ if (mCallback != null) {
+ mCallback.fill(dataset);
+ }
+ // TODO(b/33197203): add MetricsLogger call
+ }
+
+ @Override
+ public void onCanceled() {
+ hideFillUiUiThread();
+ // TODO(b/33197203): add MetricsLogger call
+ }
+ });
+ });
+ }
+
+ /**
+ * Shows the UI asking the user to save for auto-fill.
+ */
+ public void showSaveUi(@NonNull CharSequence providerLabel, @NonNull SaveInfo info) {
+ mHandler.post(() -> {
+ if (!hasCallback()) {
+ return;
+ }
+ hideAllUiThread();
+ mSaveUi = new SaveUi(mContext, providerLabel, info,
+ new SaveUi.OnSaveListener() {
+ @Override
+ public void onSave() {
+ hideSaveUiUiThread();
+ if (mCallback != null) {
+ mCallback.save();
+ }
+ // TODO(b/33197203): add MetricsLogger call
+ }
+
+ @Override
+ public void onCancel() {
+ // TODO(b/33197203): add MetricsLogger call
+ hideSaveUiUiThread();
+ }
+ });
+ });
+ }
+
+ /**
+ * Hides all UI affordances.
+ */
+ public void hideAll() {
+ mHandler.post(this::hideAllUiThread);
+ }
+
+ public void dump(PrintWriter pw) {
+ pw.println("AufoFill UI");
+ final String prefix = " ";
+ pw.print(prefix); pw.print("showsFillUi: "); pw.println(mFillUi != null);
+ pw.print(prefix); pw.print("showsSaveUi: "); pw.println(mSaveUi != null);
+ }
+
+ @android.annotation.UiThread
+ private void hideFillUiUiThread() {
+ if (mFillUi != null) {
+ mFillUi.destroy();
+ mFillUi = null;
+ }
+ }
+
+ @android.annotation.UiThread
+ private void hideSaveUiUiThread() {
+ if (mSaveUi != null) {
+ mSaveUi.destroy();
+ mSaveUi = null;
+ }
+ }
+
+ @android.annotation.UiThread
+ private void hideAllUiThread() {
+ hideFillUiUiThread();
+ hideSaveUiUiThread();
+ }
+
+ private boolean hasCallback() {
+ return mCallback != null;
+ }
+}
diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
new file mode 100644
index 0000000..0d5fbbe
--- /dev/null
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -0,0 +1,348 @@
+/*
+ * 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.autofill.ui;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.graphics.PixelFormat;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.os.IBinder;
+import android.service.autofill.Dataset;
+import android.service.autofill.FillResponse;
+import android.util.Slog;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.MeasureSpec;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.view.autofill.AutoFillId;
+import android.view.autofill.AutoFillValue;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+import com.android.internal.R;
+import com.android.internal.R;
+import libcore.util.Objects;
+
+import java.util.ArrayList;
+
+final class FillUi {
+ private static final String TAG = "FillUi";
+
+ interface Callback {
+ void onResponsePicked(@NonNull FillResponse response);
+ void onDatasetPicked(@NonNull Dataset dataset);
+ void onCanceled();
+ }
+
+ private final Rect mAnchorBounds = new Rect();
+
+ private final @NonNull AnchoredWindow mWindow;
+
+ private final @NonNull Callback mCallback;
+
+ private final @Nullable ArrayAdapter<ViewItem> mAdapter;
+
+ private @Nullable String mFilterText;
+
+ private int mContentWidth;
+ private int mContentHeight;
+
+ private boolean mDestroyed;
+
+ FillUi(@NonNull Context context, @NonNull FillResponse response,
+ @NonNull AutoFillId focusedViewId, @NonNull IBinder windowToken,
+ @NonNull Rect anchorBounds, @Nullable String filterText,
+ @NonNull Callback callback) {
+ mAnchorBounds.set(anchorBounds);
+ mCallback = callback;
+
+ if (response.getAuthentication() != null) {
+ final View content;
+ try {
+ content = response.getPresentation().apply(context, null);
+ } catch (RuntimeException e) {
+ callback.onCanceled();
+ Slog.e(TAG, "Error inflating remote views", e);
+ mWindow = null;
+ mAdapter = null;
+ return;
+ }
+ final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, 0);
+ final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, 0);
+ content.measure(widthMeasureSpec, heightMeasureSpec);
+ content.setOnClickListener(v -> mCallback.onResponsePicked(response));
+ mContentWidth = content.getMeasuredWidth();
+ mContentHeight = content.getMeasuredHeight();
+ mAdapter = null;
+
+ mWindow = new AnchoredWindow(windowToken, content);
+ mWindow.update(mContentWidth, mContentHeight, mAnchorBounds);
+ } else {
+ final int datasetCount = response.getDatasets().size();
+ 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);
+ if (index >= 0) {
+ AutoFillValue value = dataset.getFieldValues().get(index);
+ final View view;
+ try {
+ view = dataset.getPresentation().apply(context, null);
+ } catch (RuntimeException e) {
+ Slog.e(TAG, "Error inflating remote views", e);
+ continue;
+ }
+ items.add(new ViewItem(dataset, value.coerceToString()
+ .toLowerCase(), view));
+ }
+ }
+
+ mAdapter = new ArrayAdapter<ViewItem>(context, 0, items) {
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ return getItem(position).getView();
+ }
+ };
+
+ final LayoutInflater inflater = LayoutInflater.from(context);
+ final ListView listView = (ListView) inflater.inflate(
+ com.android.internal.R.layout.autofill_dataset_picker, null);
+ listView.setAdapter(mAdapter);
+ listView.setOnItemClickListener((adapter, view, position, id) -> {
+ final ViewItem vi = mAdapter.getItem(position);
+ mCallback.onDatasetPicked(vi.getDataset());
+ });
+
+ filter(filterText);
+ mWindow = new AnchoredWindow(windowToken, listView);
+ }
+ }
+
+ public void update(@NonNull Rect anchorBounds) {
+ throwIfDestroyed();
+ if (!mAnchorBounds.equals(anchorBounds)) {
+ mAnchorBounds.set(anchorBounds);
+ mWindow.update(mContentWidth, mContentHeight, anchorBounds);
+ }
+ }
+
+ public void filter(@Nullable String filterText) {
+ throwIfDestroyed();
+ if (mAdapter == null) {
+ return;
+ }
+ if (Objects.equal(mFilterText, filterText)) {
+ return;
+ }
+ mFilterText = filterText;
+ mAdapter.getFilter().filter(filterText, (count) -> {
+ if (mDestroyed) {
+ return;
+ }
+ if (count <= 0) {
+ mCallback.onCanceled();
+ } else {
+ if (updateContentSize()) {
+ mWindow.update(mContentWidth, mContentHeight, mAnchorBounds);
+ }
+ }
+ });
+ }
+
+ public void destroy() {
+ throwIfDestroyed();
+ mWindow.destroy();
+ mDestroyed = true;
+ }
+
+ private boolean updateContentSize() {
+ if (mAdapter == null) {
+ return false;
+ }
+ boolean changed = false;
+ if (mAdapter.getCount() <= 0) {
+ if (mContentWidth != 0) {
+ mContentWidth = 0;
+ changed = true;
+ }
+ if (mContentHeight != 0) {
+ mContentHeight = 0;
+ changed = true;
+ }
+ return changed;
+ }
+
+ mContentWidth = 0;
+ mContentHeight = 0;
+
+ final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, 0);
+ final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, 0);
+ final int itemCount = mAdapter.getCount();
+ for (int i = 0; i < itemCount; i++) {
+ View view = mAdapter.getItem(i).getView();
+ view.measure(widthMeasureSpec, heightMeasureSpec);
+ final int newContentWidth = Math.max(mContentWidth, view.getMeasuredWidth());
+ if (newContentWidth != mContentWidth) {
+ mContentWidth = newContentWidth;
+ changed = true;
+ }
+ final int newContentHeight = mContentHeight + view.getMeasuredHeight();
+ if (newContentHeight != mContentHeight) {
+ mContentHeight = newContentHeight;
+ changed = true;
+ }
+ }
+ return changed;
+ }
+
+ private void throwIfDestroyed() {
+ if (mDestroyed) {
+ throw new IllegalStateException("cannot interact with a destroyed instance");
+ }
+ }
+
+ private static class ViewItem {
+ private final String mValue;
+ private final Dataset mDataset;
+ private final View mView;
+
+ ViewItem(Dataset dataset, String value, View view) {
+ mDataset = dataset;
+ mValue = value.toLowerCase();
+ mView = view;
+ }
+
+ public View getView() {
+ return mView;
+ }
+
+ public Dataset getDataset() {
+ return mDataset;
+ }
+
+ @Override
+ public String toString() {
+ // Used for filtering in the adapter
+ return mValue;
+ }
+ }
+
+ final class AnchoredWindow implements View.OnTouchListener {
+ private final Point mTempPoint = new Point();
+
+ private final WindowManager mWm;
+
+ private final IBinder mActivityToken;
+ private final View mContentView;
+
+ /**
+ * Constructor.
+ *
+ * @param activityToken token to pass to window manager
+ * @param contentView content of the window
+ */
+ AnchoredWindow(IBinder activityToken, View contentView) {
+ mWm = contentView.getContext().getSystemService(WindowManager.class);
+ mActivityToken = activityToken;
+ mContentView = contentView;
+ }
+
+ /**
+ * Hides the window.
+ */
+ void destroy() {
+ if (mContentView.isAttachedToWindow()) {
+ mContentView.setOnTouchListener(null);
+ mWm.removeView(mContentView);
+ }
+ }
+
+ @Override
+ public boolean onTouch(View view, MotionEvent event) {
+ // When the window is touched outside, hide the window.
+ if (view == mContentView && event.getAction() == MotionEvent.ACTION_OUTSIDE) {
+ mCallback.onCanceled();
+ return true;
+ }
+ return false;
+ }
+
+ public void update(int desiredWidth, int desiredHeight, Rect anchorBounds) {
+ final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
+ params.setTitle("FillUi");
+ params.token = mActivityToken;
+ params.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
+ params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
+ | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
+ params.format = PixelFormat.TRANSLUCENT;
+
+ mWm.getDefaultDisplay().getRealSize(mTempPoint);
+ final int screenWidth = mTempPoint.x;
+ final int screenHeight = mTempPoint.y;
+
+ // Try to place the window at the start of the anchor view if
+ // there is space to fit the content, otherwise fit as much of
+ // the window as possible moving it to the left using all available
+ // screen width.
+ params.x = Math.min(anchorBounds.left, Math.max(screenWidth - desiredWidth, 0));
+ params.width = Math.min(screenWidth, desiredWidth);
+
+ // Try to fit below using all available space with top-start gravity
+ // and if that fails try to fit above using all available space with
+ // bottom-start gravity.
+ final int verticalSpaceBelow = screenHeight - anchorBounds.bottom;
+ if (desiredHeight <= verticalSpaceBelow) {
+ // Fits below bounds.
+ params.height = desiredHeight;
+ params.gravity = Gravity.TOP | Gravity.START;
+ params.y = anchorBounds.bottom;
+ } else {
+ final int verticalSpaceAbove = anchorBounds.top;
+ if (desiredHeight <= verticalSpaceAbove) {
+ // Fits above bounds.
+ params.height = desiredHeight;
+ params.gravity = Gravity.BOTTOM | Gravity.START;
+ params.y = anchorBounds.top + desiredHeight;
+ } else {
+ // Pick above/below based on which has the most space.
+ if (verticalSpaceBelow >= verticalSpaceAbove) {
+ params.height = verticalSpaceBelow;
+ params.gravity = Gravity.TOP | Gravity.START;
+ params.y = anchorBounds.bottom;
+ } else {
+ params.height = verticalSpaceAbove;
+ params.gravity = Gravity.BOTTOM | Gravity.START;
+ params.y = anchorBounds.top + desiredHeight;
+ }
+ }
+ }
+
+ if (!mContentView.isAttachedToWindow()) {
+ mWm.addView(mContentView, params);
+ mContentView.setOnTouchListener(this);
+ } else {
+ mWm.updateViewLayout(mContentView, params);
+ }
+ }
+ }
+}
diff --git a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
new file mode 100644
index 0000000..afe93c7
--- /dev/null
+++ b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
@@ -0,0 +1,130 @@
+/*
+ * 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.autofill.ui;
+
+import android.annotation.NonNull;
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Handler;
+import android.service.autofill.SaveInfo;
+import android.text.format.DateUtils;
+import android.view.Gravity;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.TextView;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import com.android.internal.R;
+import com.android.server.UiThread;
+
+/**
+ * Autofill Save Prompt
+ */
+final class SaveUi {
+ public interface OnSaveListener {
+ void onSave();
+ void onCancel();
+ }
+
+ private static final long LIFETIME_MILLIS = 5 * DateUtils.SECOND_IN_MILLIS;
+
+ private final Handler mHandler = UiThread.getHandler();
+
+ private final @NonNull Dialog mDialog;
+
+ private final @NonNull OnSaveListener mListener;
+
+ private boolean mDestroyed;
+
+ SaveUi(@NonNull Context context, @NonNull CharSequence providerLabel, @NonNull SaveInfo info,
+ @NonNull OnSaveListener listener) {
+ mListener = listener;
+
+ final LayoutInflater inflater = LayoutInflater.from(context);
+ final View view = inflater.inflate(R.layout.autofill_save, null);
+
+ final TextView titleView = (TextView) view.findViewById(R.id.autofill_save_title);
+ final String type;
+
+ switch(info.getType()) {
+ case SaveInfo.SAVE_DATA_TYPE_PASSWORD:
+ type = context.getString(R.string.autofill_save_type_password);
+ break;
+ case SaveInfo.SAVE_DATA_TYPE_ADDRESS:
+ type = context.getString(R.string.autofill_save_type_address);
+ break;
+ case SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD:
+ type = context.getString(R.string.autofill_save_type_credit_card);
+ break;
+ default:
+ type = null;
+ }
+
+ final String title = (type == null)
+ ? context.getString(R.string.autofill_save_title, providerLabel)
+ : context.getString(R.string.autofill_save_title_with_type, type, providerLabel);
+
+ titleView.setText(title);
+ final CharSequence subTitle = info.getDescription();
+ if (subTitle != null) {
+ final TextView subTitleView = (TextView) view.findViewById(R.id.autofill_save_subtitle);
+ subTitleView.setText(subTitle);
+ subTitleView.setVisibility(View.VISIBLE);
+ }
+
+ final View noButton = view.findViewById(R.id.autofill_save_no);
+ noButton.setOnClickListener((v) -> mListener.onCancel());
+
+ final View yesButton = view.findViewById(R.id.autofill_save_yes);
+ yesButton.setOnClickListener((v) -> mListener.onSave());
+
+ final View closeButton = view.findViewById(R.id.autofill_save_close);
+ closeButton.setOnClickListener((v) -> mListener.onCancel());
+
+ mDialog = new Dialog(context, R.style.Theme_Material_Panel);
+ mDialog.setContentView(view);
+
+ final Window window = mDialog.getWindow();
+ window.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
+ window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
+ window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
+ window.setGravity(Gravity.BOTTOM | Gravity.CENTER);
+ window.setCloseOnTouchOutside(true);
+ window.getAttributes().width = WindowManager.LayoutParams.MATCH_PARENT;
+
+ mDialog.show();
+
+ mHandler.postDelayed(() -> mListener.onCancel(), LIFETIME_MILLIS);
+ }
+
+ void destroy() {
+ throwIfDestroyed();
+ mHandler.removeCallbacksAndMessages(mListener);
+ mDialog.dismiss();
+ mDestroyed = true;
+ }
+
+ private void throwIfDestroyed() {
+ if (mDestroyed) {
+ throw new IllegalStateException("cannot interact with a destroyed instance");
+ }
+ }
+}
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index 13e6ae0..4f8b8af 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -16,6 +16,9 @@
package com.android.server.backup;
+import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_VERSION_OF_BACKUP_OLDER;
+import static android.app.backup.BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY;
+import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_OLD_VERSION;
import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND;
import android.app.ActivityManager;
@@ -35,15 +38,15 @@
import android.app.backup.BackupTransport;
import android.app.backup.FullBackup;
import android.app.backup.FullBackupDataOutput;
-import android.app.backup.IBackupObserver;
-import android.app.backup.IBackupManagerMonitor;
-import android.app.backup.RestoreDescription;
-import android.app.backup.RestoreSet;
import android.app.backup.IBackupManager;
+import android.app.backup.IBackupManagerMonitor;
+import android.app.backup.IBackupObserver;
import android.app.backup.IFullBackupRestoreObserver;
import android.app.backup.IRestoreObserver;
import android.app.backup.IRestoreSession;
import android.app.backup.ISelectBackupTransportCallback;
+import android.app.backup.RestoreDescription;
+import android.app.backup.RestoreSet;
import android.app.backup.SelectBackupTransportCallback;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
@@ -133,6 +136,7 @@
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.text.SimpleDateFormat;
+import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -143,6 +147,7 @@
import java.util.List;
import java.util.Map.Entry;
import java.util.Objects;
+import java.util.Queue;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap;
@@ -224,8 +229,7 @@
private static final int MSG_RUN_CLEAR = 4;
private static final int MSG_RUN_INITIALIZE = 5;
private static final int MSG_RUN_GET_RESTORE_SETS = 6;
- private static final int MSG_TIMEOUT = 7;
- private static final int MSG_RESTORE_TIMEOUT = 8;
+ private static final int MSG_RESTORE_SESSION_TIMEOUT = 8;
private static final int MSG_FULL_CONFIRMATION_TIMEOUT = 9;
private static final int MSG_RUN_ADB_RESTORE = 10;
private static final int MSG_RETRY_INIT = 11;
@@ -234,6 +238,8 @@
private static final int MSG_RUN_FULL_TRANSPORT_BACKUP = 14;
private static final int MSG_REQUEST_BACKUP = 15;
private static final int MSG_SCHEDULE_BACKUP_PACKAGE = 16;
+ private static final int MSG_BACKUP_OPERATION_TIMEOUT = 17;
+ private static final int MSG_RESTORE_OPERATION_TIMEOUT = 18;
// backup task state machine tick
static final int MSG_BACKUP_RESTORE_STEP = 20;
@@ -323,6 +329,11 @@
final Object mClearDataLock = new Object();
volatile boolean mClearingData;
+ @GuardedBy("mPendingRestores")
+ private boolean mIsRestoreInProgress;
+ @GuardedBy("mPendingRestores")
+ private final Queue<PerformUnifiedRestoreTask> mPendingRestores = new ArrayDeque<>();
+
ActiveRestoreSession mActiveRestoreSession;
// Watch the device provisioning operation during setup
@@ -599,8 +610,14 @@
static final int OP_ACKNOWLEDGED = 1;
static final int OP_TIMEOUT = -1;
- private static final int OP_TYPE_WAIT = 0; // Waiting for BackupAgent.
- private static final int OP_TYPE_BACKUP = 1; // Backup operation in progress.
+ // Waiting for backup agent to respond during backup operation.
+ private static final int OP_TYPE_BACKUP_WAIT = 0;
+
+ // Waiting for backup agent to respond during restore operation.
+ private static final int OP_TYPE_RESTORE_WAIT = 1;
+
+ // An entire backup operation spanning multiple packages.
+ private static final int OP_TYPE_BACKUP = 2;
class Operation {
int state;
@@ -899,11 +916,28 @@
{
RestoreParams params = (RestoreParams)msg.obj;
Slog.d(TAG, "MSG_RUN_RESTORE observer=" + params.observer);
- BackupRestoreTask task = new PerformUnifiedRestoreTask(params.transport,
+
+ PerformUnifiedRestoreTask task = new PerformUnifiedRestoreTask(params.transport,
params.observer, params.monitor, params.token, params.pkgInfo,
params.pmToken, params.isSystemRestore, params.filterSet);
- Message restoreMsg = obtainMessage(MSG_BACKUP_RESTORE_STEP, task);
- sendMessage(restoreMsg);
+
+ synchronized (mPendingRestores) {
+ if (mIsRestoreInProgress) {
+ if (DEBUG) {
+ Slog.d(TAG, "Restore in progress, queueing.");
+ }
+ mPendingRestores.add(task);
+ // This task will be picked up and executed when the the currently running
+ // restore task finishes.
+ } else {
+ if (DEBUG) {
+ Slog.d(TAG, "Starting restore.");
+ }
+ mIsRestoreInProgress = true;
+ Message restoreMsg = obtainMessage(MSG_BACKUP_RESTORE_STEP, task);
+ sendMessage(restoreMsg);
+ }
+ }
break;
}
@@ -984,22 +1018,23 @@
}
// Done: reset the session timeout clock
- removeMessages(MSG_RESTORE_TIMEOUT);
- sendEmptyMessageDelayed(MSG_RESTORE_TIMEOUT, TIMEOUT_RESTORE_INTERVAL);
+ removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
+ sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT, TIMEOUT_RESTORE_INTERVAL);
mWakelock.release();
}
break;
}
- case MSG_TIMEOUT:
+ case MSG_BACKUP_OPERATION_TIMEOUT:
+ case MSG_RESTORE_OPERATION_TIMEOUT:
{
Slog.d(TAG, "Timeout message received for token=" + Integer.toHexString(msg.arg1));
handleCancel(msg.arg1, false);
break;
}
- case MSG_RESTORE_TIMEOUT:
+ case MSG_RESTORE_SESSION_TIMEOUT:
{
synchronized (BackupManagerService.this) {
if (mActiveRestoreSession != null) {
@@ -2332,7 +2367,7 @@
Slog.e(TAG, "No packages named for backup request");
sendBackupFinished(observer, BackupManager.ERROR_TRANSPORT_ABORTED);
monitor = monitorEvent(monitor, BackupManagerMonitor.LOG_EVENT_ID_NO_PACKAGES,
- null, BackupManagerMonitor.LOG_EVENT_CATEGORY_TRANSPORT);
+ null, BackupManagerMonitor.LOG_EVENT_CATEGORY_TRANSPORT, null);
throw new IllegalArgumentException("No packages are provided for backup");
}
@@ -2400,14 +2435,19 @@
}
final long oldToken = Binder.clearCallingIdentity();
try {
+ List<Integer> operationsToCancel = new ArrayList<>();
synchronized (mCurrentOpLock) {
for (int i = 0; i < mCurrentOperations.size(); i++) {
Operation op = mCurrentOperations.valueAt(i);
int token = mCurrentOperations.keyAt(i);
if (op.type == OP_TYPE_BACKUP) {
- handleCancel(token, true /* cancelAll */);
+ operationsToCancel.add(token);
}
}
+
+ for (Integer token : operationsToCancel) {
+ handleCancel(token, true /* cancelAll */);
+ }
}
// We don't want the backup jobs to kick in any time soon.
@@ -2435,16 +2475,35 @@
void prepareOperationTimeout(int token, long interval, BackupRestoreTask callback,
int operationType) {
+ if (operationType != OP_TYPE_BACKUP_WAIT && operationType != OP_TYPE_RESTORE_WAIT) {
+ Slog.wtf(TAG, "prepareOperationTimeout() doesn't support operation " +
+ Integer.toHexString(token) + " of type " + operationType);
+ return;
+ }
if (MORE_DEBUG) Slog.v(TAG, "starting timeout: token=" + Integer.toHexString(token)
+ " interval=" + interval + " callback=" + callback);
+
synchronized (mCurrentOpLock) {
mCurrentOperations.put(token, new Operation(OP_PENDING, callback, operationType));
-
- Message msg = mBackupHandler.obtainMessage(MSG_TIMEOUT, token, 0, callback);
+ Message msg = mBackupHandler.obtainMessage(getMessageIdForOperationType(operationType),
+ token, 0, callback);
mBackupHandler.sendMessageDelayed(msg, interval);
}
}
+ private int getMessageIdForOperationType(int operationType) {
+ switch (operationType) {
+ case OP_TYPE_BACKUP_WAIT:
+ return MSG_BACKUP_OPERATION_TIMEOUT;
+ case OP_TYPE_RESTORE_WAIT:
+ return MSG_RESTORE_OPERATION_TIMEOUT;
+ default:
+ Slog.wtf(TAG, "getMessageIdForOperationType called on invalid operation type: " +
+ operationType);
+ return -1;
+ }
+ }
+
private void removeOperation(int token) {
if (MORE_DEBUG) {
Slog.d(TAG, "Removing operation token=" + Integer.toHexString(token));
@@ -2491,7 +2550,9 @@
}
removeOperation(token);
- mBackupHandler.removeMessages(MSG_TIMEOUT);
+ if (op != null) {
+ mBackupHandler.removeMessages(getMessageIdForOperationType(op.type));
+ }
if (MORE_DEBUG) Slog.v(TAG, "operation " + Integer.toHexString(token)
+ " complete: finalState=" + finalState);
return finalState == OP_ACKNOWLEDGED;
@@ -2520,6 +2581,9 @@
op.state = OP_TIMEOUT;
// Can't delete op from mCurrentOperations here. waitUntilOperationComplete may be
// called after we receive cancel here. We need this op's state there.
+
+ // Remove all pending timeout messages for this operation type.
+ mBackupHandler.removeMessages(getMessageIdForOperationType(op.type));
}
mCurrentOpLock.notifyAll();
}
@@ -2607,6 +2671,7 @@
boolean userInitiated, boolean nonIncremental) {
mTransport = transport;
mOriginalQueue = queue;
+ mQueue = new ArrayList<>();
mJournal = journal;
mObserver = observer;
mMonitor = monitor;
@@ -2617,19 +2682,32 @@
mStateDir = new File(mBaseStateDir, dirName);
mCurrentOpToken = generateToken();
- mCurrentState = BackupState.INITIAL;
mFinished = false;
- CountDownLatch latch = new CountDownLatch(1);
- String[] fullBackups =
- mPendingFullBackups.toArray(new String[mPendingFullBackups.size()]);
- mFullBackupTask =
- new PerformFullTransportBackupTask(/*fullBackupRestoreObserver*/ null,
- fullBackups, /*updateSchedule*/ false, /*runningJob*/ null, latch,
- mObserver, mMonitor,mUserInitiated);
+ synchronized (mCurrentOpLock) {
+ if (isBackupOperationInProgress()) {
+ if (DEBUG) {
+ Slog.d(TAG, "Skipping backup since one is already in progress.");
+ }
+ mCancelAll = true;
+ mFullBackupTask = null;
+ mCurrentState = BackupState.FINAL;
+ addBackupTrace("Skipped. Backup already in progress.");
+ } else {
+ mCurrentState = BackupState.INITIAL;
+ CountDownLatch latch = new CountDownLatch(1);
+ String[] fullBackups =
+ mPendingFullBackups.toArray(new String[mPendingFullBackups.size()]);
+ mFullBackupTask =
+ new PerformFullTransportBackupTask(/*fullBackupRestoreObserver*/ null,
+ fullBackups, /*updateSchedule*/ false, /*runningJob*/ null,
+ latch,
+ mObserver, mMonitor, mUserInitiated);
- registerTask();
- addBackupTrace("STATE => INITIAL");
+ registerTask();
+ addBackupTrace("STATE => INITIAL");
+ }
+ }
}
/**
@@ -2768,7 +2846,7 @@
// Because the PMBA is a local instance, it has already executed its
// backup callback and returned. Blow away the lingering (spurious)
// pending timeout message for it.
- mBackupHandler.removeMessages(MSG_TIMEOUT);
+ mBackupHandler.removeMessages(MSG_BACKUP_OPERATION_TIMEOUT);
}
}
@@ -3012,7 +3090,9 @@
mWakelock.acquire();
(new Thread(mFullBackupTask, "full-transport-requested")).start();
} else if (mCancelAll) {
- mFullBackupTask.unregisterTask();
+ if (mFullBackupTask != null) {
+ mFullBackupTask.unregisterTask();
+ }
sendBackupFinished(mObserver, BackupManager.ERROR_BACKUP_CANCELLED);
} else {
mFullBackupTask.unregisterTask();
@@ -3098,7 +3178,7 @@
// Initiate the target's backup pass
addBackupTrace("setting timeout");
prepareOperationTimeout(mEphemeralOpToken, TIMEOUT_BACKUP_INTERVAL, this,
- OP_TYPE_WAIT);
+ OP_TYPE_BACKUP_WAIT);
addBackupTrace("calling agent doBackup()");
agent.doBackup(mSavedState, mBackupData, mNewState, quota, mEphemeralOpToken,
@@ -3258,7 +3338,7 @@
addBackupTrace("illegal key " + key + " from " + pkgName);
EventLog.writeEvent(EventLogTags.BACKUP_AGENT_FAILURE, pkgName,
"bad key");
- mBackupHandler.removeMessages(MSG_TIMEOUT);
+ mBackupHandler.removeMessages(MSG_BACKUP_OPERATION_TIMEOUT);
sendBackupOnPackageResult(mObserver, pkgName,
BackupManager.ERROR_AGENT_FAILURE);
errorCleanup();
@@ -3292,7 +3372,7 @@
// Spin the data off to the transport and proceed with the next stage.
if (MORE_DEBUG) Slog.v(TAG, "operationComplete(): sending data to transport for "
+ pkgName);
- mBackupHandler.removeMessages(MSG_TIMEOUT);
+ mBackupHandler.removeMessages(MSG_BACKUP_OPERATION_TIMEOUT);
clearAgentState();
addBackupTrace("operation complete");
@@ -3421,6 +3501,9 @@
// fail repeatedly (i.e. have proved themselves to be buggy).
Slog.e(TAG, "Cancel backing up " + mCurrentPackage.packageName);
EventLog.writeEvent(EventLogTags.BACKUP_AGENT_FAILURE, mCurrentPackage.packageName);
+ mMonitor = monitorEvent(mMonitor,
+ BackupManagerMonitor.LOG_EVENT_ID_KEY_VALUE_BACKUP_TIMEOUT,
+ mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT, null);
addBackupTrace(
"cancel of " + mCurrentPackage.packageName + ", cancelAll=" + cancelAll);
errorCleanup();
@@ -3493,6 +3576,18 @@
}
}
+ private boolean isBackupOperationInProgress() {
+ synchronized (mCurrentOpLock) {
+ for (int i = 0; i < mCurrentOperations.size(); i++) {
+ Operation op = mCurrentOperations.valueAt(i);
+ if (op.type == OP_TYPE_BACKUP && op.state == OP_PENDING) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
// ----- Full backup/restore to a file/socket -----
@@ -3524,7 +3619,8 @@
try {
pipes = ParcelFileDescriptor.createPipe();
int token = generateToken();
- prepareOperationTimeout(token, TIMEOUT_FULL_BACKUP_INTERVAL, null, OP_TYPE_WAIT);
+ prepareOperationTimeout(token, TIMEOUT_FULL_BACKUP_INTERVAL,
+ null, OP_TYPE_BACKUP_WAIT);
mService.backupObbs(pkg.packageName, pipes[1], token, mBackupManagerBinder);
routeSocketDataToOutput(pipes[0], out);
success = waitUntilOperationComplete(token);
@@ -3717,7 +3813,7 @@
if (DEBUG) Slog.d(TAG, "Calling doFullBackup() on " + mPackage.packageName);
prepareOperationTimeout(mToken, TIMEOUT_FULL_BACKUP_INTERVAL,
- mTimeoutMonitor /* in parent class */, OP_TYPE_WAIT);
+ mTimeoutMonitor /* in parent class */, OP_TYPE_BACKUP_WAIT);
mAgent.doFullBackup(mPipe, mQuota, mToken, mBackupManagerBinder);
} catch (IOException e) {
Slog.e(TAG, "Error running full backup for " + mPackage.packageName);
@@ -4474,6 +4570,14 @@
mCurrentOpToken = generateToken();
mBackupRunnerOpToken = generateToken();
+ if (isBackupOperationInProgress()) {
+ if (DEBUG) {
+ Slog.d(TAG, "Skipping full backup. A backup is already in progress.");
+ }
+ mCancelAll = true;
+ return;
+ }
+
registerTask();
for (String pkg : whichPackages) {
@@ -4516,6 +4620,11 @@
mPackages.add(info);
} catch (NameNotFoundException e) {
Slog.i(TAG, "Requested package " + pkg + " not found; ignoring");
+ monitor = monitorEvent(monitor,
+ BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_NOT_FOUND,
+ mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
+ null);
}
}
}
@@ -4599,6 +4708,10 @@
if (mTransport == null) {
Slog.w(TAG, "Transport not present; full data backup not performed");
backupRunStatus = BackupManager.ERROR_TRANSPORT_ABORTED;
+ mMonitor = monitorEvent(mMonitor,
+ BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_TRANSPORT_NOT_PRESENT,
+ mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_TRANSPORT,
+ null);
return;
}
@@ -4909,7 +5022,8 @@
public int preflightFullBackup(PackageInfo pkg, IBackupAgent agent) {
int result;
try {
- prepareOperationTimeout(mCurrentOpToken, TIMEOUT_FULL_BACKUP_INTERVAL, this, OP_TYPE_WAIT);
+ prepareOperationTimeout(mCurrentOpToken, TIMEOUT_FULL_BACKUP_INTERVAL,
+ this, OP_TYPE_BACKUP_WAIT);
addBackupTrace("preflighting");
if (MORE_DEBUG) {
Slog.d(TAG, "Preflighting full payload of " + pkg.packageName);
@@ -5016,7 +5130,7 @@
void registerTask() {
synchronized (mCurrentOpLock) {
mCurrentOperations.put(mCurrentOpToken, new Operation(OP_PENDING, this,
- OP_TYPE_WAIT));
+ OP_TYPE_BACKUP_WAIT));
}
}
@@ -5108,7 +5222,7 @@
mMonitor = monitorEvent(mMonitor,
BackupManagerMonitor.LOG_EVENT_ID_FULL_BACKUP_TIMEOUT,
- mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT);
+ mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT, null);
mIsCancelled = true;
// Cancel tasks spun off by this task.
BackupManagerService.this.handleCancel(mEphemeralToken, cancelAll);
@@ -5485,6 +5599,8 @@
// Dedicated observer, if any
IFullBackupRestoreObserver mObserver;
+ IBackupManagerMonitor mMonitor;
+
// Where we're delivering the file data as we go
IBackupAgent mAgent;
@@ -5566,11 +5682,12 @@
}
public FullRestoreEngine(BackupRestoreTask monitorTask, IFullBackupRestoreObserver observer,
- PackageInfo onlyPackage, boolean allowApks, boolean allowObbs,
- int ephemeralOpToken) {
+ IBackupManagerMonitor monitor, PackageInfo onlyPackage, boolean allowApks,
+ boolean allowObbs, int ephemeralOpToken) {
mEphemeralOpToken = ephemeralOpToken;
mMonitorTask = monitorTask;
mObserver = observer;
+ mMonitor = monitor;
mOnlyPackage = onlyPackage;
mAllowApks = allowApks;
mAllowObbs = allowObbs;
@@ -5774,8 +5891,9 @@
boolean agentSuccess = true;
long toCopy = info.size;
try {
- prepareOperationTimeout(mEphemeralOpToken, TIMEOUT_FULL_BACKUP_INTERVAL,
- mMonitorTask, OP_TYPE_WAIT);
+ prepareOperationTimeout(mEphemeralOpToken,
+ TIMEOUT_FULL_BACKUP_INTERVAL, mMonitorTask,
+ OP_TYPE_RESTORE_WAIT);
if (info.domain.equals(FullBackup.OBB_TREE_TOKEN)) {
if (DEBUG) Slog.d(TAG, "Restoring OBB file for " + pkg
@@ -5857,7 +5975,7 @@
// it by ignoring the rest of the restore on it
if (!agentSuccess) {
Slog.w(TAG, "Agent failure; ending restore");
- mBackupHandler.removeMessages(MSG_TIMEOUT);
+ mBackupHandler.removeMessages(MSG_RESTORE_OPERATION_TIMEOUT);
tearDownPipes();
tearDownAgent(mTargetApp);
mAgent = null;
@@ -6285,6 +6403,16 @@
} else {
Slog.i(TAG, "Data requires newer version "
+ version + "; ignoring");
+ ArrayList<Pair<String, String>> list =
+ new ArrayList<>();
+ list.add(new Pair<String, String>(
+ EXTRA_LOG_OLD_VERSION,
+ Integer.toString(version)));
+ mMonitor = monitorEvent(mMonitor,
+ LOG_EVENT_ID_VERSION_OF_BACKUP_OLDER,
+ pkgInfo,
+ LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
+ list);
policy = RestorePolicy.IGNORE;
}
}
@@ -7211,7 +7339,7 @@
final int token = generateToken();
try {
prepareOperationTimeout(token, TIMEOUT_FULL_BACKUP_INTERVAL, null,
- OP_TYPE_WAIT);
+ OP_TYPE_RESTORE_WAIT);
if (info.domain.equals(FullBackup.OBB_TREE_TOKEN)) {
if (DEBUG) Slog.d(TAG, "Restoring OBB file for " + pkg
+ " : " + info.path);
@@ -7289,7 +7417,7 @@
if (DEBUG) {
Slog.d(TAG, "Agent failure restoring " + pkg + "; now ignoring");
}
- mBackupHandler.removeMessages(MSG_TIMEOUT);
+ mBackupHandler.removeMessages(MSG_RESTORE_OPERATION_TIMEOUT);
tearDownPipes();
tearDownAgent(mTargetApp, false);
mPackagePolicies.put(pkg, RestorePolicy.IGNORE);
@@ -7348,7 +7476,7 @@
final int token = generateToken();
final AdbRestoreFinishedLatch latch = new AdbRestoreFinishedLatch(token);
prepareOperationTimeout(token, TIMEOUT_FULL_BACKUP_INTERVAL, latch,
- OP_TYPE_WAIT);
+ OP_TYPE_RESTORE_WAIT);
if (mTargetApp.processName.equals("system")) {
if (MORE_DEBUG) {
Slog.d(TAG, "system agent - restoreFinished on thread");
@@ -8420,6 +8548,10 @@
RestoreDescription desc = mTransport.nextRestorePackage();
if (desc == null) {
Slog.e(TAG, "No restore metadata available; halting");
+ mMonitor = monitorEvent(mMonitor,
+ BackupManagerMonitor.LOG_EVENT_ID_NO_RESTORE_METADATA_AVAILABLE,
+ mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY, null);
mStatus = BackupTransport.TRANSPORT_ERROR;
executeNextState(UnifiedRestoreState.FINAL);
return;
@@ -8447,7 +8579,7 @@
// message and jump straight to the FINAL state. Because this was
// synchronous we also know that we should cancel the pending timeout
// message.
- mBackupHandler.removeMessages(MSG_TIMEOUT);
+ mBackupHandler.removeMessages(MSG_RESTORE_OPERATION_TIMEOUT);
// Verify that the backup set includes metadata. If not, we can't do
// signature/version verification etc, so we simply do not proceed with
@@ -8521,6 +8653,11 @@
// Whoops, we thought we could restore this package but it
// turns out not to be present. Skip it.
Slog.e(TAG, "Package not present: " + pkgName);
+ mMonitor = monitorEvent(mMonitor,
+ BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_NOT_PRESENT,
+ mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
+ null);
EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, pkgName,
"Package missing on device");
nextState = UnifiedRestoreState.RUNNING_QUEUE;
@@ -8590,6 +8727,9 @@
Slog.i(TAG, "Data exists for package " + packageName
+ " but app has no agent; skipping");
}
+ mMonitor = monitorEvent(mMonitor,
+ BackupManagerMonitor.LOG_EVENT_ID_APP_HAS_NO_AGENT, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT, null);
EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
"Package has no agent");
executeNextState(UnifiedRestoreState.RUNNING_QUEUE);
@@ -8611,6 +8751,9 @@
ApplicationThreadConstants.BACKUP_MODE_INCREMENTAL);
if (mAgent == null) {
Slog.w(TAG, "Can't find backup agent for " + packageName);
+ mMonitor = monitorEvent(mMonitor,
+ BackupManagerMonitor.LOG_EVENT_ID_CANT_FIND_AGENT, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY, null);
EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
"Restore agent missing");
executeNextState(UnifiedRestoreState.RUNNING_QUEUE);
@@ -8723,7 +8866,8 @@
// 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.
- prepareOperationTimeout(mEphemeralOpToken, TIMEOUT_RESTORE_INTERVAL, this, OP_TYPE_WAIT);
+ prepareOperationTimeout(mEphemeralOpToken, TIMEOUT_RESTORE_INTERVAL,
+ this, OP_TYPE_RESTORE_WAIT);
mAgent.doRestore(mBackupData, appVersionCode, mNewState,
mEphemeralOpToken, mBackupManagerBinder);
} catch (Exception e) {
@@ -8773,7 +8917,7 @@
private void restoreFinished() {
try {
prepareOperationTimeout(mEphemeralOpToken, TIMEOUT_RESTORE_FINISHED_INTERVAL, this,
- OP_TYPE_WAIT);
+ OP_TYPE_RESTORE_WAIT);
mAgent.doRestoreFinished(mEphemeralOpToken, mBackupManagerBinder);
// If we get this far, the callback or timeout will schedule the
// next restore state, so we're done
@@ -8815,7 +8959,7 @@
EventLog.writeEvent(EventLogTags.FULL_RESTORE_PACKAGE,
mCurrentPackage.packageName);
- mEngine = new FullRestoreEngine(this, null, mCurrentPackage, false, false, mEphemeralOpToken);
+ mEngine = new FullRestoreEngine(this, null, mMonitor, mCurrentPackage, false, false, mEphemeralOpToken);
mEngineThread = new EngineThread(mEngine, mEnginePipes[0]);
ParcelFileDescriptor eWriteEnd = mEnginePipes[1];
@@ -8959,8 +9103,10 @@
if (DEBUG) {
Slog.w(TAG, "Full-data restore target timed out; shutting down");
}
- mMonitor = monitorEvent(mMonitor, BackupManagerMonitor.LOG_EVENT_ID_FULL_RESTORE_TIMEOUT,
- mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT);
+
+ mMonitor = monitorEvent(mMonitor,
+ BackupManagerMonitor.LOG_EVENT_ID_FULL_RESTORE_TIMEOUT,
+ mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT, null);
mEngineThread.handleTimeout();
IoUtils.closeQuietly(mEnginePipes[1]);
@@ -9031,7 +9177,7 @@
}
// Clear any ongoing session timeout.
- mBackupHandler.removeMessages(MSG_RESTORE_TIMEOUT);
+ mBackupHandler.removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
// If we have a PM token, we must under all circumstances be sure to
// handshake when we've finished.
@@ -9043,7 +9189,7 @@
} else {
// We were invoked via an active restore session, not by the Package
// Manager, so start up the session timeout again.
- mBackupHandler.sendEmptyMessageDelayed(MSG_RESTORE_TIMEOUT,
+ mBackupHandler.sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT,
TIMEOUT_RESTORE_INTERVAL);
}
@@ -9061,6 +9207,24 @@
// done; we can finally release the wakelock and be legitimately done.
Slog.i(TAG, "Restore complete.");
+
+ synchronized (mPendingRestores) {
+ if (mPendingRestores.size() > 0) {
+ if (DEBUG) {
+ Slog.d(TAG, "Starting next pending restore.");
+ }
+ PerformUnifiedRestoreTask task = mPendingRestores.remove();
+ mBackupHandler.sendMessage(
+ mBackupHandler.obtainMessage(MSG_BACKUP_RESTORE_STEP, task));
+
+ } else {
+ mIsRestoreInProgress = false;
+ if (MORE_DEBUG) {
+ Slog.d(TAG, "No pending restores.");
+ }
+ }
+ }
+
mWakelock.release();
}
@@ -9134,7 +9298,7 @@
// The caller is responsible for reestablishing the state machine; our
// responsibility here is to clear the decks for whatever comes next.
- mBackupHandler.removeMessages(MSG_TIMEOUT, this);
+ mBackupHandler.removeMessages(MSG_RESTORE_OPERATION_TIMEOUT, this);
}
@Override
@@ -9203,8 +9367,9 @@
public void handleCancel(boolean cancelAll) {
removeOperation(mEphemeralOpToken);
Slog.e(TAG, "Timeout restoring application " + mCurrentPackage.packageName);
- mMonitor = monitorEvent(mMonitor, BackupManagerMonitor.LOG_EVENT_ID_KEY_VALUE_RESTORE_TIMEOUT,
- mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT);
+ mMonitor = monitorEvent(mMonitor,
+ BackupManagerMonitor.LOG_EVENT_ID_KEY_VALUE_RESTORE_TIMEOUT,
+ mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT, null);
EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE,
mCurrentPackage.packageName, "restore timeout");
// Handle like an agent that threw on invocation: wipe it and go on to the next
@@ -10283,7 +10448,8 @@
return null;
}
mActiveRestoreSession = new ActiveRestoreSession(packageName, transport);
- mBackupHandler.sendEmptyMessageDelayed(MSG_RESTORE_TIMEOUT, TIMEOUT_RESTORE_INTERVAL);
+ mBackupHandler.sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT,
+ TIMEOUT_RESTORE_INTERVAL);
}
return mActiveRestoreSession;
}
@@ -10295,7 +10461,7 @@
} else {
if (DEBUG) Slog.v(TAG, "Clearing restore session and halting timeout");
mActiveRestoreSession = null;
- mBackupHandler.removeMessages(MSG_RESTORE_TIMEOUT);
+ mBackupHandler.removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
}
}
}
@@ -10413,7 +10579,7 @@
// We know we're doing legit work now, so halt the timeout
// until we're done. It gets started again when the result
// comes in.
- mBackupHandler.removeMessages(MSG_RESTORE_TIMEOUT);
+ mBackupHandler.removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
// spin off the transport request to our service thread
mWakelock.acquire();
@@ -10470,7 +10636,7 @@
for (int i = 0; i < mRestoreSets.length; i++) {
if (token == mRestoreSets[i].token) {
// Real work, so stop the session timeout until we finalize the restore
- mBackupHandler.removeMessages(MSG_RESTORE_TIMEOUT);
+ mBackupHandler.removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
long oldId = Binder.clearCallingIdentity();
mWakelock.acquire();
@@ -10558,7 +10724,7 @@
for (int i = 0; i < mRestoreSets.length; i++) {
if (token == mRestoreSets[i].token) {
// Stop the session timeout until we finalize the restore
- mBackupHandler.removeMessages(MSG_RESTORE_TIMEOUT);
+ mBackupHandler.removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
long oldId = Binder.clearCallingIdentity();
mWakelock.acquire();
@@ -10647,7 +10813,7 @@
}
// Stop the session timeout until we finalize the restore
- mBackupHandler.removeMessages(MSG_RESTORE_TIMEOUT);
+ mBackupHandler.removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
// Ready to go: enqueue the restore request and claim success
mWakelock.acquire();
@@ -10870,7 +11036,7 @@
}
private static IBackupManagerMonitor monitorEvent(IBackupManagerMonitor monitor, int id,
- PackageInfo pkg, int category) {
+ PackageInfo pkg, int category, ArrayList<Pair<String, String>> extras) {
if (monitor != null) {
try {
Bundle bundle = new Bundle();
@@ -10882,6 +11048,11 @@
bundle.putInt(BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_VERSION,
pkg.versionCode);
}
+ if (extras != null) {
+ for (Pair<String,String> pair : extras) {
+ bundle.putString(pair.first, pair.second);
+ }
+ }
monitor.onEvent(bundle);
return monitor;
} catch(RemoteException e) {
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index b1560e6..02223c1 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -2458,9 +2458,9 @@
expectedClockTime = lastTimeChangeClockTime
+ (nowELAPSED - mLastTimeChangeRealtime);
}
- if (lastTimeChangeClockTime == 0 || nowRTC < (expectedClockTime-500)
- || nowRTC > (expectedClockTime+500)) {
- // The change is by at least +/- 500 ms (or this is the first change),
+ if (lastTimeChangeClockTime == 0 || nowRTC < (expectedClockTime-1000)
+ || nowRTC > (expectedClockTime+1000)) {
+ // The change is by at least +/- 1000 ms (or this is the first change),
// let's do it!
if (DEBUG_BATCH) {
Slog.v(TAG, "Time changed notification from kernel; rebatching");
@@ -2477,7 +2477,8 @@
}
Intent intent = new Intent(Intent.ACTION_TIME_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING
- | Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ | Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
+ | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
getContext().sendBroadcastAsUser(intent, UserHandle.ALL);
// The world has changed on us, so we need to re-evaluate alarms
diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java
index dc0e3e1..de11f36 100644
--- a/services/core/java/com/android/server/AppOpsService.java
+++ b/services/core/java/com/android/server/AppOpsService.java
@@ -167,14 +167,10 @@
}
}
- final SparseArray<ArrayList<Callback>> mOpModeWatchers
- = new SparseArray<ArrayList<Callback>>();
- final ArrayMap<String, ArrayList<Callback>> mPackageModeWatchers
- = new ArrayMap<String, ArrayList<Callback>>();
- final ArrayMap<IBinder, Callback> mModeWatchers
- = new ArrayMap<IBinder, Callback>();
- final SparseArray<SparseArray<Restriction>> mAudioRestrictions
- = new SparseArray<SparseArray<Restriction>>();
+ final SparseArray<ArraySet<Callback>> mOpModeWatchers = new SparseArray<>();
+ final ArrayMap<String, ArraySet<Callback>> mPackageModeWatchers = new ArrayMap<>();
+ final ArrayMap<IBinder, Callback> mModeWatchers = new ArrayMap<>();
+ final SparseArray<SparseArray<Restriction>> mAudioRestrictions = new SparseArray<>();
public final class Callback implements DeathRecipient {
final IAppOpsCallback mCallback;
@@ -545,11 +541,11 @@
ArrayMap<Callback, ArraySet<String>> callbackSpecs = null;
synchronized (this) {
- ArrayList<Callback> callbacks = mOpModeWatchers.get(code);
+ ArraySet<Callback> callbacks = mOpModeWatchers.get(code);
if (callbacks != null) {
final int callbackCount = callbacks.size();
for (int i = 0; i < callbackCount; i++) {
- Callback callback = callbacks.get(i);
+ Callback callback = callbacks.valueAt(i);
ArraySet<String> changedPackages = new ArraySet<>();
Collections.addAll(changedPackages, uidPackageNames);
callbackSpecs = new ArrayMap<>();
@@ -565,7 +561,7 @@
}
final int callbackCount = callbacks.size();
for (int i = 0; i < callbackCount; i++) {
- Callback callback = callbacks.get(i);
+ Callback callback = callbacks.valueAt(i);
ArraySet<String> changedPackages = callbackSpecs.get(callback);
if (changedPackages == null) {
changedPackages = new ArraySet<>();
@@ -623,17 +619,17 @@
if (op != null) {
if (op.mode != mode) {
op.mode = mode;
- ArrayList<Callback> cbs = mOpModeWatchers.get(code);
+ ArraySet<Callback> cbs = mOpModeWatchers.get(code);
if (cbs != null) {
if (repCbs == null) {
- repCbs = new ArrayList<Callback>();
+ repCbs = new ArrayList<>();
}
repCbs.addAll(cbs);
}
cbs = mPackageModeWatchers.get(packageName);
if (cbs != null) {
if (repCbs == null) {
- repCbs = new ArrayList<Callback>();
+ repCbs = new ArrayList<>();
}
repCbs.addAll(cbs);
}
@@ -666,7 +662,7 @@
private static HashMap<Callback, ArrayList<ChangeRec>> addCallbacks(
HashMap<Callback, ArrayList<ChangeRec>> callbacks,
- int op, int uid, String packageName, ArrayList<Callback> cbs) {
+ int op, int uid, String packageName, ArraySet<Callback> cbs) {
if (cbs == null) {
return callbacks;
}
@@ -674,8 +670,9 @@
callbacks = new HashMap<>();
}
boolean duplicate = false;
- for (int i=0; i<cbs.size(); i++) {
- Callback cb = cbs.get(i);
+ final int N = cbs.size();
+ for (int i=0; i<N; i++) {
+ Callback cb = cbs.valueAt(i);
ArrayList<ChangeRec> reports = callbacks.get(cb);
if (reports == null) {
reports = new ArrayList<>();
@@ -830,17 +827,17 @@
mModeWatchers.put(callback.asBinder(), cb);
}
if (op != AppOpsManager.OP_NONE) {
- ArrayList<Callback> cbs = mOpModeWatchers.get(op);
+ ArraySet<Callback> cbs = mOpModeWatchers.get(op);
if (cbs == null) {
- cbs = new ArrayList<Callback>();
+ cbs = new ArraySet<>();
mOpModeWatchers.put(op, cbs);
}
cbs.add(cb);
}
if (packageName != null) {
- ArrayList<Callback> cbs = mPackageModeWatchers.get(packageName);
+ ArraySet<Callback> cbs = mPackageModeWatchers.get(packageName);
if (cbs == null) {
- cbs = new ArrayList<Callback>();
+ cbs = new ArraySet<>();
mPackageModeWatchers.put(packageName, cbs);
}
cbs.add(cb);
@@ -858,14 +855,14 @@
if (cb != null) {
cb.unlinkToDeath();
for (int i=mOpModeWatchers.size()-1; i>=0; i--) {
- ArrayList<Callback> cbs = mOpModeWatchers.valueAt(i);
+ ArraySet<Callback> cbs = mOpModeWatchers.valueAt(i);
cbs.remove(cb);
if (cbs.size() <= 0) {
mOpModeWatchers.removeAt(i);
}
}
for (int i=mPackageModeWatchers.size()-1; i>=0; i--) {
- ArrayList<Callback> cbs = mPackageModeWatchers.valueAt(i);
+ ArraySet<Callback> cbs = mPackageModeWatchers.valueAt(i);
cbs.remove(cb);
if (cbs.size() <= 0) {
mPackageModeWatchers.removeAt(i);
@@ -2066,10 +2063,10 @@
for (int i=0; i<mOpModeWatchers.size(); i++) {
pw.print(" Op "); pw.print(AppOpsManager.opToName(mOpModeWatchers.keyAt(i)));
pw.println(":");
- ArrayList<Callback> callbacks = mOpModeWatchers.valueAt(i);
+ ArraySet<Callback> callbacks = mOpModeWatchers.valueAt(i);
for (int j=0; j<callbacks.size(); j++) {
pw.print(" #"); pw.print(j); pw.print(": ");
- pw.println(callbacks.get(j));
+ pw.println(callbacks.valueAt(j));
}
}
}
@@ -2079,10 +2076,10 @@
for (int i=0; i<mPackageModeWatchers.size(); i++) {
pw.print(" Pkg "); pw.print(mPackageModeWatchers.keyAt(i));
pw.println(":");
- ArrayList<Callback> callbacks = mPackageModeWatchers.valueAt(i);
+ ArraySet<Callback> callbacks = mPackageModeWatchers.valueAt(i);
for (int j=0; j<callbacks.size(); j++) {
pw.print(" #"); pw.print(j); pw.print(": ");
- pw.println(callbacks.get(j));
+ pw.println(callbacks.valueAt(j));
}
}
}
@@ -2310,23 +2307,23 @@
}
private void notifyWatchersOfChange(int code) {
- final ArrayList<Callback> clonedCallbacks;
+ final ArraySet<Callback> clonedCallbacks;
synchronized (this) {
- ArrayList<Callback> callbacks = mOpModeWatchers.get(code);
+ ArraySet<Callback> callbacks = mOpModeWatchers.get(code);
if (callbacks == null) {
return;
}
- clonedCallbacks = new ArrayList<>(callbacks);
+ clonedCallbacks = new ArraySet<>(callbacks);
}
// There are components watching for mode changes such as window manager
// and location manager which are in our process. The callbacks in these
- // components may require permissions our remote caller does not have.s
+ // components may require permissions our remote caller does not have.
final long identity = Binder.clearCallingIdentity();
try {
final int callbackCount = clonedCallbacks.size();
for (int i = 0; i < callbackCount; i++) {
- Callback callback = clonedCallbacks.get(i);
+ Callback callback = clonedCallbacks.valueAt(i);
try {
callback.mCallback.opChanged(code, -1, null);
} catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java
index 6248cab..81f137e 100644
--- a/services/core/java/com/android/server/BatteryService.java
+++ b/services/core/java/com/android/server/BatteryService.java
@@ -130,6 +130,8 @@
private int mLastMaxChargingVoltage;
private int mLastChargeCounter;
+ private int mSequence = 1;
+
private int mInvalidCharger;
private int mLastInvalidCharger;
@@ -448,27 +450,29 @@
}
}
- sendIntentLocked();
+ mSequence++;
// Separate broadcast is sent for power connected / not connected
// since the standard intent will not wake any applications and some
// applications may want to have smart behavior based on this.
if (mPlugType != 0 && mLastPlugType == 0) {
+ final Intent statusIntent = new Intent(Intent.ACTION_POWER_CONNECTED);
+ statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ statusIntent.putExtra(BatteryManager.EXTRA_SEQUENCE, mSequence);
mHandler.post(new Runnable() {
@Override
public void run() {
- Intent statusIntent = new Intent(Intent.ACTION_POWER_CONNECTED);
- statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
mContext.sendBroadcastAsUser(statusIntent, UserHandle.ALL);
}
});
}
else if (mPlugType == 0 && mLastPlugType != 0) {
+ final Intent statusIntent = new Intent(Intent.ACTION_POWER_DISCONNECTED);
+ statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ statusIntent.putExtra(BatteryManager.EXTRA_SEQUENCE, mSequence);
mHandler.post(new Runnable() {
@Override
public void run() {
- Intent statusIntent = new Intent(Intent.ACTION_POWER_DISCONNECTED);
- statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
mContext.sendBroadcastAsUser(statusIntent, UserHandle.ALL);
}
});
@@ -476,26 +480,33 @@
if (shouldSendBatteryLowLocked()) {
mSentLowBatteryBroadcast = true;
+ final Intent statusIntent = new Intent(Intent.ACTION_BATTERY_LOW);
+ statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ statusIntent.putExtra(BatteryManager.EXTRA_SEQUENCE, mSequence);
mHandler.post(new Runnable() {
@Override
public void run() {
- Intent statusIntent = new Intent(Intent.ACTION_BATTERY_LOW);
- statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
mContext.sendBroadcastAsUser(statusIntent, UserHandle.ALL);
}
});
} else if (mSentLowBatteryBroadcast && mLastBatteryLevel >= mLowBatteryCloseWarningLevel) {
mSentLowBatteryBroadcast = false;
+ final Intent statusIntent = new Intent(Intent.ACTION_BATTERY_OKAY);
+ statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ statusIntent.putExtra(BatteryManager.EXTRA_SEQUENCE, mSequence);
mHandler.post(new Runnable() {
@Override
public void run() {
- Intent statusIntent = new Intent(Intent.ACTION_BATTERY_OKAY);
- statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
mContext.sendBroadcastAsUser(statusIntent, UserHandle.ALL);
}
});
}
+ // We are doing this after sending the above broadcasts, so anything processing
+ // them will get the new sequence number at that point. (See for example how testing
+ // of JobScheduler's BatteryController works.)
+ sendIntentLocked();
+
// Update the battery LED
mLed.updateLightsLocked();
@@ -527,6 +538,7 @@
int icon = getIconLocked(mBatteryProps.batteryLevel);
+ intent.putExtra(BatteryManager.EXTRA_SEQUENCE, mSequence);
intent.putExtra(BatteryManager.EXTRA_STATUS, mBatteryProps.batteryStatus);
intent.putExtra(BatteryManager.EXTRA_HEALTH, mBatteryProps.batteryHealth);
intent.putExtra(BatteryManager.EXTRA_PRESENT, mBatteryProps.batteryPresent);
@@ -666,12 +678,28 @@
pw.println("Battery service (battery) commands:");
pw.println(" help");
pw.println(" Print this help text.");
- pw.println(" set [ac|usb|wireless|status|level|invalid] <value>");
+ pw.println(" set [-f] [ac|usb|wireless|status|level|invalid] <value>");
pw.println(" Force a battery property value, freezing battery state.");
- pw.println(" unplug");
+ pw.println(" -f: force a battery change broadcast be sent, prints new sequence.");
+ pw.println(" unplug [-f]");
pw.println(" Force battery unplugged, freezing battery state.");
- pw.println(" reset");
+ pw.println(" -f: force a battery change broadcast be sent, prints new sequence.");
+ pw.println(" reset [-f]");
pw.println(" Unfreeze battery state, returning to current hardware values.");
+ pw.println(" -f: force a battery change broadcast be sent, prints new sequence.");
+ }
+
+ static final int OPTION_FORCE_UPDATE = 1<<0;
+
+ int parseOptions(Shell shell) {
+ String opt;
+ int opts = 0;
+ while ((opt = shell.getNextOption()) != null) {
+ if ("-f".equals(opt)) {
+ opts |= OPTION_FORCE_UPDATE;
+ }
+ }
+ return opts;
}
int onShellCommand(Shell shell, String cmd) {
@@ -681,6 +709,7 @@
PrintWriter pw = shell.getOutPrintWriter();
switch (cmd) {
case "unplug": {
+ int opts = parseOptions(shell);
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
if (!mUpdatesStopped) {
@@ -692,12 +721,13 @@
long ident = Binder.clearCallingIdentity();
try {
mUpdatesStopped = true;
- processValuesLocked(false);
+ processValuesFromShellLocked(pw, opts);
} finally {
Binder.restoreCallingIdentity(ident);
}
} break;
case "set": {
+ int opts = parseOptions(shell);
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
final String key = shell.getNextArg();
@@ -745,7 +775,7 @@
long ident = Binder.clearCallingIdentity();
try {
mUpdatesStopped = true;
- processValuesLocked(false);
+ processValuesFromShellLocked(pw, opts);
} finally {
Binder.restoreCallingIdentity(ident);
}
@@ -756,6 +786,7 @@
}
} break;
case "reset": {
+ int opts = parseOptions(shell);
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
long ident = Binder.clearCallingIdentity();
@@ -763,7 +794,7 @@
if (mUpdatesStopped) {
mUpdatesStopped = false;
mBatteryProps.set(mLastBatteryProps);
- processValuesLocked(false);
+ processValuesFromShellLocked(pw, opts);
}
} finally {
Binder.restoreCallingIdentity(ident);
@@ -775,6 +806,13 @@
return 0;
}
+ private void processValuesFromShellLocked(PrintWriter pw, int opts) {
+ processValuesLocked((opts & OPTION_FORCE_UPDATE) != 0);
+ if ((opts & OPTION_FORCE_UPDATE) != 0) {
+ pw.println(mSequence);
+ }
+ }
+
private void dumpInternal(FileDescriptor fd, PrintWriter pw, String[] args) {
synchronized (mLock) {
if (args == null || args.length == 0 || "-a".equals(args[0])) {
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 719a64e..0bc9d19 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -815,6 +815,8 @@
intentFilter.addAction(Intent.ACTION_USER_UNLOCKED);
mContext.registerReceiverAsUser(
mUserIntentReceiver, UserHandle.ALL, intentFilter, null, null);
+ mContext.registerReceiverAsUser(mUserPresentReceiver, UserHandle.SYSTEM,
+ new IntentFilter(Intent.ACTION_USER_PRESENT), null, null);
try {
mNetd.registerObserver(mTethering);
@@ -3664,7 +3666,12 @@
// Tear down existing lockdown if profile was removed
mLockdownEnabled = LockdownVpnTracker.isEnabled();
if (mLockdownEnabled) {
- final String profileName = new String(mKeyStore.get(Credentials.LOCKDOWN_VPN));
+ byte[] profileTag = mKeyStore.get(Credentials.LOCKDOWN_VPN);
+ if (profileTag == null) {
+ Slog.e(TAG, "Lockdown VPN configured but cannot be read from keystore");
+ return false;
+ }
+ String profileName = new String(profileTag);
final VpnProfile profile = VpnProfile.decode(
profileName, mKeyStore.get(Credentials.VPN + profileName));
if (profile == null) {
@@ -4003,6 +4010,16 @@
}
};
+ private BroadcastReceiver mUserPresentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // Try creating lockdown tracker, since user present usually means
+ // unlocked keystore.
+ updateLockdownVpn();
+ mContext.unregisterReceiver(this);
+ }
+ };
+
private final HashMap<Messenger, NetworkFactoryInfo> mNetworkFactoryInfos =
new HashMap<Messenger, NetworkFactoryInfo>();
private final HashMap<NetworkRequest, NetworkRequestInfo> mNetworkRequests =
@@ -4166,7 +4183,7 @@
}
ensureRequestableCapabilities(networkCapabilities);
- if (timeoutMs < 0 || timeoutMs > ConnectivityManager.MAX_NETWORK_REQUEST_TIMEOUT_MS) {
+ if (timeoutMs < 0) {
throw new IllegalArgumentException("Bad timeout specified");
}
diff --git a/services/core/java/com/android/server/GraphicsStatsService.java b/services/core/java/com/android/server/GraphicsStatsService.java
index ecbe1ca..14a9a31 100644
--- a/services/core/java/com/android/server/GraphicsStatsService.java
+++ b/services/core/java/com/android/server/GraphicsStatsService.java
@@ -16,67 +16,150 @@
package com.android.server;
+import android.app.AlarmManager;
import android.app.AppOpsManager;
import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
import android.os.Binder;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.HandlerThread;
import android.os.IBinder;
import android.os.MemoryFile;
+import android.os.Message;
import android.os.ParcelFileDescriptor;
+import android.os.Process;
import android.os.RemoteException;
+import android.os.Trace;
import android.util.Log;
import android.view.IGraphicsStats;
-import android.view.ThreadedRenderer;
+import android.view.IGraphicsStatsCallback;
+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.Calendar;
+import java.util.HashSet;
+import java.util.TimeZone;
/**
* This service's job is to collect aggregate rendering profile data. It
* does this by allowing rendering processes to request an ashmem buffer
- * to place their stats into. This buffer will be pre-initialized with historical
- * data for that process if it exists (if the userId & packageName match a buffer
- * in the historical log)
+ * to place their stats into.
*
- * This service does not itself attempt to understand the data in the buffer,
- * its primary job is merely to manage distributing these buffers. However,
- * it is assumed that this buffer is for ThreadedRenderer and delegates
- * directly to ThreadedRenderer for dumping buffers.
+ * Buffers are rotated on a daily (in UTC) basis and only the 3 most-recent days
+ * are kept.
*
- * MEMORY USAGE:
+ * The primary consumer of this is incident reports and automated metric checking. It is not
+ * intended for end-developer consumption, for that we have gfxinfo.
*
- * This class consumes UP TO:
- * 1) [active rendering processes] * (ASHMEM_SIZE * 2)
- * 2) ASHMEM_SIZE (for scratch space used during dumping)
- * 3) ASHMEM_SIZE * HISTORY_SIZE
- *
- * This is currently under 20KiB total memory in the worst case of
- * 20 processes in history + 10 unique active processes.
+ * Buffer rotation process:
+ * 1) Alarm fires
+ * 2) onRotateGraphicsStatsBuffer() is sent to all active processes
+ * 3) Upon receiving the callback, the process will stop using the previous ashmem buffer and
+ * request a new one.
+ * 4) When that request is received we now know that the ashmem region is no longer in use so
+ * it gets queued up for saving to disk and a new ashmem region is created and returned
+ * for the process to use.
*
* @hide */
public class GraphicsStatsService extends IGraphicsStats.Stub {
public static final String GRAPHICS_STATS_SERVICE = "graphicsstats";
private static final String TAG = "GraphicsStatsService";
- private static final int ASHMEM_SIZE = 464;
- private static final int HISTORY_SIZE = 20;
+
+ private static final int SAVE_BUFFER = 1;
+ private static final int DELETE_OLD = 2;
+
+ // This isn't static because we need this to happen after registerNativeMethods, however
+ // the class is loaded (and thus static ctor happens) before that occurs.
+ private final int ASHMEM_SIZE = nGetAshmemSize();
+ private final byte[] ZERO_DATA = new byte[ASHMEM_SIZE];
private final Context mContext;
private final AppOpsManager mAppOps;
+ private final AlarmManager mAlarmManager;
private final Object mLock = new Object();
private ArrayList<ActiveBuffer> mActive = new ArrayList<>();
- private HistoricalData[] mHistoricalLog = new HistoricalData[HISTORY_SIZE];
- private int mNextHistoricalSlot = 0;
- private byte[] mTempBuffer = new byte[ASHMEM_SIZE];
+ private File mGraphicsStatsDir;
+ private final Object mFileAccessLock = new Object();
+ private Handler mWriteOutHandler;
+ private boolean mRotateIsScheduled = false;
public GraphicsStatsService(Context context) {
mContext = context;
mAppOps = context.getSystemService(AppOpsManager.class);
+ mAlarmManager = context.getSystemService(AlarmManager.class);
+ File systemDataDir = new File(Environment.getDataDirectory(), "system");
+ mGraphicsStatsDir = new File(systemDataDir, "graphicsstats");
+ mGraphicsStatsDir.mkdirs();
+ if (!mGraphicsStatsDir.exists()) {
+ throw new IllegalStateException("Graphics stats directory does not exist: "
+ + mGraphicsStatsDir.getAbsolutePath());
+ }
+ HandlerThread bgthread = new HandlerThread("GraphicsStats-disk", Process.THREAD_PRIORITY_BACKGROUND);
+ bgthread.start();
+
+ mWriteOutHandler = new Handler(bgthread.getLooper(), new Handler.Callback() {
+ @Override
+ public boolean handleMessage(Message msg) {
+ switch (msg.what) {
+ case SAVE_BUFFER:
+ saveBuffer((HistoricalBuffer) msg.obj);
+ break;
+ case DELETE_OLD:
+ deleteOldBuffers();
+ break;
+ }
+ return true;
+ }
+ });
+ }
+
+ /**
+ * Current rotation policy is to rotate at midnight UTC. We don't specify RTC_WAKEUP because
+ * rotation can be delayed if there's otherwise no activity. However exact is used because
+ * we don't want the system to delay it by TOO much.
+ */
+ private void scheduleRotateLocked() {
+ if (mRotateIsScheduled) {
+ return;
+ }
+ mRotateIsScheduled = true;
+ Calendar calendar = normalizeDate(System.currentTimeMillis());
+ calendar.add(Calendar.DATE, 1);
+ mAlarmManager.setExact(AlarmManager.RTC, calendar.getTimeInMillis(), TAG, this::onAlarm,
+ mWriteOutHandler);
+ }
+
+ private void onAlarm() {
+ // We need to make a copy since some of the callbacks won't be proxy and thus
+ // can result in a re-entrant acquisition of mLock that would result in a modification
+ // of mActive during iteration.
+ ActiveBuffer[] activeCopy;
+ synchronized (mLock) {
+ mRotateIsScheduled = false;
+ scheduleRotateLocked();
+ activeCopy = mActive.toArray(new ActiveBuffer[0]);
+ }
+ for (ActiveBuffer active : activeCopy) {
+ try {
+ active.mCallback.onRotateGraphicsStatsBuffer();
+ } catch (RemoteException e) {
+ Log.w(TAG, String.format("Failed to notify '%s' (pid=%d) to rotate buffers",
+ active.mInfo.packageName, active.mPid), e);
+ }
+ }
+ // Give a few seconds for everyone to rotate before doing the cleanup
+ mWriteOutHandler.sendEmptyMessageDelayed(DELETE_OLD, 10000);
}
@Override
- public ParcelFileDescriptor requestBufferForProcess(String packageName, IBinder token)
+ public ParcelFileDescriptor requestBufferForProcess(String packageName, IGraphicsStatsCallback token)
throws RemoteException {
int uid = Binder.getCallingUid();
int pid = Binder.getCallingPid();
@@ -84,9 +167,12 @@
long callingIdentity = Binder.clearCallingIdentity();
try {
mAppOps.checkPackage(uid, packageName);
+ PackageInfo info = mContext.getPackageManager().getPackageInfo(packageName, 0);
synchronized (mLock) {
- pfd = requestBufferForProcessLocked(token, uid, pid, packageName);
+ pfd = requestBufferForProcessLocked(token, uid, pid, packageName, info.versionCode);
}
+ } catch (PackageManager.NameNotFoundException ex) {
+ throw new RemoteException("Unable to find package: '" + packageName + "'");
} finally {
Binder.restoreCallingIdentity(callingIdentity);
}
@@ -95,51 +181,130 @@
private ParcelFileDescriptor getPfd(MemoryFile file) {
try {
+ if (!file.getFileDescriptor().valid()) {
+ throw new IllegalStateException("Invalid file descriptor");
+ }
return new ParcelFileDescriptor(file.getFileDescriptor());
} catch (IOException ex) {
throw new IllegalStateException("Failed to get PFD from memory file", ex);
}
}
- private ParcelFileDescriptor requestBufferForProcessLocked(IBinder token,
- int uid, int pid, String packageName) throws RemoteException {
- ActiveBuffer buffer = fetchActiveBuffersLocked(token, uid, pid, packageName);
+ private ParcelFileDescriptor requestBufferForProcessLocked(IGraphicsStatsCallback token,
+ int uid, int pid, String packageName, int versionCode) throws RemoteException {
+ ActiveBuffer buffer = fetchActiveBuffersLocked(token, uid, pid, packageName, versionCode);
+ scheduleRotateLocked();
return getPfd(buffer.mProcessBuffer);
}
+ private Calendar normalizeDate(long timestamp) {
+ Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ calendar.setTimeInMillis(timestamp);
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+ return calendar;
+ }
+
+ private File pathForApp(BufferInfo info) {
+ String subPath = String.format("%d/%s/%d/total",
+ normalizeDate(info.startTime).getTimeInMillis(), info.packageName, info.versionCode);
+ return new File(mGraphicsStatsDir, subPath);
+ }
+
+ private void saveBuffer(HistoricalBuffer buffer) {
+ if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) {
+ Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "saving graphicsstats for " + buffer.mInfo.packageName);
+ }
+ synchronized (mFileAccessLock) {
+ File path = pathForApp(buffer.mInfo);
+ File parent = path.getParentFile();
+ parent.mkdirs();
+ if (!parent.exists()) {
+ Log.w(TAG, "Unable to create path: '" + parent.getAbsolutePath() + "'");
+ return;
+ }
+ nSaveBuffer(path.getAbsolutePath(), buffer.mInfo.packageName, buffer.mInfo.versionCode,
+ buffer.mInfo.startTime, buffer.mInfo.endTime, buffer.mData);
+ }
+ Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
+ }
+
+ private void deleteRecursiveLocked(File file) {
+ if (file.isDirectory()) {
+ for (File child : file.listFiles()) {
+ deleteRecursiveLocked(child);
+ }
+ }
+ if (!file.delete()) {
+ Log.w(TAG, "Failed to delete '" + file.getAbsolutePath() + "'!");
+ }
+ }
+
+ private void deleteOldBuffers() {
+ Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "deleting old graphicsstats buffers");
+ synchronized (mFileAccessLock) {
+ File[] files = mGraphicsStatsDir.listFiles();
+ if (files == null || files.length <= 3) {
+ return;
+ }
+ long[] sortedDates = new long[files.length];
+ for (int i = 0; i < files.length; i++) {
+ try {
+ sortedDates[i] = Long.parseLong(files[i].getName());
+ } catch (NumberFormatException ex) {
+ // Skip unrecognized folders
+ }
+ }
+ if (sortedDates.length <= 3) {
+ return;
+ }
+ Arrays.sort(sortedDates);
+ for (int i = 0; i < sortedDates.length - 3; i++) {
+ deleteRecursiveLocked(new File(mGraphicsStatsDir, Long.toString(sortedDates[i])));
+ }
+ }
+ Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
+ }
+
+ private void addToSaveQueue(ActiveBuffer buffer) {
+ try {
+ HistoricalBuffer data = new HistoricalBuffer(buffer);
+ Message.obtain(mWriteOutHandler, SAVE_BUFFER, data).sendToTarget();
+ } catch (IOException e) {
+ Log.w(TAG, "Failed to copy graphicsstats from " + buffer.mInfo.packageName, e);
+ }
+ buffer.closeAllBuffers();
+ }
+
private void processDied(ActiveBuffer buffer) {
synchronized (mLock) {
mActive.remove(buffer);
- Log.d("GraphicsStats", "Buffer count: " + mActive.size());
}
- HistoricalData data = buffer.mPreviousData;
- buffer.mPreviousData = null;
- if (data == null) {
- data = mHistoricalLog[mNextHistoricalSlot];
- if (data == null) {
- data = new HistoricalData();
- }
- }
- data.update(buffer.mPackageName, buffer.mUid, buffer.mProcessBuffer);
- buffer.closeAllBuffers();
-
- mHistoricalLog[mNextHistoricalSlot] = data;
- mNextHistoricalSlot = (mNextHistoricalSlot + 1) % mHistoricalLog.length;
+ addToSaveQueue(buffer);
}
- private ActiveBuffer fetchActiveBuffersLocked(IBinder token, int uid, int pid,
- String packageName) throws RemoteException {
+ private ActiveBuffer fetchActiveBuffersLocked(IGraphicsStatsCallback token, int uid, int pid,
+ String packageName, int versionCode) throws RemoteException {
int size = mActive.size();
+ long today = normalizeDate(System.currentTimeMillis()).getTimeInMillis();
for (int i = 0; i < size; i++) {
- ActiveBuffer buffers = mActive.get(i);
- if (buffers.mPid == pid
- && buffers.mUid == uid) {
- return buffers;
+ ActiveBuffer buffer = mActive.get(i);
+ if (buffer.mPid == pid
+ && buffer.mUid == uid) {
+ // If the buffer is too old we remove it and return a new one
+ if (buffer.mInfo.startTime < today) {
+ buffer.binderDied();
+ break;
+ } else {
+ return buffer;
+ }
}
}
// Didn't find one, need to create it
try {
- ActiveBuffer buffers = new ActiveBuffer(token, uid, pid, packageName);
+ ActiveBuffer buffers = new ActiveBuffer(token, uid, pid, packageName, versionCode);
mActive.add(buffers);
return buffers;
} catch (IOException ex) {
@@ -147,71 +312,106 @@
}
}
- private HistoricalData removeHistoricalDataLocked(int uid, String packageName) {
- for (int i = 0; i < mHistoricalLog.length; i++) {
- final HistoricalData data = mHistoricalLog[i];
- if (data != null && data.mUid == uid
- && data.mPackageName.equals(packageName)) {
- if (i == mNextHistoricalSlot) {
- mHistoricalLog[i] = null;
- } else {
- mHistoricalLog[i] = mHistoricalLog[mNextHistoricalSlot];
- mHistoricalLog[mNextHistoricalSlot] = null;
+ private HashSet<File> dumpActiveLocked(long dump, ArrayList<HistoricalBuffer> buffers) {
+ HashSet<File> skipFiles = new HashSet<>(buffers.size());
+ for (int i = 0; i < buffers.size(); i++) {
+ HistoricalBuffer buffer = buffers.get(i);
+ File path = pathForApp(buffer.mInfo);
+ skipFiles.add(path);
+ nAddToDump(dump, path.getAbsolutePath(), buffer.mInfo.packageName,
+ buffer.mInfo.versionCode, buffer.mInfo.startTime, buffer.mInfo.endTime,
+ buffer.mData);
+ }
+ return skipFiles;
+ }
+
+ private void dumpHistoricalLocked(long dump, HashSet<File> skipFiles) {
+ for (File date : mGraphicsStatsDir.listFiles()) {
+ for (File pkg : date.listFiles()) {
+ for (File version : pkg.listFiles()) {
+ File data = new File(version, "total");
+ if (skipFiles.contains(data)) {
+ continue;
+ }
+ nAddToDump(dump, data.getAbsolutePath());
}
- return data;
}
}
- return null;
}
@Override
protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
+ boolean dumpProto = false;
+ for (String str : args) {
+ if ("--proto".equals(str)) {
+ dumpProto = true;
+ break;
+ }
+ }
+ ArrayList<HistoricalBuffer> buffers;
synchronized (mLock) {
+ buffers = new ArrayList<>(mActive.size());
for (int i = 0; i < mActive.size(); i++) {
- final ActiveBuffer buffer = mActive.get(i);
- fout.print("Package: ");
- fout.print(buffer.mPackageName);
- fout.flush();
try {
- buffer.mProcessBuffer.readBytes(mTempBuffer, 0, 0, ASHMEM_SIZE);
- ThreadedRenderer.dumpProfileData(mTempBuffer, fd);
- } catch (IOException e) {
- fout.println("Failed to dump");
+ buffers.add(new HistoricalBuffer(mActive.get(i)));
+ } catch (IOException ex) {
+ // Ignore
}
- fout.println();
}
- for (HistoricalData buffer : mHistoricalLog) {
- if (buffer == null) continue;
- fout.print("Package: ");
- fout.print(buffer.mPackageName);
- fout.flush();
- ThreadedRenderer.dumpProfileData(buffer.mBuffer, fd);
- fout.println();
+ }
+ long dump = nCreateDump(fd.getInt$(), dumpProto);
+ try {
+ synchronized (mFileAccessLock) {
+ HashSet<File> skipList = dumpActiveLocked(dump, buffers);
+ buffers.clear();
+ dumpHistoricalLocked(dump, skipList);
}
+ } finally {
+ nFinishDump(dump);
+ }
+ }
+
+ private static native int nGetAshmemSize();
+ private static native long nCreateDump(int outFd, boolean isProto);
+ private static native void nAddToDump(long dump, String path, String packageName,
+ int versionCode, long startTime, long endTime, byte[] data);
+ private static native void nAddToDump(long dump, String path);
+ private static native void nFinishDump(long dump);
+ private static native void nSaveBuffer(String path, String packageName, int versionCode,
+ long startTime, long endTime, byte[] data);
+
+ private final class BufferInfo {
+ final String packageName;
+ final int versionCode;
+ long startTime;
+ long endTime;
+
+ BufferInfo(String packageName, int versionCode, long startTime) {
+ this.packageName = packageName;
+ this.versionCode = versionCode;
+ this.startTime = startTime;
}
}
private final class ActiveBuffer implements DeathRecipient {
+ final BufferInfo mInfo;
final int mUid;
final int mPid;
- final String mPackageName;
+ final IGraphicsStatsCallback mCallback;
final IBinder mToken;
MemoryFile mProcessBuffer;
- HistoricalData mPreviousData;
- ActiveBuffer(IBinder token, int uid, int pid, String packageName)
+ ActiveBuffer(IGraphicsStatsCallback token, int uid, int pid, String packageName, int versionCode)
throws RemoteException, IOException {
+ mInfo = new BufferInfo(packageName, versionCode, System.currentTimeMillis());
mUid = uid;
mPid = pid;
- mPackageName = packageName;
- mToken = token;
+ mCallback = token;
+ mToken = mCallback.asBinder();
mToken.linkToDeath(this, 0);
- mProcessBuffer = new MemoryFile("GFXStats-" + uid, ASHMEM_SIZE);
- mPreviousData = removeHistoricalDataLocked(mUid, mPackageName);
- if (mPreviousData != null) {
- mProcessBuffer.writeBytes(mPreviousData.mBuffer, 0, 0, ASHMEM_SIZE);
- }
+ mProcessBuffer = new MemoryFile("GFXStats-" + pid, ASHMEM_SIZE);
+ mProcessBuffer.writeBytes(ZERO_DATA, 0, 0, ASHMEM_SIZE);
}
@Override
@@ -228,17 +428,13 @@
}
}
- private final static class HistoricalData {
- final byte[] mBuffer = new byte[ASHMEM_SIZE];
- int mUid;
- String mPackageName;
-
- void update(String packageName, int uid, MemoryFile file) {
- mUid = uid;
- mPackageName = packageName;
- try {
- file.readBytes(mBuffer, 0, 0, ASHMEM_SIZE);
- } catch (IOException e) {}
+ private final class HistoricalBuffer {
+ final BufferInfo mInfo;
+ final byte[] mData = new byte[ASHMEM_SIZE];
+ HistoricalBuffer(ActiveBuffer active) throws IOException {
+ mInfo = active.mInfo;
+ mInfo.endTime = System.currentTimeMillis();
+ active.mProcessBuffer.readBytes(mData, 0, 0, ASHMEM_SIZE);
}
}
}
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index dc987fa..b95ed08 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -881,7 +881,7 @@
final class MyPackageMonitor extends PackageMonitor {
/**
- * Set of packages to be monitored.
+ * Package names that are known to contain {@link InputMethodService}.
*
* <p>No need to include packages because of direct-boot unaware IMEs since we always rescan
* all the packages when the user is unlocked, and direct-boot awareness will not be changed
@@ -889,19 +889,40 @@
* rescanning.</p>
*/
@GuardedBy("mMethodMap")
- private ArraySet<String> mPackagesToMonitorComponentChange = new ArraySet<>();
+ final private ArraySet<String> mKnownImePackageNames = new ArraySet<>();
+
+ /**
+ * Packages that are appeared, disappeared, or modified for whatever reason.
+ *
+ * <p>Note: For now we intentionally use {@link ArrayList} instead of {@link ArraySet}
+ * because 1) the number of elements is almost always 1 or so, and 2) we do not care
+ * duplicate elements for our use case.</p>
+ *
+ * <p>This object must be accessed only from callback methods in {@link PackageMonitor},
+ * which should be bound to {@link #getRegisteredHandler()}.</p>
+ */
+ private final ArrayList<String> mChangedPackages = new ArrayList<>();
+
+ /**
+ * {@code true} if one or more packages that contain {@link InputMethodService} appeared.
+ *
+ * <p>This field must be accessed only from callback methods in {@link PackageMonitor},
+ * which should be bound to {@link #getRegisteredHandler()}.</p>
+ */
+ private boolean mImePackageAppeared = false;
@GuardedBy("mMethodMap")
- void clearPackagesToMonitorComponentChangeLocked() {
- mPackagesToMonitorComponentChange.clear();
+ void clearKnownImePackageNamesLocked() {
+ mKnownImePackageNames.clear();
}
@GuardedBy("mMethodMap")
- final void addPackageToMonitorComponentChangeLocked(@NonNull String packageName) {
- mPackagesToMonitorComponentChange.add(packageName);
+ final void addKnownImePackageNameLocked(@NonNull String packageName) {
+ mKnownImePackageNames.add(packageName);
}
- private boolean isChangingPackagesOfCurrentUser() {
+ @GuardedBy("mMethodMap")
+ private boolean isChangingPackagesOfCurrentUserLocked() {
final int userId = getChangingUserId();
final boolean retval = userId == mSettings.getCurrentUserId();
if (DEBUG) {
@@ -914,10 +935,10 @@
@Override
public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) {
- if (!isChangingPackagesOfCurrentUser()) {
- return false;
- }
synchronized (mMethodMap) {
+ if (!isChangingPackagesOfCurrentUserLocked()) {
+ return false;
+ }
String curInputMethodId = mSettings.getSelectedInputMethod();
final int N = mMethodList.size();
if (curInputMethodId != null) {
@@ -942,19 +963,97 @@
}
@Override
- public boolean onPackageChanged(String packageName, int uid, String[] components) {
- // If this package is in the watch list, we want to check it.
- synchronized (mMethodMap) {
- return mPackagesToMonitorComponentChange.contains(packageName);
+ public void onBeginPackageChanges() {
+ clearPackageChangeState();
+ }
+
+ @Override
+ public void onPackageAppeared(String packageName, int reason) {
+ if (!mImePackageAppeared) {
+ final PackageManager pm = mContext.getPackageManager();
+ final List<ResolveInfo> services = pm.queryIntentServicesAsUser(
+ new Intent(InputMethod.SERVICE_INTERFACE).setPackage(packageName),
+ PackageManager.MATCH_DISABLED_COMPONENTS, getChangingUserId());
+ // No need to lock this because we access it only on getRegisteredHandler().
+ if (!services.isEmpty()) {
+ mImePackageAppeared = true;
+ }
+ }
+ // No need to lock this because we access it only on getRegisteredHandler().
+ mChangedPackages.add(packageName);
+ }
+
+ @Override
+ public void onPackageDisappeared(String packageName, int reason) {
+ // No need to lock this because we access it only on getRegisteredHandler().
+ mChangedPackages.add(packageName);
+ }
+
+ @Override
+ public void onPackageModified(String packageName) {
+ // No need to lock this because we access it only on getRegisteredHandler().
+ mChangedPackages.add(packageName);
+ }
+
+ @Override
+ public void onPackagesSuspended(String[] packages) {
+ // No need to lock this because we access it only on getRegisteredHandler().
+ for (String packageName : packages) {
+ mChangedPackages.add(packageName);
}
}
@Override
- public void onSomePackagesChanged() {
- if (!isChangingPackagesOfCurrentUser()) {
- return;
+ public void onPackagesUnsuspended(String[] packages) {
+ // No need to lock this because we access it only on getRegisteredHandler().
+ for (String packageName : packages) {
+ mChangedPackages.add(packageName);
}
+ }
+
+ @Override
+ public void onFinishPackageChanges() {
+ onFinishPackageChangesInternal();
+ clearPackageChangeState();
+ }
+
+ private void clearPackageChangeState() {
+ // No need to lock them because we access these fields only on getRegisteredHandler().
+ mChangedPackages.clear();
+ mImePackageAppeared = false;
+ }
+
+ private boolean shouldRebuildInputMethodListLocked() {
+ // This method is guaranteed to be called only by getRegisteredHandler().
+
+ // If there is any new package that contains at least one IME, then rebuilt the list
+ // of IMEs.
+ if (mImePackageAppeared) {
+ return true;
+ }
+
+ // Otherwise, check if mKnownImePackageNames and mChangedPackages have any intersection.
+ // TODO: Consider to create a utility method to do the following test. List.retainAll()
+ // is an option, but it may still do some extra operations that we do not need here.
+ final int N = mChangedPackages.size();
+ for (int i = 0; i < N; ++i) {
+ final String packageName = mChangedPackages.get(i);
+ if (mKnownImePackageNames.contains(packageName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void onFinishPackageChangesInternal() {
synchronized (mMethodMap) {
+ if (!isChangingPackagesOfCurrentUserLocked()) {
+ return;
+ }
+ if (!shouldRebuildInputMethodListLocked()) {
+ return;
+ }
+
InputMethodInfo curIm = null;
String curInputMethodId = mSettings.getSelectedInputMethod();
final int N = mMethodList.size();
@@ -2032,10 +2131,6 @@
@Override
public void setImeWindowStatus(IBinder token, IBinder startInputToken, int vis,
int backDisposition) {
- if (startInputToken == null) {
- throw new InvalidParameterException("startInputToken cannot be null");
- }
-
if (!calledWithValidToken(token)) {
return;
}
@@ -2043,15 +2138,13 @@
final StartInputInfo info;
synchronized (mMethodMap) {
info = mStartInputMap.get(startInputToken);
- if (info == null) {
- throw new InvalidParameterException("Unknown startInputToken=" + startInputToken);
- }
mImeWindowVis = vis;
mBackDisposition = backDisposition;
updateSystemUiLocked(token, vis, backDisposition);
}
- mWindowManagerInternal.updateInputMethodWindowStatus(info.mImeToken,
- (vis & InputMethodService.IME_VISIBLE) != 0, info.mTargetWindow);
+ mWindowManagerInternal.updateInputMethodWindowStatus(token,
+ (vis & InputMethodService.IME_VISIBLE) != 0,
+ info != null ? info.mTargetWindow : null);
}
private void updateSystemUi(IBinder token, int vis, int backDisposition) {
@@ -3288,7 +3381,7 @@
mMethodList.clear();
mMethodMap.clear();
mMethodMapUpdateCount++;
- mMyPackageMonitor.clearPackagesToMonitorComponentChangeLocked();
+ mMyPackageMonitor.clearKnownImePackageNamesLocked();
// Use for queryIntentServicesAsUser
final PackageManager pm = mContext.getPackageManager();
@@ -3344,10 +3437,9 @@
final int N = allInputMethodServices.size();
for (int i = 0; i < N; ++i) {
final ServiceInfo si = allInputMethodServices.get(i).serviceInfo;
- if (!android.Manifest.permission.BIND_INPUT_METHOD.equals(si.permission)) {
- continue;
+ if (android.Manifest.permission.BIND_INPUT_METHOD.equals(si.permission)) {
+ mMyPackageMonitor.addKnownImePackageNameLocked(si.packageName);
}
- mMyPackageMonitor.addPackageToMonitorComponentChangeLocked(si.packageName);
}
}
diff --git a/services/core/java/com/android/server/IntentResolver.java b/services/core/java/com/android/server/IntentResolver.java
index 14abb53..40499c9 100644
--- a/services/core/java/com/android/server/IntentResolver.java
+++ b/services/core/java/com/android/server/IntentResolver.java
@@ -351,7 +351,7 @@
}
public List<R> queryIntentFromList(Intent intent, String resolvedType, boolean defaultOnly,
- boolean visibleToEphemeral, boolean isEphemeral, ArrayList<F[]> listCut, int userId) {
+ ArrayList<F[]> listCut, int userId) {
ArrayList<R> resultList = new ArrayList<R>();
final boolean debug = localLOGV ||
@@ -361,8 +361,8 @@
final String scheme = intent.getScheme();
int N = listCut.size();
for (int i = 0; i < N; ++i) {
- buildResolveList(intent, categories, debug, defaultOnly, visibleToEphemeral,
- isEphemeral, resolvedType, scheme, listCut.get(i), resultList, userId);
+ buildResolveList(intent, categories, debug, defaultOnly, resolvedType, scheme,
+ listCut.get(i), resultList, userId);
}
filterResults(resultList);
sortResults(resultList);
@@ -370,7 +370,7 @@
}
public List<R> queryIntent(Intent intent, String resolvedType, boolean defaultOnly,
- boolean visibleToEphemeral, boolean isEphemeral, int userId) {
+ int userId) {
String scheme = intent.getScheme();
ArrayList<R> finalList = new ArrayList<R>();
@@ -443,20 +443,20 @@
FastImmutableArraySet<String> categories = getFastIntentCategories(intent);
if (firstTypeCut != null) {
- buildResolveList(intent, categories, debug, defaultOnly, visibleToEphemeral,
- isEphemeral, resolvedType, scheme, firstTypeCut, finalList, userId);
+ buildResolveList(intent, categories, debug, defaultOnly, resolvedType,
+ scheme, firstTypeCut, finalList, userId);
}
if (secondTypeCut != null) {
- buildResolveList(intent, categories, debug, defaultOnly, visibleToEphemeral,
- isEphemeral, resolvedType, scheme, secondTypeCut, finalList, userId);
+ buildResolveList(intent, categories, debug, defaultOnly, resolvedType,
+ scheme, secondTypeCut, finalList, userId);
}
if (thirdTypeCut != null) {
- buildResolveList(intent, categories, debug, defaultOnly, visibleToEphemeral,
- isEphemeral, resolvedType, scheme, thirdTypeCut, finalList, userId);
+ buildResolveList(intent, categories, debug, defaultOnly, resolvedType,
+ scheme, thirdTypeCut, finalList, userId);
}
if (schemeCut != null) {
- buildResolveList(intent, categories, debug, defaultOnly, visibleToEphemeral,
- isEphemeral, resolvedType, scheme, schemeCut, finalList, userId);
+ buildResolveList(intent, categories, debug, defaultOnly, resolvedType,
+ scheme, schemeCut, finalList, userId);
}
filterResults(finalList);
sortResults(finalList);
@@ -694,8 +694,8 @@
}
private void buildResolveList(Intent intent, FastImmutableArraySet<String> categories,
- boolean debug, boolean defaultOnly, boolean visibleToEphemeral, boolean isEphemeral,
- String resolvedType, String scheme, F[] src, List<R> dest, int userId) {
+ boolean debug, boolean defaultOnly, String resolvedType, String scheme,
+ F[] src, List<R> dest, int userId) {
final String action = intent.getAction();
final Uri data = intent.getData();
final String packageName = intent.getPackage();
@@ -735,15 +735,6 @@
continue;
}
- // throw out filters that aren't visible to ephemeral apps
- if (visibleToEphemeral && !filter.isVisibleToEphemeral()) {
- continue;
- }
- // throw out ephemeral filters if we're not explicitly requesting them
- if (!isEphemeral && filter.isEphemeral()) {
- continue;
- }
-
// Are we verified ?
if (filter.getAutoVerify()) {
if (localVerificationLOGV || debug) {
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 42eb958..979096e 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -19,6 +19,8 @@
import android.app.ActivityManager;
import android.annotation.NonNull;
import android.content.pm.PackageManagerInternal;
+import android.util.ArrayMap;
+import android.util.ArraySet;
import com.android.internal.content.PackageMonitor;
import com.android.internal.location.ProviderProperties;
import com.android.internal.location.ProviderRequest;
@@ -103,6 +105,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.Set;
@@ -135,8 +138,6 @@
private static final String FUSED_LOCATION_SERVICE_ACTION =
"com.android.location.service.FusedLocationProvider";
- private static final String GMSCORE_PACKAGE = "com.android.google.gms";
-
private static final int MSG_LOCATION_CHANGED = 1;
private static final long NANOS_PER_MILLI = 1000000L;
@@ -224,7 +225,13 @@
private final ArrayList<LocationProviderProxy> mProxyProviders =
new ArrayList<>();
- private String[] mBackgroundThrottlePackageWhitelist = new String[]{};
+ private final ArraySet<String> mBackgroundThrottlePackageWhitelist = new ArraySet<>();
+
+ private final ArrayMap<IGnssMeasurementsListener, Identity> mGnssMeasurementsListeners =
+ new ArrayMap<>();
+
+ private final ArrayMap<IGnssNavigationMessageListener, Identity>
+ mGnssNavigationMessageListeners = new ArrayMap<>();
// current active user on the device - other users are denied location data
private int mCurrentUserId = UserHandle.USER_SYSTEM;
@@ -316,17 +323,17 @@
boolean foreground = isImportanceForeground(importance);
HashSet<String> affectedProviders = new HashSet<>(mRecordsByProvider.size());
synchronized (mLock) {
- for (Map.Entry<String, ArrayList<UpdateRecord>> entry
+ for (Entry<String, ArrayList<UpdateRecord>> entry
: mRecordsByProvider.entrySet()) {
String provider = entry.getKey();
for (UpdateRecord record : entry.getValue()) {
- if (record.mReceiver.mUid == uid
+ if (record.mReceiver.mIdentity.mUid == uid
&& record.mIsForegroundUid != foreground) {
if (D) Log.d(TAG, "request from uid " + uid + " is now "
+ (foreground ? "foreground" : "background)"));
record.mIsForegroundUid = foreground;
- if (!isThrottlingExemptLocked(record.mReceiver)) {
+ if (!isThrottlingExemptLocked(record.mReceiver.mIdentity)) {
affectedProviders.add(provider);
}
}
@@ -335,6 +342,33 @@
for (String provider : affectedProviders) {
applyRequirementsLocked(provider);
}
+
+ for (Entry<IGnssMeasurementsListener, Identity> entry
+ : mGnssMeasurementsListeners.entrySet()) {
+ if (entry.getValue().mUid == uid) {
+ if (D) Log.d(TAG, "gnss measurements listener from uid " + uid
+ + " is now " + (foreground ? "foreground" : "background)"));
+ if (foreground || isThrottlingExemptLocked(entry.getValue())) {
+ mGnssMeasurementsProvider.addListener(entry.getKey());
+ } else {
+ mGnssMeasurementsProvider.removeListener(entry.getKey());
+ }
+ }
+ }
+
+ for (Entry<IGnssNavigationMessageListener, Identity> entry
+ : mGnssNavigationMessageListeners.entrySet()) {
+ if (entry.getValue().mUid == uid) {
+ if (D) Log.d(TAG, "gnss navigation message listener from uid "
+ + uid + " is now "
+ + (foreground ? "foreground" : "background)"));
+ if (foreground || isThrottlingExemptLocked(entry.getValue())) {
+ mGnssNavigationMessageProvider.addListener(entry.getKey());
+ } else {
+ mGnssNavigationMessageProvider.removeListener(entry.getKey());
+ }
+ }
+ }
}
}
@@ -345,6 +379,8 @@
mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
updateUserProfiles(mCurrentUserId);
+ updateBackgroundThrottlingWhitelistLocked();
+
// prepare providers
loadProvidersLocked();
updateProvidersLocked();
@@ -380,14 +416,7 @@
@Override
public void onChange(boolean selfChange) {
synchronized (mLock) {
- String setting = Settings.Global.getString(
- mContext.getContentResolver(),
- Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST);
- if (setting == null) {
- setting = "";
- }
-
- mBackgroundThrottlePackageWhitelist = setting.split(",");
+ updateBackgroundThrottlingWhitelistLocked();
updateProvidersLocked();
}
}
@@ -727,14 +756,24 @@
}
}
+ private static final class Identity {
+ final int mUid;
+ final int mPid;
+ final String mPackageName;
+
+ Identity(int uid, int pid, String packageName) {
+ mUid = uid;
+ mPid = pid;
+ mPackageName = packageName;
+ }
+ }
+
/**
* A wrapper class holding either an ILocationListener or a PendingIntent to receive
* location updates.
*/
private final class Receiver implements IBinder.DeathRecipient, PendingIntent.OnFinished {
- final int mUid; // uid of receiver
- final int mPid; // pid of receiver
- final String mPackageName; // package name of receiver
+ final Identity mIdentity;
final int mAllowedResolutionLevel; // resolution level allowed to receiver
final ILocationListener mListener;
@@ -762,9 +801,7 @@
mKey = intent;
}
mAllowedResolutionLevel = getAllowedResolutionLevel(pid, uid);
- mUid = uid;
- mPid = pid;
- mPackageName = packageName;
+ mIdentity = new Identity(uid, pid, packageName);
if (workSource != null && workSource.size() <= 0) {
workSource = null;
}
@@ -776,7 +813,7 @@
// construct/configure wakelock
mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY);
if (workSource == null) {
- workSource = new WorkSource(mUid, mPackageName);
+ workSource = new WorkSource(mIdentity.mUid, mIdentity.mPackageName);
}
mWakeLock.setWorkSource(workSource);
}
@@ -871,13 +908,14 @@
int op) {
if (!currentlyMonitoring) {
if (allowMonitoring) {
- return mAppOps.startOpNoThrow(op, mUid, mPackageName)
+ return mAppOps.startOpNoThrow(op, mIdentity.mUid, mIdentity.mPackageName)
== AppOpsManager.MODE_ALLOWED;
}
} else {
- if (!allowMonitoring || mAppOps.checkOpNoThrow(op, mUid, mPackageName)
+ if (!allowMonitoring
+ || mAppOps.checkOpNoThrow(op, mIdentity.mUid, mIdentity.mPackageName)
!= AppOpsManager.MODE_ALLOWED) {
- mAppOps.finishOp(op, mUid, mPackageName);
+ mAppOps.finishOp(op, mIdentity.mUid, mIdentity.mPackageName);
return false;
}
}
@@ -1634,7 +1672,7 @@
ArrayList<UpdateRecord> records = mRecordsByProvider.get(provider);
if (records != null) {
for (UpdateRecord record : records) {
- if (isCurrentProfile(UserHandle.getUserId(record.mReceiver.mUid))) {
+ if (isCurrentProfile(UserHandle.getUserId(record.mReceiver.mIdentity.mUid))) {
// Sends a notification message to the receiver
if (!record.mReceiver.callProviderEnabledLocked(provider, enabled)) {
if (deadReceivers == null) {
@@ -1679,16 +1717,16 @@
if (records != null) {
for (UpdateRecord record : records) {
- if (isCurrentProfile(UserHandle.getUserId(record.mReceiver.mUid))) {
+ if (isCurrentProfile(UserHandle.getUserId(record.mReceiver.mIdentity.mUid))) {
if (checkLocationAccess(
- record.mReceiver.mPid,
- record.mReceiver.mUid,
- record.mReceiver.mPackageName,
+ record.mReceiver.mIdentity.mPid,
+ record.mReceiver.mIdentity.mUid,
+ record.mReceiver.mIdentity.mPackageName,
record.mReceiver.mAllowedResolutionLevel)) {
LocationRequest locationRequest = record.mRequest;
long interval = locationRequest.getInterval();
- if (!isThrottlingExemptLocked(record.mReceiver)) {
+ if (!isThrottlingExemptLocked(record.mReceiver.mIdentity)) {
if (!record.mIsForegroundUid) {
interval = Math.max(interval, backgroundThrottleInterval);
}
@@ -1715,7 +1753,7 @@
// under that threshold.
long thresholdInterval = (providerRequest.interval + 1000) * 3 / 2;
for (UpdateRecord record : records) {
- if (isCurrentProfile(UserHandle.getUserId(record.mReceiver.mUid))) {
+ if (isCurrentProfile(UserHandle.getUserId(record.mReceiver.mIdentity.mUid))) {
LocationRequest locationRequest = record.mRequest;
// Don't assign battery blame for update records whose
@@ -1734,8 +1772,8 @@
} else {
// Assign blame to caller.
worksource.add(
- record.mReceiver.mUid,
- record.mReceiver.mPackageName);
+ record.mReceiver.mIdentity.mUid,
+ record.mReceiver.mIdentity.mPackageName);
}
}
}
@@ -1747,23 +1785,40 @@
p.setRequest(providerRequest, worksource);
}
- private boolean isThrottlingExemptLocked(Receiver receiver) {
- if (receiver.mUid == Process.SYSTEM_UID) {
+ @Override
+ public String[] getBackgroundThrottlingWhitelist() {
+ synchronized (mLock) {
+ return mBackgroundThrottlePackageWhitelist.toArray(
+ new String[mBackgroundThrottlePackageWhitelist.size()]);
+ }
+ }
+
+ private void updateBackgroundThrottlingWhitelistLocked() {
+ String setting = Settings.Global.getString(
+ mContext.getContentResolver(),
+ Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST);
+ if (setting == null) {
+ setting = "";
+ }
+
+ mBackgroundThrottlePackageWhitelist.clear();
+ mBackgroundThrottlePackageWhitelist.addAll(
+ SystemConfig.getInstance().getAllowUnthrottledLocation());
+ mBackgroundThrottlePackageWhitelist.addAll(
+ Arrays.asList(setting.split(",")));
+ }
+
+ private boolean isThrottlingExemptLocked(Identity identity) {
+ if (identity.mUid == Process.SYSTEM_UID) {
return true;
}
- if (receiver.mPackageName.equals(GMSCORE_PACKAGE)) {
+ if (mBackgroundThrottlePackageWhitelist.contains(identity.mPackageName)) {
return true;
}
for (LocationProviderProxy provider : mProxyProviders) {
- if (receiver.mPackageName.equals(provider.getConnectedPackageName())) {
- return true;
- }
- }
-
- for (String whitelistedPackage : mBackgroundThrottlePackageWhitelist) {
- if (receiver.mPackageName.equals(whitelistedPackage)) {
+ if (identity.mPackageName.equals(provider.getConnectedPackageName())) {
return true;
}
}
@@ -1787,7 +1842,7 @@
mRequest = request;
mReceiver = receiver;
mIsForegroundUid = isImportanceForeground(
- mActivityManager.getPackageImportance(mReceiver.mPackageName));
+ mActivityManager.getPackageImportance(mReceiver.mIdentity.mPackageName));
ArrayList<UpdateRecord> records = mRecordsByProvider.get(provider);
if (records == null) {
@@ -1800,14 +1855,14 @@
// Update statistics for historical location requests by package/provider
mRequestStatistics.startRequesting(
- mReceiver.mPackageName, provider, request.getInterval());
+ mReceiver.mIdentity.mPackageName, provider, request.getInterval());
}
/**
* Method to be called when a record will no longer be used.
*/
void disposeLocked(boolean removeReceiver) {
- mRequestStatistics.stopRequesting(mReceiver.mPackageName, mProvider);
+ mRequestStatistics.stopRequesting(mReceiver.mIdentity.mPackageName, mProvider);
// remove from mRecordsByProvider
ArrayList<UpdateRecord> globalRecords = mRecordsByProvider.get(this.mProvider);
@@ -1831,8 +1886,8 @@
@Override
public String toString() {
- return "UpdateRecord[" + mProvider + " " + mReceiver.mPackageName
- + "(" + mReceiver.mUid + (mIsForegroundUid ? " foreground" : " background")
+ return "UpdateRecord[" + mProvider + " " + mReceiver.mIdentity.mPackageName
+ + "(" + mReceiver.mIdentity.mUid + (mIsForegroundUid ? " foreground" : " background")
+ ")" + " " + mRequest + "]";
}
}
@@ -1991,7 +2046,8 @@
if (D) Log.d(TAG, "request " + Integer.toHexString(System.identityHashCode(receiver))
+ " " + name + " " + request + " from " + packageName + "(" + uid + " "
+ (record.mIsForegroundUid ? "foreground" : "background")
- + (isThrottlingExemptLocked(receiver) ? " [whitelisted]" : "") + ")");
+ + (isThrottlingExemptLocked(receiver.mIdentity)
+ ? " [whitelisted]" : "") + ")");
UpdateRecord oldRecord = receiver.mUpdateRecords.put(name, record);
if (oldRecord != null) {
@@ -2224,13 +2280,33 @@
if (!hasGnssPermissions(packageName) || mGnssMeasurementsProvider == null) {
return false;
}
- return mGnssMeasurementsProvider.addListener(listener);
+
+ synchronized (mLock) {
+ Identity callerIdentity
+ = new Identity(Binder.getCallingUid(), Binder.getCallingPid(), packageName);
+ mGnssMeasurementsListeners.put(listener, callerIdentity);
+ long identity = Binder.clearCallingIdentity();
+ try {
+ if (isThrottlingExemptLocked(callerIdentity)
+ || isImportanceForeground(
+ mActivityManager.getPackageImportance(packageName))) {
+ return mGnssMeasurementsProvider.addListener(listener);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+
+ return true;
+ }
}
@Override
public void removeGnssMeasurementsListener(IGnssMeasurementsListener listener) {
if (mGnssMeasurementsProvider != null) {
- mGnssMeasurementsProvider.removeListener(listener);
+ synchronized (mLock) {
+ mGnssMeasurementsListeners.remove(listener);
+ mGnssMeasurementsProvider.removeListener(listener);
+ }
}
}
@@ -2241,13 +2317,33 @@
if (!hasGnssPermissions(packageName) || mGnssNavigationMessageProvider == null) {
return false;
}
- return mGnssNavigationMessageProvider.addListener(listener);
+
+ synchronized (mLock) {
+ Identity callerIdentity
+ = new Identity(Binder.getCallingUid(), Binder.getCallingPid(), packageName);
+ mGnssNavigationMessageListeners.put(listener, callerIdentity);
+ long identity = Binder.clearCallingIdentity();
+ try {
+ if (isThrottlingExemptLocked(callerIdentity)
+ || isImportanceForeground(
+ mActivityManager.getPackageImportance(packageName))) {
+ return mGnssNavigationMessageProvider.addListener(listener);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+
+ return true;
+ }
}
@Override
public void removeGnssNavigationMessageListener(IGnssNavigationMessageListener listener) {
if (mGnssNavigationMessageProvider != null) {
- mGnssNavigationMessageProvider.removeListener(listener);
+ synchronized (mLock) {
+ mGnssNavigationMessageListeners.remove(listener);
+ mGnssNavigationMessageProvider.removeListener(listener);
+ }
}
}
@@ -2526,26 +2622,30 @@
Receiver receiver = r.mReceiver;
boolean receiverDead = false;
- int receiverUserId = UserHandle.getUserId(receiver.mUid);
- if (!isCurrentProfile(receiverUserId) && !isUidALocationProvider(receiver.mUid)) {
+ int receiverUserId = UserHandle.getUserId(receiver.mIdentity.mUid);
+ if (!isCurrentProfile(receiverUserId)
+ && !isUidALocationProvider(receiver.mIdentity.mUid)) {
if (D) {
Log.d(TAG, "skipping loc update for background user " + receiverUserId +
" (current user: " + mCurrentUserId + ", app: " +
- receiver.mPackageName + ")");
+ receiver.mIdentity.mPackageName + ")");
}
continue;
}
- if (mBlacklist.isBlacklisted(receiver.mPackageName)) {
+ if (mBlacklist.isBlacklisted(receiver.mIdentity.mPackageName)) {
if (D) Log.d(TAG, "skipping loc update for blacklisted app: " +
- receiver.mPackageName);
+ receiver.mIdentity.mPackageName);
continue;
}
- if (!reportLocationAccessNoThrow(receiver.mPid, receiver.mUid, receiver.mPackageName,
+ if (!reportLocationAccessNoThrow(
+ receiver.mIdentity.mPid,
+ receiver.mIdentity.mUid,
+ receiver.mIdentity.mPackageName,
receiver.mAllowedResolutionLevel)) {
if (D) Log.d(TAG, "skipping loc update for no op app: " +
- receiver.mPackageName);
+ receiver.mIdentity.mPackageName);
continue;
}
@@ -2668,7 +2768,7 @@
ArrayList<Receiver> deadReceivers = null;
for (Receiver receiver : mReceivers.values()) {
- if (receiver.mPackageName.equals(packageName)) {
+ if (receiver.mIdentity.mPackageName.equals(packageName)) {
if (deadReceivers == null) {
deadReceivers = new ArrayList<>();
}
@@ -2999,6 +3099,13 @@
}
}
+ if (!mBackgroundThrottlePackageWhitelist.isEmpty()) {
+ pw.println(" Throttling Whitelisted Packages:");
+ for (String packageName : mBackgroundThrottlePackageWhitelist) {
+ pw.println(" " + packageName);
+ }
+ }
+
pw.append(" fudger: ");
mLocationFudger.dump(fd, pw, args);
diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java
index a073d8e..f76ddc7 100644
--- a/services/core/java/com/android/server/LockSettingsService.java
+++ b/services/core/java/com/android/server/LockSettingsService.java
@@ -20,6 +20,8 @@
import static android.Manifest.permission.READ_CONTACTS;
import static android.content.Context.KEYGUARD_SERVICE;
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;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
@@ -61,6 +63,7 @@
import android.provider.Settings;
import android.provider.Settings.Secure;
import android.provider.Settings.SettingNotFoundException;
+import android.security.GateKeeper;
import android.security.KeyStore;
import android.security.keystore.AndroidKeyStoreProvider;
import android.security.keystore.KeyProperties;
@@ -79,6 +82,8 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.VerifyCredentialResponse;
import com.android.server.LockSettingsStorage.CredentialHash;
+import com.android.server.SyntheticPasswordManager.AuthenticationResult;
+import com.android.server.SyntheticPasswordManager.AuthenticationToken;
import libcore.util.HexEncoding;
@@ -86,6 +91,7 @@
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
@@ -145,12 +151,14 @@
private boolean mFirstCallToVold;
protected IGateKeeperService mGateKeeperService;
+ private SyntheticPasswordManager mSpManager;
+
/**
* The UIDs that are used for system credential storage in keystore.
*/
private static final int[] SYSTEM_CREDENTIAL_UIDS = {
Process.WIFI_UID, Process.VPN_UID,
- Process.ROOT_UID, Process.SYSTEM_UID };
+ Process.ROOT_UID };
// This class manages life cycle events for encrypted users on File Based Encryption (FBE)
// devices. The most basic of these is to show/hide notifications about missing features until
@@ -335,6 +343,14 @@
}
return null;
}
+
+ public SyntheticPasswordManager getSyntheticPasswordManager(LockSettingsStorage storage) {
+ return new SyntheticPasswordManager(storage);
+ }
+
+ public int binderGetCallingUid() {
+ return Binder.getCallingUid();
+ }
}
public LockSettingsService(Context context) {
@@ -365,6 +381,8 @@
mUserManager = injector.getUserManager();
mStrongAuthTracker = injector.getStrongAuthTracker();
mStrongAuthTracker.register(mStrongAuth);
+
+ mSpManager = injector.getSyntheticPasswordManager(mStorage);
}
/**
@@ -801,17 +819,42 @@
@Override
public boolean havePassword(int userId) throws RemoteException {
+ synchronized (mSpManager) {
+ if (isSyntheticPasswordBasedCredentialLocked(userId)) {
+ long handle = getSyntheticPasswordHandleLocked(userId);
+ return mSpManager.getCredentialType(handle, userId) ==
+ LockPatternUtils.CREDENTIAL_TYPE_PASSWORD;
+ }
+ }
// Do we need a permissions check here?
return mStorage.hasPassword(userId);
}
@Override
public boolean havePattern(int userId) throws RemoteException {
+ synchronized (mSpManager) {
+ if (isSyntheticPasswordBasedCredentialLocked(userId)) {
+ long handle = getSyntheticPasswordHandleLocked(userId);
+ return mSpManager.getCredentialType(handle, userId) ==
+ LockPatternUtils.CREDENTIAL_TYPE_PATTERN;
+ }
+ }
// Do we need a permissions check here?
return mStorage.hasPattern(userId);
}
private boolean isUserSecure(int userId) {
+ synchronized (mSpManager) {
+ try {
+ if (isSyntheticPasswordBasedCredentialLocked(userId)) {
+ long handle = getSyntheticPasswordHandleLocked(userId);
+ return mSpManager.getCredentialType(handle, userId) !=
+ LockPatternUtils.CREDENTIAL_TYPE_NONE;
+ }
+ } catch (RemoteException e) {
+ // fall through
+ }
+ }
return mStorage.hasCredential(userId);
}
@@ -1021,6 +1064,21 @@
private void setLockCredentialInternal(String credential, int credentialType,
String savedCredential, int userId) throws RemoteException {
+ // Normalize savedCredential and credential such that empty string is always represented
+ // as null.
+ if (TextUtils.isEmpty(savedCredential)) {
+ savedCredential = null;
+ }
+ if (TextUtils.isEmpty(credential)) {
+ credential = null;
+ }
+ synchronized (mSpManager) {
+ if (isSyntheticPasswordBasedCredentialLocked(userId)) {
+ spBasedSetLockCredentialInternalLocked(credential, credentialType, savedCredential,
+ userId);
+ return;
+ }
+ }
if (credentialType == LockPatternUtils.CREDENTIAL_TYPE_NONE) {
if (credential != null) {
Slog.wtf(TAG, "CredentialType is none, but credential is non-null.");
@@ -1061,7 +1119,16 @@
savedCredential = null;
}
}
-
+ synchronized (mSpManager) {
+ if (shouldMigrateToSyntheticPasswordLocked(userId)) {
+ initializeSyntheticPasswordLocked(currentHandle.hash, savedCredential,
+ currentHandle.type, userId);
+ spBasedSetLockCredentialInternalLocked(credential, credentialType, savedCredential,
+ userId);
+ return;
+ }
+ }
+ if (DEBUG) Slog.d(TAG, "setLockCredentialInternal: user=" + userId);
byte[] enrolledHandle = enrollCredential(currentHandle.hash, savedCredential, credential,
userId);
if (enrolledHandle != null) {
@@ -1189,6 +1256,11 @@
return hash;
}
+ private void setAuthlessUserKeyProtection(int userId, byte[] key) throws RemoteException {
+ if (DEBUG) Slog.d(TAG, "setAuthlessUserKeyProtectiond: user=" + userId);
+ addUserKeyAuth(userId, null, key);
+ }
+
private void setUserKeyProtection(int userId, String credential, VerifyCredentialResponse vcr)
throws RemoteException {
if (DEBUG) Slog.d(TAG, "setUserKeyProtection: user=" + userId);
@@ -1320,7 +1392,16 @@
if (TextUtils.isEmpty(credential)) {
throw new IllegalArgumentException("Credential can't be null or empty");
}
-
+ synchronized (mSpManager) {
+ if (isSyntheticPasswordBasedCredentialLocked(userId)) {
+ VerifyCredentialResponse response = spBasedDoVerifyCredentialLocked(credential,
+ credentialType, hasChallenge, challenge, userId, progressCallback);
+ if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) {
+ mStrongAuth.reportSuccessfulStrongAuthUnlock(userId);
+ }
+ return response;
+ }
+ }
CredentialHash storedHash = mStorage.readCredentialHash(userId);
if (storedHash.type != credentialType) {
Slog.wtf(TAG, "doVerifyCredential type mismatch with stored credential??"
@@ -1456,8 +1537,8 @@
notifyActivePasswordMetricsAvailable(credential, userId);
unlockKeystore(credential, userId);
- Slog.i(TAG, "Unlocking user " + userId +
- " with token length " + response.getPayload().length);
+ Slog.i(TAG, "Unlocking user " + userId + " with token length "
+ + response.getPayload().length);
unlockUser(userId, response.getPayload(), secretFromCredential(credential));
if (isManagedProfileWithSeparatedLock(userId)) {
@@ -1467,6 +1548,15 @@
}
if (shouldReEnroll) {
setLockCredentialInternal(credential, storedHash.type, credential, userId);
+ } else {
+ // Now that we've cleared of all required GK migration, let's do the final
+ // migration to synthetic password.
+ synchronized (mSpManager) {
+ if (shouldMigrateToSyntheticPasswordLocked(userId)) {
+ initializeSyntheticPasswordLocked(storedHash.hash, credential,
+ storedHash.type, userId);
+ }
+ }
}
} else if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_RETRY) {
if (response.getTimeout() > 0) {
@@ -1697,7 +1787,7 @@
}
}
- private synchronized IGateKeeperService getGateKeeperService()
+ protected synchronized IGateKeeperService getGateKeeperService()
throws RemoteException {
if (mGateKeeperService != null) {
return mGateKeeperService;
@@ -1713,4 +1803,431 @@
Slog.e(TAG, "Unable to acquire GateKeeperService");
return null;
}
+
+ /**
+ * Precondition: vold and keystore unlocked.
+ *
+ * Create new synthetic password, set up synthetic password blob protected by the supplied
+ * user credential, and make the newly-created SP blob active.
+ *
+ * The invariant under a synthetic password is:
+ * 1. If user credential exists, then both vold and keystore and protected with keys derived
+ * from the synthetic password.
+ * 2. If user credential does not exist, vold and keystore protection are cleared. This is to
+ * make it consistent with current behaviour. It also allows ActivityManager to call
+ * unlockUser() with empty secret.
+ * 3. Once a user is migrated to have synthetic password, its value will never change, no matter
+ * whether the user changes his lockscreen PIN or clear/reset it. When the user clears its
+ * lockscreen PIN, we still maintain the existing synthetic password in a password blob
+ * protected by a default PIN. The only exception is when the DPC performs an untrusted
+ * credential change, in which case we have no way to derive the existing synthetic password
+ * and has to create a new one.
+ * 4. The user SID is linked with synthetic password, but its cleared/re-created when the user
+ * clears/re-creates his lockscreen PIN.
+ *
+ *
+ * Different cases of calling this method:
+ * 1. credentialHash != null
+ * This implies credential != null, a new SP blob will be provisioned, and existing SID
+ * migrated to associate with the new SP.
+ * This happens during a normal migration case when the user currently has password.
+ *
+ * 2. credentialhash == null and credential == null
+ * A new SP blob and a new SID will be created, while the user has no credentials.
+ * This can happens when we are activating an escrow token on a unsecured device, during
+ * which we want to create the SP structure with an empty user credential.
+ *
+ * 3. credentialhash == null and credential != null
+ * This is the untrusted credential reset, OR the user sets a new lockscreen password
+ * FOR THE FIRST TIME on a SP-enabled device. New credential and new SID will be created
+ */
+ private AuthenticationToken initializeSyntheticPasswordLocked(byte[] credentialHash,
+ String credential, int credentialType, int userId) throws RemoteException {
+ Slog.i(TAG, "Initialize SyntheticPassword for user: " + userId);
+ AuthenticationToken auth = mSpManager.newSyntheticPasswordAndSid(getGateKeeperService(),
+ credentialHash, credential, userId);
+ if (auth == null) {
+ Slog.wtf(TAG, "initializeSyntheticPasswordLocked returns null auth token");
+ return null;
+ }
+ long handle = mSpManager.createPasswordBasedSyntheticPassword(getGateKeeperService(),
+ credential, credentialType, auth, userId);
+ if (credential != null) {
+ if (credentialHash == null) {
+ // Since when initializing SP, we didn't provide an existing password handle
+ // for it to migrate SID, we need to create a new SID for the user.
+ mSpManager.newSidForUser(getGateKeeperService(), auth, userId);
+ }
+ mSpManager.verifyChallenge(getGateKeeperService(), auth, 0L, userId);
+ setAuthlessUserKeyProtection(userId, auth.deriveDiskEncryptionKey());
+ setKeystorePassword(auth.deriveKeyStorePassword(), userId);
+ } else {
+ clearUserKeyProtection(userId);
+ setKeystorePassword(null, userId);
+ getGateKeeperService().clearSecureUserId(userId);
+ }
+ fixateNewestUserKeyAuth(userId);
+ setLong(SYNTHETIC_PASSWORD_HANDLE_KEY, handle, userId);
+ return auth;
+ }
+
+ private long getSyntheticPasswordHandleLocked(int userId) {
+ try {
+ return getLong(SYNTHETIC_PASSWORD_HANDLE_KEY, 0, userId);
+ } catch (RemoteException e) {
+ return SyntheticPasswordManager.DEFAULT_HANDLE;
+ }
+ }
+
+ private boolean isSyntheticPasswordBasedCredentialLocked(int userId) throws RemoteException {
+ long handle = getSyntheticPasswordHandleLocked(userId);
+ // This is a global setting
+ long enabled = getLong(SYNTHETIC_PASSWORD_ENABLED_KEY, 0, UserHandle.USER_SYSTEM);
+ return enabled != 0 && handle != SyntheticPasswordManager.DEFAULT_HANDLE;
+ }
+
+ private boolean shouldMigrateToSyntheticPasswordLocked(int userId) throws RemoteException {
+ long handle = getSyntheticPasswordHandleLocked(userId);
+ // This is a global setting
+ long enabled = getLong(SYNTHETIC_PASSWORD_ENABLED_KEY, 0, UserHandle.USER_SYSTEM);
+ return enabled != 0 && handle == SyntheticPasswordManager.DEFAULT_HANDLE;
+ }
+
+ private void enableSyntheticPasswordLocked() throws RemoteException {
+ setLong(SYNTHETIC_PASSWORD_ENABLED_KEY, 1, UserHandle.USER_SYSTEM);
+ }
+
+ private VerifyCredentialResponse spBasedDoVerifyCredentialLocked(String userCredential, int
+ credentialType, boolean hasChallenge, long challenge, int userId,
+ ICheckCredentialProgressCallback progressCallback) throws RemoteException {
+ if (DEBUG) Slog.d(TAG, "spBasedDoVerifyCredentialLocked: user=" + userId);
+ if (credentialType == LockPatternUtils.CREDENTIAL_TYPE_NONE) {
+ userCredential = null;
+ }
+ long handle = getSyntheticPasswordHandleLocked(userId);
+ AuthenticationResult authResult = mSpManager.unwrapPasswordBasedSyntheticPassword(
+ getGateKeeperService(), handle, userCredential, userId);
+
+ VerifyCredentialResponse response = authResult.gkResponse;
+ if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) {
+ // credential has matched
+ // perform verifyChallenge with synthetic password which generates the real auth
+ // token for the current user
+ response = mSpManager.verifyChallenge(getGateKeeperService(), authResult.authToken,
+ challenge, userId);
+ if (response.getResponseCode() != VerifyCredentialResponse.RESPONSE_OK) {
+ Slog.wtf(TAG, "verifyChallenge with SP failed.");
+ return VerifyCredentialResponse.ERROR;
+ }
+ if (progressCallback != null) {
+ progressCallback.onCredentialVerified();
+ }
+ notifyActivePasswordMetricsAvailable(userCredential, userId);
+ unlockKeystore(authResult.authToken.deriveKeyStorePassword(), userId);
+
+ final byte[] secret = authResult.authToken.deriveDiskEncryptionKey();
+ Slog.i(TAG, "Unlocking user " + userId + " with secret only, length " + secret.length);
+ unlockUser(userId, null, secret);
+
+ if (isManagedProfileWithSeparatedLock(userId)) {
+ TrustManager trustManager =
+ (TrustManager) mContext.getSystemService(Context.TRUST_SERVICE);
+ trustManager.setDeviceLockedForUser(userId, false);
+ }
+ activateEscrowTokens(authResult.authToken, userId);
+ } else if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_RETRY) {
+ if (response.getTimeout() > 0) {
+ requireStrongAuth(STRONG_AUTH_REQUIRED_AFTER_LOCKOUT, userId);
+ }
+ }
+
+ return response;
+ }
+
+ /**
+ * Change the user's lockscreen password by creating a new SP blob and update the handle, based
+ * on an existing authentication token. Even though a new SP blob is created, the underlying
+ * synthetic password is never changed.
+ *
+ * When clearing credential, we keep the SP unchanged, but clear its password handle so its
+ * SID is gone. We also clear password from (software-based) keystore and vold, which will be
+ * added back when new password is set in future.
+ */
+ private long setLockCredentialWithAuthTokenLocked(String credential, int credentialType,
+ AuthenticationToken auth, int userId) throws RemoteException {
+ if (DEBUG) Slog.d(TAG, "setLockCredentialWithAuthTokenLocked: user=" + userId);
+ long newHandle = mSpManager.createPasswordBasedSyntheticPassword(getGateKeeperService(),
+ credential, credentialType, auth, userId);
+ final Map<Integer, String> profilePasswords;
+ if (credential != null) {
+ // // not needed by synchronizeUnifiedWorkChallengeForProfiles()
+ profilePasswords = null;
+
+ if (mSpManager.hasSidForUser(userId)) {
+ // We are changing password of a secured device, nothing more needed as
+ // createPasswordBasedSyntheticPassword has already taken care of maintaining
+ // the password handle and SID unchanged.
+
+ //refresh auth token
+ mSpManager.verifyChallenge(getGateKeeperService(), auth, 0L, userId);
+ } else {
+ // A new password is set on a previously-unsecured device, we need to generate
+ // a new SID, and re-add keys to vold and keystore.
+ mSpManager.newSidForUser(getGateKeeperService(), auth, userId);
+ mSpManager.verifyChallenge(getGateKeeperService(), auth, 0L, userId);
+ setAuthlessUserKeyProtection(userId, auth.deriveDiskEncryptionKey());
+ fixateNewestUserKeyAuth(userId);
+ setKeystorePassword(auth.deriveKeyStorePassword(), userId);
+ }
+ } else {
+ // Cache all profile password if they use unified work challenge. This will later be
+ // used to clear the profile's password in synchronizeUnifiedWorkChallengeForProfiles()
+ profilePasswords = getDecryptedPasswordsForAllTiedProfiles(userId);
+
+ // we are clearing password of a secured device, so need to nuke SID as well.
+ mSpManager.clearSidForUser(userId);
+ getGateKeeperService().clearSecureUserId(userId);
+ // Clear key from vold so ActivityManager can just unlock the user with empty secret
+ // during boot.
+ clearUserKeyProtection(userId);
+ fixateNewestUserKeyAuth(userId);
+ setKeystorePassword(null, userId);
+ }
+ setLong(SYNTHETIC_PASSWORD_HANDLE_KEY, newHandle, userId);
+ synchronizeUnifiedWorkChallengeForProfiles(userId, profilePasswords);
+ return newHandle;
+ }
+
+ private void spBasedSetLockCredentialInternalLocked(String credential, int credentialType,
+ String savedCredential, int userId) throws RemoteException {
+ if (DEBUG) Slog.d(TAG, "spBasedSetLockCredentialInternalLocked: user=" + userId);
+ if (isManagedProfileWithUnifiedLock(userId)) {
+ // get credential from keystore when managed profile has unified lock
+ try {
+ savedCredential = getDecryptedPasswordForTiedProfile(userId);
+ } catch (FileNotFoundException e) {
+ Slog.i(TAG, "Child profile key not found");
+ } catch (UnrecoverableKeyException | InvalidKeyException | KeyStoreException
+ | NoSuchAlgorithmException | NoSuchPaddingException
+ | InvalidAlgorithmParameterException | IllegalBlockSizeException
+ | BadPaddingException | CertificateException | IOException e) {
+ Slog.e(TAG, "Failed to decrypt child profile key", e);
+ }
+ }
+ long handle = getSyntheticPasswordHandleLocked(userId);
+ AuthenticationToken auth = mSpManager.unwrapPasswordBasedSyntheticPassword(
+ getGateKeeperService(), handle, savedCredential, userId).authToken;
+ if (auth != null) {
+ // We are performing a trusted credential change i.e. a correct existing credential
+ // is provided
+ setLockCredentialWithAuthTokenLocked(credential, credentialType, auth, userId);
+ mSpManager.destroyPasswordBasedSyntheticPassword(handle, userId);
+ } else {
+ // We are performing an untrusted credential change i.e. by DevicePolicyManager.
+ // So provision a new SP and SID. This would invalidate existing escrow tokens.
+ // Still support this for now but this flow will be removed in the next release.
+
+ Slog.w(TAG, "Untrusted credential change invoked");
+ initializeSyntheticPasswordLocked(null, credential, credentialType, userId);
+ synchronizeUnifiedWorkChallengeForProfiles(userId, null);
+ mSpManager.destroyPasswordBasedSyntheticPassword(handle, userId);
+ }
+ notifyActivePasswordMetricsAvailable(credential, userId);
+
+ }
+
+ @Override
+ public long addEscrowToken(byte[] token, int userId) throws RemoteException {
+ ensureCallerSystemUid();
+ if (DEBUG) Slog.d(TAG, "addEscrowToken: user=" + userId);
+ synchronized (mSpManager) {
+ enableSyntheticPasswordLocked();
+ // Migrate to synthetic password based credentials if ther user has no password,
+ // the token can then be activated immediately.
+ AuthenticationToken auth = null;
+ if (!isUserSecure(userId)) {
+ if (shouldMigrateToSyntheticPasswordLocked(userId)) {
+ auth = initializeSyntheticPasswordLocked(null, null,
+ LockPatternUtils.CREDENTIAL_TYPE_NONE, userId);
+ } else /* isSyntheticPasswordBasedCredentialLocked(userId) */ {
+ long pwdHandle = getSyntheticPasswordHandleLocked(userId);
+ auth = mSpManager.unwrapPasswordBasedSyntheticPassword(getGateKeeperService(),
+ pwdHandle, null, userId).authToken;
+ }
+ }
+ disableEscrowTokenOnNonManagedDevicesIfNeeded(userId);
+ if (!mSpManager.hasEscrowData(userId)) {
+ throw new SecurityException("Escrow token is disabled on the current user");
+ }
+ long handle = mSpManager.createTokenBasedSyntheticPassword(token, userId);
+ if (auth != null) {
+ mSpManager.activateTokenBasedSyntheticPassword(handle, auth, userId);
+ }
+ return handle;
+ }
+ }
+
+ private void activateEscrowTokens(AuthenticationToken auth, int userId) throws RemoteException {
+ if (DEBUG) Slog.d(TAG, "activateEscrowTokens: user=" + userId);
+ synchronized (mSpManager) {
+ for (long handle : mSpManager.getPendingTokensForUser(userId)) {
+ Slog.i(TAG, String.format("activateEscrowTokens: %x %d ", handle, userId));
+ mSpManager.activateTokenBasedSyntheticPassword(handle, auth, userId);
+ }
+ }
+ }
+
+ @Override
+ public boolean isEscrowTokenActive(long handle, int userId) throws RemoteException {
+ ensureCallerSystemUid();
+ synchronized (mSpManager) {
+ return mSpManager.existsHandle(handle, userId);
+ }
+ }
+
+ @Override
+ public boolean removeEscrowToken(long handle, int userId) throws RemoteException {
+ ensureCallerSystemUid();
+ synchronized (mSpManager) {
+ if (handle == getSyntheticPasswordHandleLocked(userId)) {
+ Slog.w(TAG, "Cannot remove password handle");
+ return false;
+ }
+ if (mSpManager.removePendingToken(handle, userId)) {
+ return true;
+ }
+ if (mSpManager.existsHandle(handle, userId)) {
+ mSpManager.destroyTokenBasedSyntheticPassword(handle, userId);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+
+ @Override
+ public boolean setLockCredentialWithToken(String credential, int type, long tokenHandle,
+ byte[] token, int userId) throws RemoteException {
+ ensureCallerSystemUid();
+ boolean result;
+ synchronized (mSpManager) {
+ if (!mSpManager.hasEscrowData(userId)) {
+ throw new SecurityException("Escrow token is disabled on the current user");
+ }
+ result = setLockCredentialWithTokenInternal(credential, type, tokenHandle, token,
+ userId);
+ }
+ if (result) {
+ synchronized (mSeparateChallengeLock) {
+ setSeparateProfileChallengeEnabled(userId, true, null);
+ }
+ notifyPasswordChanged(userId);
+ }
+ return result;
+ }
+
+ private boolean setLockCredentialWithTokenInternal(String credential, int type,
+ long tokenHandle, byte[] token, int userId) throws RemoteException {
+ synchronized (mSpManager) {
+ AuthenticationResult result = mSpManager.unwrapTokenBasedSyntheticPassword(
+ getGateKeeperService(), tokenHandle, token, userId);
+ if (result.authToken == null) {
+ Slog.w(TAG, "Invalid escrow token supplied");
+ return false;
+ }
+ long oldHandle = getSyntheticPasswordHandleLocked(userId);
+ setLockCredentialWithAuthTokenLocked(credential, type, result.authToken, userId);
+ mSpManager.destroyPasswordBasedSyntheticPassword(oldHandle, userId);
+ return true;
+ }
+ }
+
+ @Override
+ public void unlockUserWithToken(long tokenHandle, byte[] token, int userId)
+ throws RemoteException {
+ ensureCallerSystemUid();
+ AuthenticationResult authResult;
+ synchronized (mSpManager) {
+ if (!mSpManager.hasEscrowData(userId)) {
+ throw new SecurityException("Escrow token is disabled on the current user");
+ }
+ authResult = mSpManager.unwrapTokenBasedSyntheticPassword(getGateKeeperService(),
+ tokenHandle, token, userId);
+ if (authResult.authToken == null) {
+ Slog.w(TAG, "Invalid escrow token supplied");
+ return;
+ }
+ }
+ unlockUser(userId, null, authResult.authToken.deriveDiskEncryptionKey());
+ }
+
+ @Override
+ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args){
+ if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
+ != PackageManager.PERMISSION_GRANTED) {
+
+ pw.println("Permission Denial: can't dump LockSettingsService from from pid="
+ + Binder.getCallingPid()
+ + ", uid=" + Binder.getCallingUid());
+ return;
+ }
+
+ synchronized (this) {
+ pw.println("Current lock settings service state:");
+ pw.println(String.format("SP Enabled = %b",
+ mLockPatternUtils.isSyntheticPasswordEnabled()));
+
+ List<UserInfo> users = mUserManager.getUsers();
+ for (int user = 0; user < users.size(); user++) {
+ final int userId = users.get(user).id;
+ pw.println(" User " + userId);
+ pw.println(String.format(" SP Handle = %x",
+ getSyntheticPasswordHandleLocked(userId)));
+ try {
+ pw.println(String.format(" SID = %x",
+ getGateKeeperService().getSecureUserId(userId)));
+ } catch (RemoteException e) {
+ // ignore.
+ }
+ }
+ }
+ }
+
+ private void disableEscrowTokenOnNonManagedDevicesIfNeeded(int userId) {
+ long ident = Binder.clearCallingIdentity();
+ try {
+ // Managed profile should have escrow enabled
+ if (mUserManager.getUserInfo(userId).isManagedProfile()) {
+ return;
+ }
+ DevicePolicyManager dpm = (DevicePolicyManager)
+ mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
+ // Devices with Device Owner should have escrow enabled on all users.
+ if (dpm.getDeviceOwnerComponentOnAnyUser() != null) {
+ return;
+ }
+ // If the device is yet to be provisioned (still in SUW), there is still
+ // a chance that Device Owner will be set on the device later, so postpone
+ // disabling escrow token for now.
+ if (!dpm.isDeviceProvisioned()) {
+ return;
+ }
+ // Disable escrow token permanently on all other device/user types.
+ Slog.i(TAG, "Disabling escrow token on user " + userId);
+ if (isSyntheticPasswordBasedCredentialLocked(userId)) {
+ mSpManager.destroyEscrowData(userId);
+ }
+ } catch (RemoteException e) {
+ Slog.e(TAG, "disableEscrowTokenOnNonManagedDevices", e);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ private void ensureCallerSystemUid() throws SecurityException {
+ final int callingUid = mInjector.binderGetCallingUid();
+ if (callingUid != Process.SYSTEM_UID) {
+ throw new SecurityException("Only system can call this API.");
+ }
+ }
}
diff --git a/services/core/java/com/android/server/LockSettingsShellCommand.java b/services/core/java/com/android/server/LockSettingsShellCommand.java
index 1ab5303..91bd98e 100644
--- a/services/core/java/com/android/server/LockSettingsShellCommand.java
+++ b/services/core/java/com/android/server/LockSettingsShellCommand.java
@@ -22,12 +22,9 @@
import android.app.ActivityManager;
import android.content.Context;
-import android.os.Binder;
-import android.os.Process;
import android.os.RemoteException;
import android.os.ShellCommand;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternUtils.RequestThrottledException;
@@ -37,6 +34,7 @@
private static final String COMMAND_SET_PIN = "set-pin";
private static final String COMMAND_SET_PASSWORD = "set-password";
private static final String COMMAND_CLEAR = "clear";
+ private static final String COMMAND_SP = "sp";
private int mCurrentUserId;
private final LockPatternUtils mLockPatternUtils;
@@ -71,6 +69,9 @@
case COMMAND_CLEAR:
runClear();
break;
+ case COMMAND_SP:
+ runEnableSp();
+ break;
default:
getErrPrintWriter().println("Unknown command: " + cmd);
break;
@@ -92,6 +93,8 @@
while ((opt = getNextOption()) != null) {
if ("--old".equals(opt)) {
mOld = getNextArgRequired();
+ } else if ("--user".equals(opt)) {
+ mCurrentUserId = Integer.parseInt(getNextArgRequired());
} else {
getErrPrintWriter().println("Unknown option: " + opt);
throw new IllegalArgumentException();
@@ -100,6 +103,15 @@
mNew = getNextArg();
}
+ private void runEnableSp() {
+ if (mNew != null) {
+ mLockPatternUtils.enableSyntheticPassword();
+ getOutPrintWriter().println("Synthetic password enabled");
+ }
+ getOutPrintWriter().println(String.format("SP Enabled = %b",
+ mLockPatternUtils.isSyntheticPasswordEnabled()));
+ }
+
private void runSetPattern() throws RemoteException {
mLockPatternUtils.saveLockPattern(stringToPattern(mNew), mOld, mCurrentUserId);
getOutPrintWriter().println("Pattern set to '" + mNew + "'");
diff --git a/services/core/java/com/android/server/LockSettingsStorage.java b/services/core/java/com/android/server/LockSettingsStorage.java
index 385b1cf..f5bae7c 100644
--- a/services/core/java/com/android/server/LockSettingsStorage.java
+++ b/services/core/java/com/android/server/LockSettingsStorage.java
@@ -66,6 +66,8 @@
private static final String LEGACY_LOCK_PASSWORD_FILE = "password.key";
private static final String CHILD_PROFILE_LOCK_FILE = "gatekeeper.profile.key";
+ private static final String SYNTHETIC_PASSWORD_DIRECTORY = "spblob/";
+
private static final Object DEFAULT = new Object();
private final DatabaseHelper mOpenHelper;
@@ -412,8 +414,7 @@
}
private String getLockCredentialFilePathForUser(int userId, String basename) {
- String dataSystemDirectory =
- android.os.Environment.getDataDirectory().getAbsolutePath() +
+ String dataSystemDirectory = Environment.getDataDirectory().getAbsolutePath() +
SYSTEM_DIRECTORY;
if (userId == 0) {
// Leave it in the same place for user 0
@@ -423,6 +424,40 @@
}
}
+ public void writeSyntheticPasswordState(int userId, long handle, String name, byte[] data) {
+ writeFile(getSynthenticPasswordStateFilePathForUser(userId, handle, name), data);
+ }
+
+ public byte[] readSyntheticPasswordState(int userId, long handle, String name) {
+ return readFile(getSynthenticPasswordStateFilePathForUser(userId, handle, name));
+ }
+
+ public void deleteSyntheticPasswordState(int userId, long handle, String name, boolean secure) {
+ String path = getSynthenticPasswordStateFilePathForUser(userId, handle, name);
+ File file = new File(path);
+ if (file.exists()) {
+ //TODO: (b/34600579) invoke secdiscardable
+ file.delete();
+ mCache.putFile(path, null);
+ }
+ }
+
+ @VisibleForTesting
+ protected File getSyntheticPasswordDirectoryForUser(int userId) {
+ return new File(Environment.getDataSystemDeDirectory(userId) ,SYNTHETIC_PASSWORD_DIRECTORY);
+ }
+
+ @VisibleForTesting
+ protected String getSynthenticPasswordStateFilePathForUser(int userId, long handle,
+ String name) {
+ File baseDir = getSyntheticPasswordDirectoryForUser(userId);
+ String baseName = String.format("%016x.%s", handle, name);
+ if (!baseDir.exists()) {
+ baseDir.mkdir();
+ }
+ return new File(baseDir, baseName).getAbsolutePath();
+ }
+
public void removeUser(int userId) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
@@ -446,15 +481,20 @@
}
}
} else {
- // Manged profile
+ // Managed profile
removeChildProfileLock(userId);
}
+ File spStateDir = getSyntheticPasswordDirectoryForUser(userId);
try {
db.beginTransaction();
db.delete(TABLE, COLUMN_USERID + "='" + userId + "'", null);
db.setTransactionSuccessful();
mCache.removeUser(userId);
+ // The directory itself will be deleted as part of user deletion operation by the
+ // framework, so only need to purge cache here.
+ //TODO: (b/34600579) invoke secdiscardable
+ mCache.purgePath(spStateDir.getAbsolutePath());
} finally {
db.endTransaction();
}
@@ -619,6 +659,16 @@
mVersion++;
}
+ synchronized void purgePath(String path) {
+ for (int i = mCache.size() - 1; i >= 0; i--) {
+ CacheKey entry = mCache.keyAt(i);
+ if (entry.type == CacheKey.TYPE_FILE && entry.key.startsWith(path)) {
+ mCache.removeAt(i);
+ }
+ }
+ mVersion++;
+ }
+
synchronized void clear() {
mCache.clear();
mVersion++;
diff --git a/services/core/java/com/android/server/NetworkScoreService.java b/services/core/java/com/android/server/NetworkScoreService.java
index 3e89852..d54ebaa 100644
--- a/services/core/java/com/android/server/NetworkScoreService.java
+++ b/services/core/java/com/android/server/NetworkScoreService.java
@@ -35,8 +35,7 @@
import android.net.INetworkScoreService;
import android.net.NetworkKey;
import android.net.NetworkScoreManager;
-import android.net.NetworkScorerAppManager;
-import android.net.NetworkScorerAppManager.NetworkScorerAppData;
+import android.net.NetworkScorerAppData;
import android.net.RecommendationRequest;
import android.net.RecommendationResult;
import android.net.ScoredNetwork;
@@ -132,10 +131,10 @@
* manages the service connection.
*/
private class NetworkScorerPackageMonitor extends PackageMonitor {
- final List<String> mPackagesToWatch;
+ final String mPackageToWatch;
- private NetworkScorerPackageMonitor(List<String> packagesToWatch) {
- mPackagesToWatch = packagesToWatch;
+ private NetworkScorerPackageMonitor(String packageToWatch) {
+ mPackageToWatch = packageToWatch;
}
@Override
@@ -168,37 +167,27 @@
evaluateBinding(packageName, true /* forceUnbind */);
}
- private void evaluateBinding(String scorerPackageName, boolean forceUnbind) {
- if (!mPackagesToWatch.contains(scorerPackageName)) {
+ private void evaluateBinding(String changedPackageName, boolean forceUnbind) {
+ if (!mPackageToWatch.equals(changedPackageName)) {
// Early exit when we don't care about the package that has changed.
return;
}
if (DBG) {
- Log.d(TAG, "Evaluating binding for: " + scorerPackageName
+ Log.d(TAG, "Evaluating binding for: " + changedPackageName
+ ", forceUnbind=" + forceUnbind);
}
+
final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
if (activeScorer == null) {
// Package change has invalidated a scorer, this will also unbind any service
// connection.
if (DBG) Log.d(TAG, "No active scorers available.");
- unbindFromScoringServiceIfNeeded();
- } else if (activeScorer.getRecommendationServicePackageName().equals(scorerPackageName))
- {
- // The active scoring service changed in some way.
- if (DBG) {
- Log.d(TAG, "Possible change to the active scorer: "
- + activeScorer.getRecommendationServicePackageName());
- }
+ refreshBinding();
+ } else { // The scoring service changed in some way.
if (forceUnbind) {
unbindFromScoringServiceIfNeeded();
}
- bindToScoringServiceIfNeeded(activeScorer);
- } else {
- // One of the scoring apps on the device has changed and we may no longer be
- // bound to the correct scoring app. The logic in bindToScoringServiceIfNeeded()
- // will sort that out to leave us bound to the most recent active scorer.
if (DBG) {
Log.d(TAG, "Binding to " + activeScorer.getRecommendationServiceComponent()
+ " if needed.");
@@ -272,60 +261,71 @@
/** Called when the system is ready to run third-party code but before it actually does so. */
void systemReady() {
if (DBG) Log.d(TAG, "systemReady");
- registerPackageMonitorIfNeeded();
registerRecommendationSettingsObserver();
- refreshRecommendationRequestTimeoutMs();
}
/** Called when the system is ready for us to start third-party code. */
void systemRunning() {
if (DBG) Log.d(TAG, "systemRunning");
- bindToScoringServiceIfNeeded();
}
- private void onUserUnlocked(int userId) {
+ @VisibleForTesting
+ void onUserUnlocked(int userId) {
+ if (DBG) Log.d(TAG, "onUserUnlocked(" + userId + ")");
+ refreshBinding();
+ }
+
+ private void refreshBinding() {
+ if (DBG) Log.d(TAG, "refreshBinding()");
+ // Apply the default package name if the Setting isn't set.
+ mNetworkScorerAppManager.revertToDefaultIfNoActive();
registerPackageMonitorIfNeeded();
bindToScoringServiceIfNeeded();
}
private void registerRecommendationSettingsObserver() {
- final List<String> providerPackages =
- mNetworkScorerAppManager.getPotentialRecommendationProviderPackages();
- if (!providerPackages.isEmpty()) {
- final Uri enabledUri = Global.getUriFor(Global.NETWORK_RECOMMENDATIONS_ENABLED);
- mContentObserver.observe(enabledUri,
- ServiceHandler.MSG_RECOMMENDATIONS_ENABLED_CHANGED);
- }
+ final Uri packageNameUri = Global.getUriFor(Global.NETWORK_RECOMMENDATIONS_PACKAGE);
+ mContentObserver.observe(packageNameUri,
+ ServiceHandler.MSG_RECOMMENDATIONS_PACKAGE_CHANGED);
final Uri timeoutUri = Global.getUriFor(Global.NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS);
mContentObserver.observe(timeoutUri,
ServiceHandler.MSG_RECOMMENDATION_REQUEST_TIMEOUT_CHANGED);
}
+ /**
+ * Ensures the package manager is registered to monitor the current active scorer.
+ * If a discrepancy is found any previous monitor will be cleaned up
+ * and a new monitor will be created.
+ *
+ * This method is idempotent.
+ */
private void registerPackageMonitorIfNeeded() {
- if (DBG) Log.d(TAG, "registerPackageMonitorIfNeeded");
- final List<String> providerPackages =
- mNetworkScorerAppManager.getPotentialRecommendationProviderPackages();
+ if (DBG) Log.d(TAG, "registerPackageMonitorIfNeeded()");
+ final NetworkScorerAppData appData = mNetworkScorerAppManager.getActiveScorer();
synchronized (mPackageMonitorLock) {
// Unregister the current monitor if needed.
- if (mPackageMonitor != null) {
+ if (mPackageMonitor != null && (appData == null
+ || !appData.getRecommendationServicePackageName().equals(
+ mPackageMonitor.mPackageToWatch))) {
if (DBG) {
Log.d(TAG, "Unregistering package monitor for "
- + mPackageMonitor.mPackagesToWatch);
+ + mPackageMonitor.mPackageToWatch);
}
mPackageMonitor.unregister();
mPackageMonitor = null;
}
- // Create and register the monitor if there are packages that could be providers.
- if (!providerPackages.isEmpty()) {
- mPackageMonitor = new NetworkScorerPackageMonitor(providerPackages);
+ // Create and register the monitor if a scorer is active.
+ if (appData != null && mPackageMonitor == null) {
+ mPackageMonitor = new NetworkScorerPackageMonitor(
+ appData.getRecommendationServicePackageName());
// TODO: Need to update when we support per-user scorers. http://b/23422763
mPackageMonitor.register(mContext, null /* thread */, UserHandle.SYSTEM,
false /* externalStorage */);
if (DBG) {
Log.d(TAG, "Registered package monitor for "
- + mPackageMonitor.mPackagesToWatch);
+ + mPackageMonitor.mPackageToWatch);
}
}
}
@@ -337,6 +337,13 @@
bindToScoringServiceIfNeeded(scorerData);
}
+ /**
+ * Ensures the service connection is bound to the current active scorer.
+ * If a discrepancy is found any previous connection will be cleaned up
+ * and a new connection will be created.
+ *
+ * This method is idempotent.
+ */
private void bindToScoringServiceIfNeeded(NetworkScorerAppData appData) {
if (DBG) Log.d(TAG, "bindToScoringServiceIfNeeded(" + appData + ")");
if (appData != null) {
@@ -365,6 +372,8 @@
synchronized (mServiceConnectionLock) {
if (mServiceConnection != null) {
mServiceConnection.disconnect(mContext);
+ if (DBG) Log.d(TAG, "Disconnected from: "
+ + mServiceConnection.mAppData.getRecommendationServiceComponent());
}
mServiceConnection = null;
}
@@ -603,7 +612,10 @@
mScanResultKeys = new ArraySet<>(size);
for (int i = 0; i < size; i++) {
ScanResult scanResult = scanResults.get(i);
- mScanResultKeys.add(NetworkKey.createFromScanResult(scanResult));
+ NetworkKey key = NetworkKey.createFromScanResult(scanResult);
+ if (key != null) {
+ mScanResultKeys.add(key);
+ }
}
}
@@ -650,17 +662,13 @@
@Override
public boolean setActiveScorer(String packageName) {
- // TODO: For now, since SCORE_NETWORKS requires an app to be privileged, we allow such apps
- // to directly set the scorer app rather than having to use the consent dialog. The
- // assumption is that anyone bundling a scorer app with the system is trusted by the OEM to
- // do the right thing and not enable this feature without explaining it to the user.
- // In the future, should this API be opened to 3p apps, we will need to lock this down and
- // figure out another way to streamline the UX.
-
- mContext.enforceCallingOrSelfPermission(permission.SCORE_NETWORKS, TAG);
-
- // Scorers (recommendation providers) are selected and no longer set.
- return false;
+ // Only the system can set the active scorer
+ if (isCallerSystemProcess(getCallingUid()) || callerCanRequestScores()) {
+ return mNetworkScorerAppManager.setActiveScorer(packageName);
+ } else {
+ throw new SecurityException(
+ "Caller is neither the system process nor a score requester.");
+ }
}
/**
@@ -697,7 +705,6 @@
return null;
}
-
/**
* Returns metadata about the active scorer or <code>null</code> if there is no active scorer.
*/
@@ -724,7 +731,13 @@
*/
@Override
public List<NetworkScorerAppData> getAllValidScorers() {
- return mNetworkScorerAppManager.getAllValidScorers();
+ // Only the system can access this data.
+ if (isCallerSystemProcess(getCallingUid()) || callerCanRequestScores()) {
+ return mNetworkScorerAppManager.getAllValidScorers();
+ } else {
+ throw new SecurityException(
+ "Caller is neither the system process nor a score requester.");
+ }
}
@Override
@@ -1156,7 +1169,7 @@
@VisibleForTesting
public final class ServiceHandler extends Handler {
public static final int MSG_RECOMMENDATION_REQUEST_TIMEOUT = 1;
- public static final int MSG_RECOMMENDATIONS_ENABLED_CHANGED = 2;
+ public static final int MSG_RECOMMENDATIONS_PACKAGE_CHANGED = 2;
public static final int MSG_RECOMMENDATION_REQUEST_TIMEOUT_CHANGED = 3;
public ServiceHandler(Looper looper) {
@@ -1178,8 +1191,8 @@
sendDefaultRecommendationResponse(request, remoteCallback);
break;
- case MSG_RECOMMENDATIONS_ENABLED_CHANGED:
- bindToScoringServiceIfNeeded();
+ case MSG_RECOMMENDATIONS_PACKAGE_CHANGED:
+ refreshBinding();
break;
case MSG_RECOMMENDATION_REQUEST_TIMEOUT_CHANGED:
diff --git a/services/core/java/com/android/server/NetworkScorerAppManager.java b/services/core/java/com/android/server/NetworkScorerAppManager.java
new file mode 100644
index 0000000..2f4485a
--- /dev/null
+++ b/services/core/java/com/android/server/NetworkScorerAppManager.java
@@ -0,0 +1,245 @@
+/*
+ * 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.server;
+
+import android.Manifest.permission;
+import android.annotation.Nullable;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.net.NetworkScoreManager;
+import android.net.NetworkScorerAppData;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.internal.R;
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Internal class for discovering and managing the network scorer/recommendation application.
+ *
+ * @hide
+ */
+@VisibleForTesting
+public class NetworkScorerAppManager {
+ private static final String TAG = "NetworkScorerAppManager";
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+ private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+ private final Context mContext;
+ private final SettingsFacade mSettingsFacade;
+
+ public NetworkScorerAppManager(Context context) {
+ this(context, new SettingsFacade());
+ }
+
+ @VisibleForTesting
+ public NetworkScorerAppManager(Context context, SettingsFacade settingsFacade) {
+ mContext = context;
+ mSettingsFacade = settingsFacade;
+ }
+
+ /**
+ * Returns the list of available scorer apps. The list will be empty if there are
+ * no valid scorers.
+ */
+ @VisibleForTesting
+ public List<NetworkScorerAppData> getAllValidScorers() {
+ if (VERBOSE) Log.v(TAG, "getAllValidScorers()");
+ final PackageManager pm = mContext.getPackageManager();
+ final Intent serviceIntent = new Intent(NetworkScoreManager.ACTION_RECOMMEND_NETWORKS);
+ final List<ResolveInfo> resolveInfos =
+ pm.queryIntentServices(serviceIntent, PackageManager.GET_META_DATA);
+ if (resolveInfos == null || resolveInfos.isEmpty()) {
+ if (DEBUG) Log.d(TAG, "Found 0 Services able to handle " + serviceIntent);
+ return Collections.emptyList();
+ }
+
+ List<NetworkScorerAppData> appDataList = new ArrayList<>();
+ for (int i = 0; i < resolveInfos.size(); i++) {
+ final ServiceInfo serviceInfo = resolveInfos.get(i).serviceInfo;
+ if (hasPermissions(serviceInfo.packageName)) {
+ if (VERBOSE) {
+ Log.v(TAG, serviceInfo.packageName + " is a valid scorer/recommender.");
+ }
+ final ComponentName serviceComponentName =
+ new ComponentName(serviceInfo.packageName, serviceInfo.name);
+ final ComponentName useOpenWifiNetworksActivity =
+ findUseOpenWifiNetworksActivity(serviceInfo);
+ appDataList.add(
+ new NetworkScorerAppData(serviceInfo.applicationInfo.uid,
+ serviceComponentName, useOpenWifiNetworksActivity));
+ } else {
+ if (VERBOSE) Log.v(TAG, serviceInfo.packageName
+ + " is NOT a valid scorer/recommender.");
+ }
+ }
+
+ return appDataList;
+ }
+
+ @Nullable
+ private ComponentName findUseOpenWifiNetworksActivity(ServiceInfo serviceInfo) {
+ if (serviceInfo.metaData == null) {
+ if (DEBUG) {
+ Log.d(TAG, "No metadata found on " + serviceInfo.getComponentName());
+ }
+ return null;
+ }
+ final String useOpenWifiPackage = serviceInfo.metaData
+ .getString(NetworkScoreManager.USE_OPEN_WIFI_PACKAGE_META_DATA);
+ if (TextUtils.isEmpty(useOpenWifiPackage)) {
+ if (DEBUG) {
+ Log.d(TAG, "No use_open_wifi_package metadata found on "
+ + serviceInfo.getComponentName());
+ }
+ return null;
+ }
+ final Intent enableUseOpenWifiIntent = new Intent(NetworkScoreManager.ACTION_CUSTOM_ENABLE)
+ .setPackage(useOpenWifiPackage);
+ final ResolveInfo resolveActivityInfo = mContext.getPackageManager()
+ .resolveActivity(enableUseOpenWifiIntent, 0 /* flags */);
+ if (VERBOSE) {
+ Log.d(TAG, "Resolved " + enableUseOpenWifiIntent + " to " + resolveActivityInfo);
+ }
+
+ if (resolveActivityInfo != null && resolveActivityInfo.activityInfo != null) {
+ return resolveActivityInfo.activityInfo.getComponentName();
+ }
+
+ return null;
+ }
+
+ /**
+ * Get the application to use for scoring networks.
+ *
+ * @return the scorer app info or null if scoring is disabled (including if no scorer was ever
+ * selected) or if the previously-set scorer is no longer a valid scorer app (e.g. because
+ * it was disabled or uninstalled).
+ */
+ @Nullable
+ @VisibleForTesting
+ public NetworkScorerAppData getActiveScorer() {
+ return getScorer(getNetworkRecommendationsPackage());
+ }
+
+ private NetworkScorerAppData getScorer(String packageName) {
+ if (TextUtils.isEmpty(packageName)) {
+ return null;
+ }
+
+ // Otherwise return the recommendation provider (which may be null).
+ List<NetworkScorerAppData> apps = getAllValidScorers();
+ for (int i = 0; i < apps.size(); i++) {
+ NetworkScorerAppData app = apps.get(i);
+ if (app.getRecommendationServicePackageName().equals(packageName)) {
+ return app;
+ }
+ }
+
+ return null;
+ }
+
+ private boolean hasPermissions(String packageName) {
+ final PackageManager pm = mContext.getPackageManager();
+ return pm.checkPermission(permission.SCORE_NETWORKS, packageName)
+ == PackageManager.PERMISSION_GRANTED;
+ }
+
+ /**
+ * Set the specified package as the default scorer application.
+ *
+ * <p>The caller must have permission to write to {@link Settings.Global}.
+ *
+ * @param packageName the packageName of the new scorer to use. If null, the scoring app will
+ * revert back to the configured default. Otherwise, the scorer will only
+ * be set if it is a valid scorer application.
+ * @return true if the scorer was changed, or false if the package is not a valid scorer or
+ * a valid network recommendation provider exists.
+ */
+ @VisibleForTesting
+ public boolean setActiveScorer(String packageName) {
+ String oldPackageName = getNetworkRecommendationsPackage();
+ if (TextUtils.equals(oldPackageName, packageName)) {
+ // No change.
+ return true;
+ }
+
+ Log.i(TAG, "Changing network scorer from " + oldPackageName + " to " + packageName);
+
+ if (packageName == null) {
+ // revert to the default setting.
+ setNetworkRecommendationsPackage(getDefaultPackageSetting());
+ return true;
+ } else {
+ // We only make the change if the new package is valid.
+ if (getScorer(packageName) != null) {
+ setNetworkRecommendationsPackage(packageName);
+ return true;
+ } else {
+ Log.w(TAG, "Requested network scorer is not valid: " + packageName);
+ return false;
+ }
+ }
+ }
+
+ /**
+ * If the active scorer is null then revert to the default scorer.
+ */
+ @VisibleForTesting
+ public void revertToDefaultIfNoActive() {
+ if (getActiveScorer() == null) {
+ final String defaultPackage = getDefaultPackageSetting();
+ setNetworkRecommendationsPackage(defaultPackage);
+ Log.i(TAG, "Defaulted the network recommendations app to: " + defaultPackage);
+ }
+ }
+
+ private String getDefaultPackageSetting() {
+ return mContext.getResources().getString(
+ R.string.config_defaultNetworkRecommendationProviderPackage);
+ }
+
+ private String getNetworkRecommendationsPackage() {
+ return mSettingsFacade.getString(mContext, Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE);
+ }
+
+ private void setNetworkRecommendationsPackage(String packageName) {
+ mSettingsFacade.putString(mContext,
+ Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, packageName);
+ }
+
+ /**
+ * Wrapper around Settings to make testing easier.
+ */
+ public static class SettingsFacade {
+ public boolean putString(Context context, String name, String value) {
+ return Settings.Global.putString(context.getContentResolver(), name, value);
+ }
+
+ public String getString(Context context, String name) {
+ return Settings.Global.getString(context.getContentResolver(), name);
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/RescueParty.java b/services/core/java/com/android/server/RescueParty.java
index c77a407..480b08a 100644
--- a/services/core/java/com/android/server/RescueParty.java
+++ b/services/core/java/com/android/server/RescueParty.java
@@ -19,9 +19,8 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.UserInfo;
-import android.os.BatteryManager;
-import android.os.BatteryManagerInternal;
import android.os.Build;
+import android.os.FileUtils;
import android.os.RecoverySystem;
import android.os.SystemClock;
import android.os.SystemProperties;
@@ -36,6 +35,8 @@
import com.android.internal.util.ArrayUtils;
+import java.io.File;
+
/**
* Utilities to help rescue the system from crash loops. Callers are expected to
* report boot events and persistent app crashes, and if they happen frequently
@@ -66,24 +67,26 @@
private static boolean isDisabled() {
// We're disabled on all engineering devices
- if (Build.IS_ENG) return true;
+ if (Build.IS_ENG) {
+ Slog.v(TAG, "Disabled because of eng build");
+ return true;
+ }
// We're disabled on userdebug devices connected over USB, since that's
// a decent signal that someone is actively trying to debug the device,
// or that it's in a lab environment.
- if (Build.IS_USERDEBUG) {
- try {
- if (LocalServices.getService(BatteryManagerInternal.class)
- .getPlugType() == BatteryManager.BATTERY_PLUGGED_USB) {
- return true;
- } else {
- }
- } catch (Throwable ignored) {
- }
+ if (Build.IS_USERDEBUG && isUsbActive()) {
+ Slog.v(TAG, "Disabled because of active USB connection");
+ return true;
}
// One last-ditch check
- return SystemProperties.getBoolean(PROP_DISABLE_RESCUE, false);
+ if (SystemProperties.getBoolean(PROP_DISABLE_RESCUE, false)) {
+ Slog.v(TAG, "Disabled because of manual property");
+ return true;
+ }
+
+ return false;
}
/**
@@ -185,14 +188,14 @@
final ContentResolver resolver = context.getContentResolver();
try {
Settings.Global.resetToDefaultsAsUser(resolver, null, mode, UserHandle.USER_SYSTEM);
- } catch (Exception e) {
- res = new RuntimeException("Failed to reset global settings", e);
+ } catch (Throwable t) {
+ res = new RuntimeException("Failed to reset global settings", t);
}
for (int userId : getAllUserIds(context)) {
try {
Settings.Secure.resetToDefaultsAsUser(resolver, null, mode, userId);
- } catch (Exception e) {
- res = new RuntimeException("Failed to reset secure settings for " + userId, e);
+ } catch (Throwable t) {
+ res = new RuntimeException("Failed to reset secure settings for " + userId, t);
}
}
if (res != null) {
@@ -314,6 +317,21 @@
return userIds;
}
+ /**
+ * Hacky test to check if the device has an active USB connection, which is
+ * a good proxy for someone doing local development work.
+ */
+ private static boolean isUsbActive() {
+ try {
+ final String state = FileUtils
+ .readTextFile(new File("/sys/class/android_usb/android0/state"), 128, "");
+ return "CONFIGURED".equals(state.trim());
+ } catch (Throwable t) {
+ Slog.w(TAG, "Failed to determine if device was on USB", t);
+ return false;
+ }
+ }
+
private static String levelToString(int level) {
switch (level) {
case LEVEL_NONE: return "NONE";
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 32b7e4d..32136bb 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -70,13 +70,13 @@
import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.DiskInfo;
-import android.os.storage.IStorageEventListener;
-import android.os.storage.IStorageShutdownObserver;
import android.os.storage.IObbActionListener;
+import android.os.storage.IStorageEventListener;
import android.os.storage.IStorageManager;
-import android.os.storage.StorageManagerInternal;
+import android.os.storage.IStorageShutdownObserver;
import android.os.storage.OnObbStateChangeListener;
import android.os.storage.StorageManager;
+import android.os.storage.StorageManagerInternal;
import android.os.storage.StorageResultCode;
import android.os.storage.StorageVolume;
import android.os.storage.VolumeInfo;
@@ -109,6 +109,7 @@
import com.android.server.NativeDaemonConnector.SensitiveArg;
import com.android.server.pm.PackageManagerService;
import com.android.server.storage.AppFuseBridge;
+
import libcore.io.IoUtils;
import libcore.util.EmptyArray;
@@ -2922,10 +2923,10 @@
waitForReady();
if (StorageManager.isFileEncryptedNativeOrEmulated()) {
- // When a user has secure lock screen, require a challenge token to
- // actually unlock. This check is mostly in place for emulation mode.
- if (mLockPatternUtils.isSecure(userId) && ArrayUtils.isEmpty(token)) {
- throw new IllegalStateException("Token required to unlock secure user " + userId);
+ // When a user has secure lock screen, require secret to actually unlock.
+ // This check is mostly in place for emulation mode.
+ if (mLockPatternUtils.isSecure(userId) && ArrayUtils.isEmpty(secret)) {
+ throw new IllegalStateException("Secret required to unlock secure user " + userId);
}
try {
@@ -3293,14 +3294,69 @@
}
@Override
- public long getAllocatableBytes(String path, int flags) {
- return new File(path).getUsableSpace();
+ public long getAllocatableBytes(String volumeUuid, int flags) {
+ final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ final StorageStatsManager stats = mContext.getSystemService(StorageStatsManager.class);
+
+ final boolean aggressive = (flags & StorageManager.FLAG_ALLOCATE_AGGRESSIVE) != 0;
+ if (aggressive) {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.ALLOCATE_AGGRESSIVE, TAG);
+ }
+
+ final long token = Binder.clearCallingIdentity();
+ try {
+ // In general, apps can allocate as much space as they want, except
+ // we never let them eat into either the minimum cache space or into
+ // the low disk warning space.
+ final File path = storage.findPathForUuid(volumeUuid);
+ if (stats.isQuotaSupported(volumeUuid)) {
+ if (aggressive) {
+ return Math.max(0,
+ stats.getFreeBytes(volumeUuid) - storage.getStorageFullBytes(path));
+ } else {
+ return Math.max(0,
+ stats.getFreeBytes(volumeUuid) - storage.getStorageLowBytes(path)
+ - storage.getStorageCacheBytes(path));
+ }
+ } else {
+ // When we don't have fast quota information, we ignore cached
+ // data and only consider unused bytes.
+ if (aggressive) {
+ return Math.max(0, path.getUsableSpace() - storage.getStorageFullBytes(path));
+ } else {
+ return Math.max(0, path.getUsableSpace() - storage.getStorageLowBytes(path));
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
@Override
- public void allocateBytes(String path, long bytes, int flags) {
- if (bytes > new File(path).getUsableSpace()) {
- throw new ParcelableException(new IOException("Not enough usable space"));
+ public void allocateBytes(String volumeUuid, long bytes, int flags) {
+ final StorageManager storage = mContext.getSystemService(StorageManager.class);
+
+ // This method call will enforce FLAG_ALLOCATE_AGGRESSIVE permissions so
+ // we don't have to enforce them locally
+ final long allocatableBytes = getAllocatableBytes(volumeUuid, flags);
+ if (bytes > allocatableBytes) {
+ throw new ParcelableException(new IOException("Failed to allocate " + bytes
+ + " because only " + allocatableBytes + " allocatable"));
+ }
+
+ // Free up enough disk space to satisfy both the requested allocation
+ // and our low disk warning space.
+ final File path = storage.findPathForUuid(volumeUuid);
+ bytes += storage.getStorageLowBytes(path);
+
+ final long token = Binder.clearCallingIdentity();
+ try {
+ mPms.freeStorage(volumeUuid, bytes, flags);
+ } catch (IOException e) {
+ throw new ParcelableException(e);
+ } finally {
+ Binder.restoreCallingIdentity(token);
}
}
diff --git a/services/core/java/com/android/server/SyntheticPasswordCrypto.java b/services/core/java/com/android/server/SyntheticPasswordCrypto.java
new file mode 100644
index 0000000..12d91c5
--- /dev/null
+++ b/services/core/java/com/android/server/SyntheticPasswordCrypto.java
@@ -0,0 +1,194 @@
+/*
+ * 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;
+
+import android.security.keystore.KeyProperties;
+import android.security.keystore.KeyProtection;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import java.util.Arrays;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.KeyGenerator;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.GCMParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+public class SyntheticPasswordCrypto {
+ private static final int PROFILE_KEY_IV_SIZE = 12;
+ private static final int AES_KEY_LENGTH = 32; // 256-bit AES key
+ private static final byte[] APPLICATION_ID_PERSONALIZATION = "application-id".getBytes();
+ // Time between the user credential is verified with GK and the decryption of synthetic password
+ // under the auth-bound key. This should always happen one after the other, but give it 15
+ // seconds just to be sure.
+ private static final int USER_AUTHENTICATION_VALIDITY = 15;
+
+ private static byte[] decrypt(SecretKey key, byte[] blob)
+ throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
+ InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
+ if (blob == null) {
+ return null;
+ }
+ byte[] iv = Arrays.copyOfRange(blob, 0, PROFILE_KEY_IV_SIZE);
+ byte[] ciphertext = Arrays.copyOfRange(blob, PROFILE_KEY_IV_SIZE, blob.length);
+ Cipher cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"
+ + KeyProperties.BLOCK_MODE_GCM + "/" + KeyProperties.ENCRYPTION_PADDING_NONE);
+ cipher.init(Cipher.DECRYPT_MODE, key, new GCMParameterSpec(128, iv));
+ return cipher.doFinal(ciphertext);
+ }
+
+ private static byte[] encrypt(SecretKey key, byte[] blob)
+ throws IOException, NoSuchAlgorithmException, NoSuchPaddingException,
+ InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
+ if (blob == null) {
+ return null;
+ }
+ Cipher cipher = Cipher.getInstance(
+ KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_GCM + "/"
+ + KeyProperties.ENCRYPTION_PADDING_NONE);
+ cipher.init(Cipher.ENCRYPT_MODE, key);
+ byte[] ciphertext = cipher.doFinal(blob);
+ byte[] iv = cipher.getIV();
+ if (iv.length != PROFILE_KEY_IV_SIZE) {
+ throw new RuntimeException("Invalid iv length: " + iv.length);
+ }
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ outputStream.write(iv);
+ outputStream.write(ciphertext);
+ return outputStream.toByteArray();
+ }
+
+ public static byte[] encrypt(byte[] keyBytes, byte[] personalisation, byte[] message) {
+ byte[] keyHash = personalisedHash(personalisation, keyBytes);
+ SecretKeySpec key = new SecretKeySpec(Arrays.copyOf(keyHash, AES_KEY_LENGTH),
+ KeyProperties.KEY_ALGORITHM_AES);
+ try {
+ return encrypt(key, message);
+ } catch (InvalidKeyException | NoSuchAlgorithmException | NoSuchPaddingException
+ | IllegalBlockSizeException | BadPaddingException | IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ public static byte[] decrypt(byte[] keyBytes, byte[] personalisation, byte[] ciphertext) {
+ byte[] keyHash = personalisedHash(personalisation, keyBytes);
+ SecretKeySpec key = new SecretKeySpec(Arrays.copyOf(keyHash, AES_KEY_LENGTH),
+ KeyProperties.KEY_ALGORITHM_AES);
+ try {
+ return decrypt(key, ciphertext);
+ } catch (InvalidKeyException | NoSuchAlgorithmException | NoSuchPaddingException
+ | IllegalBlockSizeException | BadPaddingException
+ | InvalidAlgorithmParameterException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ public static byte[] decryptBlob(String keyAlias, byte[] blob, byte[] applicationId) {
+ try {
+ KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+ keyStore.load(null);
+
+ SecretKey decryptionKey = (SecretKey) keyStore.getKey(keyAlias, null);
+ byte[] intermediate = decrypt(applicationId, APPLICATION_ID_PERSONALIZATION, blob);
+ return decrypt(decryptionKey, intermediate);
+ } catch (CertificateException | IOException | BadPaddingException
+ | IllegalBlockSizeException
+ | KeyStoreException | NoSuchPaddingException | NoSuchAlgorithmException
+ | InvalidKeyException | UnrecoverableKeyException
+ | InvalidAlgorithmParameterException e) {
+ e.printStackTrace();
+ throw new RuntimeException("Failed to decrypt blob", e);
+ }
+ }
+
+ public static byte[] createBlob(String keyAlias, byte[] data, byte[] applicationId, long sid) {
+ try {
+ KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES);
+ keyGenerator.init(new SecureRandom());
+ SecretKey secretKey = keyGenerator.generateKey();
+ KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+ keyStore.load(null);
+ KeyProtection.Builder builder = new KeyProtection.Builder(KeyProperties.PURPOSE_DECRYPT)
+ .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
+ .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE);
+ if (sid != 0) {
+ builder.setUserAuthenticationRequired(true)
+ .setBoundToSpecificSecureUserId(sid)
+ .setUserAuthenticationValidityDurationSeconds(USER_AUTHENTICATION_VALIDITY);
+ }
+ keyStore.setEntry(keyAlias,
+ new KeyStore.SecretKeyEntry(secretKey),
+ builder.build());
+ byte[] intermediate = encrypt(secretKey, data);
+ return encrypt(applicationId, APPLICATION_ID_PERSONALIZATION, intermediate);
+
+ } catch (CertificateException | IOException | BadPaddingException
+ | IllegalBlockSizeException
+ | KeyStoreException | NoSuchPaddingException | NoSuchAlgorithmException
+ | InvalidKeyException e) {
+ e.printStackTrace();
+ throw new RuntimeException("Failed to encrypt blob", e);
+ }
+ }
+
+ public static void destroyBlobKey(String keyAlias) {
+ KeyStore keyStore;
+ try {
+ keyStore = KeyStore.getInstance("AndroidKeyStore");
+ keyStore.load(null);
+ keyStore.deleteEntry(keyAlias);
+ } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException
+ | IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ protected static byte[] personalisedHash(byte[] personalisation, byte[]... message) {
+ try {
+ final int PADDING_LENGTH = 128;
+ MessageDigest digest = MessageDigest.getInstance("SHA-512");
+ if (personalisation.length > PADDING_LENGTH) {
+ throw new RuntimeException("Personalisation too long");
+ }
+ // Personalize the hash
+ // Pad it to the block size of the hash function
+ personalisation = Arrays.copyOf(personalisation, PADDING_LENGTH);
+ digest.update(personalisation);
+ for (byte[] data : message) {
+ digest.update(data);
+ }
+ return digest.digest();
+ } catch (NoSuchAlgorithmException e) {
+ throw new RuntimeException("NoSuchAlgorithmException for SHA-512", e);
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/SyntheticPasswordManager.java b/services/core/java/com/android/server/SyntheticPasswordManager.java
new file mode 100644
index 0000000..6267880
--- /dev/null
+++ b/services/core/java/com/android/server/SyntheticPasswordManager.java
@@ -0,0 +1,692 @@
+/*
+ * 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;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.RemoteException;
+import android.service.gatekeeper.GateKeeperResponse;
+import android.service.gatekeeper.IGateKeeperService;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import com.android.internal.util.ArrayUtils;
+import com.android.internal.widget.LockPatternUtils;
+import com.android.internal.widget.VerifyCredentialResponse;
+
+import libcore.util.HexEncoding;
+
+import java.nio.ByteBuffer;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Set;
+
+
+/**
+ * A class that maintains the wrapping of synthetic password by user credentials or escrow tokens.
+ * It's (mostly) a pure storage for synthetic passwords, providing APIs to creating and destroying
+ * synthetic password blobs which are wrapped by user credentials or escrow tokens.
+ *
+ * Here is the assumptions it makes:
+ * Each user has one single synthetic password at any time.
+ * The SP has an associated password handle, which binds to the SID for that user. The password
+ * handle is persisted by SyntheticPasswordManager internally.
+ * If the user credential is null, it's treated as if the credential is DEFAULT_PASSWORD
+ */
+public class SyntheticPasswordManager {
+ private static final String SP_BLOB_NAME = "spblob";
+ private static final String SP_E0_NAME = "e0";
+ private static final String SP_P1_NAME = "p1";
+ private static final String SP_HANDLE_NAME = "handle";
+ private static final String SECDISCARDABLE_NAME = "secdis";
+ private static final int SECDISCARDABLE_LENGTH = 16 * 1024;
+ private static final String PASSWORD_DATA_NAME = "pwd";
+
+ public static final long DEFAULT_HANDLE = 0;
+ private static final String DEFAULT_PASSWORD = "default-password";
+
+ private static final byte SYNTHETIC_PASSWORD_VERSION = 1;
+ private static final byte SYNTHETIC_PASSWORD_PASSWORD_BASED = 0;
+ private static final byte SYNTHETIC_PASSWORD_TOKEN_BASED = 1;
+
+ // 256-bit synthetic password
+ private static final byte SYNTHETIC_PASSWORD_LENGTH = 256 / 8;
+
+ private static final int PASSWORD_SCRYPT_N = 13;
+ private static final int PASSWORD_SCRYPT_R = 3;
+ private static final int PASSWORD_SCRYPT_P = 1;
+ private static final int PASSWORD_SALT_LENGTH = 16;
+ private static final int PASSWORD_TOKEN_LENGTH = 32;
+ private static final String TAG = "SyntheticPasswordManager";
+
+ private static final byte[] PERSONALISATION_SECDISCARDABLE = "secdiscardable-transform".getBytes();
+ private static final byte[] PERSONALIZATION_KEY_STORE_PASSWORD = "keystore-password".getBytes();
+ private static final byte[] PERSONALIZATION_USER_GK_AUTH = "user-gk-authentication".getBytes();
+ private static final byte[] PERSONALIZATION_SP_GK_AUTH = "sp-gk-authentication".getBytes();
+ private static final byte[] PERSONALIZATION_FBE_KEY = "fbe-key".getBytes();
+ private static final byte[] PERSONALIZATION_SP_SPLIT = "sp-split".getBytes();
+ private static final byte[] PERSONALIZATION_E0 = "e0-encryption".getBytes();
+
+ static class AuthenticationResult {
+ public AuthenticationToken authToken;
+ public VerifyCredentialResponse gkResponse;
+ }
+
+ static class AuthenticationToken {
+ /*
+ * Here is the relationship between all three fields:
+ * P0 and P1 are two randomly-generated blocks. P1 is stored on disk but P0 is not.
+ * syntheticPassword = hash(P0 || P1)
+ * E0 = P0 encrypted under syntheticPassword, stored on disk.
+ */
+ private @Nullable byte[] E0;
+ private @Nullable byte[] P1;
+ private @NonNull String syntheticPassword;
+
+ public String deriveKeyStorePassword() {
+ return bytesToHex(SyntheticPasswordCrypto.personalisedHash(
+ PERSONALIZATION_KEY_STORE_PASSWORD, syntheticPassword.getBytes()));
+ }
+
+ public byte[] deriveGkPassword() {
+ return SyntheticPasswordCrypto.personalisedHash(PERSONALIZATION_SP_GK_AUTH,
+ syntheticPassword.getBytes());
+ }
+
+ public byte[] deriveDiskEncryptionKey() {
+ return SyntheticPasswordCrypto.personalisedHash(PERSONALIZATION_FBE_KEY,
+ syntheticPassword.getBytes());
+ }
+
+ private void initialize(byte[] P0, byte[] P1) {
+ this.P1 = P1;
+ this.syntheticPassword = String.valueOf(HexEncoding.encode(
+ SyntheticPasswordCrypto.personalisedHash(
+ PERSONALIZATION_SP_SPLIT, P0, P1)));
+ this.E0 = SyntheticPasswordCrypto.encrypt(this.syntheticPassword.getBytes(),
+ PERSONALIZATION_E0, P0);
+ }
+
+ public void recreate(byte[] secret) {
+ initialize(secret, this.P1);
+ }
+
+ protected static AuthenticationToken create() {
+ AuthenticationToken result = new AuthenticationToken();
+ result.initialize(secureRandom(SYNTHETIC_PASSWORD_LENGTH),
+ secureRandom(SYNTHETIC_PASSWORD_LENGTH));
+ return result;
+ }
+
+ public byte[] computeP0() {
+ if (E0 == null) {
+ return null;
+ }
+ return SyntheticPasswordCrypto.decrypt(syntheticPassword.getBytes(), PERSONALIZATION_E0,
+ E0);
+ }
+ }
+
+ static class PasswordData {
+ byte scryptN;
+ byte scryptR;
+ byte scryptP;
+ public int passwordType;
+ byte[] salt;
+ public byte[] passwordHandle;
+
+ public static PasswordData create(int passwordType) {
+ PasswordData result = new PasswordData();
+ result.scryptN = PASSWORD_SCRYPT_N;
+ result.scryptR = PASSWORD_SCRYPT_R;
+ result.scryptP = PASSWORD_SCRYPT_P;
+ result.passwordType = passwordType;
+ result.salt = secureRandom(PASSWORD_SALT_LENGTH);
+ return result;
+ }
+
+ public static PasswordData fromBytes(byte[] data) {
+ PasswordData result = new PasswordData();
+ ByteBuffer buffer = ByteBuffer.allocate(data.length);
+ buffer.put(data, 0, data.length);
+ buffer.flip();
+ result.passwordType = buffer.getInt();
+ result.scryptN = buffer.get();
+ result.scryptR = buffer.get();
+ result.scryptP = buffer.get();
+ int saltLen = buffer.getInt();
+ result.salt = new byte[saltLen];
+ buffer.get(result.salt);
+ int handleLen = buffer.getInt();
+ result.passwordHandle = new byte[handleLen];
+ buffer.get(result.passwordHandle);
+ return result;
+ }
+
+ public byte[] toBytes() {
+ ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES + 3 * Byte.BYTES
+ + Integer.BYTES + salt.length + Integer.BYTES + passwordHandle.length);
+ buffer.putInt(passwordType);
+ buffer.put(scryptN);
+ buffer.put(scryptR);
+ buffer.put(scryptP);
+ buffer.putInt(salt.length);
+ buffer.put(salt);
+ buffer.putInt(passwordHandle.length);
+ buffer.put(passwordHandle);
+ return buffer.array();
+ }
+ }
+
+ private LockSettingsStorage mStorage;
+
+ public SyntheticPasswordManager(LockSettingsStorage storage) {
+ mStorage = storage;
+ }
+
+
+ public int getCredentialType(long handle, int userId) {
+ byte[] passwordData = loadState(PASSWORD_DATA_NAME, handle, userId);
+ if (passwordData == null) {
+ Log.w(TAG, "getCredentialType: encountered empty password data for user " + userId);
+ return LockPatternUtils.CREDENTIAL_TYPE_NONE;
+ }
+ return PasswordData.fromBytes(passwordData).passwordType;
+ }
+
+ /**
+ * Initializing a new Authentication token, possibly from an existing credential and hash.
+ *
+ * The authentication token would bear a randomly-generated synthetic password.
+ *
+ * This method has the side effect of rebinding the SID of the given user to the
+ * newly-generated SP.
+ *
+ * If the existing credential hash is non-null, the existing SID mill be migrated so
+ * the synthetic password in the authentication token will produce the same SID
+ * (the corresponding synthetic password handle is persisted by SyntheticPasswordManager
+ * in a per-user data storage.
+ *
+ * If the existing credential hash is null, it means the given user should have no SID so
+ * SyntheticPasswordManager will nuke any SP handle previously persisted. In this case,
+ * the supplied credential parameter is also ignored.
+ *
+ * Also saves the escrow information necessary to re-generate the synthetic password under
+ * an escrow scheme. This information can be removed with {@link #destroyEscrowData} if
+ * password escrow should be disabled completely on the given user.
+ *
+ */
+ public AuthenticationToken newSyntheticPasswordAndSid(IGateKeeperService gatekeeper,
+ byte[] hash, String credential, int userId) throws RemoteException {
+ AuthenticationToken result = AuthenticationToken.create();
+ GateKeeperResponse response;
+ if (hash != null) {
+ response = gatekeeper.enroll(userId, hash, credential.getBytes(),
+ result.deriveGkPassword());
+ if (response.getResponseCode() != GateKeeperResponse.RESPONSE_OK) {
+ Log.w(TAG, "Fail to migrate SID, assuming no SID, user " + userId);
+ clearSidForUser(userId);
+ } else {
+ saveSyntheticPasswordHandle(response.getPayload(), userId);
+ }
+ } else {
+ clearSidForUser(userId);
+ }
+ saveEscrowData(result, userId);
+ return result;
+ }
+
+ /**
+ * Enroll a new password handle and SID for the given synthetic password and persist it on disk.
+ * Used when adding password to previously-unsecured devices.
+ */
+ public void newSidForUser(IGateKeeperService gatekeeper, AuthenticationToken authToken,
+ int userId) throws RemoteException {
+ GateKeeperResponse response = gatekeeper.enroll(userId, null, null,
+ authToken.deriveGkPassword());
+ if (response.getResponseCode() != GateKeeperResponse.RESPONSE_OK) {
+ Log.e(TAG, "Fail to create new SID for user " + userId);
+ return;
+ }
+ saveSyntheticPasswordHandle(response.getPayload(), userId);
+ }
+
+ // Nuke the SP handle (and as a result, its SID) for the given user.
+ public void clearSidForUser(int userId) {
+ destroyState(SP_HANDLE_NAME, true, DEFAULT_HANDLE, userId);
+ }
+
+ public boolean hasSidForUser(int userId) {
+ return hasState(SP_HANDLE_NAME, DEFAULT_HANDLE, userId);
+ }
+
+ // if null, it means there is no SID associated with the user
+ // This can happen if the user is migrated to SP but currently
+ // do not have a lockscreen password.
+ private byte[] loadSyntheticPasswordHandle(int userId) {
+ return loadState(SP_HANDLE_NAME, DEFAULT_HANDLE, userId);
+ }
+
+ private void saveSyntheticPasswordHandle(byte[] spHandle, int userId) {
+ saveState(SP_HANDLE_NAME, spHandle, DEFAULT_HANDLE, userId);
+ }
+
+ private boolean loadEscrowData(AuthenticationToken authToken, int userId) {
+ authToken.E0 = loadState(SP_E0_NAME, DEFAULT_HANDLE, userId);
+ authToken.P1 = loadState(SP_P1_NAME, DEFAULT_HANDLE, userId);
+ return authToken.E0 != null && authToken.P1 != null;
+ }
+
+ private void saveEscrowData(AuthenticationToken authToken, int userId) {
+ saveState(SP_E0_NAME, authToken.E0, DEFAULT_HANDLE, userId);
+ saveState(SP_P1_NAME, authToken.P1, DEFAULT_HANDLE, userId);
+ }
+
+ public boolean hasEscrowData(int userId) {
+ return hasState(SP_E0_NAME, DEFAULT_HANDLE, userId)
+ && hasState(SP_P1_NAME, DEFAULT_HANDLE, userId);
+ }
+
+ public void destroyEscrowData(int userId) {
+ destroyState(SP_E0_NAME, true, DEFAULT_HANDLE, userId);
+ destroyState(SP_P1_NAME, true, DEFAULT_HANDLE, userId);
+ }
+
+ /**
+ * Create a new password based SP blob based on the supplied authentication token, such that
+ * a future successful authentication with unwrapPasswordBasedSyntheticPassword() would result
+ * in the same authentication token.
+ *
+ * This method only creates SP blob wrapping around the given synthetic password and does not
+ * handle logic around SID or SP handle. The caller should separately ensure that the user's SID
+ * is consistent with the device state by calling other APIs in this class.
+ *
+ * @see #newSidForUser
+ * @see #clearSidForUser
+ */
+ public long createPasswordBasedSyntheticPassword(IGateKeeperService gatekeeper,
+ String credential, int credentialType, AuthenticationToken authToken, int userId)
+ throws RemoteException {
+ if (credential == null || credentialType == LockPatternUtils.CREDENTIAL_TYPE_NONE) {
+ credentialType = LockPatternUtils.CREDENTIAL_TYPE_NONE;
+ credential = DEFAULT_PASSWORD;
+ }
+
+ long handle = generateHandle();
+ PasswordData pwd = PasswordData.create(credentialType);
+ byte[] pwdToken = computePasswordToken(credential, pwd);
+
+ GateKeeperResponse response = gatekeeper.enroll(fakeUid(userId), null, null,
+ passwordTokenToGkInput(pwdToken));
+ if (response.getResponseCode() != GateKeeperResponse.RESPONSE_OK) {
+ Log.e(TAG, "Fail to enroll user password when creating SP for user " + userId);
+ return 0;
+ }
+ pwd.passwordHandle = response.getPayload();
+ long sid = sidFromPasswordHandle(pwd.passwordHandle);
+ saveState(PASSWORD_DATA_NAME, pwd.toBytes(), handle, userId);
+
+ byte[] applicationId = transformUnderSecdiscardable(pwdToken,
+ createSecdiscardable(handle, userId));
+ createSyntheticPasswordBlob(handle, SYNTHETIC_PASSWORD_PASSWORD_BASED, authToken,
+ applicationId, sid, userId);
+ return handle;
+ }
+
+ private ArrayMap<Integer, ArrayMap<Long, byte[]>> tokenMap = new ArrayMap<>();
+
+ public long createTokenBasedSyntheticPassword(byte[] token, int userId) {
+ long handle = generateHandle();
+ byte[] applicationId = transformUnderSecdiscardable(token,
+ createSecdiscardable(handle, userId));
+ if (!tokenMap.containsKey(userId)) {
+ tokenMap.put(userId, new ArrayMap<>());
+ }
+ tokenMap.get(userId).put(handle, applicationId);
+ return handle;
+ }
+
+ public Set<Long> getPendingTokensForUser(int userId) {
+ if (!tokenMap.containsKey(userId)) {
+ return Collections.emptySet();
+ }
+ return tokenMap.get(userId).keySet();
+ }
+
+ public boolean removePendingToken(long handle, int userId) {
+ if (!tokenMap.containsKey(userId)) {
+ return false;
+ }
+ return tokenMap.get(userId).remove(handle) != null;
+ }
+
+ public boolean activateTokenBasedSyntheticPassword(long handle, AuthenticationToken authToken,
+ int userId) {
+ if (!tokenMap.containsKey(userId)) {
+ return false;
+ }
+ byte[] applicationId = tokenMap.get(userId).get(handle);
+ if (applicationId == null) {
+ return false;
+ }
+ if (!loadEscrowData(authToken, userId)) {
+ Log.w(TAG, "User is not escrowable");
+ return false;
+ }
+ createSyntheticPasswordBlob(handle, SYNTHETIC_PASSWORD_TOKEN_BASED, authToken,
+ applicationId, 0L, userId);
+ tokenMap.get(userId).remove(handle);
+ return true;
+ }
+
+ private void createSyntheticPasswordBlob(long handle, byte type, AuthenticationToken authToken,
+ byte[] applicationId, long sid, int userId) {
+ final byte[] secret;
+ if (type == SYNTHETIC_PASSWORD_TOKEN_BASED) {
+ secret = authToken.computeP0();
+ } else {
+ secret = authToken.syntheticPassword.getBytes();
+ }
+ byte[] content = createSPBlob(getHandleName(handle), secret, applicationId, sid);
+ byte[] blob = new byte[content.length + 1 + 1];
+ blob[0] = SYNTHETIC_PASSWORD_VERSION;
+ blob[1] = type;
+ System.arraycopy(content, 0, blob, 2, content.length);
+ saveState(SP_BLOB_NAME, blob, handle, userId);
+ }
+
+ /**
+ * Decrypt a synthetic password by supplying the user credential and corresponding password
+ * blob handle generated previously. If the decryption is successful, initiate a GateKeeper
+ * verification to referesh the SID & Auth token maintained by the system.
+ */
+ public AuthenticationResult unwrapPasswordBasedSyntheticPassword(IGateKeeperService gatekeeper,
+ long handle, String credential, int userId) throws RemoteException {
+ if (credential == null) {
+ credential = DEFAULT_PASSWORD;
+ }
+ AuthenticationResult result = new AuthenticationResult();
+ PasswordData pwd = PasswordData.fromBytes(loadState(PASSWORD_DATA_NAME, handle, userId));
+ byte[] pwdToken = computePasswordToken(credential, pwd);
+ byte[] gkPwdToken = passwordTokenToGkInput(pwdToken);
+
+ GateKeeperResponse response = gatekeeper.verifyChallenge(fakeUid(userId), 0L,
+ pwd.passwordHandle, gkPwdToken);
+ int responseCode = response.getResponseCode();
+ if (responseCode == GateKeeperResponse.RESPONSE_OK) {
+ result.gkResponse = VerifyCredentialResponse.OK;
+ if (response.getShouldReEnroll()) {
+ GateKeeperResponse reenrollResponse = gatekeeper.enroll(fakeUid(userId),
+ pwd.passwordHandle, gkPwdToken, gkPwdToken);
+ if (reenrollResponse.getResponseCode() == GateKeeperResponse.RESPONSE_OK) {
+ pwd.passwordHandle = reenrollResponse.getPayload();
+ saveState(PASSWORD_DATA_NAME, pwd.toBytes(), handle, userId);
+ } else {
+ Log.w(TAG, "Fail to re-enroll user password for user " + userId);
+ // continue the flow anyway
+ }
+ }
+ } else if (responseCode == GateKeeperResponse.RESPONSE_RETRY) {
+ result.gkResponse = new VerifyCredentialResponse(response.getTimeout());
+ return result;
+ } else {
+ result.gkResponse = VerifyCredentialResponse.ERROR;
+ return result;
+ }
+
+
+ byte[] applicationId = transformUnderSecdiscardable(pwdToken,
+ loadSecdiscardable(handle, userId));
+ result.authToken = unwrapSyntheticPasswordBlob(handle, SYNTHETIC_PASSWORD_PASSWORD_BASED,
+ applicationId, userId);
+
+ // Perform verifyChallenge to refresh auth tokens for GK if user password exists.
+ result.gkResponse = verifyChallenge(gatekeeper, result.authToken, 0L, userId);
+ return result;
+ }
+
+ /**
+ * Decrypt a synthetic password by supplying an escrow token and corresponding token
+ * blob handle generated previously. If the decryption is successful, initiate a GateKeeper
+ * verification to referesh the SID & Auth token maintained by the system.
+ */
+ public @NonNull AuthenticationResult unwrapTokenBasedSyntheticPassword(
+ IGateKeeperService gatekeeper, long handle, byte[] token, int userId)
+ throws RemoteException {
+ AuthenticationResult result = new AuthenticationResult();
+ byte[] applicationId = transformUnderSecdiscardable(token,
+ loadSecdiscardable(handle, userId));
+ result.authToken = unwrapSyntheticPasswordBlob(handle, SYNTHETIC_PASSWORD_TOKEN_BASED,
+ applicationId, userId);
+ if (result.authToken != null) {
+ result.gkResponse = verifyChallenge(gatekeeper, result.authToken, 0L, userId);
+ if (result.gkResponse == null) {
+ // The user currently has no password. return OK with null payload so null
+ // is propagated to unlockUser()
+ result.gkResponse = VerifyCredentialResponse.OK;
+ }
+ } else {
+ result.gkResponse = VerifyCredentialResponse.ERROR;
+ }
+ return result;
+ }
+
+ private AuthenticationToken unwrapSyntheticPasswordBlob(long handle, byte type,
+ byte[] applicationId, int userId) {
+ byte[] blob = loadState(SP_BLOB_NAME, handle, userId);
+ if (blob == null) {
+ return null;
+ }
+ if (blob[0] != SYNTHETIC_PASSWORD_VERSION) {
+ throw new RuntimeException("Unknown blob version");
+ }
+ if (blob[1] != type) {
+ throw new RuntimeException("Invalid blob type");
+ }
+ byte[] secret = decryptSPBlob(getHandleName(handle),
+ Arrays.copyOfRange(blob, 2, blob.length), applicationId);
+ if (secret == null) {
+ Log.e(TAG, "Fail to decrypt SP for user " + userId);
+ return null;
+ }
+ AuthenticationToken result = new AuthenticationToken();
+ if (type == SYNTHETIC_PASSWORD_TOKEN_BASED) {
+ if (!loadEscrowData(result, userId)) {
+ Log.e(TAG, "User is not escrowable: " + userId);
+ return null;
+ }
+ result.recreate(secret);
+ } else {
+ result.syntheticPassword = new String(secret);
+ }
+ return result;
+ }
+
+ /**
+ * performs GK verifyChallenge and returns auth token, re-enrolling SP password handle
+ * if required.
+ *
+ * Normally performing verifyChallenge with an AuthenticationToken should always return
+ * RESPONSE_OK, since user authentication failures are detected earlier when trying to
+ * decrypt SP.
+ */
+ public VerifyCredentialResponse verifyChallenge(IGateKeeperService gatekeeper,
+ @NonNull AuthenticationToken auth, long challenge, int userId) throws RemoteException {
+ byte[] spHandle = loadSyntheticPasswordHandle(userId);
+ if (spHandle == null) {
+ // There is no password handle associated with the given user, i.e. the user is not
+ // secured by lockscreen and has no SID, so just return here;
+ return null;
+ }
+ VerifyCredentialResponse result;
+ GateKeeperResponse response = gatekeeper.verifyChallenge(userId, challenge,
+ spHandle, auth.deriveGkPassword());
+ int responseCode = response.getResponseCode();
+ if (responseCode == GateKeeperResponse.RESPONSE_OK) {
+ result = new VerifyCredentialResponse(response.getPayload());
+ if (response.getShouldReEnroll()) {
+ response = gatekeeper.enroll(userId, spHandle,
+ spHandle, auth.deriveGkPassword());
+ if (response.getResponseCode() == GateKeeperResponse.RESPONSE_OK) {
+ spHandle = response.getPayload();
+ saveSyntheticPasswordHandle(spHandle, userId);
+ // Call self again to re-verify with updated handle
+ return verifyChallenge(gatekeeper, auth, challenge, userId);
+ } else {
+ Log.w(TAG, "Fail to re-enroll SP handle for user " + userId);
+ // Fall through, return existing handle
+ }
+ }
+ } else if (responseCode == GateKeeperResponse.RESPONSE_RETRY) {
+ result = new VerifyCredentialResponse(response.getTimeout());
+ } else {
+ result = VerifyCredentialResponse.ERROR;
+ }
+ return result;
+ }
+
+ public boolean existsHandle(long handle, int userId) {
+ return hasState(SP_BLOB_NAME, handle, userId);
+ }
+
+ public void destroyTokenBasedSyntheticPassword(long handle, int userId) {
+ destroySyntheticPassword(handle, userId);
+ destroyState(SECDISCARDABLE_NAME, true, handle, userId);
+ }
+
+ public void destroyPasswordBasedSyntheticPassword(long handle, int userId) {
+ destroySyntheticPassword(handle, userId);
+ destroyState(SECDISCARDABLE_NAME, true, handle, userId);
+ destroyState(PASSWORD_DATA_NAME, true, handle, userId);
+ }
+
+ private void destroySyntheticPassword(long handle, int userId) {
+ destroyState(SP_BLOB_NAME, true, handle, userId);
+ destroyState(SP_E0_NAME, true, handle, userId);
+ destroyState(SP_P1_NAME, true, handle, userId);
+ destroySPBlobKey(getHandleName(handle));
+ }
+
+ private byte[] transformUnderSecdiscardable(byte[] data, byte[] rawSecdiscardable) {
+ byte[] secdiscardable = SyntheticPasswordCrypto.personalisedHash(
+ PERSONALISATION_SECDISCARDABLE, rawSecdiscardable);
+ byte[] result = new byte[data.length + secdiscardable.length];
+ System.arraycopy(data, 0, result, 0, data.length);
+ System.arraycopy(secdiscardable, 0, result, data.length, secdiscardable.length);
+ return result;
+ }
+
+ private byte[] createSecdiscardable(long handle, int userId) {
+ byte[] data = secureRandom(SECDISCARDABLE_LENGTH);
+ saveState(SECDISCARDABLE_NAME, data, handle, userId);
+ return data;
+ }
+
+ private byte[] loadSecdiscardable(long handle, int userId) {
+ return loadState(SECDISCARDABLE_NAME, handle, userId);
+ }
+
+ private boolean hasState(String stateName, long handle, int userId) {
+ return !ArrayUtils.isEmpty(loadState(stateName, handle, userId));
+ }
+
+ private byte[] loadState(String stateName, long handle, int userId) {
+ return mStorage.readSyntheticPasswordState(userId, handle, stateName);
+ }
+
+ private void saveState(String stateName, byte[] data, long handle, int userId) {
+ mStorage.writeSyntheticPasswordState(userId, handle, stateName, data);
+ }
+
+ private void destroyState(String stateName, boolean secure, long handle, int userId) {
+ mStorage.deleteSyntheticPasswordState(userId, handle, stateName, secure);
+ }
+
+ protected byte[] decryptSPBlob(String blobKeyName, byte[] blob, byte[] applicationId) {
+ return SyntheticPasswordCrypto.decryptBlob(blobKeyName, blob, applicationId);
+ }
+
+ protected byte[] createSPBlob(String blobKeyName, byte[] data, byte[] applicationId, long sid) {
+ return SyntheticPasswordCrypto.createBlob(blobKeyName, data, applicationId, sid);
+ }
+
+ protected void destroySPBlobKey(String keyAlias) {
+ SyntheticPasswordCrypto.destroyBlobKey(keyAlias);
+ }
+
+ public static long generateHandle() {
+ SecureRandom rng = new SecureRandom();
+ long result;
+ do {
+ result = rng.nextLong();
+ } while (result == DEFAULT_HANDLE);
+ return result;
+ }
+
+ private int fakeUid(int uid) {
+ return 100000 + uid;
+ }
+
+ protected static byte[] secureRandom(int length) {
+ try {
+ return SecureRandom.getInstance("SHA1PRNG").generateSeed(length);
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ private String getHandleName(long handle) {
+ return String.format("%s%x", LockPatternUtils.SYNTHETIC_PASSWORD_KEY_PREFIX, handle);
+ }
+
+ private byte[] computePasswordToken(String password, PasswordData data) {
+ return scrypt(password, data.salt, 1 << data.scryptN, 1 << data.scryptR, 1 << data.scryptP,
+ PASSWORD_TOKEN_LENGTH);
+ }
+
+ private byte[] passwordTokenToGkInput(byte[] token) {
+ return SyntheticPasswordCrypto.personalisedHash(PERSONALIZATION_USER_GK_AUTH, token);
+ }
+
+ protected long sidFromPasswordHandle(byte[] handle) {
+ return nativeSidFromPasswordHandle(handle);
+ }
+
+ protected byte[] scrypt(String password, byte[] salt, int N, int r, int p, int outLen) {
+ return nativeScrypt(password.getBytes(), salt, N, r, p, outLen);
+ }
+
+ native long nativeSidFromPasswordHandle(byte[] handle);
+ native byte[] nativeScrypt(byte[] password, byte[] salt, int N, int r, int p, int outLen);
+
+ final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
+ public static String bytesToHex(byte[] bytes) {
+ if (bytes == null) {
+ return "null";
+ }
+ char[] hexChars = new char[bytes.length * 2];
+ for ( int j = 0; j < bytes.length; j++ ) {
+ int v = bytes[j] & 0xFF;
+ hexChars[j * 2] = hexArray[v >>> 4];
+ hexChars[j * 2 + 1] = hexArray[v & 0x0F];
+ }
+ return new String(hexChars);
+ }
+}
diff --git a/services/core/java/com/android/server/SystemService.java b/services/core/java/com/android/server/SystemService.java
index ce3166d..421d5a6 100644
--- a/services/core/java/com/android/server/SystemService.java
+++ b/services/core/java/com/android/server/SystemService.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.os.IBinder;
import android.os.ServiceManager;
+import android.os.UserManager;
/**
* The base class for services running in the system process. Override and implement
@@ -133,9 +134,16 @@
public void onStartUser(int userHandle) {}
/**
- * Called when an existing user is unlocked. This means the
- * credential-encrypted storage for that user is now available, and
- * encryption-aware component filtering is no longer in effect.
+ * Called when an existing user is in the process of being unlocked. This
+ * means the credential-encrypted storage for that user is now available,
+ * and encryption-aware component filtering is no longer in effect.
+ * <p>
+ * While dispatching this event to services, the user is in the
+ * {@code STATE_RUNNING_UNLOCKING} state, and once dispatching is finished
+ * the user will transition into the {@code STATE_RUNNING_UNLOCKED} state.
+ * Code written inside system services should use
+ * {@link UserManager#isUserUnlockingOrUnlocked(int)} to handle both of
+ * these states.
*
* @param userHandle The identifier of the user.
*/
diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java
index 3f97d4f..cb13a3d 100644
--- a/services/core/java/com/android/server/SystemServiceManager.java
+++ b/services/core/java/com/android/server/SystemServiceManager.java
@@ -16,6 +16,7 @@
package com.android.server;
+import android.annotation.NonNull;
import android.content.Context;
import android.os.Trace;
import android.util.Slog;
@@ -105,22 +106,25 @@
+ ": service constructor threw an exception", ex);
}
- // Register it.
- mServices.add(service);
-
- // Start it.
- try {
- service.onStart();
- } catch (RuntimeException ex) {
- throw new RuntimeException("Failed to start service " + name
- + ": onStart threw an exception", ex);
- }
+ startService(service);
return service;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
+ public void startService(@NonNull final SystemService service) {
+ // Register it.
+ mServices.add(service);
+ // Start it.
+ try {
+ service.onStart();
+ } catch (RuntimeException ex) {
+ throw new RuntimeException("Failed to start service " + service.getClass().getName()
+ + ": onStart threw an exception", ex);
+ }
+ }
+
/**
* Starts the specified boot phase for all system services that have been started up to
* this point.
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index fbc4440..1b2c75d 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -182,7 +182,8 @@
static {
ACCOUNTS_CHANGED_INTENT = new Intent(AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION);
- ACCOUNTS_CHANGED_INTENT.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ ACCOUNTS_CHANGED_INTENT.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
+ | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
}
private final LinkedHashMap<String, Session> mSessions = new LinkedHashMap<String, Session>();
@@ -481,8 +482,13 @@
managedTypes.add(accountType);
}
- return getAccountsAndVisibilityForPackage(packageName, managedTypes, callingUid,
- getUserAccounts(UserHandle.getUserId(callingUid)));
+ long identityToken = clearCallingIdentity();
+ try {
+ return getAccountsAndVisibilityForPackage(packageName, managedTypes, callingUid,
+ getUserAccounts(UserHandle.getUserId(callingUid)));
+ } finally {
+ restoreCallingIdentity(identityToken);
+ }
}
/*
@@ -560,7 +566,7 @@
a.type);
throw new SecurityException(msg);
}
- return getAccountVisibility(a, packageName,
+ return resolveAccountVisibility(a, packageName,
getUserAccounts(UserHandle.getUserId(callingUid)));
}
@@ -4087,9 +4093,10 @@
}
@Override
- public void addSharedAccountsFromParentUser(int parentUserId, int userId) {
+ public void addSharedAccountsFromParentUser(int parentUserId, int userId,
+ String opPackageName) {
checkManageOrCreateUsersPermission("addSharedAccountsFromParentUser");
- Account[] accounts = getAccountsAsUser(null, parentUserId, mContext.getOpPackageName());
+ Account[] accounts = getAccountsAsUser(null, parentUserId, opPackageName);
for (Account account : accounts) {
addSharedAccountAsUser(account, userId);
}
@@ -4932,21 +4939,20 @@
}
private boolean isPrivileged(int callingUid) {
- final int callingUserId = UserHandle.getUserId(callingUid);
-
- final PackageManager userPackageManager;
+ String[] packages;
+ long identityToken = Binder.clearCallingIdentity();
try {
- userPackageManager = mContext.createPackageContextAsUser(
- "android", 0, new UserHandle(callingUserId)).getPackageManager();
- } catch (NameNotFoundException e) {
- Log.d(TAG, "Package not found " + e.getMessage());
+ packages = mPackageManager.getPackagesForUid(callingUid);
+ } finally {
+ Binder.restoreCallingIdentity(identityToken);
+ }
+ if (packages == null) {
+ Log.d(TAG, "No packages for callingUid " + callingUid);
return false;
}
-
- String[] packages = userPackageManager.getPackagesForUid(callingUid);
for (String name : packages) {
try {
- PackageInfo packageInfo = userPackageManager.getPackageInfo(name, 0 /* flags */);
+ PackageInfo packageInfo = mPackageManager.getPackageInfo(name, 0 /* flags */);
if (packageInfo != null
&& (packageInfo.applicationInfo.privateFlags
& ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0) {
@@ -5392,6 +5398,9 @@
if (user != null && user.isRestricted()) {
String[] packages =
mPackageManager.getPackagesForUid(callingUid);
+ if (packages == null) {
+ packages = new String[] {};
+ }
// If any of the packages is a visible listed package, return the full set,
// otherwise return non-shared accounts only.
// This might be a temporary way to specify a visible list
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index cec5800..2bc131f 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -703,27 +703,21 @@
return false;
}
- public long setServiceForegroundLocked(ComponentName className, IBinder token,
+ public void setServiceForegroundLocked(ComponentName className, IBinder token,
int id, Notification notification, int flags) {
final int userId = UserHandle.getCallingUserId();
final long origId = Binder.clearCallingIdentity();
try {
ServiceRecord r = findServiceLocked(className, token, userId);
if (r != null) {
- return setServiceForegroundInnerLocked(r, id, notification, flags);
+ setServiceForegroundInnerLocked(r, id, notification, flags);
}
- return ActivityThread.INVALID_PROC_STATE_SEQ;
} finally {
Binder.restoreCallingIdentity(origId);
}
}
- /**
- * @return current process state sequence number {@link UidRecord#curProcStateSeq} corresponding
- * to the ServiceRecord {@param r} if the calling service has to block until the
- * network rules are udpated, Otherwise {@link ActivityThread#INVALID_PROC_STATE_SEQ}.
- */
- private long setServiceForegroundInnerLocked(ServiceRecord r, int id,
+ private void setServiceForegroundInnerLocked(ServiceRecord r, int id,
Notification notification, int flags) {
if (id != 0) {
if (notification == null) {
@@ -742,7 +736,7 @@
Slog.w(TAG, "Instant app " + r.appInfo.packageName
+ " does not have permission to create foreground services"
+ ", ignoring.");
- return ActivityThread.INVALID_PROC_STATE_SEQ;
+ return;
case AppOpsManager.MODE_ERRORED:
throw new SecurityException("Instant app " + r.appInfo.packageName
+ " does not have permission to create foreground services");
@@ -770,18 +764,12 @@
r.foregroundNoti = notification;
r.isForeground = true;
r.postNotification();
- long procStateSeqToReturn = ActivityThread.INVALID_PROC_STATE_SEQ;
if (r.app != null) {
updateServiceForegroundLocked(r.app, true);
- if (r.app.uidRecord != null &&
- r.app.uidRecord.blockState == ActivityThread.NETWORK_STATE_BLOCK) {
- procStateSeqToReturn = r.app.uidRecord.curProcStateSeq;
- }
}
getServiceMapLocked(r.userId).ensureNotStartingBackgroundLocked(r);
mAm.notifyPackageUse(r.serviceInfo.packageName,
PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE);
- return procStateSeqToReturn;
} else {
if (r.isForeground) {
r.isForeground = false;
@@ -802,7 +790,6 @@
}
}
}
- return ActivityThread.INVALID_PROC_STATE_SEQ;
}
private void cancelForegroudNotificationLocked(ServiceRecord r) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
index 8ed95ee..88e0d03 100644
--- a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
+++ b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
@@ -63,7 +63,6 @@
static final boolean DEBUG_LOCKTASK = DEBUG_ALL || false;
static final boolean DEBUG_LRU = DEBUG_ALL || false;
static final boolean DEBUG_MU = DEBUG_ALL || false;
- static final boolean DEBUG_NETWORK = DEBUG_ALL || false;
static final boolean DEBUG_OOM_ADJ = DEBUG_ALL || false;
static final boolean DEBUG_PAUSE = DEBUG_ALL || false;
static final boolean DEBUG_POWER = DEBUG_ALL || false;
@@ -108,7 +107,6 @@
static final String POSTFIX_LOCKTASK = (APPEND_CATEGORY_NAME) ? "_LockTask" : "";
static final String POSTFIX_LRU = (APPEND_CATEGORY_NAME) ? "_LRU" : "";
static final String POSTFIX_MU = "_MU";
- static final String POSTFIX_NETWORK = "_Network";
static final String POSTFIX_OOM_ADJ = (APPEND_CATEGORY_NAME) ? "_OomAdj" : "";
static final String POSTFIX_PAUSE = (APPEND_CATEGORY_NAME) ? "_Pause" : "";
static final String POSTFIX_POWER = (APPEND_CATEGORY_NAME) ? "_Power" : "";
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index a73eb18..67cac98 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -42,9 +42,6 @@
import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.content.res.Configuration.UI_MODE_TYPE_TELEVISION;
-import static android.net.NetworkPolicyManager.isProcStateAllowedWhileIdleOrPowerSaveMode;
-import static android.net.NetworkPolicyManager.isProcStateAllowedWhileRestrictBackgroundOn;
-import static android.net.NetworkPolicyManager.UidStateWithSeqObserver;
import static android.os.Build.VERSION_CODES.N;
import static android.os.Process.PROC_CHAR;
import static android.os.Process.PROC_OUT_LONG;
@@ -79,7 +76,6 @@
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKTASK;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LRU;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
-import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_NETWORK;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_OOM_ADJ;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PERMISSIONS_REVIEW;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_POWER;
@@ -109,7 +105,6 @@
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LOCKTASK;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LRU;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_MU;
-import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_NETWORK;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_OOM_ADJ;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_POWER;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PROCESSES;
@@ -231,6 +226,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.UserInfo;
import android.content.res.CompatibilityInfo;
@@ -241,6 +237,7 @@
import android.graphics.Point;
import android.graphics.Rect;
import android.location.LocationManager;
+import android.media.audiofx.AudioEffect;
import android.metrics.LogMaker;
import android.net.Proxy;
import android.net.ProxyInfo;
@@ -293,6 +290,7 @@
import android.service.voice.VoiceInteractionManagerInternal;
import android.service.voice.VoiceInteractionSession;
import android.telecom.TelecomManager;
+import android.text.TextUtils;
import android.text.format.DateUtils;
import android.text.format.Time;
import android.text.style.SuggestionSpan;
@@ -358,7 +356,6 @@
import com.android.server.Watchdog;
import com.android.server.am.ActivityStack.ActivityState;
import com.android.server.firewall.IntentFirewall;
-import com.android.server.net.NetworkPolicyManagerService;
import com.android.server.pm.Installer;
import com.android.server.pm.Installer.InstallerException;
import com.android.server.statusbar.StatusBarManagerInternal;
@@ -415,7 +412,6 @@
private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK;
private static final String TAG_LRU = TAG + POSTFIX_LRU;
private static final String TAG_MU = TAG + POSTFIX_MU;
- private static final String TAG_NETWORK = TAG + POSTFIX_NETWORK;
private static final String TAG_OOM_ADJ = TAG + POSTFIX_OOM_ADJ;
private static final String TAG_POWER = TAG + POSTFIX_POWER;
private static final String TAG_PROCESS_OBSERVERS = TAG + POSTFIX_PROCESS_OBSERVERS;
@@ -556,7 +552,7 @@
// Intent sent when remote bugreport collection has been completed
private static final String INTENT_REMOTE_BUGREPORT_FINISHED =
- "android.intent.action.REMOTE_BUGREPORT_FINISHED";
+ "com.android.internal.intent.action.REMOTE_BUGREPORT_FINISHED";
// Used to indicate that an app transition should be animated.
static final boolean ANIMATE = true;
@@ -602,8 +598,6 @@
BroadcastStats mLastBroadcastStats;
BroadcastStats mCurBroadcastStats;
- private UidStateWithSeqObserver mUidStateWithSeqObserver;
-
BroadcastQueue broadcastQueueForIntent(Intent intent) {
final boolean isFg = (intent.getFlags() & Intent.FLAG_RECEIVER_FOREGROUND) != 0;
if (DEBUG_BROADCAST_BACKGROUND) Slog.i(TAG_BROADCAST,
@@ -3029,15 +3023,24 @@
startRunningVoiceLocked(r.task.voiceSession, r.info.applicationInfo.uid);
} else {
finishRunningVoiceLocked();
- IVoiceInteractionSession session;
- if (mLastResumedActivity != null
- && ((session = mLastResumedActivity.task.voiceSession) != null
- || (session = mLastResumedActivity.voiceSession) != null)) {
- // We had been in a voice interaction session, but now focused has
- // move to something different. Just finish the session, we can't
- // return to it and retain the proper state and synchronization with
- // the voice interaction service.
- finishVoiceTask(session);
+
+ if (mLastResumedActivity != null) {
+ final IVoiceInteractionSession session;
+
+ if (mLastResumedActivity.task != null
+ && mLastResumedActivity.task.voiceSession != null) {
+ session = mLastResumedActivity.task.voiceSession;
+ } else {
+ session = mLastResumedActivity.voiceSession;
+ }
+
+ if (session != null) {
+ // We had been in a voice interaction session, but now focused has
+ // move to something different. Just finish the session, we can't
+ // return to it and retain the proper state and synchronization with
+ // the voice interaction service.
+ finishVoiceTask(session);
+ }
}
}
@@ -3505,6 +3508,7 @@
info.processName = processName;
info.className = entryPoint;
info.packageName = "android";
+ info.seInfoUser = SELinuxUtil.COMPLETE_STR;
ProcessRecord proc = startProcessLocked(processName, info /* info */,
false /* knownToBeDead */, 0 /* intentFlags */, "" /* hostingType */,
null /* hostingName */, true /* allowWhileBooting */, true /* isolated */,
@@ -3776,6 +3780,13 @@
app.requiredAbi = requiredAbi;
app.instructionSet = instructionSet;
+ // the per-user SELinux context must be set
+ if (TextUtils.isEmpty(app.info.seInfoUser)) {
+ Slog.wtf(TAG, "SELinux tag not defined",
+ new IllegalStateException("SELinux tag not defined"));
+ }
+ final String seInfo = app.info.seInfo
+ + (TextUtils.isEmpty(app.info.seInfoUser) ? "" : app.info.seInfoUser);
// Start the process. It will either succeed and return a result containing
// the PID of the new process, or else throw a RuntimeException.
boolean isActivityProcess = (entryPoint == null);
@@ -3787,12 +3798,12 @@
if (hostingType.equals("webview_service")) {
startResult = Process.startWebView(entryPoint,
app.processName, uid, uid, gids, debugFlags, mountExternal,
- app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet,
+ app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
app.info.dataDir, null, entryPointArgs);
} else {
startResult = Process.start(entryPoint,
app.processName, uid, uid, gids, debugFlags, mountExternal,
- app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet,
+ app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
app.info.dataDir, invokeWith, entryPointArgs);
}
checkTime(startTime, "startProcess: returned from zygote!");
@@ -3808,7 +3819,7 @@
try {
AppGlobals.getPackageManager().logAppProcessStartIfNeeded(app.processName, app.uid,
- app.info.seinfo, app.info.sourceDir, startResult.pid);
+ seInfo, app.info.sourceDir, startResult.pid);
} catch (RemoteException ex) {
// Ignore
}
@@ -4220,25 +4231,6 @@
"*** Delivering " + N + " uid changes");
}
- if (mUidStateWithSeqObserver != null) {
- final int registeredCallbackCount = mUidObservers.getRegisteredCallbackCount();
- for (int i = 0; i < N; ++i) {
- final UidRecord.ChangeItem item = mActiveUidChanges[i];
- if (item.change == UidRecord.CHANGE_PROCSTATE) {
- mUidStateWithSeqObserver.onUidStateChangedWithSeq(
- item.uid, item.processState, item.procStateSeq);
- if (VALIDATE_UID_STATES && registeredCallbackCount == 0) {
- UidRecord validateUid = mValidateUids.get(item.uid);
- if (validateUid == null) {
- validateUid = new UidRecord(item.uid);
- mValidateUids.put(item.uid, validateUid);
- }
- validateUid.curProcState = validateUid.setProcState = item.processState;
- }
- }
- }
- }
-
int i = mUidObservers.beginBroadcast();
while (i > 0) {
i--;
@@ -7711,7 +7703,7 @@
aspectRatio);
mStackSupervisor.moveActivityToPinnedStackLocked(r, "enterPictureInPictureMode",
bounds, true /* moveHomeStackToFront */);
- final ActivityStack stack = mStackSupervisor.getStack(PINNED_STACK_ID);
+ final PinnedActivityStack stack = mStackSupervisor.getStack(PINNED_STACK_ID);
stack.setPictureInPictureAspectRatio(aspectRatio);
stack.setPictureInPictureActions(actions);
@@ -7765,9 +7757,9 @@
// Only update the saved args from the args that are set
r.pictureInPictureArgs.copyOnlySet(args);
- final ActivityStack stack = r.getStack();
- if (stack.getStackId() == PINNED_STACK_ID) {
+ if (r.getStack().getStackId() == PINNED_STACK_ID) {
// If the activity is already in picture-in-picture, update the pinned stack now
+ final PinnedActivityStack stack = r.getStack();
stack.setPictureInPictureAspectRatio(r.pictureInPictureArgs.getAspectRatio());
stack.setPictureInPictureActions(r.pictureInPictureArgs.getActions());
}
@@ -10329,7 +10321,7 @@
synchronized (this) {
if (animate) {
if (stackId == PINNED_STACK_ID) {
- final ActivityStack pinnedStack =
+ final PinnedActivityStack pinnedStack =
mStackSupervisor.getStack(PINNED_STACK_ID);
pinnedStack.animateResizePinnedStack(bounds, animationDuration);
} else {
@@ -10653,7 +10645,7 @@
providers = AppGlobals.getPackageManager()
.queryContentProviders(app.processName, app.uid,
STOCK_PM_FLAGS | PackageManager.GET_URI_PERMISSION_PATTERNS
- | MATCH_DEBUG_TRIAGED_MISSING)
+ | MATCH_DEBUG_TRIAGED_MISSING, /*metadastaKey=*/ null)
.getList();
} catch (RemoteException ex) {
}
@@ -10719,16 +10711,14 @@
try {
cpi = AppGlobals.getPackageManager().resolveContentProvider(authority,
STOCK_PM_FLAGS | PackageManager.GET_URI_PERMISSION_PATTERNS
+ | PackageManager.MATCH_DISABLED_COMPONENTS
| PackageManager.MATCH_DIRECT_BOOT_AWARE
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
userId);
} catch (RemoteException ignored) {
}
if (cpi == null) {
- // TODO: make this an outright failure in a future platform release;
- // until then anonymous content notifications are unprotected
- //return "Failed to find provider " + authority + " for user " + userId;
- return null;
+ return "Failed to find provider " + authority + " for user " + userId;
}
ProcessRecord r = null;
@@ -17615,16 +17605,11 @@
}
}
- /**
- * Returns sequence number associated with the current process state change if the service
- * coming to the foreground needs to block for network before proceeding, otherwise
- * {@link ActivityThread#INVALID_PROC_STATE_SEQ}.
- */
@Override
- public long setServiceForeground(ComponentName className, IBinder token,
+ public void setServiceForeground(ComponentName className, IBinder token,
int id, Notification notification, int flags) {
synchronized(this) {
- return mServices.setServiceForegroundLocked(className, token, id, notification, flags);
+ mServices.setServiceForegroundLocked(className, token, id, notification, flags);
}
}
@@ -18047,15 +18032,18 @@
} else if (rl.uid != callingUid) {
throw new IllegalArgumentException(
"Receiver requested to register for uid " + callingUid
- + " was previously registered for uid " + rl.uid);
+ + " was previously registered for uid " + rl.uid
+ + " callerPackage is " + callerPackage);
} else if (rl.pid != callingPid) {
throw new IllegalArgumentException(
"Receiver requested to register for pid " + callingPid
- + " was previously registered for pid " + rl.pid);
+ + " was previously registered for pid " + rl.pid
+ + " callerPackage is " + callerPackage);
} else if (rl.userId != userId) {
throw new IllegalArgumentException(
"Receiver requested to register for user " + userId
- + " was previously registered for user " + rl.userId);
+ + " was previously registered for user " + rl.userId
+ + " callerPackage is " + callerPackage);
}
BroadcastFilter bf = new BroadcastFilter(filter, rl, callerPackage,
permission, callingUid, userId);
@@ -18257,7 +18245,9 @@
|| AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)
|| LocationManager.HIGH_POWER_REQUEST_CHANGE_ACTION.equals(action)
|| TelephonyIntents.ACTION_REQUEST_OMADM_CONFIGURATION_UPDATE.equals(action)
- || SuggestionSpan.ACTION_SUGGESTION_PICKED.equals(action)) {
+ || SuggestionSpan.ACTION_SUGGESTION_PICKED.equals(action)
+ || AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION.equals(action)
+ || AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION.equals(action)) {
// Broadcast is either protected, or it's a public action that
// we've relaxed, so it's fine for system internals to send.
return;
@@ -18774,8 +18764,7 @@
}
List<BroadcastFilter> registeredReceiversForUser =
mReceiverResolver.queryIntent(intent,
- resolvedType, false, false /*visibleToEphemeral*/,
- false /*isInstant*/, users[i]);
+ resolvedType, false /*defaultOnly*/, users[i]);
if (registeredReceivers == null) {
registeredReceivers = registeredReceiversForUser;
} else if (registeredReceiversForUser != null) {
@@ -18784,8 +18773,7 @@
}
} else {
registeredReceivers = mReceiverResolver.queryIntent(intent,
- resolvedType, false, false /*visibleToEphemeral*/,
- false /*isInstant*/, userId);
+ resolvedType, false /*defaultOnly*/, userId);
}
}
@@ -19745,7 +19733,7 @@
mStackSupervisor.setDisplayOverrideConfiguration(mTempConfig, displayId);
final boolean isDensityChange = (changes & ActivityInfo.CONFIG_DENSITY) != 0;
- if (isDensityChange) {
+ if (isDensityChange && displayId == DEFAULT_DISPLAY) {
// Reset the unsupported display size dialog.
mUiHandler.sendEmptyMessage(SHOW_UNSUPPORTED_DISPLAY_SIZE_DIALOG_MSG);
@@ -21385,7 +21373,6 @@
pendingChange.processState = uidRec != null
? uidRec.setProcState : ActivityManager.PROCESS_STATE_NONEXISTENT;
pendingChange.ephemeral = uidRec.ephemeral;
- pendingChange.procStateSeq = uidRec.curProcStateSeq;
// Directly update the power manager, since we sit on top of it and it is critical
// it be kept in sync (so wake locks will be held as soon as appropriate).
@@ -21759,34 +21746,6 @@
}
}
- for (int i = mActiveUids.size() - 1; i >= 0; --i) {
- final UidRecord uidRec = mActiveUids.valueAt(i);
- uidRec.shouldNotifyAppThreads = false;
- if (uidRec.curProcState == uidRec.setProcState) {
- continue;
- }
- final int newBlockState = getUidRecordBlockState(uidRec);
- // Sequence no. associated with process state change will only be updated if the
- // process is coming from background to foreground or vice versa.
- if (newBlockState != uidRec.blockState) {
- uidRec.blockState = newBlockState;
- uidRec.curProcStateSeq++;
- uidRec.appThreadListeners = null;
- uidRec.shouldNotifyAppThreads = true;
- }
- }
-
- for (int i = mLruProcesses.size() - 1; i >= 0; --i) {
- final ProcessRecord app = mLruProcesses.get(i);
- if (!app.killedByAm && app.thread != null && app.uidRecord.shouldNotifyAppThreads) {
- try {
- app.thread.setBlockForNetworkState(app.uidRecord.blockState,
- app.uidRecord.curProcStateSeq);
- } catch (RemoteException ignored) {
- }
- }
- }
-
mNumServiceProcs = mNewNumServiceProcs;
// Now determine the memory trimming level of background processes.
@@ -22988,131 +22947,6 @@
updateOomAdjLocked(pr);
}
}
-
- @Override
- public void setUidStateWithSeqObserver(UidStateWithSeqObserver observer) {
- synchronized (ActivityManagerService.this) {
- mUidStateWithSeqObserver = observer;
- }
- }
-
- @Override
- public void notifyNetworkPolicyRulesUpdated(int uid, long procStateSeq) {
- if (DEBUG_NETWORK) {
- Slog.d(TAG_NETWORK, "Got update from NPMS uid: " + uid + " seq: " + procStateSeq);
- }
- synchronized (ActivityManagerService.this) {
- final UidRecord record = mActiveUids.get(uid);
- if (record == null) {
- if (DEBUG_NETWORK) {
- Slog.d(TAG_NETWORK, "No active uidRecord for uid: " + uid
- + "seq: " + procStateSeq);
- }
- return;
- }
- record.lastProcStateSeqWithUpdatedNetworkState = procStateSeq;
- if (record.curProcStateSeq > procStateSeq) {
- if (DEBUG_NETWORK) {
- Slog.d(TAG_NETWORK, "Since the current procStateSeq is greater, the "
- + "listeners would already be notified when it is incremented.");
- }
- return;
- }
-
- if (record.appThreadListeners == null) {
- if (DEBUG_NETWORK) {
- Slog.d(TAG_NETWORK, "No app thread listeners for uid: " + uid
- + "seq: " + procStateSeq);
- }
- return;
- }
- for (int i = record.appThreadListeners.beginBroadcast() - 1; i >= 0; i--) {
- final IApplicationThread listener =
- record.appThreadListeners.getBroadcastItem(i);
- try {
- if (listener != null) {
- listener.notifyNetworkStateUpdated(procStateSeq);
- }
- } catch (RemoteException ignored) {
- }
- }
- record.appThreadListeners.finishBroadcast();
- record.appThreadListeners = null;
- }
- }
- }
-
- @Override
- public boolean registerNetworkRulesUpdateListener(IApplicationThread listener,
- long procStateSeq) {
- synchronized (this) {
- final int uid = Binder.getCallingUid();
- final UidRecord record = mActiveUids.get(uid);
- if (record.lastProcStateSeqWithUpdatedNetworkState >= procStateSeq) {
- if (DEBUG_NETWORK) {
- Slog.v(TAG_NETWORK, "Network state is already updated for seq: " + procStateSeq
- + ". No need to register listener for uid: " + uid);
- }
- return false;
- }
- if (record.curProcStateSeq > procStateSeq) {
- if (DEBUG_NETWORK) {
- Slog.v(TAG_NETWORK, "Since the current procState is greater, there is no need "
- + " to register listeners for older seq numbers");
- }
- }
- if (record.appThreadListeners == null) {
- record.appThreadListeners = new RemoteCallbackList<>();
- }
- record.appThreadListeners.register(listener);
- if (DEBUG_NETWORK) {
- Slog.v(TAG_NETWORK, "Registered listener for uid: " + uid + " seq: " + procStateSeq);
- }
- return true;
- }
- }
-
- private int getUidRecordBlockState(UidRecord uidRec) {
- final boolean curStateAllowedWhileRestrictBackgroundOn
- = isProcStateAllowedWhileRestrictBackgroundOn(uidRec.curProcState);
- final boolean curStateAllowedWhileIdleOrPowerSaveMode
- = isProcStateAllowedWhileIdleOrPowerSaveMode(uidRec.curProcState);
-
- if (uidRec.setProcState == ActivityManager.PROCESS_STATE_UNKNOWN) {
- if (uidRec.curProcState != ActivityManager.PROCESS_STATE_UNKNOWN &&
- (curStateAllowedWhileIdleOrPowerSaveMode
- || curStateAllowedWhileRestrictBackgroundOn)) {
- return ActivityThread.NETWORK_STATE_BLOCK;
- }
- return ActivityThread.NETWORK_STATE_NO_CHANGE;
- }
-
- final boolean prevStateAllowedWhileRestrictBackgroundOn
- = isProcStateAllowedWhileRestrictBackgroundOn(uidRec.setProcState);
- final boolean prevStateAllowedWhileIdleOrPowerSaveMode
- = isProcStateAllowedWhileIdleOrPowerSaveMode(uidRec.setProcState);
-
- if (prevStateAllowedWhileIdleOrPowerSaveMode == curStateAllowedWhileIdleOrPowerSaveMode &&
- prevStateAllowedWhileRestrictBackgroundOn ==
- curStateAllowedWhileRestrictBackgroundOn) {
- return uidRec.blockState;
- }
-
- if (!prevStateAllowedWhileIdleOrPowerSaveMode && curStateAllowedWhileIdleOrPowerSaveMode) {
- return ActivityThread.NETWORK_STATE_BLOCK;
- } else if (!prevStateAllowedWhileRestrictBackgroundOn
- && curStateAllowedWhileRestrictBackgroundOn) {
- return ActivityThread.NETWORK_STATE_BLOCK;
- }
-
- if (prevStateAllowedWhileIdleOrPowerSaveMode && !curStateAllowedWhileIdleOrPowerSaveMode) {
- return ActivityThread.NETWORK_STATE_UNBLOCK;
- } else if (prevStateAllowedWhileRestrictBackgroundOn &&
- !curStateAllowedWhileRestrictBackgroundOn) {
- return ActivityThread.NETWORK_STATE_UNBLOCK;
- }
-
- return uidRec.blockState;
}
private final class SleepTokenImpl extends SleepToken {
@@ -23341,10 +23175,11 @@
}
void updateApplicationInfoLocked(@NonNull List<String> packagesToUpdate, int userId) {
+ final PackageManagerInternal packageManager = getPackageManagerInternalLocked();
final boolean updateFrameworkRes = packagesToUpdate.contains("android");
for (int i = mLruProcesses.size() - 1; i >= 0; i--) {
final ProcessRecord app = mLruProcesses.get(i);
- if (app.thread == null) {
+ if (app.thread == null || app.pid == Process.myPid()) {
continue;
}
@@ -23357,7 +23192,7 @@
final String packageName = app.pkgList.keyAt(j);
if (updateFrameworkRes || packagesToUpdate.contains(packageName)) {
try {
- final ApplicationInfo ai = mPackageManagerInt.getApplicationInfo(
+ final ApplicationInfo ai = packageManager.getApplicationInfo(
packageName, app.userId);
if (ai != null) {
app.thread.scheduleApplicationInfoChanged(ai);
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 80df26b..aaad12c 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -240,6 +240,8 @@
return runSupportsSplitScreenMultiwindow(pw);
case "update-appinfo":
return runUpdateApplicationInfo(pw);
+ case "no-home-screen":
+ return runNoHomeScreen(pw);
default:
return handleDefaultCommands(cmd);
}
@@ -2386,6 +2388,15 @@
return 0;
}
+ int runNoHomeScreen(PrintWriter pw) throws RemoteException {
+ final Resources res = getResources(pw);
+ if (res == null) {
+ return -1;
+ }
+ pw.println(res.getBoolean(com.android.internal.R.bool.config_noHomeScreen));
+ return 0;
+ }
+
private Resources getResources(PrintWriter pw) throws RemoteException {
// system resources does not contain all the device configuration, construct it manually.
Configuration config = mInterface.getConfiguration();
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 1b19382..10055c8 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -22,7 +22,6 @@
import static android.app.ActivityManager.StackId.ASSISTANT_STACK_ID;
import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID;
-import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.StackId.HOME_STACK_ID;
import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
import static android.app.AppOpsManager.MODE_ALLOWED;
@@ -47,7 +46,6 @@
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
-import static android.content.res.Configuration.UI_MODE_TYPE_MASK;
import static android.content.res.Configuration.UI_MODE_TYPE_VR_HEADSET;
import static android.os.Build.VERSION_CODES.HONEYCOMB;
import static android.os.Build.VERSION_CODES.O;
@@ -85,7 +83,6 @@
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Rect;
-import android.os.Build;
import android.os.Bundle;
import android.os.Debug;
import android.os.IBinder;
@@ -204,6 +201,7 @@
// WARNING: Reference points to {@link TaskRecord#getMergedOverrideConfig}, so its internal
// state should never be altered directly.
private Configuration mLastReportedOverrideConfiguration;
+ private int mLastReportedDisplayId;
CompatibilityInfo compat;// last used compatibility mode
ActivityRecord resultTo; // who started this entry, so will get our reply
final String resultWho; // additional identifier for use by resultTo.
@@ -290,8 +288,8 @@
/**
* Temp configs used in {@link #ensureActivityConfigurationLocked(int, boolean)}
*/
- private final Configuration mTmpGlobalConfig = new Configuration();
- private final Configuration mTmpTaskConfig = new Configuration();
+ private final Configuration mTmpConfig1 = new Configuration();
+ private final Configuration mTmpConfig2 = new Configuration();
private static String startingWindowStateToString(int state) {
switch (state) {
@@ -516,16 +514,37 @@
mSmallestSizeConfigurations = smallestSizeConfigurations;
}
- private void scheduleConfigurationChanged(Configuration config, boolean reportToActivity) {
+ private void scheduleActivityMovedToDisplay(int displayId, Configuration config) {
if (app == null || app.thread == null) {
+ if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.w(TAG,
+ "Can't report activity moved to display - client not running, activityRecord="
+ + this + ", displayId=" + displayId);
return;
}
try {
- if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + this + " " +
- "reportToActivity=" + reportToActivity + " and config: " + config);
+ if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
+ "Reporting activity moved to display" + ", activityRecord=" + this
+ + ", displayId=" + displayId + ", config=" + config);
- app.thread.scheduleActivityConfigurationChanged(appToken, new Configuration(config),
- reportToActivity);
+ app.thread.scheduleActivityMovedToDisplay(appToken, displayId,
+ new Configuration(config));
+ } catch (RemoteException e) {
+ // If process died, whatever.
+ }
+ }
+
+ private void scheduleConfigurationChanged(Configuration config) {
+ if (app == null || app.thread == null) {
+ if (DEBUG_CONFIGURATION) Slog.w(TAG,
+ "Can't report activity configuration update - client not running"
+ + ", activityRecord=" + this);
+ return;
+ }
+ try {
+ if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + this + ", config: "
+ + config);
+
+ app.thread.scheduleActivityConfigurationChanged(appToken, new Configuration(config));
} catch (RemoteException e) {
// If process died, whatever.
}
@@ -783,10 +802,7 @@
// Remove the activity from the old task and add it to the new task
prevTask.removeActivity(this);
- // TODO(b/34179495): This should really be set to null in removeActivity() call above,
- // but really bad things that I can't track down right now happen when I do that.
- // So, setting it here now and will change later when there is time for investigation.
- task = null;
+
newTask.addActivityAtIndex(position, this);
}
@@ -861,8 +877,8 @@
/**
* @return Stack value from current task, null if there is no task.
*/
- ActivityStack getStack() {
- return task != null ? task.getStack() : null;
+ <T extends ActivityStack> T getStack() {
+ return task != null ? (T) task.getStack() : null;
}
boolean changeWindowTranslucency(boolean toOpaque) {
@@ -980,25 +996,26 @@
boolean hasPinnedStack = mStackSupervisor.getStack(PINNED_STACK_ID) != null;
// Don't return early if !isNotLocked, since we want to throw an exception if the activity
// is in an incorrect state
- boolean isNotLocked = !isKeyguardLocked && !isCurrentAppLocked;
+ boolean isNotLockedOrOnKeyguard = !isKeyguardLocked && !isCurrentAppLocked;
switch (state) {
case RESUMED:
- // When visible, allow entering PiP if not on the lockscreen and if the task is not
- // locked
- return isNotLocked;
+ // When visible, allow entering PiP if the app is not locked. If it is over the
+ // keyguard, then we will prompt to unlock in the caller before entering PiP.
+ return !isCurrentAppLocked;
case PAUSING:
case PAUSED:
// When pausing, then only allow enter PiP as in the resume state, and in addition,
// require that there is not an existing PiP activity and that the current system
// state supports entering PiP
- return isNotLocked && !hasPinnedStack && supportsPictureInPictureWhilePausing
+ return isNotLockedOrOnKeyguard && !hasPinnedStack
+ && supportsPictureInPictureWhilePausing
&& checkEnterPictureInPictureOnHideAppOpsState();
case STOPPING:
// When stopping in a valid state, then only allow enter PiP as in the pause state.
// Otherwise, fall through to throw an exception if the caller is trying to enter
// PiP in an invalid stopping state.
if (supportsPictureInPictureWhilePausing) {
- return isNotLocked && !hasPinnedStack
+ return isNotLockedOrOnKeyguard && !hasPinnedStack
&& checkEnterPictureInPictureOnHideAppOpsState();
}
default:
@@ -1972,21 +1989,6 @@
return true;
}
- if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
- "Ensuring correct configuration: " + this);
-
- // Short circuit: if the two configurations are equal (the common case), then there is
- // nothing to do.
- final Configuration newGlobalConfig = service.getGlobalConfiguration();
- final Configuration newTaskMergedOverrideConfig = task.getMergedOverrideConfiguration();
- if (mLastReportedConfiguration.equals(newGlobalConfig)
- && mLastReportedOverrideConfiguration.equals(newTaskMergedOverrideConfig)
- && !forceNewConfig) {
- if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
- "Configuration unchanged in " + this);
- return true;
- }
-
// We don't worry about activities that are finishing.
if (finishing) {
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
@@ -1995,22 +1997,48 @@
return true;
}
+ if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
+ "Ensuring correct configuration: " + this);
+
+ final int newDisplayId = getDisplayId();
+ final boolean displayChanged = mLastReportedDisplayId != newDisplayId;
+ if (displayChanged) {
+ mLastReportedDisplayId = newDisplayId;
+ }
+ // Short circuit: if the two full configurations are equal (the common case), then there is
+ // nothing to do. We test the full configuration instead of the global and merged override
+ // configurations because there are cases (like moving a task to the pinned stack) where
+ // the combine configurations are equal, but would otherwise differ in the override config
+ mTmpConfig1.setTo(mLastReportedConfiguration);
+ mTmpConfig1.updateFrom(mLastReportedOverrideConfiguration);
+ if (task.getConfiguration().equals(mTmpConfig1) && !forceNewConfig && !displayChanged) {
+ if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
+ "Configuration & display unchanged in " + this);
+ return true;
+ }
+
// Okay we now are going to make this activity have the new config.
// But then we need to figure out how it needs to deal with that.
- mTmpGlobalConfig.setTo(mLastReportedConfiguration);
- mTmpTaskConfig.setTo(mLastReportedOverrideConfiguration);
+ final Configuration newGlobalConfig = service.getGlobalConfiguration();
+ final Configuration newTaskMergedOverrideConfig = task.getMergedOverrideConfiguration();
+ mTmpConfig1.setTo(mLastReportedConfiguration);
+ mTmpConfig2.setTo(mLastReportedOverrideConfiguration);
mLastReportedConfiguration.setTo(newGlobalConfig);
mLastReportedOverrideConfiguration.setTo(newTaskMergedOverrideConfig);
int taskChanges = getTaskConfigurationChanges(this, newTaskMergedOverrideConfig,
- mTmpTaskConfig);
- final int changes = mTmpGlobalConfig.diff(newGlobalConfig) | taskChanges;
+ mTmpConfig2);
+ final int changes = mTmpConfig1.diff(newGlobalConfig) | taskChanges;
if (changes == 0 && !forceNewConfig) {
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
"Configuration no differences in " + this);
// There are no significant differences, so we won't relaunch but should still deliver
// the new configuration to the client process.
- scheduleConfigurationChanged(newTaskMergedOverrideConfig, true);
+ if (displayChanged) {
+ scheduleActivityMovedToDisplay(newDisplayId, newTaskMergedOverrideConfig);
+ } else {
+ scheduleConfigurationChanged(newTaskMergedOverrideConfig);
+ }
return true;
}
@@ -2083,7 +2111,11 @@
// NOTE: We only forward the task override configuration as the system level configuration
// changes is always sent to all processes when they happen so it can just use whatever
// system level configuration it last got.
- scheduleConfigurationChanged(newTaskMergedOverrideConfig, true);
+ if (displayChanged) {
+ scheduleActivityMovedToDisplay(newDisplayId, newTaskMergedOverrideConfig);
+ } else {
+ scheduleConfigurationChanged(newTaskMergedOverrideConfig);
+ }
stopFreezingScreenLocked(false);
return true;
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 7c24604..7f7caff 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -84,7 +84,6 @@
import android.app.ActivityOptions;
import android.app.AppGlobals;
import android.app.IActivityController;
-import android.app.RemoteAction;
import android.app.ResultInfo;
import android.content.ComponentName;
import android.content.Intent;
@@ -135,7 +134,8 @@
/**
* State and management of a single stack of activities.
*/
-final class ActivityStack extends ConfigurationContainer implements StackWindowListener {
+class ActivityStack<T extends StackWindowController> extends ConfigurationContainer
+ implements StackWindowListener {
private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStack" : TAG_AM;
private static final String TAG_ADD_REMOVE = TAG + POSTFIX_ADD_REMOVE;
@@ -247,7 +247,7 @@
final ActivityManagerService mService;
private final WindowManagerService mWindowManager;
- private StackWindowController mWindowContainerController;
+ T mWindowContainerController;
private final RecentTasks mRecentTasks;
/**
@@ -462,14 +462,18 @@
? new LaunchingTaskPositioner() : null;
final ActivityStackSupervisor.ActivityDisplay display = mActivityContainer.mActivityDisplay;
mTmpRect2.setEmpty();
- mWindowContainerController = new StackWindowController(mStackId, this,
- display.mDisplayId, onTop, mTmpRect2);
+ mWindowContainerController = createStackWindowController(display.mDisplayId, onTop,
+ mTmpRect2);
activityContainer.mStack = this;
mStackSupervisor.mActivityContainers.put(mStackId, activityContainer);
postAddToDisplay(display, mTmpRect2.isEmpty() ? null : mTmpRect2, onTop);
}
- StackWindowController getWindowContainerController() {
+ T createStackWindowController(int displayId, boolean onTop, Rect outBounds) {
+ return (T) new StackWindowController(mStackId, this, displayId, onTop, outBounds);
+ }
+
+ T getWindowContainerController() {
return mWindowContainerController;
}
@@ -540,18 +544,6 @@
mActivityContainer.mActivityDisplay.mDisplay.getSize(out);
}
- void animateResizePinnedStack(Rect bounds, int animationDuration) {
- mWindowContainerController.animateResizePinnedStack(bounds, animationDuration);
- }
-
- void setPictureInPictureAspectRatio(float aspectRatio) {
- mWindowContainerController.setPictureInPictureAspectRatio(aspectRatio);
- }
-
- void setPictureInPictureActions(List<RemoteAction> actions) {
- mWindowContainerController.setPictureInPictureActions(actions);
- }
-
void getStackDockedModeBounds(Rect outBounds, Rect outTempBounds, Rect outTempInsetBounds,
boolean ignoreVisibility) {
mWindowContainerController.getStackDockedModeBounds(outBounds, outTempBounds,
@@ -1526,10 +1518,11 @@
return false;
}
- if (!isHomeOrRecentsStack() && r.frontOfTask
- && task.isOverHomeStack() && !StackId.isHomeOrRecentsStack(stackBehindId)) {
+ if (!isHomeOrRecentsStack() && r.frontOfTask && task.isOverHomeStack()
+ && !StackId.isHomeOrRecentsStack(stackBehindId) && !isAssistantStack()) {
// Stack isn't translucent if it's top activity should have the home stack
- // behind it and the stack currently behind it isn't the home or recents stack.
+ // behind it and the stack currently behind it isn't the home or recents stack
+ // or the assistant stack.
return false;
}
}
@@ -1559,54 +1552,63 @@
return STACK_INVISIBLE;
}
- final ActivityStack focusedStack = mStackSupervisor.getFocusedStack();
- final int focusedStackId = focusedStack.mStackId;
+ // Check position and visibility of this stack relative to the front stack on its display.
+ final ActivityStack topStack = getTopStackOnDisplay();
+ final int topStackId = topStack.mStackId;
if (StackId.isBackdropToTranslucentActivity(mStackId)
- && hasVisibleBehindActivity() && StackId.isHomeOrRecentsStack(focusedStackId)
- && !focusedStack.topActivity().fullscreen) {
+ && hasVisibleBehindActivity() && StackId.isHomeOrRecentsStack(topStackId)
+ && !topStack.topActivity().fullscreen) {
// The fullscreen or assistant stack should be visible if it has a visible behind
// activity behind the home or recents stack that is translucent.
return STACK_VISIBLE_ACTIVITY_BEHIND;
}
if (mStackId == DOCKED_STACK_ID) {
- // Docked stack is always visible, except in the case where the top running activity
- // task in the focus stack doesn't support any form of resizing but we show it for the
- // home task even though it's not resizable.
- final ActivityRecord r = focusedStack.topRunningActivityLocked();
+ final ActivityRecord r = topStack.topRunningActivityLocked();
+
+ // If the assistant stack is focused and translucent, then the docked stack is always
+ // visible
+ if (topStack.isAssistantStack()
+ && topStack.isStackTranslucent(starting, DOCKED_STACK_ID)) {
+ return STACK_VISIBLE;
+ }
+
+ // Otherwise, the docked stack is always visible, except in the case where the top
+ // running activity task in the focus stack doesn't support any form of resizing but we
+ // show it for the home task even though it's not resizable.
final TaskRecord task = r != null ? r.task : null;
return task == null || task.supportsSplitScreen() || task.isHomeTask() ? STACK_VISIBLE
: STACK_INVISIBLE;
}
- // Find the first stack behind focused stack that actually got something visible.
- int stackBehindFocusedIndex = mStacks.indexOf(focusedStack) - 1;
- while (stackBehindFocusedIndex >= 0 &&
- mStacks.get(stackBehindFocusedIndex).topRunningActivityLocked() == null) {
- stackBehindFocusedIndex--;
+ // Find the first stack behind front stack that actually got something visible.
+ int stackBehindTopIndex = mStacks.indexOf(topStack) - 1;
+ while (stackBehindTopIndex >= 0 &&
+ mStacks.get(stackBehindTopIndex).topRunningActivityLocked() == null) {
+ stackBehindTopIndex--;
}
- if ((focusedStackId == DOCKED_STACK_ID || focusedStackId == PINNED_STACK_ID)
- && stackIndex == stackBehindFocusedIndex) {
+ if ((topStackId == DOCKED_STACK_ID || topStackId == PINNED_STACK_ID)
+ && stackIndex == stackBehindTopIndex) {
// Stacks directly behind the docked or pinned stack are always visible.
return STACK_VISIBLE;
}
- final int stackBehindFocusedId = (stackBehindFocusedIndex >= 0)
- ? mStacks.get(stackBehindFocusedIndex).mStackId : INVALID_STACK_ID;
+ final int stackBehindTopId = (stackBehindTopIndex >= 0)
+ ? mStacks.get(stackBehindTopIndex).mStackId : INVALID_STACK_ID;
- if (StackId.isBackdropToTranslucentActivity(focusedStackId)
- && focusedStack.isStackTranslucent(starting, stackBehindFocusedId)) {
+ if (StackId.isBackdropToTranslucentActivity(topStackId)
+ && topStack.isStackTranslucent(starting, stackBehindTopId)) {
// Stacks behind the fullscreen or assistant stack with a translucent activity are
// always visible so they can act as a backdrop to the translucent activity.
// For example, dialog activities
- if (stackIndex == stackBehindFocusedIndex) {
+ if (stackIndex == stackBehindTopIndex) {
return STACK_VISIBLE;
}
- if (stackBehindFocusedIndex >= 0) {
- if ((stackBehindFocusedId == DOCKED_STACK_ID
- || stackBehindFocusedId == PINNED_STACK_ID)
- && stackIndex == (stackBehindFocusedIndex - 1)) {
+ if (stackBehindTopIndex >= 0) {
+ if ((stackBehindTopId == DOCKED_STACK_ID
+ || stackBehindTopId == PINNED_STACK_ID)
+ && stackIndex == (stackBehindTopIndex - 1)) {
// The stack behind the docked or pinned stack is also visible so we can have a
// complete backdrop to the translucent activity when the docked stack is up.
return STACK_VISIBLE;
@@ -2507,7 +2509,7 @@
if (!next.hasBeenLaunched) {
next.hasBeenLaunched = true;
} else if (SHOW_APP_STARTING_PREVIEW && lastStack != null &&
- mStackSupervisor.isFrontStack(lastStack)) {
+ mStackSupervisor.isFrontStackOnDisplay(lastStack)) {
next.showStartingWindow(null /* prev */, false /* newTask */,
false /* taskSwitch */);
}
@@ -4271,8 +4273,8 @@
AppTimeTracker timeTracker, String reason) {
if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "moveTaskToFront: " + tr);
- final ActivityRecord focusedTopActivity = mStackSupervisor.getFocusedStack() != null
- ? mStackSupervisor.getFocusedStack().topActivity() : null;
+ final ActivityStack topStack = getTopStackOnDisplay();
+ final ActivityRecord topActivity = topStack != null ? topStack.topActivity() : null;
final int numTasks = mTaskHistory.size();
final int index = mTaskHistory.indexOf(tr);
if (numTasks == 0 || index < 0) {
@@ -4297,7 +4299,7 @@
insertTaskAtTop(tr, null);
// Don't refocus if invisible to current user
- ActivityRecord top = tr.getTopActivity();
+ final ActivityRecord top = tr.getTopActivity();
if (top == null || !top.okToShowLocked()) {
addRecentActivityLocked(top);
ActivityOptions.abort(options);
@@ -4305,7 +4307,7 @@
}
// Set focus to the top running activity of this stack.
- ActivityRecord r = topRunningActivityLocked();
+ final ActivityRecord r = topRunningActivityLocked();
mStackSupervisor.moveFocusableActivityStackToFrontLocked(r, reason);
if (DEBUG_TRANSITION) Slog.v(TAG_TRANSITION, "Prepare to front transition: task=" + tr);
@@ -4320,8 +4322,8 @@
}
// If a new task is moved to the front, then mark the existing top activity as supporting
// picture-in-picture while paused
- if (focusedTopActivity != null) {
- focusedTopActivity.supportsPictureInPictureWhilePausing = true;
+ if (topActivity != null) {
+ topActivity.supportsPictureInPictureWhilePausing = true;
}
mStackSupervisor.resumeFocusedStackTopActivityLocked();
@@ -4354,7 +4356,7 @@
// If we have a watcher, preflight the move before committing to it. First check
// for *other* available tasks, but if none are available, then try again allowing the
// current task to be selected.
- if (mStackSupervisor.isFrontStack(this) && mService.mController != null) {
+ if (mStackSupervisor.isFrontStackOnDisplay(this) && mService.mController != null) {
ActivityRecord next = topRunningActivityLocked(null, taskId);
if (next == null) {
next = topRunningActivityLocked(null, 0);
@@ -4447,6 +4449,15 @@
return true;
}
+ /**
+ * Get the topmost stack on the current display. It may be different from focused stack, because
+ * focus may be on another display.
+ */
+ private ActivityStack getTopStackOnDisplay() {
+ final ArrayList<ActivityStack> stacks = mActivityContainer.mActivityDisplay.mStacks;
+ return stacks.isEmpty() ? null : stacks.get(stacks.size() - 1);
+ }
+
static void logStartActivity(int tag, ActivityRecord r, TaskRecord task) {
final Uri data = r.intent.getData();
final String strData = data != null ? data.toSafeString() : null;
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 95734a4..ab1559d 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -120,7 +120,6 @@
import android.content.pm.ResolveInfo;
import android.content.pm.UserInfo;
import android.content.res.Configuration;
-import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.DisplayListener;
@@ -153,7 +152,6 @@
import android.service.voice.IVoiceInteractionSession;
import android.util.ArrayMap;
import android.util.ArraySet;
-import android.util.DisplayMetrics;
import android.util.EventLog;
import android.util.IntArray;
import android.util.Slog;
@@ -179,8 +177,8 @@
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener {
@@ -624,11 +622,6 @@
return stack == mFocusedStack;
}
- /** The top most stack. */
- boolean isFrontStack(ActivityStack stack) {
- return isFrontOfStackList(stack, mHomeStack.mStacks);
- }
-
/** The top most stack on its display. */
boolean isFrontStackOnDisplay(ActivityStack stack) {
return isFrontOfStackList(stack, stack.mActivityContainer.mActivityDisplay.mStacks);
@@ -1103,13 +1096,21 @@
}
// Look in other non-focused and non-home stacks.
- final ArrayList<ActivityStack> stacks = mHomeStack.mStacks;
- for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
- final ActivityStack stack = stacks.get(stackNdx);
- if (stack != focusedStack && isFrontStack(stack) && stack.isFocusable()) {
- r = stack.topRunningActivityLocked();
- if (r != null) {
- return r;
+ mWindowManager.getDisplaysInFocusOrder(mTmpOrderedDisplayIds);
+
+ for (int i = mTmpOrderedDisplayIds.size() - 1; i >= 0; --i) {
+ final int displayId = mTmpOrderedDisplayIds.get(i);
+ final List<ActivityStack> stacks = mActivityDisplays.get(displayId).mStacks;
+ if (stacks == null) {
+ continue;
+ }
+ for (int j = stacks.size() - 1; j >= 0; --j) {
+ final ActivityStack stack = stacks.get(j);
+ if (stack != focusedStack && isFrontStackOnDisplay(stack) && stack.isFocusable()) {
+ r = stack.topRunningActivityLocked();
+ if (r != null) {
+ return r;
+ }
}
}
}
@@ -1194,13 +1195,11 @@
}
ResolveInfo resolveIntent(Intent intent, String resolvedType, int userId, int flags) {
- try {
- return AppGlobals.getPackageManager().resolveIntent(intent, resolvedType,
- PackageManager.MATCH_DEFAULT_ONLY | flags
+ synchronized (mService) {
+ return mService.getPackageManagerInternalLocked().resolveIntent(intent, resolvedType,
+ PackageManager.MATCH_INSTANT | PackageManager.MATCH_DEFAULT_ONLY | flags
| ActivityManagerService.STOCK_PM_FLAGS, userId);
- } catch (RemoteException e) {
}
- return null;
}
ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
@@ -1222,13 +1221,11 @@
return false;
}
- if (andResume) {
- r.startFreezingScreenLocked(app, 0);
- r.setVisibility(true);
+ r.startFreezingScreenLocked(app, 0);
+ r.setVisibility(true);
- // schedule launch ticks to collect information about slow apps.
- r.startLaunchTickingLocked();
- }
+ // schedule launch ticks to collect information about slow apps.
+ r.startLaunchTickingLocked();
// Have the window manager re-evaluate the orientation of the screen based on the new
// activity order. Note that as a result of this, it can call back into the activity
@@ -1278,17 +1275,16 @@
List<ResultInfo> results = null;
List<ReferrerIntent> newIntents = null;
if (andResume) {
+ // We don't need to deliver new intents and/or set results if activity is going
+ // to pause immediately after launch.
results = r.results;
newIntents = r.newIntents;
}
if (DEBUG_SWITCH) Slog.v(TAG_SWITCH,
"Launching: " + r + " icicle=" + r.icicle + " with results=" + results
+ " newIntents=" + newIntents + " andResume=" + andResume);
- if (andResume) {
- EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
- r.userId, System.identityHashCode(r),
- task.taskId, r.shortComponentName);
- }
+ EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, r.userId,
+ System.identityHashCode(r), task.taskId, r.shortComponentName);
if (r.isHomeActivity()) {
// Home process is the root process of the task.
mService.mHomeProcess = task.mActivities.get(0).app;
@@ -1328,10 +1324,8 @@
}
}
- if (andResume) {
- app.hasShownUi = true;
- app.pendingUiClean = true;
- }
+ app.hasShownUi = true;
+ app.pendingUiClean = true;
app.forceProcessStateUpTo(mService.mTopProcessState);
// Because we could be starting an Activity in the system process this may not go across
// a Binder interface which would create a new Configuration. Consequently we have to
@@ -2038,19 +2032,20 @@
|| mService.mSupportsFreeformWindowManagement;
}
- ActivityStack getStack(int stackId) {
+ protected <T extends ActivityStack> T getStack(int stackId) {
return getStack(stackId, !CREATE_IF_NEEDED, !ON_TOP);
}
- ActivityStack getStack(int stackId, boolean createStaticStackIfNeeded, boolean createOnTop) {
+ protected <T extends ActivityStack> T getStack(int stackId, boolean createStaticStackIfNeeded,
+ boolean createOnTop) {
final ActivityContainer activityContainer = mActivityContainers.get(stackId);
if (activityContainer != null) {
- return activityContainer.mStack;
+ return (T) activityContainer.mStack;
}
if (!createStaticStackIfNeeded || !StackId.isStaticStack(stackId)) {
return null;
}
- return createStackOnDisplay(stackId, DEFAULT_DISPLAY, createOnTop);
+ return (T) createStackOnDisplay(stackId, DEFAULT_DISPLAY, createOnTop);
}
/**
@@ -2302,7 +2297,9 @@
} else {
for (int i = 0; i < size; i++) {
final TaskRecord task = tasks.get(i);
- task.reparent(FULLSCREEN_WORKSPACE_STACK_ID, MAX_VALUE,
+ final int position = fullscreenStack != null ?
+ Math.max(fullscreenStack.getAllTasks().size() - 1, 0) : 0;
+ task.reparent(FULLSCREEN_WORKSPACE_STACK_ID, position,
"moveTasksToFullscreenStack - NOT_onTop");
}
}
@@ -2394,7 +2391,18 @@
mWindowManager.deferSurfaceLayout();
try {
ActivityRecord r = stack.topRunningActivityLocked();
- stack.resize(pinnedBounds, tempPinnedTaskBounds, null);
+ Rect insetBounds = null;
+ if (tempPinnedTaskBounds != null) {
+ // We always use 0,0 as the position for the inset rect because
+ // if we are getting insets at all in the pinned stack it must mean
+ // we are headed for fullscreen.
+ insetBounds = tempRect;
+ insetBounds.top = 0;
+ insetBounds.left = 0;
+ insetBounds.right = tempPinnedTaskBounds.width();
+ insetBounds.bottom = tempPinnedTaskBounds.height();
+ }
+ stack.resize(pinnedBounds, tempPinnedTaskBounds, insetBounds);
stack.ensureVisibleActivitiesConfigurationLocked(r, false);
} finally {
mWindowManager.continueSurfaceLayout();
@@ -2676,7 +2684,7 @@
// In some cases the focused stack isn't the front stack. E.g. pinned stack.
// Whenever we are moving the top activity from the front stack we want to make sure to move
// the stack to the front.
- final boolean wasFront = isFrontStack(prevStack)
+ final boolean wasFront = isFrontStackOnDisplay(prevStack)
&& (prevStack.topRunningActivityLocked() == r);
if (stackId == DOCKED_STACK_ID && !task.isResizeable()) {
@@ -2774,7 +2782,8 @@
stack.prepareFreezingTaskBounds();
// Make sure the task has the appropriate bounds/size for the stack it is in.
- if (stackId == FULLSCREEN_WORKSPACE_STACK_ID && task.mBounds != null) {
+ if (stackId == FULLSCREEN_WORKSPACE_STACK_ID
+ && !Objects.equals(task.mBounds, stack.mBounds)) {
kept = task.resize(stack.mBounds, RESIZE_MODE_SYSTEM, !mightReplaceWindow,
deferResume);
} else if (stackId == FREEFORM_WORKSPACE_STACK_ID) {
@@ -2843,7 +2852,7 @@
mWindowManager.deferSurfaceLayout();
// Need to make sure the pinned stack exist so we can resize it below...
- final ActivityStack stack = getStack(PINNED_STACK_ID, CREATE_IF_NEEDED, ON_TOP);
+ final PinnedActivityStack stack = getStack(PINNED_STACK_ID, CREATE_IF_NEEDED, ON_TOP);
try {
final TaskRecord task = r.task;
@@ -2893,10 +2902,11 @@
ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
resumeFocusedStackTopActivityLocked();
- stack.animateResizePinnedStack(bounds, -1);
+ stack.animateResizePinnedStack(bounds, -1 /* animationDuration */);
mService.mTaskChangeNotificationController.notifyActivityPinned();
}
+ /** Move activity with its stack to front and make the stack focused. */
boolean moveFocusableActivityStackToFrontLocked(ActivityRecord r, String reason) {
if (r == null || !r.isFocusable()) {
if (DEBUG_FOCUS) Slog.d(TAG_FOCUS,
@@ -3776,18 +3786,27 @@
}
private void handleDisplayRemoved(int displayId) {
+ if (displayId == DEFAULT_DISPLAY) {
+ throw new IllegalArgumentException("Can't remove the primary display.");
+ }
+
synchronized (mService) {
ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
if (activityDisplay != null) {
final boolean destroyContentOnRemoval
= activityDisplay.shouldDestroyContentOnRemove();
- ArrayList<ActivityStack> stacks = activityDisplay.mStacks;
- for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
- final ActivityStack stack = stacks.get(stackNdx);
- moveStackToDisplayLocked(stack.mStackId, DEFAULT_DISPLAY,
- !destroyContentOnRemoval /* onTop */);
+ final ArrayList<ActivityStack> stacks = activityDisplay.mStacks;
+ while (!stacks.isEmpty()) {
+ final ActivityStack stack = stacks.get(0);
if (destroyContentOnRemoval) {
+ moveStackToDisplayLocked(stack.mStackId, DEFAULT_DISPLAY,
+ false /* onTop */);
stack.finishAllActivitiesLocked(true /* immediately */);
+ } else {
+ // Moving all tasks to fullscreen stack, because it's guaranteed to be
+ // a valid launch stack for all activities. This way the task history from
+ // external display will be preserved on primary after move.
+ moveTasksToFullscreenStackLocked(stack.getStackId(), true /* onTop */);
}
}
mActivityDisplays.remove(displayId);
@@ -4344,7 +4363,14 @@
synchronized (mService) {
mStackId = stackId;
mActivityDisplay = activityDisplay;
- new ActivityStack(this, mRecentTasks, onTop);
+ switch (mStackId) {
+ case PINNED_STACK_ID:
+ new PinnedActivityStack(this, mRecentTasks, onTop);
+ break;
+ default:
+ new ActivityStack(this, mRecentTasks, onTop);
+ break;
+ }
mIdString = "ActivtyContainer{" + mStackId + "}";
if (DEBUG_STACK) Slog.d(TAG_STACK, "Creating " + this);
}
@@ -4875,7 +4901,7 @@
setResizingDuringAnimation(task);
}
- mService.mActivityStarter.postStartActivityUncheckedProcessing(task.getTopActivity(),
+ mService.mActivityStarter.postStartActivityProcessing(task.getTopActivity(),
ActivityManager.START_TASK_TO_FRONT,
sourceRecord != null ? sourceRecord.task.getStackId() : INVALID_STACK_ID,
sourceRecord, task.getStack());
@@ -4898,24 +4924,24 @@
* @return a list of activities which are the top ones in each visible stack. The first
* entry will be the focused activity.
*/
- public List<IBinder> getTopVisibleActivities() {
- // TODO(multi-display): Get rid of DEFAULT_DISPLAY here. Used in
- // VoiceInteractionManagerServiceImpl#showSessionLocked.
- final ActivityDisplay display = mActivityDisplays.get(DEFAULT_DISPLAY);
- if (display == null) {
- return Collections.EMPTY_LIST;
- }
- ArrayList<IBinder> topActivityTokens = new ArrayList<>();
- final ArrayList<ActivityStack> stacks = display.mStacks;
- for (int i = stacks.size() - 1; i >= 0; i--) {
- ActivityStack stack = stacks.get(i);
- if (stack.getStackVisibilityLocked(null) == ActivityStack.STACK_VISIBLE) {
- ActivityRecord top = stack.topActivity();
- if (top != null) {
- if (stack == mFocusedStack) {
- topActivityTokens.add(0, top.appToken);
- } else {
- topActivityTokens.add(top.appToken);
+ List<IBinder> getTopVisibleActivities() {
+ final ArrayList<IBinder> topActivityTokens = new ArrayList<>();
+ // Traverse all displays.
+ for (int i = mActivityDisplays.size() - 1; i >= 0; i--) {
+ final ActivityDisplay display = mActivityDisplays.valueAt(i);
+ // Traverse all stacks on a display.
+ for (int j = display.mStacks.size() - 1; j >= 0; j--) {
+ final ActivityStack stack = display.mStacks.get(j);
+ // Get top activity from a visible stack and add it to the list.
+ if (stack.getStackVisibilityLocked(null /* starting */)
+ == ActivityStack.STACK_VISIBLE) {
+ final ActivityRecord top = stack.topActivity();
+ if (top != null) {
+ if (stack == mFocusedStack) {
+ topActivityTokens.add(0, top.appToken);
+ } else {
+ topActivityTokens.add(top.appToken);
+ }
}
}
}
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 4b07af0..d8c5533 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -17,6 +17,7 @@
package com.android.server.am;
import static android.app.Activity.RESULT_CANCELED;
+import static android.app.ActivityManager.START_CANCELED;
import static android.app.ActivityManager.START_CLASS_NOT_FOUND;
import static android.app.ActivityManager.START_DELIVERED_TO_TOP;
import static android.app.ActivityManager.START_FLAG_ONLY_IF_NEEDED;
@@ -82,23 +83,24 @@
import static com.android.server.am.ActivityStackSupervisor.TAG_TASKS;
import static com.android.server.am.EventLogTags.AM_NEW_INTENT;
+import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.AppGlobals;
import android.app.IActivityContainer;
import android.app.IApplicationThread;
-import android.app.KeyguardManager;
import android.app.PendingIntent;
import android.app.ProfilerInfo;
import android.app.WaitResult;
import android.content.ComponentName;
-import android.content.Context;
import android.content.IIntentSender;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
+import android.content.pm.AuxiliaryResolveInfo;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
import android.content.pm.ResolveInfo;
import android.content.pm.UserInfo;
import android.content.res.Configuration;
@@ -456,22 +458,9 @@
// Instead, launch the ephemeral installer. Once the installer is finished, it
// starts either the intent we resolved here [on install error] or the ephemeral
// app [on install success].
- if (rInfo != null && rInfo.ephemeralResponse != null) {
- final String packageName =
- rInfo.ephemeralResponse.resolveInfo.getPackageName();
- final String splitName = rInfo.ephemeralResponse.splitName;
- final boolean needsPhaseTwo = rInfo.ephemeralResponse.needsPhase2;
- final String token = rInfo.ephemeralResponse.token;
- final int versionCode = rInfo.ephemeralResponse.resolveInfo.getVersionCode();
- if (needsPhaseTwo) {
- // request phase two resolution
- mService.getPackageManagerInternalLocked().requestEphemeralResolutionPhaseTwo(
- rInfo.ephemeralResponse, ephemeralIntent, resolvedType, intent,
- callingPackage, userId);
- }
- intent = EphemeralResolver.buildEphemeralInstallerIntent(intent, ephemeralIntent,
- callingPackage, resolvedType, userId, packageName, splitName, versionCode,
- token, needsPhaseTwo);
+ if (rInfo != null && rInfo.auxiliaryInfo != null) {
+ intent = createLaunchIntent(rInfo.auxiliaryInfo, ephemeralIntent,
+ callingPackage, resolvedType, userId);
resolvedType = null;
callingUid = realCallingUid;
callingPid = realCallingPid;
@@ -519,18 +508,26 @@
doPendingActivityLaunchesLocked(false);
- try {
- mService.mWindowManager.deferSurfaceLayout();
- err = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor, startFlags,
- true, options, inTask);
- } finally {
- mService.mWindowManager.continueSurfaceLayout();
- }
- postStartActivityUncheckedProcessing(r, err, stack.mStackId, mSourceRecord, mTargetStack);
- return err;
+ return startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags, true,
+ options, inTask);
}
- void postStartActivityUncheckedProcessing(
+ /** Creates a launch intent for the given auxiliary resolution data. */
+ private @NonNull Intent createLaunchIntent(@NonNull AuxiliaryResolveInfo auxiliaryResponse,
+ Intent originalIntent, String callingPackage,
+ String resolvedType, int userId) {
+ if (auxiliaryResponse.needsPhaseTwo) {
+ // request phase two resolution
+ mService.getPackageManagerInternalLocked().requestInstantAppResolutionPhaseTwo(
+ auxiliaryResponse, originalIntent, resolvedType, callingPackage, userId);
+ }
+ return EphemeralResolver.buildEphemeralInstallerIntent(originalIntent,
+ callingPackage, resolvedType, userId, auxiliaryResponse.packageName,
+ auxiliaryResponse.splitName, auxiliaryResponse.versionCode,
+ auxiliaryResponse.token, auxiliaryResponse.needsPhaseTwo);
+ }
+
+ void postStartActivityProcessing(
ActivityRecord r, int result, int prevFocusedStackId, ActivityRecord sourceRecord,
ActivityStack targetStack) {
@@ -585,10 +582,8 @@
// The activity was already running in the pinned stack so it wasn't started, but either
// brought to the front or the new intent was delivered to it since it was already in
// front. Notify anyone interested in this piece of information.
- final ComponentName sourceComponent = sourceRecord == null ? null :
- sourceRecord.realActivity;
mService.mTaskChangeNotificationController.notifyPinnedActivityRestartAttempt(
- sourceComponent);
+ sourceRecord.launchedFromPackage);
return;
}
}
@@ -934,6 +929,32 @@
}
}
+ private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord,
+ IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
+ int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask) {
+ int result = START_CANCELED;
+ try {
+ mService.mWindowManager.deferSurfaceLayout();
+ result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,
+ startFlags,
+ doResume, options, inTask);
+ } finally {
+ // If we are not able to proceed, disassociate the activity from the task. Leaving an
+ // activity in an incomplete state can lead to issues, such as performing operations
+ // without a window container.
+ if (result != START_SUCCESS && mStartActivity.task != null) {
+ mStartActivity.task.removeActivity(mStartActivity);
+ }
+ mService.mWindowManager.continueSurfaceLayout();
+ }
+
+ postStartActivityProcessing(r, result, mSupervisor.mFocusedStack.mStackId,
+ mSourceRecord, mTargetStack);
+
+ return result;
+ }
+
+ // Note: This method should only be called from {@link startActivity}.
private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask) {
@@ -1840,11 +1861,8 @@
final PendingActivityLaunch pal = mPendingActivityLaunches.remove(0);
final boolean resume = doResume && mPendingActivityLaunches.isEmpty();
try {
- final int result = startActivityUnchecked(
- pal.r, pal.sourceRecord, null, null, pal.startFlags, resume, null, null);
- postStartActivityUncheckedProcessing(
- pal.r, result, mSupervisor.mFocusedStack.mStackId, mSourceRecord,
- mTargetStack);
+ startActivity(pal.r, pal.sourceRecord, null, null, pal.startFlags, resume, null,
+ null);
} catch (Exception e) {
Slog.e(TAG, "Exception during pending activity launch pal=" + pal, e);
pal.sendErrorResult(e.getMessage());
diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java
index 9b459d1..73a17c6 100644
--- a/services/core/java/com/android/server/am/CoreSettingsObserver.java
+++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java
@@ -49,7 +49,6 @@
// add other system settings here...
sGlobalSettingToTypeMap.put(Settings.Global.DEBUG_VIEW_ATTRIBUTES, int.class);
- sGlobalSettingToTypeMap.put(Settings.Global.WAIT_FOR_NETWORK_TIMEOUT_MS, long.class);
// add other global settings here...
}
@@ -57,8 +56,6 @@
private final ActivityManagerService mActivityManagerService;
- private static final long WAIT_FOR_NETWORK_TIMEOUT_DEFAULT_MS = 2000; // 2 sec
-
public CoreSettingsObserver(ActivityManagerService activityManagerService) {
super(activityManagerService.mHandler);
mActivityManagerService = activityManagerService;
@@ -146,13 +143,7 @@
} else if (map == sSystemSettingToTypeMap) {
value = Settings.System.getLong(context.getContentResolver(), setting, 0);
} else {
- // TODO: remove this conditional and set the default in settings provider.
- if (Settings.Global.WAIT_FOR_NETWORK_TIMEOUT_MS.equals(setting)) {
- value = Settings.Global.getLong(context.getContentResolver(), setting,
- WAIT_FOR_NETWORK_TIMEOUT_DEFAULT_MS);
- } else {
- value = Settings.Global.getLong(context.getContentResolver(), setting, 0);
- }
+ value = Settings.Global.getLong(context.getContentResolver(), setting, 0);
}
snapshot.putLong(setting, value);
}
diff --git a/services/core/java/com/android/server/am/PinnedActivityStack.java b/services/core/java/com/android/server/am/PinnedActivityStack.java
new file mode 100644
index 0000000..aa7ab15
--- /dev/null
+++ b/services/core/java/com/android/server/am/PinnedActivityStack.java
@@ -0,0 +1,55 @@
+/*
+ * 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.am;
+
+import android.app.RemoteAction;
+import android.graphics.Rect;
+
+import com.android.server.am.ActivityStackSupervisor.ActivityContainer;
+import com.android.server.wm.PinnedStackWindowController;
+import com.android.server.wm.StackWindowController;
+
+import java.util.List;
+
+/**
+ * State and management of the pinned stack of activities.
+ */
+class PinnedActivityStack extends ActivityStack<PinnedStackWindowController> {
+
+ PinnedActivityStack(ActivityContainer activityContainer,
+ RecentTasks recentTasks, boolean onTop) {
+ super(activityContainer, recentTasks, onTop);
+ }
+
+ @Override
+ PinnedStackWindowController createStackWindowController(int displayId, boolean onTop,
+ Rect outBounds) {
+ return new PinnedStackWindowController(mStackId, this, displayId, onTop, outBounds);
+ }
+
+ void animateResizePinnedStack(Rect bounds, int animationDuration) {
+ getWindowContainerController().animateResizePinnedStack(bounds, animationDuration);
+ }
+
+ void setPictureInPictureAspectRatio(float aspectRatio) {
+ getWindowContainerController().setPictureInPictureAspectRatio(aspectRatio);
+ }
+
+ void setPictureInPictureActions(List<RemoteAction> actions) {
+ getWindowContainerController().setPictureInPictureActions(actions);
+ }
+}
diff --git a/services/core/java/com/android/server/am/TaskChangeNotificationController.java b/services/core/java/com/android/server/am/TaskChangeNotificationController.java
index 2990dff..9dfc7cd 100644
--- a/services/core/java/com/android/server/am/TaskChangeNotificationController.java
+++ b/services/core/java/com/android/server/am/TaskChangeNotificationController.java
@@ -97,7 +97,7 @@
};
private final TaskStackConsumer mNotifyPinnedActivityRestartAttempt = (l, m) -> {
- l.onPinnedActivityRestartAttempt((ComponentName) m.obj);
+ l.onPinnedActivityRestartAttempt((String) m.obj);
};
private final TaskStackConsumer mNotifyPinnedStackAnimationEnded = (l, m) -> {
@@ -267,11 +267,11 @@
* running in the pinned stack and the activity was not actually started, but the task is
* either brought to the front or a new Intent is delivered to it.
*/
- void notifyPinnedActivityRestartAttempt(ComponentName sourceComponent) {
+ void notifyPinnedActivityRestartAttempt(String launchedFromPackage) {
mHandler.removeMessages(NOTIFY_PINNED_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG);
final Message msg =
mHandler.obtainMessage(NOTIFY_PINNED_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG,
- sourceComponent);
+ launchedFromPackage);
forAllLocalListeners(mNotifyPinnedActivityRestartAttempt, msg);
msg.sendToTarget();
}
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 520d4ee..b051304 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -35,7 +35,6 @@
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Bitmap;
-import android.graphics.GraphicBuffer;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Debug;
@@ -52,6 +51,7 @@
import com.android.internal.util.XmlUtils;
import com.android.server.wm.AppWindowContainerController;
+import com.android.server.wm.StackWindowController;
import com.android.server.wm.TaskWindowContainerController;
import com.android.server.wm.TaskWindowContainerListener;
@@ -278,7 +278,6 @@
private final Rect mTmpStableBounds = new Rect();
private final Rect mTmpNonDecorBounds = new Rect();
private final Rect mTmpRect = new Rect();
- private final Rect mTmpRect2 = new Rect();
// Last non-fullscreen bounds the task was launched in or resized to.
// The information is persisted and used to determine the appropriate stack to launch the
@@ -1084,6 +1083,13 @@
/** @return true if this was the last activity in the task */
boolean removeActivity(ActivityRecord r) {
+ if (r.task != this) {
+ throw new IllegalArgumentException(
+ "Activity=" + r + " does not belong to task=" + this);
+ }
+
+ r.task = null;
+
if (mActivities.remove(r) && r.fullscreen) {
// Was previously in list.
numFullscreen--;
@@ -1838,66 +1844,38 @@
return !mTmpConfig.equals(newConfig);
}
- private void subtractNonDecorInsets(Rect inOutBounds, Rect inInsetBounds,
- boolean overrideWidth, boolean overrideHeight) {
- mTmpRect2.set(inInsetBounds);
- mService.mWindowManager.subtractNonDecorInsets(mTmpRect2);
- int leftInset = mTmpRect2.left - inInsetBounds.left;
- int topInset = mTmpRect2.top - inInsetBounds.top;
- int rightInset = overrideWidth ? 0 : inInsetBounds.right - mTmpRect2.right;
- int bottomInset = overrideHeight ? 0 : inInsetBounds.bottom - mTmpRect2.bottom;
- inOutBounds.inset(leftInset, topInset, rightInset, bottomInset);
- }
-
- private void subtractStableInsets(Rect inOutBounds, Rect inInsetBounds,
- boolean overrideWidth, boolean overrideHeight) {
- mTmpRect2.set(inInsetBounds);
- mService.mWindowManager.subtractStableInsets(mTmpRect2);
- int leftInset = mTmpRect2.left - inInsetBounds.left;
- int topInset = mTmpRect2.top - inInsetBounds.top;
- int rightInset = overrideWidth ? 0 : inInsetBounds.right - mTmpRect2.right;
- int bottomInset = overrideHeight ? 0 : inInsetBounds.bottom - mTmpRect2.bottom;
- inOutBounds.inset(leftInset, topInset, rightInset, bottomInset);
- }
-
/** Clears passed config and fills it with new override values. */
private void calculateOverrideConfig(Configuration config, Rect bounds, Rect insetBounds,
boolean overrideWidth, boolean overrideHeight) {
mTmpNonDecorBounds.set(bounds);
mTmpStableBounds.set(bounds);
- final Configuration parentConfig = getParent().getConfiguration();
config.unset();
+ final Configuration parentConfig = getParent().getConfiguration();
final float density = parentConfig.densityDpi * DisplayMetrics.DENSITY_DEFAULT_SCALE;
- final boolean isFloatingTask = mStack != null && StackId.tasksAreFloating(mStack.mStackId);
- if (isFloatingTask) {
- // Floating tasks should not be resized to the screen's bounds.
- config.screenWidthDp = (int) (mTmpStableBounds.width() / density);
- config.screenHeightDp = (int) (mTmpStableBounds.height() / density);
- } else {
- // For calculating screenWidthDp, screenWidthDp, we use the stable inset screen area,
- // i.e. the screen area without the system bars.
- // Additionally task dimensions should not be bigger than its parents dimensions.
- subtractNonDecorInsets(mTmpNonDecorBounds, insetBounds != null ? insetBounds : bounds,
- overrideWidth, overrideHeight);
- subtractStableInsets(mTmpStableBounds, insetBounds != null ? insetBounds : bounds,
- overrideWidth, overrideHeight);
- config.screenWidthDp = Math.min(
- (int) (mTmpStableBounds.width() / density), parentConfig.screenWidthDp);
- config.screenHeightDp = Math.min(
- (int) (mTmpStableBounds.height() / density), parentConfig.screenHeightDp);
- }
// TODO: Orientation?
config.orientation = (config.screenWidthDp <= config.screenHeightDp)
? Configuration.ORIENTATION_PORTRAIT
: Configuration.ORIENTATION_LANDSCAPE;
+ if (mStack != null) {
+ final StackWindowController stackController = mStack.getWindowContainerController();
+ stackController.adjustConfigurationForBounds(bounds, insetBounds,
+ mTmpNonDecorBounds, mTmpStableBounds, overrideWidth, overrideHeight, density,
+ config, parentConfig);
+ } else {
+ // No stack, give some default values
+ config.smallestScreenWidthDp =
+ mService.mStackSupervisor.mDefaultMinSizeOfResizeableTask;
+ config.screenWidthDp = config.screenHeightDp = config.smallestScreenWidthDp;
+ Slog.wtf(TAG, "Expected stack when caclulating override config");
+ }
// For calculating screen layout, we need to use the non-decor inset screen area for the
// calculation for compatibility reasons, i.e. screen area without system bars that could
// never go away in Honeycomb.
- final int compatScreenWidthDp = (int)(mTmpNonDecorBounds.width() / density);
- final int compatScreenHeightDp = (int)(mTmpNonDecorBounds.height() / density);
+ final int compatScreenWidthDp = (int) (mTmpNonDecorBounds.width() / density);
+ final int compatScreenHeightDp = (int) (mTmpNonDecorBounds.height() / density);
// We're only overriding LONG, SIZE and COMPAT parts of screenLayout, so we start override
// calculation with partial default.
final int sl = Configuration.SCREENLAYOUT_LONG_YES | Configuration.SCREENLAYOUT_SIZE_XLARGE;
@@ -1905,8 +1883,6 @@
final int shortSize = Math.min(compatScreenHeightDp, compatScreenWidthDp);
config.screenLayout = Configuration.reduceScreenLayout(sl, longSize, shortSize);
- config.smallestScreenWidthDp = mService.mWindowManager.getSmallestWidthForTaskBounds(
- insetBounds != null ? insetBounds : bounds);
}
/**
diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java
index 1e16bc9..302f628 100644
--- a/services/core/java/com/android/server/am/UidRecord.java
+++ b/services/core/java/com/android/server/am/UidRecord.java
@@ -17,12 +17,8 @@
package com.android.server.am;
import android.app.ActivityManager;
-import android.app.ActivityThread;
-import android.app.IApplicationThread;
-import android.os.RemoteCallbackList;
import android.os.SystemClock;
import android.os.UserHandle;
-import android.util.DebugUtils;
import android.util.TimeUtils;
/**
@@ -38,27 +34,6 @@
boolean setWhitelist;
boolean idle;
int numProcs;
- /**
- * Seq no. associated with the current process state change (from background to foreground or
- * vice versa).
- */
- long curProcStateSeq;
- /**
- * Latest seq number for which NetworkPolicyManagerService notified ActivityManagerService that
- * network policy rules are updated.
- */
- long lastProcStateSeqWithUpdatedNetworkState;
- /**
- * Current block state indicating whether components in the process corresponding to this
- * uidRecord needs to block for network or unblock or if there is no change.
- * value will be one of {@link ActivityThread#NETWORK_STATE_BLOCK},
- * {@link ActivityThread#NETWORK_STATE_UNBLOCK}, {@link ActivityThread#NETWORK_STATE_NO_CHANGE}.
- */
- int blockState;
- /** Indicates whether app threads need be notified of the current blockState change. */
- boolean shouldNotifyAppThreads;
- /** Listeners waiting for the network policy rules to get updated. */
- RemoteCallbackList<IApplicationThread> appThreadListeners;
static final int CHANGE_PROCSTATE = 0;
static final int CHANGE_GONE = 1;
@@ -72,7 +47,6 @@
int change;
int processState;
boolean ephemeral;
- long procStateSeq;
}
ChangeItem pendingChange;
@@ -109,14 +83,6 @@
}
sb.append(" procs:");
sb.append(numProcs);
- sb.append(" procStateSeq:");
- sb.append(curProcStateSeq);
- sb.append(" lastProcStateSeqWithUpdatedNetworkState:");
- sb.append(lastProcStateSeqWithUpdatedNetworkState);
- sb.append(" blockState:");
- sb.append(DebugUtils.valueToString(ActivityThread.class, "NETWORK_STATE_", blockState));
- sb.append(" shouldNotifyAppThreads:");
- sb.append(shouldNotifyAppThreads);
sb.append("}");
return sb.toString();
}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 8d0111b..79b99a3 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -43,6 +43,7 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.content.pm.UserInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -72,6 +73,7 @@
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.media.VolumePolicy;
+import android.media.audiofx.AudioEffect;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.PlayerBase;
@@ -723,6 +725,9 @@
RotationHelper.init(mContext, mAudioHandler);
}
+ intentFilter.addAction(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION);
+ intentFilter.addAction(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION);
+
context.registerReceiverAsUser(mReceiver, UserHandle.ALL, intentFilter, null, null);
LocalServices.addService(AudioManagerInternal.class, new AudioServiceInternal());
@@ -5462,6 +5467,9 @@
state == BluetoothAdapter.STATE_TURNING_OFF) {
disconnectAllBluetoothProfiles();
}
+ } else if (action.equals(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION) ||
+ action.equals(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION)) {
+ handleAudioEffectBroadcast(context, intent);
}
}
} // end class AudioServiceBroadcastReceiver
@@ -5497,6 +5505,27 @@
}
} // end class AudioServiceUserRestrictionsListener
+ private void handleAudioEffectBroadcast(Context context, Intent intent) {
+ String target = intent.getPackage();
+ if (target != null) {
+ Log.w(TAG, "effect broadcast already targeted to " + target);
+ return;
+ }
+ intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
+ // TODO this should target a user-selected panel
+ List<ResolveInfo> ril = context.getPackageManager().queryBroadcastReceivers(
+ intent, 0 /* flags */);
+ if (ril != null && ril.size() != 0) {
+ ResolveInfo ri = ril.get(0);
+ if (ri != null && ri.activityInfo != null && ri.activityInfo.packageName != null) {
+ intent.setPackage(ri.activityInfo.packageName);
+ context.sendBroadcastAsUser(intent, UserHandle.ALL);
+ return;
+ }
+ }
+ Log.w(TAG, "couldn't find receiver package for effect intent");
+ }
+
private void killBackgroundUserProcessesWithRecordAudioPermission(UserInfo oldUser) {
PackageManager pm = mContext.getPackageManager();
// Find the home activity of the user. It should not be killed to avoid expensive restart,
@@ -6489,35 +6518,22 @@
return mRecordMonitor.getActiveRecordingConfigurations();
}
- public void disableRingtoneSync() {
+ public void disableRingtoneSync(final int userId) {
final int callingUserId = UserHandle.getCallingUserId();
+ if (callingUserId != userId) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL,
+ "disable sound settings syncing for another profile");
+ }
final long token = Binder.clearCallingIdentity();
try {
- UserManager userManager = UserManager.get(mContext);
-
- // Disable the sync setting
- Settings.Secure.putIntForUser(mContentResolver,
- Settings.Secure.SYNC_PARENT_SOUNDS, 0 /* false */, callingUserId);
-
- UserInfo parentInfo = userManager.getProfileParent(callingUserId);
- if (parentInfo != null && parentInfo.id != callingUserId) {
- // This is a managed profile, so we clone the ringtones from the parent profile
- cloneRingtoneSetting(callingUserId, parentInfo.id, Settings.System.RINGTONE);
- cloneRingtoneSetting(callingUserId, parentInfo.id,
- Settings.System.NOTIFICATION_SOUND);
- cloneRingtoneSetting(callingUserId, parentInfo.id, Settings.System.ALARM_ALERT);
- }
+ // Disable the sync setting so the profile uses its own sound settings.
+ Settings.Secure.putIntForUser(mContentResolver, Settings.Secure.SYNC_PARENT_SOUNDS,
+ 0 /* false */, userId);
} finally {
Binder.restoreCallingIdentity(token);
}
}
- private void cloneRingtoneSetting(int userId, int parentId, String ringtoneSetting) {
- String parentSetting = Settings.System.getStringForUser(mContentResolver, ringtoneSetting,
- parentId);
- Settings.System.putStringForUser(mContentResolver, ringtoneSetting, parentSetting, userId);
- }
-
//======================
// Audio playback notification
//======================
diff --git a/services/core/java/com/android/server/audio/MediaFocusControl.java b/services/core/java/com/android/server/audio/MediaFocusControl.java
index b4feef3..abdcfe7 100644
--- a/services/core/java/com/android/server/audio/MediaFocusControl.java
+++ b/services/core/java/com/android/server/audio/MediaFocusControl.java
@@ -437,7 +437,7 @@
* @param attr attributes of the sound about to start playing
* @return time in ms
*/
- protected int getFocusRampTimeMs(int focusGain, AudioAttributes attr) {
+ protected static int getFocusRampTimeMs(int focusGain, AudioAttributes attr) {
switch (attr.getUsage()) {
case AudioAttributes.USAGE_MEDIA:
case AudioAttributes.USAGE_GAME:
diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
index a95a627..d648dd8 100644
--- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
@@ -25,6 +25,7 @@
import android.media.IPlaybackConfigDispatcher;
import android.media.MediaRecorder;
import android.media.PlayerBase;
+import android.media.VolumeShaper;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
@@ -46,16 +47,40 @@
implements AudioPlaybackConfiguration.PlayerDeathMonitor, PlayerFocusEnforcer {
public final static String TAG = "AudioService.PlaybackActivityMonitor";
- private final static boolean DEBUG = false;
- private ArrayList<PlayMonitorClient> mClients = new ArrayList<PlayMonitorClient>();
+ private final static boolean DEBUG = false;
+ private final static int VOLUME_SHAPER_SYSTEM_DUCK_ID = 1;
+
+ private final VolumeShaper.Configuration DUCK_VSHAPE =
+ new VolumeShaper.Configuration.Builder()
+ .setId(VOLUME_SHAPER_SYSTEM_DUCK_ID)
+ .setCurve(new float[] { 0.f, 1.f } /* times */,
+ new float[] { 1.f, 0.2f } /* volumes */)
+ .setOptionFlags(VolumeShaper.Configuration.OPTION_FLAG_CLOCK_TIME)
+ .setDurationMs(MediaFocusControl.getFocusRampTimeMs(
+ AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK,
+ new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_NOTIFICATION)
+ .build()))
+ .build();
+ private final VolumeShaper.Configuration DUCK_ID =
+ new VolumeShaper.Configuration(VOLUME_SHAPER_SYSTEM_DUCK_ID);
+ private final VolumeShaper.Operation PLAY_CREATE_IF_NEEDED =
+ new VolumeShaper.Operation.Builder(VolumeShaper.Operation.PLAY)
+ .createIfNeeded()
+ .build();
+ private final VolumeShaper.Operation TERMINATE =
+ new VolumeShaper.Operation.Builder()
+ .terminate()
+ .build();
+
+ private final ArrayList<PlayMonitorClient> mClients = new ArrayList<PlayMonitorClient>();
// a public client is one that needs an anonymized version of the playback configurations, we
// keep track of whether there is at least one to know when we need to create the list of
// playback configurations that do not contain uid/pid/package name information.
private boolean mHasPublicClients = false;
private final Object mPlayerLock = new Object();
- private HashMap<Integer, AudioPlaybackConfiguration> mPlayers =
+ private final HashMap<Integer, AudioPlaybackConfiguration> mPlayers =
new HashMap<Integer, AudioPlaybackConfiguration>();
PlaybackActivityMonitor() {
@@ -104,7 +129,9 @@
synchronized(mPlayerLock) {
final AudioPlaybackConfiguration apc = mPlayers.get(new Integer(piid));
// FIXME SoundPool not ready for state reporting
- if (apc.getPlayerType() == AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) {
+ if (apc != null
+ && apc.getPlayerType() == AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL)
+ {
return;
}
if (checkConfigurationCaller(piid, apc, binderUid)) {
@@ -125,6 +152,9 @@
synchronized(mPlayerLock) {
final AudioPlaybackConfiguration apc = mPlayers.get(new Integer(piid));
if (checkConfigurationCaller(piid, apc, binderUid)) {
+ apc.getPlayerProxy().applyVolumeShaper(
+ DUCK_ID,
+ TERMINATE);
mPlayers.remove(new Integer(piid));
} else {
Log.e(TAG, "Error releasing player " + piid);
@@ -257,6 +287,9 @@
while (piidIterator.hasNext()) {
final Integer piid = piidIterator.next();
final AudioPlaybackConfiguration apc = mPlayers.get(piid);
+ if (apc == null) {
+ continue;
+ }
if (!winner.hasSameUid(apc.getClientUid())
&& loser.hasSameUid(apc.getClientUid())
&& apc.getPlayerState() == AudioPlaybackConfiguration.PLAYER_STATE_STARTED)
@@ -268,11 +301,16 @@
// the player is speaking, ducking will make the speech unintelligible
// so let the app handle it instead
return false;
+ } else if (apc.getPlayerType()
+ == AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) {
+ // TODO support ducking of SoundPool players
+ return false;
} else {
try {
if (DEBUG) { Log.v(TAG, "ducking player " + piid); }
- //FIXME just a test before we have VolumeShape
- apc.getPlayerProxy().setPan(-1.0f);
+ apc.getPlayerProxy().applyVolumeShaper(
+ DUCK_VSHAPE,
+ PLAY_CREATE_IF_NEEDED);
mDuckedPlayers.add(piid);
} catch (Exception e) {
Log.e(TAG, "Error ducking player " + piid, e);
@@ -301,8 +339,9 @@
try {
if (DEBUG) { Log.v(TAG, "unducking player" + piid); }
mDuckedPlayers.remove(new Integer(piid));
- //FIXME just a test before we have VolumeShape
- apc.getPlayerProxy().setPan(0.0f);
+ apc.getPlayerProxy().applyVolumeShaper(
+ DUCK_ID,
+ VolumeShaper.Operation.REVERSE);
} catch (Exception e) {
Log.e(TAG, "Error unducking player " + piid, e);
}
@@ -327,6 +366,9 @@
while (piidIterator.hasNext()) {
final Integer piid = piidIterator.next();
final AudioPlaybackConfiguration apc = mPlayers.get(piid);
+ if (apc == null) {
+ continue;
+ }
final int playerUsage = apc.getAudioAttributes().getUsage();
boolean mute = false;
for (int usageToMute : usagesToMute) {
diff --git a/services/core/java/com/android/server/camera/CameraService.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java
similarity index 96%
rename from services/core/java/com/android/server/camera/CameraService.java
rename to services/core/java/com/android/server/camera/CameraServiceProxy.java
index 7d9adf2..d155825 100644
--- a/services/core/java/com/android/server/camera/CameraService.java
+++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java
@@ -40,11 +40,11 @@
import java.util.Set;
/**
- * CameraService is the system_server analog to the camera service running in mediaserver.
+ * CameraServiceProxy is the system_server analog to the camera service running in mediaserver.
*
* @hide
*/
-public class CameraService extends SystemService
+public class CameraServiceProxy extends SystemService
implements Handler.Callback, IBinder.DeathRecipient {
private static final String TAG = "CameraService_proxy";
private static final boolean DEBUG = false;
@@ -131,7 +131,7 @@
}
};
- public CameraService(Context context) {
+ public CameraServiceProxy(Context context) {
super(context);
mContext = context;
mHandlerThread = new ServiceThread(TAG, Process.THREAD_PRIORITY_DISPLAY, /*allowTo*/false);
@@ -149,7 +149,7 @@
notifySwitchWithRetries(msg.arg1);
} break;
default: {
- Slog.e(TAG, "CameraService error, invalid message: " + msg.what);
+ Slog.e(TAG, "CameraServiceProxy error, invalid message: " + msg.what);
} break;
}
return true;
@@ -160,7 +160,8 @@
mUserManager = UserManager.get(mContext);
if (mUserManager == null) {
// Should never see this unless someone messes up the SystemServer service boot order.
- throw new IllegalStateException("UserManagerService must start before CameraService!");
+ throw new IllegalStateException("UserManagerService must start before" +
+ " CameraServiceProxy!");
}
IntentFilter filter = new IntentFilter();
diff --git a/services/core/java/com/android/server/connectivity/MetricsLoggerService.java b/services/core/java/com/android/server/connectivity/MetricsLoggerService.java
deleted file mode 100644
index 1c9feb2..0000000
--- a/services/core/java/com/android/server/connectivity/MetricsLoggerService.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.server.connectivity;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.SystemService;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.net.ConnectivityMetricsEvent;
-import android.net.ConnectivityMetricsLogger;
-import android.net.IConnectivityMetricsLogger;
-import android.os.Binder;
-import android.os.Parcel;
-import android.text.format.DateUtils;
-import android.util.Log;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-
-/** {@hide} */
-public class MetricsLoggerService extends SystemService {
- private static String TAG = "ConnectivityMetricsLoggerService";
- private static final boolean DBG = true;
- private static final boolean VDBG = false;
-
- public MetricsLoggerService(Context context) {
- super(context);
- }
-
- @Override
- public void onStart() {
- resetThrottlingCounters(System.currentTimeMillis());
- }
-
- @Override
- public void onBootPhase(int phase) {
- if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
- if (DBG) Log.d(TAG, "onBootPhase: PHASE_SYSTEM_SERVICES_READY");
- publishBinderService(ConnectivityMetricsLogger.CONNECTIVITY_METRICS_LOGGER_SERVICE,
- mBinder);
- }
- }
-
- // TODO: read these constants from system property
- private final int EVENTS_NOTIFICATION_THRESHOLD = 300;
- private final int MAX_NUMBER_OF_EVENTS = 1000;
- private final int THROTTLING_MAX_NUMBER_OF_MESSAGES_PER_COMPONENT = 1000;
- private final long THROTTLING_TIME_INTERVAL_MILLIS = DateUtils.HOUR_IN_MILLIS;
-
- private int mEventCounter = 0;
-
- /**
- * Reference of the last event in the list of cached events.
- *
- * When client of this service retrieves events by calling getEvents, it is passing
- * ConnectivityMetricsEvent.Reference object. After getEvents returns, that object will
- * contain this reference. The client can save it and use next time it calls getEvents.
- * This way only new events will be returned.
- */
- private long mLastEventReference = 0;
-
- private final int mThrottlingCounters[] =
- new int[ConnectivityMetricsLogger.NUMBER_OF_COMPONENTS];
-
- private long mThrottlingIntervalBoundaryMillis;
-
- private final ArrayDeque<ConnectivityMetricsEvent> mEvents = new ArrayDeque<>();
-
- private void enforceConnectivityInternalPermission() {
- getContext().enforceCallingOrSelfPermission(
- android.Manifest.permission.CONNECTIVITY_INTERNAL,
- "MetricsLoggerService");
- }
-
- private void enforceDumpPermission() {
- getContext().enforceCallingOrSelfPermission(
- android.Manifest.permission.DUMP,
- "MetricsLoggerService");
- }
-
- private void resetThrottlingCounters(long currentTimeMillis) {
- synchronized (mThrottlingCounters) {
- for (int i = 0; i < mThrottlingCounters.length; i++) {
- mThrottlingCounters[i] = 0;
- }
- mThrottlingIntervalBoundaryMillis =
- currentTimeMillis + THROTTLING_TIME_INTERVAL_MILLIS;
- }
- }
-
- private void addEvent(ConnectivityMetricsEvent e) {
- if (VDBG) {
- Log.v(TAG, "writeEvent(" + e.toString() + ")");
- }
-
- while (mEvents.size() >= MAX_NUMBER_OF_EVENTS) {
- mEvents.removeFirst();
- }
-
- mEvents.addLast(e);
- }
-
- @VisibleForTesting
- final MetricsLoggerImpl mBinder = new MetricsLoggerImpl();
-
- /**
- * Implementation of the IConnectivityMetricsLogger interface.
- */
- final class MetricsLoggerImpl extends IConnectivityMetricsLogger.Stub {
-
- private final ArrayList<PendingIntent> mPendingIntents = new ArrayList<>();
-
- @Override
- protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- if (getContext().checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
- != PackageManager.PERMISSION_GRANTED) {
- pw.println("Permission Denial: can't dump ConnectivityMetricsLoggerService " +
- "from from pid=" + Binder.getCallingPid() + ", uid=" +
- Binder.getCallingUid());
- return;
- }
-
- boolean dumpSerializedSize = false;
- boolean dumpEvents = false;
- boolean dumpDebugInfo = false;
- for (String arg : args) {
- switch (arg) {
- case "--debug":
- dumpDebugInfo = true;
- break;
-
- case "--events":
- dumpEvents = true;
- break;
-
- case "--size":
- dumpSerializedSize = true;
- break;
-
- case "--all":
- dumpDebugInfo = true;
- dumpEvents = true;
- dumpSerializedSize = true;
- break;
- }
- }
-
- synchronized (mEvents) {
- pw.println("Number of events: " + mEvents.size());
- pw.println("Counter: " + mEventCounter);
- if (mEvents.size() > 0) {
- pw.println("Time span: " +
- DateUtils.formatElapsedTime(
- (System.currentTimeMillis() - mEvents.peekFirst().timestamp)
- / 1000));
- }
-
- if (dumpSerializedSize) {
- Parcel p = Parcel.obtain();
- for (ConnectivityMetricsEvent e : mEvents) {
- p.writeParcelable(e, 0);
- }
- pw.println("Serialized data size: " + p.dataSize());
- p.recycle();
- }
-
- if (dumpEvents) {
- pw.println();
- pw.println("Events:");
- for (ConnectivityMetricsEvent e : mEvents) {
- pw.println(e.toString());
- }
- }
- }
-
- if (dumpDebugInfo) {
- synchronized (mThrottlingCounters) {
- pw.println();
- for (int i = 0; i < ConnectivityMetricsLogger.NUMBER_OF_COMPONENTS; i++) {
- if (mThrottlingCounters[i] > 0) {
- pw.println("Throttling Counter #" + i + ": " + mThrottlingCounters[i]);
- }
- }
- pw.println("Throttling Time Remaining: " +
- DateUtils.formatElapsedTime(
- (mThrottlingIntervalBoundaryMillis - System.currentTimeMillis())
- / 1000));
- }
- }
-
- synchronized (mPendingIntents) {
- if (!mPendingIntents.isEmpty()) {
- pw.println();
- pw.println("Pending intents:");
- for (PendingIntent pi : mPendingIntents) {
- pw.println(pi.toString());
- }
- }
- }
- }
-
- public long logEvent(ConnectivityMetricsEvent event) {
- ConnectivityMetricsEvent[] events = new ConnectivityMetricsEvent[]{event};
- return logEvents(events);
- }
-
- /**
- * @param events
- *
- * Note: All events must belong to the same component.
- *
- * @return 0 on success
- * <0 if error happened
- * >0 timestamp after which new events will be accepted
- */
- public long logEvents(ConnectivityMetricsEvent[] events) {
- enforceConnectivityInternalPermission();
-
- if (events == null || events.length == 0) {
- Log.wtf(TAG, "No events passed to logEvents()");
- return -1;
- }
-
- int componentTag = events[0].componentTag;
- if (componentTag < 0 ||
- componentTag >= ConnectivityMetricsLogger.NUMBER_OF_COMPONENTS) {
- Log.wtf(TAG, "Unexpected tag: " + componentTag);
- return -1;
- }
-
- synchronized (mThrottlingCounters) {
- long currentTimeMillis = System.currentTimeMillis();
- if (currentTimeMillis > mThrottlingIntervalBoundaryMillis) {
- resetThrottlingCounters(currentTimeMillis);
- }
-
- mThrottlingCounters[componentTag] += events.length;
-
- if (mThrottlingCounters[componentTag] >
- THROTTLING_MAX_NUMBER_OF_MESSAGES_PER_COMPONENT) {
- Log.w(TAG, "Too many events from #" + componentTag +
- ". Block until " + mThrottlingIntervalBoundaryMillis);
-
- return mThrottlingIntervalBoundaryMillis;
- }
- }
-
- boolean sendPendingIntents = false;
-
- synchronized (mEvents) {
- for (ConnectivityMetricsEvent e : events) {
- if (e.componentTag != componentTag) {
- Log.wtf(TAG, "Unexpected tag: " + e.componentTag);
- return -1;
- }
-
- addEvent(e);
- }
-
- mLastEventReference += events.length;
-
- mEventCounter += events.length;
- if (mEventCounter >= EVENTS_NOTIFICATION_THRESHOLD) {
- mEventCounter = 0;
- sendPendingIntents = true;
- }
- }
-
- if (sendPendingIntents) {
- synchronized (mPendingIntents) {
- for (PendingIntent pi : mPendingIntents) {
- if (VDBG) Log.v(TAG, "Send pending intent");
- try {
- pi.send(getContext(), 0, null, null, null);
- } catch (PendingIntent.CanceledException e) {
- Log.e(TAG, "Pending intent canceled: " + pi);
- mPendingIntents.remove(pi);
- }
- }
- }
- }
-
- return 0;
- }
-
- /**
- * Retrieve events
- *
- * @param reference of the last event previously returned. The function will return
- * events following it.
- * If 0 then all events will be returned.
- * After the function call it will contain reference of the
- * last returned event.
- * @return events
- */
- public ConnectivityMetricsEvent[] getEvents(ConnectivityMetricsEvent.Reference reference) {
- enforceDumpPermission();
- long ref = reference.getValue();
- if (VDBG) Log.v(TAG, "getEvents(" + ref + ")");
-
- ConnectivityMetricsEvent[] result;
- synchronized (mEvents) {
- if (ref > mLastEventReference) {
- Log.e(TAG, "Invalid reference");
- reference.setValue(mLastEventReference);
- return null;
- }
- if (ref < mLastEventReference - mEvents.size()) {
- ref = mLastEventReference - mEvents.size();
- }
-
- int numEventsToSkip =
- mEvents.size() // Total number of events
- - (int)(mLastEventReference - ref); // Number of events to return
-
- result = new ConnectivityMetricsEvent[mEvents.size() - numEventsToSkip];
- int i = 0;
- for (ConnectivityMetricsEvent e : mEvents) {
- if (numEventsToSkip > 0) {
- numEventsToSkip--;
- } else {
- result[i++] = e;
- }
- }
-
- reference.setValue(mLastEventReference);
- }
-
- return result;
- }
-
- public boolean register(PendingIntent newEventsIntent) {
- enforceDumpPermission();
- if (VDBG) Log.v(TAG, "register(" + newEventsIntent + ")");
-
- synchronized (mPendingIntents) {
- if (mPendingIntents.remove(newEventsIntent)) {
- Log.w(TAG, "Replacing registered pending intent");
- }
- mPendingIntents.add(newEventsIntent);
- }
-
- return true;
- }
-
- public void unregister(PendingIntent newEventsIntent) {
- enforceDumpPermission();
- if (VDBG) Log.v(TAG, "unregister(" + newEventsIntent + ")");
-
- synchronized (mPendingIntents) {
- if (!mPendingIntents.remove(newEventsIntent)) {
- Log.e(TAG, "Pending intent is not registered");
- }
- }
- }
- };
-}
diff --git a/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java b/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
index 017c5fb..6106093 100644
--- a/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
@@ -20,6 +20,8 @@
import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.LinkProperties;
@@ -72,6 +74,7 @@
private final Context mContext;
private final StateMachine mTarget;
+ private final Handler mHandler;
private final int mWhat;
private final HashMap<Network, NetworkState> mNetworkMap = new HashMap<>();
private ConnectivityManager mCM;
@@ -84,6 +87,7 @@
public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what) {
mContext = ctx;
mTarget = tgt;
+ mHandler = mTarget.getHandler();
mWhat = what;
}
@@ -99,10 +103,10 @@
final NetworkRequest listenAllRequest = new NetworkRequest.Builder()
.clearCapabilities().build();
mListenAllCallback = new UpstreamNetworkCallback(CALLBACK_LISTEN_ALL);
- cm().registerNetworkCallback(listenAllRequest, mListenAllCallback);
+ cm().registerNetworkCallback(listenAllRequest, mListenAllCallback, mHandler);
mDefaultNetworkCallback = new UpstreamNetworkCallback(CALLBACK_TRACK_DEFAULT);
- cm().registerDefaultNetworkCallback(mDefaultNetworkCallback);
+ cm().registerDefaultNetworkCallback(mDefaultNetworkCallback, mHandler);
}
public void stop() {
@@ -154,7 +158,7 @@
// Additionally, we log a message to aid in any subsequent debugging.
Log.d(TAG, "requesting mobile upstream network: " + mobileUpstreamRequest);
- cm().requestNetwork(mobileUpstreamRequest, mMobileNetworkCallback, 0, legacyType);
+ cm().requestNetwork(mobileUpstreamRequest, mMobileNetworkCallback, 0, legacyType, mHandler);
}
public void releaseMobileNetworkRequest() {
@@ -183,11 +187,35 @@
case CALLBACK_LISTEN_ALL:
break;
case CALLBACK_TRACK_DEFAULT:
+ if (mDefaultNetworkCallback == null) {
+ // The callback was unregistered in the interval between
+ // ConnectivityService enqueueing onAvailable() and our
+ // handling of it here on the mHandler thread.
+ //
+ // Clean-up of this network entry is deferred to the
+ // handling of onLost() by other callbacks.
+ //
+ // These request*() calls can be deleted post oag/339444.
+ return;
+ }
+
cm().requestNetworkCapabilities(mDefaultNetworkCallback);
cm().requestLinkProperties(mDefaultNetworkCallback);
mCurrentDefault = network;
break;
case CALLBACK_MOBILE_REQUEST:
+ if (mMobileNetworkCallback == null) {
+ // The callback was unregistered in the interval between
+ // ConnectivityService enqueueing onAvailable() and our
+ // handling of it here on the mHandler thread.
+ //
+ // Clean-up of this network entry is deferred to the
+ // handling of onLost() by other callbacks.
+ //
+ // These request*() calls can be deleted post oag/339444.
+ return;
+ }
+
cm().requestNetworkCapabilities(mMobileNetworkCallback);
cm().requestLinkProperties(mMobileNetworkCallback);
break;
@@ -292,8 +320,9 @@
}
/**
- * A NetworkCallback class that relays information of interest to the
- * tethering master state machine thread for subsequent processing.
+ * A NetworkCallback class that handles information of interest directly
+ * in the thread on which it is invoked. To avoid locking, this MUST be
+ * run on the same thread as the target state machine's handler.
*/
private class UpstreamNetworkCallback extends NetworkCallback {
private final int mCallbackType;
@@ -304,22 +333,35 @@
@Override
public void onAvailable(Network network) {
- mTarget.getHandler().post(() -> handleAvailable(mCallbackType, network));
+ checkExpectedThread();
+ handleAvailable(mCallbackType, network);
}
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities newNc) {
- mTarget.getHandler().post(() -> handleNetCap(network, newNc));
+ checkExpectedThread();
+ handleNetCap(network, newNc);
}
@Override
public void onLinkPropertiesChanged(Network network, LinkProperties newLp) {
- mTarget.getHandler().post(() -> handleLinkProp(network, newLp));
+ checkExpectedThread();
+ handleLinkProp(network, newLp);
}
+ // TODO: Handle onNetworkSuspended();
+ // TODO: Handle onNetworkResumed();
+
@Override
public void onLost(Network network) {
- mTarget.getHandler().post(() -> handleLost(mCallbackType, network));
+ checkExpectedThread();
+ handleLost(mCallbackType, network);
+ }
+
+ private void checkExpectedThread() {
+ if (Looper.myLooper() != mHandler.getLooper()) {
+ Log.wtf(TAG, "Handling callback in unexpected thread.");
+ }
}
}
diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java
index 886c97f..4b34eba56 100644
--- a/services/core/java/com/android/server/content/ContentService.java
+++ b/services/core/java/com/android/server/content/ContentService.java
@@ -43,6 +43,7 @@
import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.os.Binder;
+import android.os.Build;
import android.os.Bundle;
import android.os.FactoryTest;
import android.os.IBinder;
@@ -287,7 +288,7 @@
*/
@Override
public void registerContentObserver(Uri uri, boolean notifyForDescendants,
- IContentObserver observer, int userHandle) {
+ IContentObserver observer, int userHandle, int targetSdkVersion) {
if (observer == null || uri == null) {
throw new IllegalArgumentException("You must pass a valid uri and observer");
}
@@ -301,8 +302,17 @@
final String msg = LocalServices.getService(ActivityManagerInternal.class)
.checkContentProviderAccess(uri.getAuthority(), userHandle);
if (msg != null) {
- Log.w(TAG, "Ignoring content changes for " + uri + " from " + uid + ": " + msg);
- return;
+ if (targetSdkVersion >= Build.VERSION_CODES.O) {
+ throw new SecurityException(msg);
+ } else {
+ if (msg.startsWith("Failed to find provider")) {
+ // Sigh, we need to quietly let apps targeting older API
+ // levels notify on non-existent providers.
+ } else {
+ Log.w(TAG, "Ignoring content changes for " + uri + " from " + uid + ": " + msg);
+ return;
+ }
+ }
}
synchronized (mRootNode) {
@@ -316,7 +326,7 @@
public void registerContentObserver(Uri uri, boolean notifyForDescendants,
IContentObserver observer) {
registerContentObserver(uri, notifyForDescendants, observer,
- UserHandle.getCallingUserId());
+ UserHandle.getCallingUserId(), Build.VERSION_CODES.CUR_DEVELOPMENT);
}
@Override
@@ -340,8 +350,8 @@
*/
@Override
public void notifyChange(Uri uri, IContentObserver observer,
- boolean observerWantsSelfNotifications, int flags,
- int userHandle) {
+ boolean observerWantsSelfNotifications, int flags, int userHandle,
+ int targetSdkVersion) {
if (DEBUG) Slog.d(TAG, "Notifying update of " + uri + " for user " + userHandle
+ " from observer " + observer + ", flags " + Integer.toHexString(flags));
@@ -359,8 +369,17 @@
final String msg = LocalServices.getService(ActivityManagerInternal.class)
.checkContentProviderAccess(uri.getAuthority(), userHandle);
if (msg != null) {
- Log.w(TAG, "Ignoring notify for " + uri + " from " + uid + ": " + msg);
- return;
+ if (targetSdkVersion >= Build.VERSION_CODES.O) {
+ throw new SecurityException(msg);
+ } else {
+ if (msg.startsWith("Failed to find provider")) {
+ // Sigh, we need to quietly let apps targeting older API
+ // levels notify on non-existent providers.
+ } else {
+ Log.w(TAG, "Ignoring notify for " + uri + " from " + uid + ": " + msg);
+ return;
+ }
+ }
}
// This makes it so that future permission checks will be in the context of this
@@ -427,7 +446,7 @@
boolean observerWantsSelfNotifications, boolean syncToNetwork) {
notifyChange(uri, observer, observerWantsSelfNotifications,
syncToNetwork ? ContentResolver.NOTIFY_SYNC_TO_NETWORK : 0,
- UserHandle.getCallingUserId());
+ UserHandle.getCallingUserId(), Build.VERSION_CODES.CUR_DEVELOPMENT);
}
/**
diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java
index 5f348bf..a947b41 100644
--- a/services/core/java/com/android/server/display/LogicalDisplay.java
+++ b/services/core/java/com/android/server/display/LogicalDisplay.java
@@ -261,7 +261,6 @@
mPrimaryDisplayDeviceInfo = deviceInfo;
mInfo = null;
- mOverrideDisplayInfo = null;
}
}
diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
index 74e025d..5149933 100644
--- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
@@ -149,13 +149,7 @@
}
private void handleBinderDiedLocked(IBinder appToken) {
- VirtualDisplayDevice device = mVirtualDisplayDevices.remove(appToken);
- if (device != null) {
- Slog.i(TAG, "Virtual display device released because application token died: "
- + device.mOwnerPackageName);
- device.destroyLocked(false);
- sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_REMOVED);
- }
+ mVirtualDisplayDevices.remove(appToken);
}
private void handleMediaProjectionStoppedLocked(IBinder appToken) {
@@ -216,6 +210,10 @@
public void binderDied() {
synchronized (getSyncRoot()) {
handleBinderDiedLocked(mAppToken);
+ Slog.i(TAG, "Virtual display device released because application token died: "
+ + mOwnerPackageName);
+ destroyLocked(false);
+ sendDisplayDeviceEventLocked(this, DISPLAY_DEVICE_EVENT_REMOVED);
}
}
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
index e83b228..0f29942 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
@@ -1180,7 +1180,7 @@
// Statistics about secure fingerprint transactions (e.g. to unlock password
// storage, make secure purchases, etc.)
- final PerformanceStats crypto = mPerformanceMap.get(userId);
+ final PerformanceStats crypto = mCryptoPerformanceMap.get(userId);
if (crypto != null) {
final long countsToken = proto.start(FingerprintUserStatsProto.CRYPTO);
proto.write(FingerprintActionStatsProto.ACCEPT, crypto.accept);
diff --git a/services/core/java/com/android/server/firewall/IntentFirewall.java b/services/core/java/com/android/server/firewall/IntentFirewall.java
index 93c14b9..376a864 100644
--- a/services/core/java/com/android/server/firewall/IntentFirewall.java
+++ b/services/core/java/com/android/server/firewall/IntentFirewall.java
@@ -151,8 +151,7 @@
// For the first pass, find all the rules that have at least one intent-filter or
// component-filter that matches this intent
List<Rule> candidateRules;
- candidateRules = resolver.queryIntent(intent, resolvedType, false /*defaultOnly*/,
- false /*visibleToEphemeral*/, false /*isInstant*/, 0);
+ candidateRules = resolver.queryIntent(intent, resolvedType, false /*defaultOnly*/, 0);
if (candidateRules == null) {
candidateRules = new ArrayList<Rule>();
}
diff --git a/services/core/java/com/android/server/job/JobPackageTracker.java b/services/core/java/com/android/server/job/JobPackageTracker.java
index 82e2eb4..0a6d8a4 100644
--- a/services/core/java/com/android/server/job/JobPackageTracker.java
+++ b/services/core/java/com/android/server/job/JobPackageTracker.java
@@ -437,7 +437,7 @@
for (int i=0; i<size; i++) {
final int index = mEventIndices.indexOf(i);
final int uid = mEventUids[index];
- if (filterUid != -1 && filterUid != UserHandle.getAppId(filterUid)) {
+ if (filterUid != -1 && filterUid != UserHandle.getAppId(uid)) {
continue;
}
final int cmd = mEventCmds[index];
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index a748013..c973911 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -131,6 +131,8 @@
final List<JobServiceContext> mActiveServices = new ArrayList<>();
/** List of controllers that will notify this service of updates to jobs. */
List<StateController> mControllers;
+ /** Need direct access to this for testing. */
+ BatteryController mBatteryController;
/**
* Queue of pending jobs. The JobServiceContext class will receive jobs from this list
* when ready to execute them.
@@ -194,6 +196,7 @@
// Key names stored in the settings value.
private static final String KEY_MIN_IDLE_COUNT = "min_idle_count";
private static final String KEY_MIN_CHARGING_COUNT = "min_charging_count";
+ private static final String KEY_MIN_BATTERY_NOT_LOW_COUNT = "min_battery_not_low_count";
private static final String KEY_MIN_CONNECTIVITY_COUNT = "min_connectivity_count";
private static final String KEY_MIN_CONTENT_COUNT = "min_content_count";
private static final String KEY_MIN_READY_JOBS_COUNT = "min_ready_jobs_count";
@@ -207,6 +210,7 @@
private static final int DEFAULT_MIN_IDLE_COUNT = 1;
private static final int DEFAULT_MIN_CHARGING_COUNT = 1;
+ private static final int DEFAULT_MIN_BATTERY_NOT_LOW_COUNT = 1;
private static final int DEFAULT_MIN_CONNECTIVITY_COUNT = 1;
private static final int DEFAULT_MIN_CONTENT_COUNT = 1;
private static final int DEFAULT_MIN_READY_JOBS_COUNT = 1;
@@ -229,6 +233,11 @@
*/
int MIN_CHARGING_COUNT = DEFAULT_MIN_CHARGING_COUNT;
/**
+ * Minimum # of "battery not low" jobs that must be ready in order to force the JMS to
+ * schedule things early.
+ */
+ int MIN_BATTERY_NOT_LOW_COUNT = DEFAULT_MIN_BATTERY_NOT_LOW_COUNT;
+ /**
* Minimum # of connectivity jobs that must be ready in order to force the JMS to schedule
* things early. 1 == Run connectivity jobs as soon as ready.
*/
@@ -312,6 +321,8 @@
DEFAULT_MIN_IDLE_COUNT);
MIN_CHARGING_COUNT = mParser.getInt(KEY_MIN_CHARGING_COUNT,
DEFAULT_MIN_CHARGING_COUNT);
+ MIN_BATTERY_NOT_LOW_COUNT = mParser.getInt(KEY_MIN_BATTERY_NOT_LOW_COUNT,
+ DEFAULT_MIN_BATTERY_NOT_LOW_COUNT);
MIN_CONNECTIVITY_COUNT = mParser.getInt(KEY_MIN_CONNECTIVITY_COUNT,
DEFAULT_MIN_CONNECTIVITY_COUNT);
MIN_CONTENT_COUNT = mParser.getInt(KEY_MIN_CONTENT_COUNT,
@@ -356,6 +367,9 @@
pw.print(" "); pw.print(KEY_MIN_CHARGING_COUNT); pw.print("=");
pw.print(MIN_CHARGING_COUNT); pw.println();
+ pw.print(" "); pw.print(KEY_MIN_BATTERY_NOT_LOW_COUNT); pw.print("=");
+ pw.print(MIN_BATTERY_NOT_LOW_COUNT); pw.println();
+
pw.print(" "); pw.print(KEY_MIN_CONNECTIVITY_COUNT); pw.print("=");
pw.print(MIN_CONNECTIVITY_COUNT); pw.println();
@@ -785,7 +799,8 @@
mControllers.add(ConnectivityController.get(this));
mControllers.add(TimeController.get(this));
mControllers.add(IdleController.get(this));
- mControllers.add(BatteryController.get(this));
+ mBatteryController = BatteryController.get(this);
+ mControllers.add(mBatteryController);
mControllers.add(AppIdleController.get(this));
mControllers.add(ContentObserverController.get(this));
mControllers.add(DeviceIdleJobsController.get(this));
@@ -1186,6 +1201,7 @@
*/
class MaybeReadyJobQueueFunctor implements JobStatusFunctor {
int chargingCount;
+ int batteryNotLowCount;
int idleCount;
int backoffCount;
int connectivityCount;
@@ -1223,6 +1239,9 @@
if (job.hasChargingConstraint()) {
chargingCount++;
}
+ if (job.hasBatteryNotLowConstraint()) {
+ batteryNotLowCount++;
+ }
if (job.hasContentTriggerConstraint()) {
contentCount++;
}
@@ -1241,6 +1260,7 @@
idleCount >= mConstants.MIN_IDLE_COUNT ||
connectivityCount >= mConstants.MIN_CONNECTIVITY_COUNT ||
chargingCount >= mConstants.MIN_CHARGING_COUNT ||
+ batteryNotLowCount >= mConstants.MIN_BATTERY_NOT_LOW_COUNT ||
contentCount >= mConstants.MIN_CONTENT_COUNT ||
(runnableJobs != null
&& runnableJobs.size() >= mConstants.MIN_READY_JOBS_COUNT)) {
@@ -1264,6 +1284,7 @@
idleCount = 0;
backoffCount = 0;
connectivityCount = 0;
+ batteryNotLowCount = 0;
contentCount = 0;
runnableJobs = null;
}
@@ -1764,6 +1785,34 @@
return 0;
}
+ void setMonitorBattery(boolean enabled) {
+ synchronized (mLock) {
+ if (mBatteryController != null) {
+ mBatteryController.getTracker().setMonitorBatteryLocked(enabled);
+ }
+ }
+ }
+
+ int getBatterySeq() {
+ synchronized (mLock) {
+ return mBatteryController != null ? mBatteryController.getTracker().getSeq() : -1;
+ }
+ }
+
+ boolean getBatteryCharging() {
+ synchronized (mLock) {
+ return mBatteryController != null
+ ? mBatteryController.getTracker().isOnStablePower() : false;
+ }
+ }
+
+ boolean getBatteryNotLow() {
+ synchronized (mLock) {
+ return mBatteryController != null
+ ? mBatteryController.getTracker().isBatteryNotLow() : false;
+ }
+ }
+
private String printContextIdToJobMap(JobStatus[] map, String initial) {
StringBuilder s = new StringBuilder(initial + ": ");
for (int i=0; i<map.length; i++) {
diff --git a/services/core/java/com/android/server/job/JobSchedulerShellCommand.java b/services/core/java/com/android/server/job/JobSchedulerShellCommand.java
index 2d62c1c..ec23407 100644
--- a/services/core/java/com/android/server/job/JobSchedulerShellCommand.java
+++ b/services/core/java/com/android/server/job/JobSchedulerShellCommand.java
@@ -43,10 +43,19 @@
public int onCommand(String cmd) {
final PrintWriter pw = getOutPrintWriter();
try {
- if ("run".equals(cmd)) {
- return runJob();
- } else {
- return handleDefaultCommands(cmd);
+ switch (cmd != null ? cmd : "") {
+ case "run":
+ return runJob(pw);
+ case "monitor-battery":
+ return runMonitorBattery(pw);
+ case "get-battery-seq":
+ return runGetBatterySeq(pw);
+ case "get-battery-charging":
+ return runGetBatteryCharging(pw);
+ case "get-battery-not-low":
+ return runGetBatteryNotLow(pw);
+ default:
+ return handleDefaultCommands(cmd);
}
} catch (Exception e) {
pw.println("Exception: " + e);
@@ -54,20 +63,23 @@
return -1;
}
- private int runJob() {
- try {
- final int uid = Binder.getCallingUid();
- final int perm = mPM.checkUidPermission(
- "android.permission.CHANGE_APP_IDLE_STATE", uid);
- if (perm != PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException("Uid " + uid
- + " not permitted to force scheduled jobs");
- }
- } catch (RemoteException e) {
- // Can't happen
+ private void checkPermission(String operation) throws Exception {
+ final int uid = Binder.getCallingUid();
+ if (uid == 0) {
+ // Root can do anything.
+ return;
}
+ final int perm = mPM.checkUidPermission(
+ "android.permission.CHANGE_APP_IDLE_STATE", uid);
+ if (perm != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Uid " + uid
+ + " not permitted to " + operation);
+ }
+ }
- final PrintWriter pw = getOutPrintWriter();
+ private int runJob(PrintWriter pw) throws Exception {
+ checkPermission("force scheduled jobs");
+
boolean force = false;
int userId = UserHandle.USER_SYSTEM;
@@ -133,6 +145,42 @@
return ret;
}
+ private int runMonitorBattery(PrintWriter pw) throws Exception {
+ checkPermission("change battery monitoring");
+ String opt = getNextArgRequired();
+ boolean enabled;
+ if ("on".equals(opt)) {
+ enabled = true;
+ } else if ("off".equals(opt)) {
+ enabled = false;
+ } else {
+ getErrPrintWriter().println("Error: unknown option " + opt);
+ return 1;
+ }
+ mInternal.setMonitorBattery(enabled);
+ if (enabled) pw.println("Battery monitoring enabled");
+ else pw.println("Battery monitoring disabled");
+ return 0;
+ }
+
+ private int runGetBatterySeq(PrintWriter pw) {
+ int seq = mInternal.getBatterySeq();
+ pw.println(seq);
+ return 0;
+ }
+
+ private int runGetBatteryCharging(PrintWriter pw) {
+ boolean val = mInternal.getBatteryCharging();
+ pw.println(val);
+ return 0;
+ }
+
+ private int runGetBatteryNotLow(PrintWriter pw) {
+ boolean val = mInternal.getBatteryNotLow();
+ pw.println(val);
+ return 0;
+ }
+
@Override
public void onHelp() {
final PrintWriter pw = getOutPrintWriter();
@@ -140,7 +188,6 @@
pw.println("Job scheduler (jobscheduler) commands:");
pw.println(" help");
pw.println(" Print this help text.");
- pw.println();
pw.println(" run [-f | --force] [-u | --user USER_ID] PACKAGE JOB_ID");
pw.println(" Trigger immediate execution of a specific scheduled job.");
pw.println(" Options:");
@@ -148,6 +195,15 @@
pw.println(" connectivity are not currently met");
pw.println(" -u or --user: specify which user's job is to be run; the default is");
pw.println(" the primary or system user");
+ pw.println(" monitor-battery [on|off]");
+ pw.println(" Control monitoring of all battery changes. Off by default. Turning");
+ pw.println(" on makes get-battery-seq useful.");
+ pw.println(" get-battery-seq");
+ pw.println(" Return the last battery update sequence number that was received.");
+ pw.println(" get-battery-charging");
+ pw.println(" Return whether the battery is currently considered to be charging.");
+ pw.println(" get-battery-not-low");
+ pw.println(" Return whether the battery is currently considered to not be low.");
pw.println();
}
diff --git a/services/core/java/com/android/server/job/JobServiceContext.java b/services/core/java/com/android/server/job/JobServiceContext.java
index 7cb223d..1337046 100644
--- a/services/core/java/com/android/server/job/JobServiceContext.java
+++ b/services/core/java/com/android/server/job/JobServiceContext.java
@@ -448,7 +448,10 @@
mVerb = VERB_STARTING;
scheduleOpTimeOut();
service.startJob(mParams);
- } catch (RemoteException e) {
+ } catch (Exception e) {
+ // We catch 'Exception' because client-app malice or bugs might induce a wide
+ // range of possible exception-throw outcomes from startJob() and its handling
+ // of the client's ParcelableBundle extras.
Slog.e(TAG, "Error sending onStart message to '" +
mRunningJob.getServiceComponent().getShortClassName() + "' ", e);
}
diff --git a/services/core/java/com/android/server/job/JobStore.java b/services/core/java/com/android/server/job/JobStore.java
index dd3f85f..ccfc287 100644
--- a/services/core/java/com/android/server/job/JobStore.java
+++ b/services/core/java/com/android/server/job/JobStore.java
@@ -381,6 +381,9 @@
if (jobStatus.hasChargingConstraint()) {
out.attribute(null, "charging", Boolean.toString(true));
}
+ if (jobStatus.hasBatteryNotLowConstraint()) {
+ out.attribute(null, "battery-not-low", Boolean.toString(true));
+ }
out.endTag(null, XML_TAG_PARAMS_CONSTRAINTS);
}
diff --git a/services/core/java/com/android/server/job/controllers/BatteryController.java b/services/core/java/com/android/server/job/controllers/BatteryController.java
index f6b8ef4..05527be 100644
--- a/services/core/java/com/android/server/job/controllers/BatteryController.java
+++ b/services/core/java/com/android/server/job/controllers/BatteryController.java
@@ -80,32 +80,38 @@
@Override
public void maybeStartTrackingJobLocked(JobStatus taskStatus, JobStatus lastJob) {
- final boolean isOnStablePower = mChargeTracker.isOnStablePower();
- if (taskStatus.hasChargingConstraint()) {
+ if (taskStatus.hasPowerConstraint()) {
mTrackedTasks.add(taskStatus);
- taskStatus.setChargingConstraintSatisfied(isOnStablePower);
+ taskStatus.setChargingConstraintSatisfied(mChargeTracker.isOnStablePower());
+ taskStatus.setBatteryNotLowConstraintSatisfied(mChargeTracker.isBatteryNotLow());
}
}
@Override
public void maybeStopTrackingJobLocked(JobStatus taskStatus, JobStatus incomingJob, boolean forUpdate) {
- if (taskStatus.hasChargingConstraint()) {
+ if (taskStatus.hasPowerConstraint()) {
mTrackedTasks.remove(taskStatus);
}
}
private void maybeReportNewChargingState() {
final boolean stablePower = mChargeTracker.isOnStablePower();
+ final boolean batteryNotLow = mChargeTracker.isBatteryNotLow();
if (DEBUG) {
Slog.d(TAG, "maybeReportNewChargingState: " + stablePower);
}
boolean reportChange = false;
synchronized (mLock) {
- for (JobStatus ts : mTrackedTasks) {
+ for (int i = mTrackedTasks.size() - 1; i >= 0; i--) {
+ final JobStatus ts = mTrackedTasks.get(i);
boolean previous = ts.setChargingConstraintSatisfied(stablePower);
if (previous != stablePower) {
reportChange = true;
}
+ previous = ts.setBatteryNotLowConstraintSatisfied(batteryNotLow);
+ if (previous != batteryNotLow) {
+ reportChange = true;
+ }
}
}
// Let the scheduler know that state has changed. This may or may not result in an
@@ -127,6 +133,10 @@
private boolean mCharging;
/** Keep track of whether the battery is charged enough that we want to do work. */
private boolean mBatteryHealthy;
+ /** Sequence number of last broadcast. */
+ private int mLastBatterySeq = -1;
+
+ private BroadcastReceiver mMonitor;
public ChargingTracker() {
}
@@ -149,10 +159,42 @@
mCharging = batteryManagerInternal.isPowered(BatteryManager.BATTERY_PLUGGED_ANY);
}
- boolean isOnStablePower() {
+ public void setMonitorBatteryLocked(boolean enabled) {
+ if (enabled) {
+ if (mMonitor == null) {
+ mMonitor = new BroadcastReceiver() {
+ @Override public void onReceive(Context context, Intent intent) {
+ ChargingTracker.this.onReceive(context, intent);
+ }
+ };
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_BATTERY_CHANGED);
+ mContext.registerReceiver(mMonitor, filter);
+ }
+ } else {
+ if (mMonitor != null) {
+ mContext.unregisterReceiver(mMonitor);
+ mMonitor = null;
+ }
+ }
+ }
+
+ public boolean isOnStablePower() {
return mCharging && mBatteryHealthy;
}
+ public boolean isBatteryNotLow() {
+ return mBatteryHealthy;
+ }
+
+ public boolean isMonitoring() {
+ return mMonitor != null;
+ }
+
+ public int getSeq() {
+ return mLastBatterySeq;
+ }
+
@Override
public void onReceive(Context context, Intent intent) {
onReceiveInternal(intent);
@@ -191,13 +233,20 @@
mCharging = false;
maybeReportNewChargingState();
}
+ mLastBatterySeq = intent.getIntExtra(BatteryManager.EXTRA_SEQUENCE, mLastBatterySeq);
}
}
@Override
public void dumpControllerStateLocked(PrintWriter pw, int filterUid) {
pw.print("Battery: stable power = ");
- pw.println(mChargeTracker.isOnStablePower());
+ pw.print(mChargeTracker.isOnStablePower());
+ pw.print(", not low = ");
+ pw.println(mChargeTracker.isBatteryNotLow());
+ if (mChargeTracker.isMonitoring()) {
+ pw.print("MONITORING: seq=");
+ pw.println(mChargeTracker.getSeq());
+ }
pw.print("Tracking ");
pw.print(mTrackedTasks.size());
pw.println(":");
diff --git a/services/core/java/com/android/server/job/controllers/JobStatus.java b/services/core/java/com/android/server/job/controllers/JobStatus.java
index 4b39bf9..9a55fed 100644
--- a/services/core/java/com/android/server/job/controllers/JobStatus.java
+++ b/services/core/java/com/android/server/job/controllers/JobStatus.java
@@ -46,16 +46,17 @@
public static final long NO_LATEST_RUNTIME = Long.MAX_VALUE;
public static final long NO_EARLIEST_RUNTIME = 0L;
- static final int CONSTRAINT_CHARGING = 1<<0;
- static final int CONSTRAINT_TIMING_DELAY = 1<<1;
- static final int CONSTRAINT_DEADLINE = 1<<2;
- static final int CONSTRAINT_IDLE = 1<<3;
- static final int CONSTRAINT_UNMETERED = 1<<4;
- static final int CONSTRAINT_CONNECTIVITY = 1<<5;
- static final int CONSTRAINT_APP_NOT_IDLE = 1<<6;
- static final int CONSTRAINT_CONTENT_TRIGGER = 1<<7;
- static final int CONSTRAINT_DEVICE_NOT_DOZING = 1<<8;
- static final int CONSTRAINT_NOT_ROAMING = 1<<9;
+ static final int CONSTRAINT_CHARGING = JobInfo.CONSTRAINT_FLAG_CHARGING;
+ static final int CONSTRAINT_IDLE = JobInfo.CONSTRAINT_FLAG_DEVICE_IDLE;
+ static final int CONSTRAINT_BATTERY_NOT_LOW = JobInfo.CONSTRAINT_FLAG_BATTERY_NOT_LOW;
+ static final int CONSTRAINT_TIMING_DELAY = 1<<31;
+ static final int CONSTRAINT_DEADLINE = 1<<30;
+ static final int CONSTRAINT_UNMETERED = 1<<29;
+ static final int CONSTRAINT_CONNECTIVITY = 1<<28;
+ static final int CONSTRAINT_APP_NOT_IDLE = 1<<27;
+ static final int CONSTRAINT_CONTENT_TRIGGER = 1<<26;
+ static final int CONSTRAINT_DEVICE_NOT_DOZING = 1<<25;
+ static final int CONSTRAINT_NOT_ROAMING = 1<<24;
// Soft override: ignore constraints like time that don't affect API availability
public static final int OVERRIDE_SOFT = 1;
@@ -163,7 +164,7 @@
this.latestRunTimeElapsedMillis = latestRunTimeElapsedMillis;
this.numFailures = numFailures;
- int requiredConstraints = 0;
+ int requiredConstraints = job.getConstraintFlags();
if (job.getNetworkType() == JobInfo.NETWORK_TYPE_ANY) {
requiredConstraints |= CONSTRAINT_CONNECTIVITY;
}
@@ -173,18 +174,12 @@
if (job.getNetworkType() == JobInfo.NETWORK_TYPE_NOT_ROAMING) {
requiredConstraints |= CONSTRAINT_NOT_ROAMING;
}
- if (job.isRequireCharging()) {
- requiredConstraints |= CONSTRAINT_CHARGING;
- }
if (earliestRunTimeElapsedMillis != NO_EARLIEST_RUNTIME) {
requiredConstraints |= CONSTRAINT_TIMING_DELAY;
}
if (latestRunTimeElapsedMillis != NO_LATEST_RUNTIME) {
requiredConstraints |= CONSTRAINT_DEADLINE;
}
- if (job.isRequireDeviceIdle()) {
- requiredConstraints |= CONSTRAINT_IDLE;
- }
if (job.getTriggerContentUris() != null) {
requiredConstraints |= CONSTRAINT_CONTENT_TRIGGER;
}
@@ -331,6 +326,14 @@
return (requiredConstraints&CONSTRAINT_CHARGING) != 0;
}
+ public boolean hasBatteryNotLowConstraint() {
+ return (requiredConstraints&CONSTRAINT_BATTERY_NOT_LOW) != 0;
+ }
+
+ public boolean hasPowerConstraint() {
+ return (requiredConstraints&(CONSTRAINT_CHARGING|CONSTRAINT_BATTERY_NOT_LOW)) != 0;
+ }
+
public boolean hasTimingDelayConstraint() {
return (requiredConstraints&CONSTRAINT_TIMING_DELAY) != 0;
}
@@ -379,6 +382,10 @@
return setConstraintSatisfied(CONSTRAINT_CHARGING, state);
}
+ boolean setBatteryNotLowConstraintSatisfied(boolean state) {
+ return setConstraintSatisfied(CONSTRAINT_BATTERY_NOT_LOW, state);
+ }
+
boolean setTimingDelayConstraintSatisfied(boolean state) {
return setConstraintSatisfied(CONSTRAINT_TIMING_DELAY, state);
}
@@ -453,13 +460,14 @@
}
static final int CONSTRAINTS_OF_INTEREST =
- CONSTRAINT_CHARGING | CONSTRAINT_TIMING_DELAY |
+ CONSTRAINT_CHARGING | CONSTRAINT_BATTERY_NOT_LOW | CONSTRAINT_TIMING_DELAY |
CONSTRAINT_CONNECTIVITY | CONSTRAINT_UNMETERED | CONSTRAINT_NOT_ROAMING |
CONSTRAINT_IDLE | CONSTRAINT_CONTENT_TRIGGER;
// Soft override covers all non-"functional" constraints
static final int SOFT_OVERRIDE_CONSTRAINTS =
- CONSTRAINT_CHARGING | CONSTRAINT_TIMING_DELAY | CONSTRAINT_IDLE;
+ CONSTRAINT_CHARGING | CONSTRAINT_BATTERY_NOT_LOW
+ | CONSTRAINT_TIMING_DELAY | CONSTRAINT_IDLE;
/**
* @return Whether the constraints set on this job are satisfied.
@@ -495,6 +503,7 @@
+ ",R=(" + formatRunTime(earliestRunTimeElapsedMillis, NO_EARLIEST_RUNTIME)
+ "," + formatRunTime(latestRunTimeElapsedMillis, NO_LATEST_RUNTIME) + ")"
+ ",N=" + job.getNetworkType() + ",C=" + job.isRequireCharging()
+ + ",BL=" + job.isRequireBatteryNotLow()
+ ",I=" + job.isRequireDeviceIdle()
+ ",U=" + (job.getTriggerContentUris() != null)
+ ",F=" + numFailures + ",P=" + job.isPersisted()
@@ -550,6 +559,9 @@
if ((constraints&CONSTRAINT_CHARGING) != 0) {
pw.print(" CHARGING");
}
+ if ((constraints& CONSTRAINT_BATTERY_NOT_LOW) != 0) {
+ pw.print(" BATTERY_NOT_LOW");
+ }
if ((constraints&CONSTRAINT_TIMING_DELAY) != 0) {
pw.print(" TIMING_DELAY");
}
@@ -607,7 +619,8 @@
pw.println(Integer.toHexString(job.getFlags()));
}
pw.print(prefix); pw.print(" Requires: charging=");
- pw.print(job.isRequireCharging()); pw.print(" deviceIdle=");
+ pw.print(job.isRequireCharging()); pw.print(" batteryNotLow=");
+ pw.print(job.isRequireBatteryNotLow()); pw.print(" deviceIdle=");
pw.println(job.isRequireDeviceIdle());
if (job.getTriggerContentUris() != null) {
pw.print(prefix); pw.println(" Trigger content URIs:");
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index 17b005d..fdaba0b 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -263,8 +263,6 @@
private Object mLock = new Object();
- private int mLocationFlags = LOCATION_INVALID;
-
// current status
private int mStatus = LocationProvider.TEMPORARILY_UNAVAILABLE;
@@ -481,12 +479,6 @@
public void onLost(Network network) {
releaseSuplConnection(GPS_RELEASE_AGPS_DATA_CONN);
}
-
- @Override
- public void onUnavailable() {
- // timeout, it was not possible to establish the required connection
- releaseSuplConnection(GPS_AGPS_DATA_CONN_FAILED);
- }
};
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@@ -877,8 +869,7 @@
NetworkRequest request = requestBuilder.build();
mConnMgr.requestNetwork(
request,
- mSuplConnectivityCallback,
- ConnectivityManager.MAX_NETWORK_REQUEST_TIMEOUT_MS);
+ mSuplConnectivityCallback);
}
private void handleReleaseSuplConnection(int agpsDataConnStatus) {
@@ -1458,7 +1449,6 @@
native_stop();
mTimeToFirstFix = 0;
mLastFixTime = 0;
- mLocationFlags = LOCATION_INVALID;
// reset SV count to zero
updateStatus(LocationProvider.TEMPORARILY_UNAVAILABLE, 0);
@@ -1482,12 +1472,9 @@
/**
* called from native code to update our position.
*/
- private void reportLocation(int flags, double latitude, double longitude, double altitude,
- float speedMetersPerSecond, float bearing, float horizontalAccuracyMeters,
- float verticalAccuracyMeters, float speedAccuracyMetersPerSeconds,
- float bearingAccuracyDegrees, long timestamp) {
- if ((flags & LOCATION_HAS_SPEED) == LOCATION_HAS_SPEED) {
- mItarSpeedLimitExceeded = speedMetersPerSecond > ITAR_SPEED_LIMIT_METERS_PER_SECOND;
+ private void reportLocation(boolean hasLatLong, Location location) {
+ if (location.hasSpeed()) {
+ mItarSpeedLimitExceeded = location.getSpeed() > ITAR_SPEED_LIMIT_METERS_PER_SECOND;
}
if (mItarSpeedLimitExceeded) {
@@ -1496,54 +1483,13 @@
return; // No output of location allowed
}
- if (VERBOSE) Log.v(TAG, "reportLocation lat: " + latitude + " long: " + longitude +
- " timestamp: " + timestamp + " flags: " + flags);
+ if (VERBOSE) Log.v(TAG, "reportLocation " + location.toString());
synchronized (mLocation) {
- mLocationFlags = flags;
- if ((flags & LOCATION_HAS_LAT_LONG) == LOCATION_HAS_LAT_LONG) {
- mLocation.setLatitude(latitude);
- mLocation.setLongitude(longitude);
- mLocation.setTime(timestamp);
- // It would be nice to push the elapsed real-time timestamp
- // further down the stack, but this is still useful
- mLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
- }
- if ((flags & LOCATION_HAS_ALTITUDE) == LOCATION_HAS_ALTITUDE) {
- mLocation.setAltitude(altitude);
- } else {
- mLocation.removeAltitude();
- }
- if ((flags & LOCATION_HAS_SPEED) == LOCATION_HAS_SPEED) {
- mLocation.setSpeed(speedMetersPerSecond);
- } else {
- mLocation.removeSpeed();
- }
- if ((flags & LOCATION_HAS_BEARING) == LOCATION_HAS_BEARING) {
- mLocation.setBearing(bearing);
- } else {
- mLocation.removeBearing();
- }
- if ((flags & LOCATION_HAS_HORIZONTAL_ACCURACY) == LOCATION_HAS_HORIZONTAL_ACCURACY) {
- mLocation.setAccuracy(horizontalAccuracyMeters);
- } else {
- mLocation.removeAccuracy();
- }
- if ((flags & LOCATION_HAS_VERTICAL_ACCURACY) == LOCATION_HAS_VERTICAL_ACCURACY) {
- mLocation.setVerticalAccuracyMeters(verticalAccuracyMeters);
- } else {
- mLocation.removeVerticalAccuracy();
- }
- if((flags & LOCATION_HAS_SPEED_ACCURACY) == LOCATION_HAS_SPEED_ACCURACY) {
- mLocation.setSpeedAccuracyMetersPerSecond(speedAccuracyMetersPerSeconds);
- } else {
- mLocation.removeSpeedAccuracy();
- }
- if((flags & LOCATION_HAS_BEARING_ACCURACY) == LOCATION_HAS_BEARING_ACCURACY) {
- mLocation.setBearingAccuracyDegrees(bearingAccuracyDegrees);
- } else {
- mLocation.removeBearingAccuracy();
- }
+ mLocation = location;
+ // It would be nice to push the elapsed real-time timestamp
+ // further down the stack, but this is still useful
+ mLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
mLocation.setExtras(mLocationExtras);
try {
@@ -1555,7 +1501,7 @@
mLastFixTime = System.currentTimeMillis();
// report time to first fix
- if (mTimeToFirstFix == 0 && (flags & LOCATION_HAS_LAT_LONG) == LOCATION_HAS_LAT_LONG) {
+ if (mTimeToFirstFix == 0 && hasLatLong) {
mTimeToFirstFix = (int)(mLastFixTime - mFixRequestTime);
if (DEBUG) Log.d(TAG, "TTFF: " + mTimeToFirstFix);
@@ -1878,52 +1824,6 @@
}
/**
- * Helper method to construct a location object.
- */
- private Location buildLocation(
- int flags,
- double latitude,
- double longitude,
- double altitude,
- float speed,
- float bearing,
- float horizontalAccuracy,
- float verticalAccuracy,
- float speedAccuracy,
- float bearingAccuracy,
- long timestamp) {
- Location location = new Location(LocationManager.GPS_PROVIDER);
- if((flags & LOCATION_HAS_LAT_LONG) == LOCATION_HAS_LAT_LONG) {
- location.setLatitude(latitude);
- location.setLongitude(longitude);
- location.setTime(timestamp);
- location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
- }
- if((flags & LOCATION_HAS_ALTITUDE) == LOCATION_HAS_ALTITUDE) {
- location.setAltitude(altitude);
- }
- if((flags & LOCATION_HAS_SPEED) == LOCATION_HAS_SPEED) {
- location.setSpeed(speed);
- }
- if((flags & LOCATION_HAS_BEARING) == LOCATION_HAS_BEARING) {
- location.setBearing(bearing);
- }
- if((flags & LOCATION_HAS_HORIZONTAL_ACCURACY) == LOCATION_HAS_HORIZONTAL_ACCURACY) {
- location.setAccuracy(horizontalAccuracy);
- }
- if((flags & LOCATION_HAS_VERTICAL_ACCURACY) == LOCATION_HAS_VERTICAL_ACCURACY) {
- location.setVerticalAccuracyMeters(verticalAccuracy);
- }
- if((flags & LOCATION_HAS_SPEED_ACCURACY) == LOCATION_HAS_SPEED_ACCURACY) {
- location.setSpeedAccuracyMetersPerSecond(speedAccuracy);
- }
- if((flags & LOCATION_HAS_BEARING_ACCURACY) == LOCATION_HAS_BEARING_ACCURACY) {
- location.setBearingAccuracyDegrees(bearingAccuracy);
- }
- return location;
- }
-
- /**
* Converts the GPS HAL status to the internal Geofence Hardware status.
*/
private int getGeofenceStatus(int status) {
@@ -1949,25 +1849,12 @@
* Called from native to report GPS Geofence transition
* All geofence callbacks are called on the same thread
*/
- private void reportGeofenceTransition(int geofenceId, int flags, double latitude,
- double longitude, double altitude, float speed, float bearing, float horizontalAccuracy,
- float verticalAccuracy, float speedAccuracy, float bearingAccuracy, long timestamp,
- int transition, long transitionTimestamp) {
+ private void reportGeofenceTransition(int geofenceId, Location location, int transition,
+ long transitionTimestamp) {
if (mGeofenceHardwareImpl == null) {
mGeofenceHardwareImpl = GeofenceHardwareImpl.getInstance(mContext);
}
- Location location = buildLocation(
- flags,
- latitude,
- longitude,
- altitude,
- speed,
- bearing,
- horizontalAccuracy,
- verticalAccuracy,
- speedAccuracy,
- bearingAccuracy,
- timestamp);
+
mGeofenceHardwareImpl.reportGeofenceTransition(
geofenceId,
location,
@@ -1980,24 +1867,10 @@
/**
* called from native code to report GPS status change.
*/
- private void reportGeofenceStatus(int status, int flags, double latitude,
- double longitude, double altitude, float speed, float bearing, float horizontalAccuracy,
- float verticalAccuracy, float speedAccuracy, float bearingAccuracy, long timestamp) {
+ private void reportGeofenceStatus(int status, Location location) {
if (mGeofenceHardwareImpl == null) {
mGeofenceHardwareImpl = GeofenceHardwareImpl.getInstance(mContext);
}
- Location location = buildLocation(
- flags,
- latitude,
- longitude,
- altitude,
- speed,
- bearing,
- horizontalAccuracy,
- verticalAccuracy,
- speedAccuracy,
- bearingAccuracy,
- timestamp);
int monitorStatus = GeofenceHardware.MONITOR_CURRENTLY_UNAVAILABLE;
if(status == GPS_GEOFENCE_AVAILABLE) {
monitorStatus = GeofenceHardware.MONITOR_CURRENTLY_AVAILABLE;
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 98177fe..6349f21 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -37,6 +37,7 @@
import android.media.IAudioService;
import android.media.IRemoteVolumeController;
import android.media.session.IActiveSessionsListener;
+import android.media.session.ICallback;
import android.media.session.IOnMediaKeyListener;
import android.media.session.IOnVolumeKeyLongPressListener;
import android.media.session.ISession;
@@ -64,6 +65,7 @@
import android.util.Slog;
import android.util.SparseArray;
import android.view.KeyEvent;
+import android.view.ViewConfiguration;
import com.android.server.LocalServices;
import com.android.server.SystemService;
@@ -93,19 +95,20 @@
private final SessionManagerImpl mSessionManagerImpl;
private final MediaSessionStack mPriorityStack;
- private final ArrayList<MediaSessionRecord> mAllSessions = new ArrayList<MediaSessionRecord>();
private final SparseArray<UserRecord> mUserRecords = new SparseArray<UserRecord>();
private final ArrayList<SessionsListenerRecord> mSessionsListeners
= new ArrayList<SessionsListenerRecord>();
private final Object mLock = new Object();
private final MessageHandler mHandler = new MessageHandler();
private final PowerManager.WakeLock mMediaEventWakeLock;
+ private final int mLongPressTimeout;
private KeyguardManager mKeyguardManager;
private IAudioService mAudioService;
private AudioManagerInternal mAudioManagerInternal;
private ContentResolver mContentResolver;
private SettingsObserver mSettingsObserver;
+ private ICallback mCallback;
// List of user IDs running in the foreground.
// Multiple users can be in the foreground if the work profile is on.
@@ -121,6 +124,7 @@
mPriorityStack = new MediaSessionStack();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleMediaEvent");
+ mLongPressTimeout = ViewConfiguration.getLongPressTimeout();
}
@Override
@@ -145,7 +149,8 @@
public void updateSession(MediaSessionRecord record) {
synchronized (mLock) {
- if (!mAllSessions.contains(record)) {
+ UserRecord user = mUserRecords.get(record.getUserId());
+ if (user == null || !user.mSessions.contains(record)) {
Log.d(TAG, "Unknown session updated. Ignoring.");
return;
}
@@ -171,7 +176,8 @@
public void onSessionPlaystateChange(MediaSessionRecord record, int oldState, int newState) {
boolean updateSessions = false;
synchronized (mLock) {
- if (!mAllSessions.contains(record)) {
+ UserRecord user = mUserRecords.get(record.getUserId());
+ if (user == null || !user.mSessions.contains(record)) {
Log.d(TAG, "Unknown session changed playback state. Ignoring.");
return;
}
@@ -184,7 +190,8 @@
public void onSessionPlaybackTypeChanged(MediaSessionRecord record) {
synchronized (mLock) {
- if (!mAllSessions.contains(record)) {
+ UserRecord user = mUserRecords.get(record.getUserId());
+ if (user == null || !user.mSessions.contains(record)) {
Log.d(TAG, "Unknown session changed playback type. Ignoring.");
return;
}
@@ -318,7 +325,6 @@
}
mPriorityStack.removeSession(session);
- mAllSessions.remove(session);
try {
session.getCallback().asBinder().unlinkToDeath(session, 0);
@@ -455,7 +461,6 @@
throw new RuntimeException("Media Session owner died prematurely.", e);
}
- mAllSessions.add(session);
mPriorityStack.addSession(session, mCurrentUserIdList.contains(userId));
user.addSessionLocked(session);
@@ -483,6 +488,7 @@
if (size > 0 && records.get(0).isPlaybackActive(false)) {
rememberMediaButtonReceiverLocked(records.get(0));
}
+ pushAddressedPlayerChangedLocked();
ArrayList<MediaSession.Token> tokens = new ArrayList<MediaSession.Token>();
for (int i = 0; i < size; i++) {
tokens.add(new MediaSession.Token(records.get(i).getControllerBinder()));
@@ -514,6 +520,52 @@
}
}
+ private MediaSessionRecord getMediaButtonSessionLocked() {
+ // If we don't have a media button receiver to fall back on
+ // include non-playing sessions for dispatching.
+ boolean useNotPlayingSessions = true;
+ for (int userId : mCurrentUserIdList) {
+ UserRecord ur = mUserRecords.get(userId);
+ if (ur.mLastMediaButtonReceiver != null
+ || ur.mRestoredMediaButtonReceiver != null) {
+ useNotPlayingSessions = false;
+ break;
+ }
+ }
+ return mPriorityStack.getDefaultMediaButtonSession(
+ mCurrentUserIdList, useNotPlayingSessions);
+ }
+
+ private void pushAddressedPlayerChangedLocked() {
+ if (mCallback == null) {
+ return;
+ }
+ try {
+ MediaSessionRecord mediaButtonSession = getMediaButtonSessionLocked();
+ if (mediaButtonSession != null) {
+ mCallback.onAddressedPlayerChangedToMediaSession(
+ new MediaSession.Token(mediaButtonSession.getControllerBinder()));
+ } else {
+ for (int userId : mCurrentUserIdList) {
+ UserRecord user = mUserRecords.get(userId);
+ if (user.mLastMediaButtonReceiver == null
+ && user.mRestoredMediaButtonReceiver == null) {
+ continue;
+ }
+ ComponentName componentName = user.mLastMediaButtonReceiver != null
+ ? user.mLastMediaButtonReceiver.getIntent().getComponent()
+ : user.mRestoredMediaButtonReceiver;
+ mCallback.onAddressedPlayerChangedToMediaButtonReceiver(componentName);
+ return;
+ }
+ }
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to pushAddressedPlayerChangedLocked", e);
+ }
+ }
+
+ // Remember media button receiver and keep it in the persistent storage.
+ // This should be called whenever there's no media session to receive media button event.
private void rememberMediaButtonReceiverLocked(MediaSessionRecord record) {
PendingIntent receiver = record.getMediaButtonReceiver();
UserRecord user = mUserRecords.get(record.getUserId());
@@ -536,6 +588,16 @@
return "";
}
+ private void dispatchVolumeKeyLongPressLocked(KeyEvent keyEvent) {
+ // Only consider full user.
+ UserRecord user = mUserRecords.get(mCurrentUserIdList.get(0));
+ try {
+ user.mOnVolumeKeyLongPressListener.onVolumeKeyLongPress(keyEvent);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to send " + keyEvent + " to volume key long-press listener");
+ }
+ }
+
/**
* Information about a particular user. The contents of this object is
* guarded by mLock.
@@ -788,19 +850,74 @@
+ "setup is in progress.");
return;
}
- if (isGlobalPriorityActive() && uid != Process.SYSTEM_UID) {
- // Prevent dispatching key event through reflection while the global priority
- // session is active.
- Slog.i(TAG, "Only the system can dispatch media key event "
- + "to the global priority session.");
- return;
- }
synchronized (mLock) {
- if (!isGlobalPriorityActive() && isVoiceKey(keyEvent.getKeyCode())) {
+ boolean isGlobalPriorityActive = mPriorityStack.isGlobalPriorityActive();
+ if (isGlobalPriorityActive && uid != Process.SYSTEM_UID) {
+ // Prevent dispatching key event through reflection while the global
+ // priority session is active.
+ Slog.i(TAG, "Only the system can dispatch media key event "
+ + "to the global priority session.");
+ return;
+ }
+ if (!isGlobalPriorityActive) {
+ // Only consider full user.
+ UserRecord user = mUserRecords.get(mCurrentUserIdList.get(0));
+ if (user.mOnMediaKeyListener != null) {
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "Send " + keyEvent + " to media key listener");
+ }
+ try {
+ user.mOnMediaKeyListener.onMediaKey(keyEvent,
+ new MediaKeyListenerResultReceiver(keyEvent, needWakeLock));
+ return;
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to send " + keyEvent + " to media key listener");
+ }
+ }
+ }
+ if (!isGlobalPriorityActive && isVoiceKey(keyEvent.getKeyCode())) {
handleVoiceKeyEventLocked(keyEvent, needWakeLock);
} else {
- dispatchMediaKeyEventLocked(keyEvent, needWakeLock, true);
+ dispatchMediaKeyEventLocked(keyEvent, needWakeLock);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void setCallback(ICallback callback) {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ if (uid != Process.BLUETOOTH_UID) {
+ throw new SecurityException("Only Bluetooth service processes can set"
+ + " Callback");
+ }
+ synchronized (mLock) {
+ Log.d(TAG, "Callback + " + mCallback
+ + " is set by " + getCallingPackageName(uid));
+ mCallback = callback;
+ if (mCallback == null) {
+ return;
+ }
+ try {
+ mCallback.asBinder().linkToDeath(
+ new IBinder.DeathRecipient() {
+ @Override
+ public void binderDied() {
+ synchronized (mLock) {
+ mCallback = null;
+ }
+ }
+ }, 0);
+ pushAddressedPlayerChangedLocked();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to set callback", e);
+ mCallback = null;
}
}
} finally {
@@ -944,7 +1061,8 @@
try {
synchronized (mLock) {
// Only consider full user.
- UserRecord user = mUserRecords.get(mCurrentUserIdList.get(0));
+ int userId = mCurrentUserIdList.get(0);
+ UserRecord user = mUserRecords.get(userId);
if (mPriorityStack.isGlobalPriorityActive()
|| user.mOnVolumeKeyLongPressListener == null) {
@@ -954,11 +1072,17 @@
// at the same time.
if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
if (keyEvent.getRepeatCount() == 0) {
- user.mInitialDownVolumeKeyEvent = keyEvent;
+ // Keeps the copy of the KeyEvent because it can be reused.
+ user.mInitialDownVolumeKeyEvent = KeyEvent.obtain(keyEvent);
user.mInitialDownVolumeStream = stream;
user.mInitialDownMusicOnly = musicOnly;
+ mHandler.sendMessageDelayed(
+ mHandler.obtainMessage(
+ MessageHandler.MSG_VOLUME_INITIAL_DOWN, userId, 0),
+ mLongPressTimeout);
}
if (keyEvent.getRepeatCount() > 0 || keyEvent.isLongPress()) {
+ mHandler.removeMessages(MessageHandler.MSG_VOLUME_INITIAL_DOWN);
if (user.mInitialDownVolumeKeyEvent != null) {
dispatchVolumeKeyLongPressLocked(
user.mInitialDownVolumeKeyEvent);
@@ -968,6 +1092,7 @@
dispatchVolumeKeyLongPressLocked(keyEvent);
}
} else { // if up
+ mHandler.removeMessages(MessageHandler.MSG_VOLUME_INITIAL_DOWN);
if (user.mInitialDownVolumeKeyEvent != null
&& user.mInitialDownVolumeKeyEvent.getDownTime()
== keyEvent.getDownTime()) {
@@ -988,16 +1113,6 @@
}
}
- private void dispatchVolumeKeyLongPressLocked(KeyEvent keyEvent) {
- // Only consider full user.
- UserRecord user = mUserRecords.get(mCurrentUserIdList.get(0));
- try {
- user.mOnVolumeKeyLongPressListener.onVolumeKeyLongPress(keyEvent);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to send " + keyEvent + " to volume key long-press listener");
- }
- }
-
private void dispatchVolumeKeyEventLocked(
KeyEvent keyEvent, int stream, boolean musicOnly) {
boolean down = keyEvent.getAction() == KeyEvent.ACTION_DOWN;
@@ -1069,7 +1184,9 @@
@Override
public boolean isGlobalPriorityActive() {
- return mPriorityStack.isGlobalPriorityActive();
+ synchronized (mLock) {
+ return mPriorityStack.isGlobalPriorityActive();
+ }
}
@Override
@@ -1087,16 +1204,10 @@
synchronized (mLock) {
pw.println(mSessionsListeners.size() + " sessions listeners.");
- int count = mAllSessions.size();
- pw.println(count + " Sessions:");
- for (int i = 0; i < count; i++) {
- mAllSessions.get(i).dump(pw, "");
- pw.println();
- }
mPriorityStack.dump(pw, "");
pw.println("User Records:");
- count = mUserRecords.size();
+ int count = mUserRecords.size();
for (int i = 0; i < count; i++) {
UserRecord user = mUserRecords.get(mUserRecords.keyAt(i));
user.dumpLocked(pw, "");
@@ -1185,52 +1296,15 @@
if (!mVoiceButtonHandled && !keyEvent.isCanceled()) {
// Resend the down then send this event through
KeyEvent downEvent = KeyEvent.changeAction(keyEvent, KeyEvent.ACTION_DOWN);
- dispatchMediaKeyEventLocked(downEvent, needWakeLock, true);
- dispatchMediaKeyEventLocked(keyEvent, needWakeLock, true);
+ dispatchMediaKeyEventLocked(downEvent, needWakeLock);
+ dispatchMediaKeyEventLocked(keyEvent, needWakeLock);
}
}
}
}
- private void dispatchMediaKeyEventLocked(KeyEvent keyEvent, boolean needWakeLock,
- boolean checkMediaKeyListener) {
- // If we don't have a media button receiver to fall back on
- // include non-playing sessions for dispatching.
- boolean useNotPlayingSessions = true;
- for (int userId : mCurrentUserIdList) {
- UserRecord ur = mUserRecords.get(userId);
- if (ur.mLastMediaButtonReceiver != null
- || ur.mRestoredMediaButtonReceiver != null) {
- useNotPlayingSessions = false;
- break;
- }
- }
- if (DEBUG) {
- Log.d(TAG, "dispatchMediaKeyEvent, useNotPlayingSessions="
- + useNotPlayingSessions);
- }
-
- MediaSessionRecord session = mPriorityStack.getDefaultMediaButtonSession(
- mCurrentUserIdList, useNotPlayingSessions);
-
- if ((session == null
- || !session.hasFlag(MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY))
- && checkMediaKeyListener) {
- // Only consider full user.
- UserRecord user = mUserRecords.get(mCurrentUserIdList.get(0));
- if (user.mOnMediaKeyListener != null) {
- if (DEBUG_KEY_EVENT) {
- Log.d(TAG, "Send " + keyEvent + " to media key listener");
- }
- try {
- user.mOnMediaKeyListener.onMediaKey(keyEvent,
- new MediaKeyListenerResultReceiver(keyEvent, needWakeLock));
- return;
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to send " + keyEvent + " to media key listener");
- }
- }
- }
+ private void dispatchMediaKeyEventLocked(KeyEvent keyEvent, boolean needWakeLock) {
+ MediaSessionRecord session = getMediaButtonSessionLocked();
if (session != null) {
if (DEBUG_KEY_EVENT) {
Log.d(TAG, "Sending " + keyEvent + " to " + session);
@@ -1243,6 +1317,14 @@
needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1,
mKeyEventReceiver, Process.SYSTEM_UID,
getContext().getPackageName());
+ if (mCallback != null) {
+ try {
+ mCallback.onMediaKeyEventDispatchedToMediaSession(keyEvent,
+ new MediaSession.Token(session.getControllerBinder()));
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to send callback", e);
+ }
+ }
} else {
// Launch the last PendingIntent we had with priority
for (int userId : mCurrentUserIdList) {
@@ -1259,26 +1341,41 @@
mediaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
try {
if (user.mLastMediaButtonReceiver != null) {
+ PendingIntent receiver = user.mLastMediaButtonReceiver;
if (DEBUG_KEY_EVENT) {
Log.d(TAG, "Sending " + keyEvent
- + " to the last known pendingIntent "
- + user.mLastMediaButtonReceiver);
+ + " to the last known pendingIntent " + receiver);
}
- user.mLastMediaButtonReceiver.send(getContext(),
+ receiver.send(getContext(),
needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1,
mediaButtonIntent, mKeyEventReceiver, mHandler);
+ if (mCallback != null) {
+ ComponentName componentName =
+ user.mLastMediaButtonReceiver.getIntent().getComponent();
+ if (componentName != null) {
+ mCallback.onMediaKeyEventDispatchedToMediaButtonReceiver(
+ keyEvent, componentName);
+ }
+ }
} else {
+ ComponentName receiver = user.mRestoredMediaButtonReceiver;
if (DEBUG_KEY_EVENT) {
Log.d(TAG, "Sending " + keyEvent + " to the restored intent "
- + user.mRestoredMediaButtonReceiver);
+ + receiver);
}
- mediaButtonIntent.setComponent(user.mRestoredMediaButtonReceiver);
+ mediaButtonIntent.setComponent(receiver);
getContext().sendBroadcastAsUser(mediaButtonIntent,
UserHandle.of(userId));
+ if (mCallback != null) {
+ mCallback.onMediaKeyEventDispatchedToMediaButtonReceiver(
+ keyEvent, receiver);
+ }
}
} catch (CanceledException e) {
Log.i(TAG, "Error sending key event to media button receiver "
+ user.mLastMediaButtonReceiver, e);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to send callback", e);
}
return;
}
@@ -1389,7 +1486,12 @@
mHandled = true;
mHandler.removeCallbacks(this);
synchronized (mLock) {
- dispatchMediaKeyEventLocked(mKeyEvent, mNeedWakeLock, false);
+ if (!mPriorityStack.isGlobalPriorityActive()
+ && isVoiceKey(mKeyEvent.getKeyCode())) {
+ handleVoiceKeyEventLocked(mKeyEvent, mNeedWakeLock);
+ } else {
+ dispatchMediaKeyEventLocked(mKeyEvent, mNeedWakeLock);
+ }
}
}
}
@@ -1486,6 +1588,7 @@
final class MessageHandler extends Handler {
private static final int MSG_SESSIONS_CHANGED = 1;
+ private static final int MSG_VOLUME_INITIAL_DOWN = 2;
@Override
public void handleMessage(Message msg) {
@@ -1493,6 +1596,16 @@
case MSG_SESSIONS_CHANGED:
pushSessionsChanged(msg.arg1);
break;
+ case MSG_VOLUME_INITIAL_DOWN:
+ synchronized (mLock) {
+ UserRecord user = mUserRecords.get((int) msg.arg1);
+ if (user != null && user.mInitialDownVolumeKeyEvent != null) {
+ dispatchVolumeKeyLongPressLocked(user.mInitialDownVolumeKeyEvent);
+ // Mark that the key is already handled.
+ user.mInitialDownVolumeKeyEvent = null;
+ }
+ }
+ break;
}
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 91c9316..ac3a025 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -23,7 +23,6 @@
import static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY;
import static android.Manifest.permission.READ_PHONE_STATE;
import static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE;
-import static android.app.ActivityThread.INVALID_PROC_STATE_SEQ;
import static android.content.Intent.ACTION_PACKAGE_ADDED;
import static android.content.Intent.ACTION_UID_REMOVED;
import static android.content.Intent.ACTION_USER_ADDED;
@@ -54,15 +53,11 @@
import static android.net.NetworkPolicyManager.RULE_ALLOW_METERED;
import static android.net.NetworkPolicyManager.MASK_METERED_NETWORKS;
import static android.net.NetworkPolicyManager.MASK_ALL_NETWORKS;
-import static android.net.NetworkPolicyManager.RULE_INVALID;
import static android.net.NetworkPolicyManager.RULE_NONE;
import static android.net.NetworkPolicyManager.RULE_REJECT_ALL;
import static android.net.NetworkPolicyManager.RULE_REJECT_METERED;
import static android.net.NetworkPolicyManager.RULE_TEMPORARY_ALLOW_METERED;
-import static android.net.NetworkPolicyManager.UidStateWithSeqObserver;
import static android.net.NetworkPolicyManager.computeLastCycleBoundary;
-import static android.net.NetworkPolicyManager.isProcStateAllowedWhileIdleOrPowerSaveMode;
-import static android.net.NetworkPolicyManager.isProcStateAllowedWhileRestrictBackgroundOn;
import static android.net.NetworkPolicyManager.uidPoliciesToString;
import static android.net.NetworkPolicyManager.uidRulesToString;
import static android.net.NetworkTemplate.MATCH_MOBILE_3G_LOWER;
@@ -99,7 +94,6 @@
import android.annotation.IntDef;
import android.annotation.Nullable;
import android.app.ActivityManager;
-import android.app.ActivityManagerInternal;
import android.app.AppGlobals;
import android.app.AppOpsManager;
import android.app.IActivityManager;
@@ -129,7 +123,6 @@
import android.net.NetworkIdentity;
import android.net.NetworkInfo;
import android.net.NetworkPolicy;
-import android.net.NetworkPolicyManager;
import android.net.NetworkQuotaInfo;
import android.net.NetworkState;
import android.net.NetworkTemplate;
@@ -137,7 +130,6 @@
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Binder;
-import android.os.Debug;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
@@ -169,10 +161,8 @@
import android.util.NtpTrustedTime;
import android.util.Pair;
import android.util.Slog;
-import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
-import android.util.SparseLongArray;
import android.util.TrustedTime;
import android.util.Xml;
@@ -220,16 +210,14 @@
* enforcement.
*
* <p>
- * This class uses 4 locks to synchronize state:
+ * This class uses 2-3 locks to synchronize state:
* <ul>
* <li>{@code mUidRulesFirstLock}: used to guard state related to individual UIDs (such as firewall
* rules).
* <li>{@code mNetworkPoliciesSecondLock}: used to guard state related to network interfaces (such
* as network policies).
- * <li>{@code mDispatchedThirdLock}: used to guard state related to process state sequence numbers
- * of uids which are currently blocked waiting for network.
- * <li>{@code allLocks}: not a "real" lock, but an indication (through @GuardedBy) that both locks
- * {@code mUidRulesFirstLock} and {@code mNetworkPoliciesSecondLock} must be held.
+ * <li>{@code allLocks}: not a "real" lock, but an indication (through @GuardedBy) that all locks
+ * must be held.
* </ul>
*
* <p>
@@ -237,11 +225,8 @@
* <ul>
* <li>{@code UL()}: require the "UID" lock ({@code mUidRulesFirstLock}).
* <li>{@code NL()}: require the "Network" lock ({@code mNetworkPoliciesSecondLock}).
- * <li>{@code DL()}: require the "Dispatched" lock ({@code mDispatchedThirdLock}).
- * <li>{@code AL()}: require both locks {@code mUidRulesFirstLock} and
- * {@code mNetworkPoliciesSecondLock}.
- * When multiple locks are needed, they must be obtained in order ({@code mUidRulesFirstLock}
- * first, then {@code mNetworkPoliciesSecondLock}, then {@code mDispatchedThirdLock}, etc..
+ * <li>{@code AL()}: require all locks, which must be obtained in order ({@code mUidRulesFirstLock}
+ * first, then {@code mNetworkPoliciesSecondLock}, then {@code mYetAnotherGuardThirdLock}, etc..
* </ul>
*/
public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
@@ -328,27 +313,6 @@
// See main javadoc for instructions on how to use these locks.
final Object mUidRulesFirstLock = new Object();
final Object mNetworkPoliciesSecondLock = new Object();
- final Object mDispatchedThirdLock = new Object();
-
- @GuardedBy("mDispatchedThirdLock")
- private final SparseLongArray mLastHandledProcStateSeq = new SparseLongArray();
-
- /**
- * Used for tracking whether the updated uid and firewall rules have been dispatched to
- * ConnectivityService and NetworkManagementService respectively.
- *
- * SparseIntArray: uid -> dispatch flags (one or more combinations of {@link #FLAG_NONE},
- * {@link #FLAG_UID_RULES_DISPATCHED}, {@link #FLAG_FIREWALL_RULES_DISPATCHED} and
- * {@link #FLAG_ALL_RULES_DISPATCHED}).
- */
- @GuardedBy("mDispatchedThirdLock")
- private final SparseIntArray mDispatchFlagsForCurProcStateSeq = new SparseIntArray();
-
- private final int FLAG_NONE = 0;
- private final int FLAG_UID_RULES_DISPATCHED = 1 << 0;
- private final int FLAG_FIREWALL_RULES_DISPATCHED = 1 << 1;
- private final int FLAG_ALL_RULES_DISPATCHED =
- (FLAG_UID_RULES_DISPATCHED | FLAG_FIREWALL_RULES_DISPATCHED);
@GuardedBy("allLocks") volatile boolean mSystemReady;
@@ -443,8 +407,6 @@
private final IPackageManager mIPm;
- private ActivityManagerInternal mActivityManagerInternal;
-
// TODO: keep whitelist of system-critical services that should never have
// rules enforced, such as system, phone, and radio UIDs.
@@ -655,16 +617,13 @@
try {
mActivityManager.registerUidObserver(mUidObserver,
- ActivityManager.UID_OBSERVER_GONE,
+ ActivityManager.UID_OBSERVER_PROCSTATE|ActivityManager.UID_OBSERVER_GONE,
ActivityManager.PROCESS_STATE_UNKNOWN, null);
mNetworkManager.registerObserver(mAlertObserver);
} catch (RemoteException e) {
// ignored; both services live in system_server
}
- mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
- mActivityManagerInternal.setUidStateWithSeqObserver(mUidStateWithSeqObserver);
-
// listen for changes to power save whitelist
final IntentFilter whitelistFilter = new IntentFilter(
PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED);
@@ -746,24 +705,17 @@
}
}
- final private UidStateWithSeqObserver mUidStateWithSeqObserver = new UidStateWithSeqObserver() {
- @Override
- public void onUidStateChangedWithSeq(int uid, int procState, long procStateSeq) {
+ final private IUidObserver mUidObserver = new IUidObserver.Stub() {
+ @Override public void onUidStateChanged(int uid, int procState) throws RemoteException {
Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "onUidStateChanged");
try {
- final long effectiveProcStateSeq = getEffectiveProcStateSeq(uid, procStateSeq);
synchronized (mUidRulesFirstLock) {
- updateUidStateUL(uid, procState, effectiveProcStateSeq);
+ updateUidStateUL(uid, procState);
}
} finally {
Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
}
}
- };
-
- final private IUidObserver mUidObserver = new IUidObserver.Stub() {
- @Override public void onUidStateChanged(int uid, int procState) throws RemoteException {
- }
@Override public void onUidGone(int uid, boolean disabled) throws RemoteException {
synchronized (mUidRulesFirstLock) {
@@ -1890,7 +1842,7 @@
}
// uid policy changed, recompute rules and persist policy.
- updateRulesForDataUsageRestrictionsUL(uid, true);
+ updateRulesForDataUsageRestrictionsUL(uid);
if (persist) {
synchronized (mNetworkPoliciesSecondLock) {
writePolicyAL();
@@ -2489,7 +2441,7 @@
private boolean isUidForegroundOnRestrictBackgroundUL(int uid) {
final int procState = mUidState.get(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
- return isProcStateAllowedWhileRestrictBackgroundOn(procState);
+ return isProcStateAllowedWhileOnRestrictBackground(procState);
}
private boolean isUidForegroundOnRestrictPowerUL(int uid) {
@@ -2507,50 +2459,26 @@
* {@link #updateRulesForDataUsageRestrictionsUL(int)} and
* {@link #updateRulesForPowerRestrictionsUL(int)}
*/
- private void updateUidStateUL(int uid, int uidState, long procStateSeq) {
+ private void updateUidStateUL(int uid, int uidState) {
Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "updateUidStateUL");
try {
final int oldUidState = mUidState.get(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
if (oldUidState != uidState) {
// state changed, push updated rules
mUidState.put(uid, uidState);
- if (procStateSeq != INVALID_PROC_STATE_SEQ) {
- int updatedUidRules = RULE_INVALID;
- ReturnStatus status = updateRestrictBackgroundRulesOnUidStatusChangedUL(
- uid, oldUidState, uidState, false);
- if (status != null && status.mNeedToNotify) {
- updatedUidRules = status.mNewUidRules;
+ updateRestrictBackgroundRulesOnUidStatusChangedUL(uid, oldUidState, uidState);
+ if (isProcStateAllowedWhileIdleOrPowerSaveMode(oldUidState)
+ != isProcStateAllowedWhileIdleOrPowerSaveMode(uidState) ) {
+ if (isUidIdle(uid)) {
+ updateRuleForAppIdleUL(uid);
}
- final boolean procStateChangedAllowedWhileIdleOrPowerSaveMode =
- isProcStateAllowedWhileIdleOrPowerSaveMode(oldUidState)
- != isProcStateAllowedWhileIdleOrPowerSaveMode(uidState);
- if (procStateChangedAllowedWhileIdleOrPowerSaveMode) {
- status = updateRulesForPowerRestrictionsUL(uid, false);
- if (status != null && status.mNeedToNotify) {
- updatedUidRules = status.mNewUidRules;
- }
+ if (mDeviceIdleMode) {
+ updateRuleForDeviceIdleUL(uid);
}
- // TODO: We can avoid this if the rules are not changed. But since dispatching
- // to ConnectivityService is currently asynchronous, we need this to make sure
- // any previous the msg_rules_changes have been handled. Optimize this once
- // dispatching from NPMS to ConnectivityService is made synchronous.
- mHandler.obtainMessage(MSG_RULES_CHANGED, uid, updatedUidRules,
- procStateSeq).sendToTarget();
- if (procStateChangedAllowedWhileIdleOrPowerSaveMode) {
- if (isUidIdle(uid)) {
- updateRuleForAppIdleUL(uid);
- }
- if (mDeviceIdleMode) {
- updateRuleForDeviceIdleUL(uid);
- }
- if (mRestrictPower) {
- updateRuleForRestrictPowerUL(uid);
- }
+ if (mRestrictPower) {
+ updateRuleForRestrictPowerUL(uid);
}
- synchronized (mDispatchedThirdLock) {
- setDispatchedFlagDL(uid, procStateSeq, FLAG_FIREWALL_RULES_DISPATCHED);
- checkAndNotifyDL(uid, procStateSeq);
- }
+ updateRulesForPowerRestrictionsUL(uid);
}
updateNetworkStats(uid, isUidStateForegroundUL(uidState));
}
@@ -2559,61 +2487,6 @@
}
}
- /**
- * Returns {@link android.app.ActivityThread#INVALID_PROC_STATE_SEQ} if acting on
- * {@param procStateSeq} leads to an invalid state, otherwise update global state and return
- * {@param procStateSeq}.
- */
- private long getEffectiveProcStateSeq(int uid, long procStateSeq) {
- synchronized (mDispatchedThirdLock) {
- final long lastHandledProcStateSeq = mLastHandledProcStateSeq.get(uid);
- if (procStateSeq < lastHandledProcStateSeq) {
- Slog.wtf(TAG, "procStateSeq from AMS should never go down, procStateSeq: "
- + procStateSeq + " lastHandledProcStateSeq: " + lastHandledProcStateSeq
- + " uid: " + uid);
- return INVALID_PROC_STATE_SEQ;
- }
- if (procStateSeq == lastHandledProcStateSeq) {
- if (LOGD) {
- Slog.d(TAG, "procStateSeq: " + procStateSeq + " is not changed, so process is "
- + "not jumping from background to foreground or vice versa. "
- + "uid: " + uid);
- }
- return INVALID_PROC_STATE_SEQ;
- }
- mLastHandledProcStateSeq.put(uid, procStateSeq);
- mDispatchFlagsForCurProcStateSeq.put(uid, 0);
- return procStateSeq;
- }
- }
-
- /**
- * Update dispatch flags to include {@param flag}.
- */
- private void setDispatchedFlagDL(int uid, long procStateSeq, int flag) {
- int dispatchedFlag = mDispatchFlagsForCurProcStateSeq.get(uid);
- dispatchedFlag |= flag;
- mDispatchFlagsForCurProcStateSeq.put(uid, dispatchedFlag);
- }
-
- /**
- * Check whether uid and firewall rules are dispatched to ConnectivityService and
- * NetworkManagementService respectively, if so notify ActivityManagerService that network
- * rules are updated.
- */
- private void checkAndNotifyDL(int uid, long procStateSeq) {
- synchronized (mDispatchedThirdLock) {
- final int dispatchedFlags = mDispatchFlagsForCurProcStateSeq.get(uid);
- if (dispatchedFlags == FLAG_ALL_RULES_DISPATCHED) {
- if (LOGD) {
- Slog.d(TAG, "Notifying AMS that network rules are updated for uid: " + uid
- + " seq: " + procStateSeq + " callers: " + Debug.getCallers(3));
- }
- mActivityManagerInternal.notifyNetworkPolicyRulesUpdated(uid, procStateSeq);
- }
- }
- }
-
private void removeUidStateUL(int uid) {
final int index = mUidState.indexOfKey(uid);
if (index >= 0) {
@@ -2621,21 +2494,17 @@
mUidState.removeAt(index);
if (oldUidState != ActivityManager.PROCESS_STATE_CACHED_EMPTY) {
updateRestrictBackgroundRulesOnUidStatusChangedUL(uid, oldUidState,
- ActivityManager.PROCESS_STATE_CACHED_EMPTY, true);
+ ActivityManager.PROCESS_STATE_CACHED_EMPTY);
if (mDeviceIdleMode) {
updateRuleForDeviceIdleUL(uid);
}
if (mRestrictPower) {
updateRuleForRestrictPowerUL(uid);
}
- updateRulesForPowerRestrictionsUL(uid, true);
+ updateRulesForPowerRestrictionsUL(uid);
updateNetworkStats(uid, false);
}
}
- synchronized (mDispatchedThirdLock) {
- mLastHandledProcStateSeq.delete(uid);
- mDispatchFlagsForCurProcStateSeq.delete(uid);
- }
}
// adjust stats accounting based on foreground status
@@ -2647,16 +2516,23 @@
}
}
- private ReturnStatus updateRestrictBackgroundRulesOnUidStatusChangedUL(int uid, int oldUidState,
- int newUidState, boolean notify) {
+ private void updateRestrictBackgroundRulesOnUidStatusChangedUL(int uid, int oldUidState,
+ int newUidState) {
final boolean oldForeground =
- isProcStateAllowedWhileRestrictBackgroundOn(oldUidState);
+ isProcStateAllowedWhileOnRestrictBackground(oldUidState);
final boolean newForeground =
- isProcStateAllowedWhileRestrictBackgroundOn(newUidState);
+ isProcStateAllowedWhileOnRestrictBackground(newUidState);
if (oldForeground != newForeground) {
- return updateRulesForDataUsageRestrictionsUL(uid, notify);
+ updateRulesForDataUsageRestrictionsUL(uid);
}
- return null;
+ }
+
+ static boolean isProcStateAllowedWhileIdleOrPowerSaveMode(int procState) {
+ return procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
+ }
+
+ static boolean isProcStateAllowedWhileOnRestrictBackground(int procState) {
+ return procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
}
void updateRulesForPowerSaveUL() {
@@ -2805,7 +2681,7 @@
// Skip if it had no restrictions to begin with
if ((oldRules & MASK_ALL_NETWORKS) == 0) continue;
}
- updateRulesForPowerRestrictionsUL(uid, oldRules, paroled, true);
+ updateRulesForPowerRestrictionsUL(uid, oldRules, paroled);
}
}
@@ -2885,10 +2761,10 @@
final int uid = UserHandle.getUid(user.id, app.uid);
switch (type) {
case TYPE_RESTRICT_BACKGROUND:
- updateRulesForDataUsageRestrictionsUL(uid, true);
+ updateRulesForDataUsageRestrictionsUL(uid);
break;
case TYPE_RESTRICT_POWER:
- updateRulesForPowerRestrictionsUL(uid, true);
+ updateRulesForPowerRestrictionsUL(uid);
break;
default:
Slog.w(TAG, "Invalid type for updateRulesForAllApps: " + type);
@@ -2914,7 +2790,7 @@
updateRuleForDeviceIdleUL(uid);
updateRuleForRestrictPowerUL(uid);
// Update internal rules.
- updateRulesForPowerRestrictionsUL(uid, true);
+ updateRulesForPowerRestrictionsUL(uid);
}
}
}
@@ -2978,10 +2854,6 @@
mPowerSaveWhitelistExceptIdleAppIds.delete(uid);
mPowerSaveWhitelistAppIds.delete(uid);
mPowerSaveTempWhitelistAppIds.delete(uid);
- synchronized (mDispatchedThirdLock) {
- mLastHandledProcStateSeq.delete(uid);
- mDispatchFlagsForCurProcStateSeq.delete(uid);
- }
// ...then update iptables asynchronously.
mHandler.obtainMessage(MSG_RESET_FIREWALL_RULES_BY_UID, uid, 0).sendToTarget();
@@ -3007,10 +2879,10 @@
updateRuleForRestrictPowerUL(uid);
// Update internal state for power-related modes.
- updateRulesForPowerRestrictionsUL(uid, true);
+ updateRulesForPowerRestrictionsUL(uid);
// Update firewall and internal rules for Data Saver Mode.
- updateRulesForDataUsageRestrictionsUL(uid, true);
+ updateRulesForDataUsageRestrictionsUL(uid);
}
/**
@@ -3051,16 +2923,11 @@
*
* <p>The {@link #mUidRules} map is used to define the transtion of states of an UID.
*
- * @param uid The uid for which the rules have to be updated.
- * @param notify Indicates whether to notify network policy listeners if the rules are updated.
- *
- * @return ReturnStatus includes new updated rules and whether network policy listeners
- * (INetworkPolicyListener) need to be notified.
*/
- private ReturnStatus updateRulesForDataUsageRestrictionsUL(int uid, boolean notify) {
+ private void updateRulesForDataUsageRestrictionsUL(int uid) {
if (!isUidValidForWhitelistRules(uid)) {
if (LOGD) Slog.d(TAG, "no need to update restrict data rules for uid " + uid);
- return new ReturnStatus(false, RULE_NONE);
+ return;
}
final int uidPolicy = mUidPolicy.get(uid, POLICY_NONE);
@@ -3155,12 +3022,9 @@
+ ", oldRule=" + uidRulesToString(oldUidRules));
}
- if (notify) {
- mHandler.obtainMessage(MSG_RULES_CHANGED, uid, newUidRules).sendToTarget();
- }
- return new ReturnStatus(true, newUidRules);
+ // Dispatch changed rule to existing listeners.
+ mHandler.obtainMessage(MSG_RULES_CHANGED, uid, newUidRules).sendToTarget();
}
- return new ReturnStatus(false, newUidRules);
}
/**
@@ -3181,18 +3045,16 @@
* <p>
* <strong>NOTE: </strong>This method does not update the firewall rules on {@code netd}.
*/
- private ReturnStatus updateRulesForPowerRestrictionsUL(int uid, boolean notify) {
+ private void updateRulesForPowerRestrictionsUL(int uid) {
final int oldUidRules = mUidRules.get(uid, RULE_NONE);
- final ReturnStatus status = updateRulesForPowerRestrictionsUL(uid, oldUidRules, false,
- notify);
+ final int newUidRules = updateRulesForPowerRestrictionsUL(uid, oldUidRules, false);
- if (status.mNewUidRules == RULE_NONE) {
+ if (newUidRules == RULE_NONE) {
mUidRules.delete(uid);
} else {
- mUidRules.put(uid, status.mNewUidRules);
+ mUidRules.put(uid, newUidRules);
}
- return status;
}
/**
@@ -3201,17 +3063,13 @@
* @param uid the uid of the app to update rules for
* @param oldUidRules the current rules for the uid, in order to determine if there's a change
* @param paroled whether to ignore idle state of apps and only look at other restrictions.
- * @param notify whether to notify network policy listeners (INetworkPolicyListener) if the
- * rules are updated.
*
- * @return ReturnStatus includes new updated rules and whether network policy listeners
- * (INetworkPolicyListener) need to be notified.
+ * @return the new computed rules for the uid
*/
- private ReturnStatus updateRulesForPowerRestrictionsUL(int uid, int oldUidRules,
- boolean paroled, boolean notify) {
+ private int updateRulesForPowerRestrictionsUL(int uid, int oldUidRules, boolean paroled) {
if (!isUidValidForBlacklistRules(uid)) {
if (LOGD) Slog.d(TAG, "no need to update restrict power rules for uid " + uid);
- return new ReturnStatus(false, RULE_NONE);
+ return RULE_NONE;
}
final boolean isIdle = !paroled && isUidIdle(uid);
@@ -3263,23 +3121,10 @@
+ ", newRule=" + uidRulesToString(newUidRules)
+ ", oldRule=" + uidRulesToString(oldUidRules));
}
- if (notify) {
- mHandler.obtainMessage(MSG_RULES_CHANGED, uid, newUidRules).sendToTarget();
- }
- return new ReturnStatus(true, newUidRules);
+ mHandler.obtainMessage(MSG_RULES_CHANGED, uid, newUidRules).sendToTarget();
}
- return new ReturnStatus(false, newUidRules);
- }
-
- private static final class ReturnStatus {
- boolean mNeedToNotify;
- int mNewUidRules;
-
- ReturnStatus(boolean needToNotify, int newUidRules) {
- mNeedToNotify = needToNotify;
- mNewUidRules = newUidRules;
- }
+ return newUidRules;
}
private class AppIdleStateChangeListener
@@ -3293,7 +3138,7 @@
if (LOGV) Log.v(TAG, "onAppIdleStateChanged(): uid=" + uid + ", idle=" + idle);
synchronized (mUidRulesFirstLock) {
updateRuleForAppIdleUL(uid);
- updateRulesForPowerRestrictionsUL(uid, true);
+ updateRulesForPowerRestrictionsUL(uid);
}
} catch (NameNotFoundException nnfe) {
}
@@ -3353,26 +3198,13 @@
case MSG_RULES_CHANGED: {
final int uid = msg.arg1;
final int uidRules = msg.arg2;
- if (uidRules != RULE_INVALID) {
- dispatchUidRulesChanged(mConnectivityListener, uid, uidRules);
+ dispatchUidRulesChanged(mConnectivityListener, uid, uidRules);
+ final int length = mListeners.beginBroadcast();
+ for (int i = 0; i < length; i++) {
+ final INetworkPolicyListener listener = mListeners.getBroadcastItem(i);
+ dispatchUidRulesChanged(listener, uid, uidRules);
}
- final Long procStateSeq = (Long) msg.obj;
- if (procStateSeq != null) {
- synchronized (mDispatchedThirdLock) {
- if (mLastHandledProcStateSeq.get(uid) == procStateSeq) {
- setDispatchedFlagDL(uid, procStateSeq, FLAG_UID_RULES_DISPATCHED);
- checkAndNotifyDL(uid, procStateSeq);
- }
- }
- }
- if (uidRules != RULE_INVALID) {
- final int length = mListeners.beginBroadcast();
- for (int i = 0; i < length; i++) {
- final INetworkPolicyListener listener = mListeners.getBroadcastItem(i);
- dispatchUidRulesChanged(listener, uid, uidRules);
- }
- mListeners.finishBroadcast();
- }
+ mListeners.finishBroadcast();
return true;
}
case MSG_METERED_IFACES_CHANGED: {
diff --git a/services/core/java/com/android/server/notification/BadgeExtractor.java b/services/core/java/com/android/server/notification/BadgeExtractor.java
index 4795fbf..e6edaf1 100644
--- a/services/core/java/com/android/server/notification/BadgeExtractor.java
+++ b/services/core/java/com/android/server/notification/BadgeExtractor.java
@@ -46,7 +46,9 @@
if (!appCanShowBadge) {
record.setShowBadge(false);
} else {
- record.setShowBadge(record.getChannel().canShowBadge() && appCanShowBadge);
+ record.setShowBadge(mConfig.getNotificationChannel(record.sbn.getPackageName(),
+ record.sbn.getUid(), record.getChannel().getId(), false).canShowBadge()
+ && appCanShowBadge);
}
return null;
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 771ae9a..45ff20b 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -121,6 +121,7 @@
import android.service.notification.SnoozeCriterion;
import android.service.notification.StatusBarNotification;
import android.service.notification.ZenModeConfig;
+import android.service.notification.ZenModeProto;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
@@ -140,6 +141,7 @@
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
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.statusbar.NotificationVisibility;
import com.android.internal.util.FastXmlSerializer;
@@ -1438,6 +1440,11 @@
return ;
}
+ if (isCallerInstantApp(pkg)) {
+ throw new SecurityException("Instant app " + pkg
+ + " is not allowed to create toasts");
+ }
+
final boolean isSystemToast = isCallerSystem() || ("android".equals(pkg));
final boolean isPackageSuspended =
isPackageSuspendedForUser(pkg, Binder.getCallingUid());
@@ -2022,11 +2029,11 @@
*/
@Override
public void snoozeNotificationUntilFromListener(INotificationListener token, String key,
- long snoozeUntil) {
+ long duration) {
long identity = Binder.clearCallingIdentity();
try {
final ManagedServiceInfo info = mListeners.checkServiceTokenLocked(token);
- snoozeNotificationInt(key, snoozeUntil, null, info);
+ snoozeNotificationInt(key, duration, null, info);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -2812,8 +2819,26 @@
proto.write(NotificationRecordProto.STATE, NotificationServiceProto.ENQUEUED);
}
}
+ List<NotificationRecord> snoozed = mSnoozeHelper.getSnoozed();
+ N = snoozed.size();
+ if (N > 0) {
+ for (int i = 0; i < N; i++) {
+ final NotificationRecord nr = snoozed.get(i);
+ if (filter.filtered && !filter.matches(nr.sbn)) continue;
+ nr.dump(proto, filter.redact);
+ proto.write(NotificationRecordProto.STATE, NotificationServiceProto.SNOOZED);
+ }
+ }
proto.end(records);
}
+
+ long zenLog = proto.start(NotificationServiceDumpProto.ZEN);
+ mZenModeHelper.dump(proto);
+ for (ComponentName suppressor : mEffectsSuppressors) {
+ proto.write(ZenModeProto.SUPPRESSORS, suppressor.toString());
+ }
+ proto.end(zenLog);
+
proto.flush();
}
@@ -2899,24 +2924,12 @@
}
pw.println(" ");
}
+
+ mSnoozeHelper.dump(pw, filter);
}
}
if (!zenOnly) {
- pw.println("\n Usage Stats:");
- mUsageStats.dump(pw, " ", filter);
- }
-
- if (!filter.filtered || zenOnly) {
- pw.println("\n Zen Mode:");
- pw.print(" mInterruptionFilter="); pw.println(mInterruptionFilter);
- mZenModeHelper.dump(pw, " ");
-
- pw.println("\n Zen Log:");
- ZenLog.dump(pw, " ");
- }
-
- if (!zenOnly) {
pw.println("\n Ranking Config:");
mRankingHelper.dump(pw, " ", filter);
@@ -2945,8 +2958,13 @@
mNotificationAssistants.dump(pw, filter);
}
- if (!zenOnly) {
- mSnoozeHelper.dump(pw, filter);
+ if (!filter.filtered || zenOnly) {
+ pw.println("\n Zen Mode:");
+ pw.print(" mInterruptionFilter="); pw.println(mInterruptionFilter);
+ mZenModeHelper.dump(pw, " ");
+
+ pw.println("\n Zen Log:");
+ ZenLog.dump(pw, " ");
}
pw.println("\n Policy access:");
@@ -2964,6 +2982,11 @@
r.dump(pw, " ", getContext(), filter.redact);
}
}
+
+ if (!zenOnly) {
+ pw.println("\n Usage Stats:");
+ mUsageStats.dump(pw, " ", filter);
+ }
}
}
@@ -3105,6 +3128,13 @@
}
return false;
}
+ } else if (isCallerInstantApp(pkg)) {
+ // Ephemeral apps have some special contraints for notifications.
+ // They are not allowed to create new notifications however they are allowed to
+ // update notifications created by the system (e.g. a foreground service
+ // notification).
+ throw new SecurityException("Instant app " + pkg
+ + " cannot create notifications");
}
int count = 0;
@@ -3131,7 +3161,9 @@
// snoozed apps
if (mSnoozeHelper.isSnoozed(userId, pkg, r.getKey())) {
- // TODO: log to event log
+ MetricsLogger.action(r.getLogMaker()
+ .setType(MetricsProto.MetricsEvent.TYPE_UPDATE)
+ .setCategory(MetricsProto.MetricsEvent.NOTIFICATION_SNOOZED));
if (DBG) {
Slog.d(TAG, "Ignored enqueue for snoozed notification " + r.getKey());
}
@@ -3377,7 +3409,7 @@
@VisibleForTesting
void scheduleTimeoutLocked(NotificationRecord record) {
- if (record.getNotification().getTimeout() > System.currentTimeMillis()) {
+ if (record.getNotification().getTimeout() > 0) {
final PendingIntent pi = PendingIntent.getBroadcast(getContext(),
REQUEST_CODE_TIMEOUT,
new Intent(ACTION_NOTIFICATION_TIMEOUT)
@@ -3386,8 +3418,8 @@
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
.putExtra(EXTRA_KEY, record.getKey()),
PendingIntent.FLAG_UPDATE_CURRENT);
- mAlarmManager.setExactAndAllowWhileIdle(
- AlarmManager.RTC_WAKEUP, record.getNotification().getTimeout(), pi);
+ mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
+ SystemClock.elapsedRealtime() + record.getNotification().getTimeout(), pi);
}
}
@@ -3867,14 +3899,18 @@
private void cancelNotificationLocked(NotificationRecord r, boolean sendDelete, int reason) {
final String canceledKey = r.getKey();
- // Remove from either list
- boolean wasPosted;
- if (mNotificationList.remove(r)) {
- mNotificationsByKey.remove(r.sbn.getKey());
+ // Remove from both lists, either list could have a separate Record for what is effectively
+ // the same notification.
+ boolean wasPosted = false;
+ NotificationRecord recordInList = null;
+ if ((recordInList = findNotificationByListLocked(mNotificationList, r.getKey())) != null) {
+ mNotificationList.remove(recordInList);
+ mNotificationsByKey.remove(recordInList.sbn.getKey());
wasPosted = true;
- } else {
- mEnqueuedNotifications.remove(r);
- wasPosted = false;
+ }
+ if ((recordInList = findNotificationByListLocked(mEnqueuedNotifications, r.getKey()))
+ != null) {
+ mEnqueuedNotifications.remove(recordInList);
}
// Record caller.
@@ -4149,16 +4185,16 @@
}
}
- void snoozeNotificationInt(String key, long until, String snoozeCriterionId,
+ void snoozeNotificationInt(String key, long duration, String snoozeCriterionId,
ManagedServiceInfo listener) {
String listenerName = listener == null ? null : listener.component.toShortString();
- if (until < System.currentTimeMillis() && snoozeCriterionId == null) {
+ if (duration <= 0 && snoozeCriterionId == null) {
return;
}
- // TODO: write to event log
+
if (DBG) {
- Slog.d(TAG, String.format("snooze event(%s, %d, %s, %s)", key, until, snoozeCriterionId,
- listenerName));
+ Slog.d(TAG, String.format("snooze event(%s, %d, %s, %s)", key, duration,
+ snoozeCriterionId, listenerName));
}
// Needs to post so that it can cancel notifications not yet enqueued.
mHandler.post(new Runnable() {
@@ -4167,6 +4203,11 @@
synchronized (mNotificationLock) {
final NotificationRecord r = findNotificationByKeyLocked(key);
if (r != null) {
+ MetricsLogger.action(r.getLogMaker()
+ .setCategory(MetricsEvent.NOTIFICATION_SNOOZED)
+ .setType(MetricsEvent.TYPE_CLOSE)
+ .addTaggedData(MetricsEvent.NOTIFICATION_SNOOZED_CRITERIA,
+ snoozeCriterionId == null ? 0 : 1));
cancelNotificationLocked(r, false, REASON_SNOOZED);
updateLightsLocked();
if (snoozeCriterionId != null) {
@@ -4174,7 +4215,7 @@
snoozeCriterionId);
mSnoozeHelper.snooze(r);
} else {
- mSnoozeHelper.snooze(r, until);
+ mSnoozeHelper.snooze(r, duration);
}
savePolicyFile();
}
@@ -4185,7 +4226,6 @@
void unsnoozeNotificationInt(String key, ManagedServiceInfo listener) {
String listenerName = listener == null ? null : listener.component.toShortString();
- // TODO: write to event log
if (DBG) {
Slog.d(TAG, String.format("unsnooze event(%s, %s)", key, listenerName));
}
@@ -4298,17 +4338,12 @@
// TODO: need to combine a bunch of these getters with slightly different behavior.
// TODO: Should enqueuing just add to mNotificationsByKey instead?
private NotificationRecord findNotificationByKeyLocked(String key) {
- final int N = mNotificationList.size();
- for (int i = 0; i < N; i++) {
- if (key.equals(mNotificationList.get(i).getKey())) {
- return mNotificationList.get(i);
- }
+ NotificationRecord r;
+ if ((r = findNotificationByListLocked(mNotificationList, key)) != null) {
+ return r;
}
- final int M = mEnqueuedNotifications.size();
- for (int i = 0; i < M; i++) {
- if (key.equals(mEnqueuedNotifications.get(i).getKey())) {
- return mEnqueuedNotifications.get(i);
- }
+ if ((r = findNotificationByListLocked(mEnqueuedNotifications, key)) != null) {
+ return r;
}
return null;
}
@@ -4326,8 +4361,7 @@
}
private NotificationRecord findNotificationByListLocked(ArrayList<NotificationRecord> list,
- String pkg, String tag, int id, int userId)
- {
+ String pkg, String tag, int id, int userId) {
final int len = list.size();
for (int i = 0; i < len; i++) {
NotificationRecord r = list.get(i);
@@ -4339,6 +4373,18 @@
return null;
}
+ private NotificationRecord findNotificationByListLocked(ArrayList<NotificationRecord> list,
+ String key)
+ {
+ final int N = list.size();
+ for (int i = 0; i < N; i++) {
+ if (key.equals(list.get(i).getKey())) {
+ return list.get(i);
+ }
+ }
+ return null;
+ }
+
// lock on mNotificationList
int indexOfNotificationLocked(String key) {
final int N = mNotificationList.size();
@@ -4379,6 +4425,27 @@
checkCallerIsSameApp(pkg);
}
+ private boolean isCallerInstantApp(String pkg) {
+ // System is always allowed to act for ephemeral apps.
+ if (isCallerSystem()) {
+ return false;
+ }
+
+ mAppOps.checkPackage(Binder.getCallingUid(), pkg);
+
+ try {
+ ApplicationInfo ai = mPackageManager.getApplicationInfo(pkg, 0,
+ UserHandle.getCallingUserId());
+ if (ai == null) {
+ throw new SecurityException("Unknown package " + pkg);
+ }
+ return ai.isInstantApp();
+ } catch (RemoteException re) {
+ throw new SecurityException("Unknown package " + pkg, re);
+ }
+
+ }
+
private void checkCallerIsSameApp(String pkg) {
final int uid = Binder.getCallingUid();
try {
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 76890b1..867af9a 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -32,6 +32,7 @@
import android.content.pm.ParceledListSlice;
import android.os.Build;
import android.os.UserHandle;
+import android.provider.Settings;
import android.service.notification.NotificationListenerService.Ranking;
import android.text.TextUtils;
import android.util.ArrayMap;
@@ -516,6 +517,10 @@
if (!r.showBadge) {
channel.setShowBadge(false);
}
+ if (channel.getSound() == null) {
+ channel.setSound(Settings.System.DEFAULT_NOTIFICATION_URI,
+ Notification.AUDIO_ATTRIBUTES_DEFAULT);
+ }
r.channels.put(channel.getId(), channel);
updateConfig();
}
diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java
index f2aff11..913f636 100644
--- a/services/core/java/com/android/server/notification/SnoozeHelper.java
+++ b/services/core/java/com/android/server/notification/SnoozeHelper.java
@@ -16,11 +16,14 @@
package com.android.server.notification;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
+import android.annotation.NonNull;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
@@ -29,6 +32,7 @@
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Binder;
+import android.os.SystemClock;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import android.util.ArrayMap;
@@ -99,7 +103,7 @@
return Collections.EMPTY_LIST;
}
- protected List<NotificationRecord> getSnoozed() {
+ protected @NonNull List<NotificationRecord> getSnoozed() {
List<NotificationRecord> snoozedForUser = new ArrayList<>();
int[] userIds = mUserProfiles.getCurrentProfileIds();
final int N = userIds.length;
@@ -122,9 +126,9 @@
/**
* Snoozes a notification and schedules an alarm to repost at that time.
*/
- protected void snooze(NotificationRecord record, long until) {
+ protected void snooze(NotificationRecord record, long duration) {
snooze(record);
- scheduleRepost(record.sbn.getPackageName(), record.getKey(), record.getUserId(), until);
+ scheduleRepost(record.sbn.getPackageName(), record.getKey(), record.getUserId(), duration);
}
/**
@@ -270,6 +274,9 @@
final NotificationRecord record = pkgRecords.remove(key);
if (record != null) {
+ MetricsLogger.action(record.getLogMaker()
+ .setCategory(MetricsProto.MetricsEvent.NOTIFICATION_SNOOZED)
+ .setType(MetricsProto.MetricsEvent.TYPE_OPEN));
mCallback.repost(userId, record);
}
}
@@ -285,13 +292,14 @@
PendingIntent.FLAG_UPDATE_CURRENT);
}
- private void scheduleRepost(String pkg, String key, int userId, long time) {
+ private void scheduleRepost(String pkg, String key, int userId, long duration) {
long identity = Binder.clearCallingIdentity();
try {
final PendingIntent pi = createPendingIntent(pkg, key, userId);
mAm.cancel(pi);
+ long time = SystemClock.elapsedRealtime() + duration;
if (DEBUG) Slog.d(TAG, "Scheduling evaluate for " + new Date(time));
- mAm.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, pi);
+ mAm.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, time, pi);
} finally {
Binder.restoreCallingIdentity(identity);
}
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index 66fb976..75190f3 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -50,14 +50,18 @@
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings.Global;
+import android.service.notification.Condition;
import android.service.notification.ConditionProviderService;
+import android.service.notification.NotificationServiceDumpProto;
import android.service.notification.ZenModeConfig;
import android.service.notification.ZenModeConfig.EventInfo;
import android.service.notification.ZenModeConfig.ScheduleInfo;
import android.service.notification.ZenModeConfig.ZenRule;
+import android.service.notification.ZenModeProto;
import android.util.AndroidRuntimeException;
import android.util.Log;
import android.util.SparseArray;
+import android.util.proto.ProtoOutputStream;
import com.android.internal.R;
import com.android.internal.logging.MetricsLogger;
@@ -488,6 +492,24 @@
}
}
+ void dump(ProtoOutputStream proto) {
+
+ proto.write(ZenModeProto.ZEN_MODE, mZenMode);
+ synchronized (mConfig) {
+ if (mConfig.manualRule != null) {
+ proto.write(ZenModeProto.ENABLED_ACTIVE_CONDITIONS, mConfig.manualRule.toString());
+ }
+ for (ZenRule rule : mConfig.automaticRules.values()) {
+ if (rule.enabled && rule.condition.state == Condition.STATE_TRUE
+ && !rule.snoozing) {
+ proto.write(ZenModeProto.ENABLED_ACTIVE_CONDITIONS, rule.toString());
+ }
+ }
+ proto.write(ZenModeProto.POLICY, mConfig.toNotificationPolicy().toString());
+ proto.write(ZenModeProto.SUPPRESSED_EFFECTS, mSuppressedEffects);
+ }
+ }
+
public void dump(PrintWriter pw, String prefix) {
pw.print(prefix); pw.print("mZenMode=");
pw.println(Global.zenModeToString(mZenMode));
diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java
index cc709ce..ba4d46a 100644
--- a/services/core/java/com/android/server/om/OverlayManagerService.java
+++ b/services/core/java/com/android/server/om/OverlayManagerService.java
@@ -26,7 +26,6 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
-import android.app.ActivityManagerNative;
import android.app.IActivityManager;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -42,7 +41,6 @@
import android.os.Binder;
import android.os.Environment;
import android.os.IBinder;
-import android.os.Process;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ShellCallback;
@@ -646,7 +644,7 @@
Slog.d(TAG, String.format("send broadcast %s", intent));
}
try {
- ActivityManagerNative.getDefault().broadcastIntent(null, intent, null, null, 0,
+ ActivityManager.getService().broadcastIntent(null, intent, null, null, 0,
null, null, null, android.app.AppOpsManager.OP_NONE, null, false, false,
userId);
} catch (RemoteException e) {
@@ -664,7 +662,38 @@
}
private void updateAssets(final int userId, List<String> targetPackageNames) {
- // TODO: implement when we integrate OMS properly
+ final PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
+ final boolean updateFrameworkRes = targetPackageNames.contains("android");
+ if (updateFrameworkRes) {
+ targetPackageNames = pm.getTargetPackageNames(userId);
+ }
+
+ final Map<String, List<String>> pendingChanges = new ArrayMap<>(targetPackageNames.size());
+ synchronized (mLock) {
+ final int N = targetPackageNames.size();
+ for (int i = 0; i < N; i++) {
+ final String targetPackageName = targetPackageNames.get(i);
+ pendingChanges.put(targetPackageName,
+ mImpl.getEnabledOverlayPackageNames(targetPackageName, userId));
+ }
+ }
+
+ final int N = targetPackageNames.size();
+ for (int i = 0; i < N; i++) {
+ final String targetPackageName = targetPackageNames.get(i);
+ if (!pm.setEnabledOverlayPackages(
+ userId, targetPackageName, pendingChanges.get(targetPackageName))) {
+ Slog.e(TAG, String.format("Failed to change enabled overlays for %s user %d",
+ targetPackageName, userId));
+ }
+ }
+
+ final IActivityManager am = ActivityManager.getService();
+ try {
+ am.scheduleApplicationInfoChanged(targetPackageNames, userId);
+ } catch (RemoteException e) {
+ // Intentionally left empty.
+ }
}
private void schedulePersistSettings() {
diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
index 9da94b3..6365d15 100644
--- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
@@ -20,6 +20,7 @@
import android.annotation.NonNull;
import android.app.DownloadManager;
import android.app.admin.DevicePolicyManager;
+import android.companion.CompanionDeviceManager;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
@@ -58,6 +59,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -673,6 +675,16 @@
&& doesPackageSupportRuntimePermissions(storageManagerPckg)) {
grantRuntimePermissionsLPw(storageManagerPckg, STORAGE_PERMISSIONS, true, userId);
}
+
+ // Companion devices
+ PackageParser.Package companionDeviceDiscoveryPackage = getSystemPackageLPr(
+ CompanionDeviceManager.COMPANION_DEVICE_DISCOVERY_PACKAGE_NAME);
+ if (companionDeviceDiscoveryPackage != null
+ && doesPackageSupportRuntimePermissions(companionDeviceDiscoveryPackage)) {
+ grantRuntimePermissionsLPw(companionDeviceDiscoveryPackage,
+ LOCATION_PERMISSIONS, true, userId);
+ }
+
mService.mSettings.onDefaultRuntimePermissionsGrantedLPr(userId);
}
}
@@ -1024,14 +1036,22 @@
}
}
+ private File[] getDefaultPermissionFiles() {
+ ArrayList<File> ret = new ArrayList<File>();
+ File dir = new File(Environment.getRootDirectory(), "etc/default-permissions");
+ if (dir.isDirectory() && dir.canRead()) {
+ Collections.addAll(ret, dir.listFiles());
+ }
+ dir = new File(Environment.getVendorDirectory(), "etc/default-permissions");
+ if (dir.isDirectory() && dir.canRead()) {
+ Collections.addAll(ret, dir.listFiles());
+ }
+ return ret.isEmpty() ? null : ret.toArray(new File[0]);
+ }
+
private @NonNull ArrayMap<String, List<DefaultPermissionGrant>>
readDefaultPermissionExceptionsLPw() {
- File dir = new File(Environment.getRootDirectory(), "etc/default-permissions");
- if (!dir.exists() || !dir.isDirectory() || !dir.canRead()) {
- return new ArrayMap<>(0);
- }
-
- File[] files = dir.listFiles();
+ File[] files = getDefaultPermissionFiles();
if (files == null) {
return new ArrayMap<>(0);
}
@@ -1041,7 +1061,7 @@
// Iterate over the files in the directory and scan .xml files
for (File file : files) {
if (!file.getPath().endsWith(".xml")) {
- Slog.i(TAG, "Non-xml file " + file + " in " + dir + " directory, ignoring");
+ Slog.i(TAG, "Non-xml file " + file + " in " + file.getParent() + " directory, ignoring");
continue;
}
if (!file.canRead()) {
diff --git a/services/core/java/com/android/server/pm/EphemeralResolver.java b/services/core/java/com/android/server/pm/EphemeralResolver.java
index 3c55422..7bc65f9 100644
--- a/services/core/java/com/android/server/pm/EphemeralResolver.java
+++ b/services/core/java/com/android/server/pm/EphemeralResolver.java
@@ -16,8 +16,9 @@
package com.android.server.pm;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.app.ActivityManager;
-import android.app.ActivityManagerNative;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
@@ -29,7 +30,7 @@
import android.content.pm.EphemeralIntentFilter;
import android.content.pm.EphemeralRequest;
import android.content.pm.EphemeralResolveInfo;
-import android.content.pm.EphemeralResponse;
+import android.content.pm.AuxiliaryResolveInfo;
import android.content.pm.EphemeralResolveInfo.EphemeralDigest;
import android.os.Binder;
import android.os.Handler;
@@ -46,7 +47,7 @@
/** @hide */
public abstract class EphemeralResolver {
- public static EphemeralResponse doEphemeralResolutionPhaseOne(Context context,
+ public static AuxiliaryResolveInfo doEphemeralResolutionPhaseOne(Context context,
EphemeralResolverConnection connection, EphemeralRequest requestObj) {
final Intent intent = requestObj.origIntent;
final EphemeralDigest digest =
@@ -83,7 +84,7 @@
final ArrayList<EphemeralResolveInfo> ephemeralResolveInfoList =
new ArrayList<EphemeralResolveInfo>(1);
ephemeralResolveInfoList.add(ephemeralResolveInfo);
- final EphemeralResponse ephemeralIntentInfo =
+ final AuxiliaryResolveInfo ephemeralIntentInfo =
EphemeralResolver.filterEphemeralIntent(
ephemeralResolveInfoList, intent, null /*resolvedType*/,
0 /*userId*/, intent.getPackage(), digest,
@@ -104,7 +105,6 @@
versionCode = -1;
}
final Intent installerIntent = buildEphemeralInstallerIntent(
- requestObj.launchIntent,
requestObj.origIntent,
requestObj.callingPackage,
requestObj.resolvedType,
@@ -126,35 +126,41 @@
/**
* Builds and returns an intent to launch the ephemeral installer.
*/
- public static Intent buildEphemeralInstallerIntent(Intent launchIntent, Intent origIntent,
- String callingPackage, String resolvedType, int userId, String ephemeralPackageName,
- String ephemeralSplitName, int versionCode, String token, boolean needsPhaseTwo) {
+ public static Intent buildEphemeralInstallerIntent(@NonNull Intent origIntent,
+ @NonNull String callingPackage,
+ @NonNull String resolvedType,
+ int userId,
+ @NonNull String ephemeralPackageName,
+ @Nullable String ephemeralSplitName,
+ int versionCode,
+ @Nullable String token,
+ boolean needsPhaseTwo) {
// Construct the intent that launches the ephemeral installer
- int flags = launchIntent.getFlags();
+ int flags = origIntent.getFlags();
final Intent intent = new Intent();
intent.setFlags(flags
| Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK
| Intent.FLAG_ACTIVITY_NO_HISTORY
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
- // TODO: Remove when the platform has fully implemented ephemeral apps
- intent.setData(origIntent.getData().buildUpon().clearQuery().build());
- intent.putExtra(Intent.EXTRA_EPHEMERAL_TOKEN, token);
- intent.putExtra(Intent.EXTRA_EPHEMERAL_HOSTNAME, origIntent.getData().getHost());
+ if (token != null) {
+ intent.putExtra(Intent.EXTRA_EPHEMERAL_TOKEN, token);
+ }
+ if (origIntent.getData() != null) {
+ intent.putExtra(Intent.EXTRA_EPHEMERAL_HOSTNAME, origIntent.getData().getHost());
+ }
+ // We have all of the data we need; just start the installer without a second phase
if (!needsPhaseTwo) {
- // We have all of the data we need; just start the installer without a second phase
- final Intent nonEphemeralIntent = new Intent(origIntent);
- nonEphemeralIntent.setFlags(
- nonEphemeralIntent.getFlags() | Intent.FLAG_IGNORE_EPHEMERAL);
- // Intent that is launched if the ephemeral package couldn't be installed
- // for any reason.
+ // Intent that is launched if the package couldn't be installed for any reason.
+ final Intent failureIntent = new Intent(origIntent);
+ failureIntent.setFlags(failureIntent.getFlags() | Intent.FLAG_IGNORE_EPHEMERAL);
try {
- final IIntentSender failureIntentTarget = ActivityManagerNative.getDefault()
+ final IIntentSender failureIntentTarget = ActivityManager.getService()
.getIntentSender(
ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage,
null /*token*/, null /*resultWho*/, 1 /*requestCode*/,
- new Intent[] { nonEphemeralIntent },
+ new Intent[] { failureIntent },
new String[] { resolvedType },
PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT
| PendingIntent.FLAG_IMMUTABLE,
@@ -163,19 +169,14 @@
new IntentSender(failureIntentTarget));
} catch (RemoteException ignore) { /* ignore; same process */ }
- // Success intent goes back to the installer
- final Intent ephemeralIntent = new Intent(launchIntent)
- .setComponent(null)
- .setPackage(ephemeralPackageName);
- // Intent that is eventually launched if the ephemeral package was
- // installed successfully. This will actually be launched by a platform
- // broadcast receiver.
+ // Intent that is launched if the package was installed successfully.
+ final Intent successIntent = new Intent(origIntent);
try {
- final IIntentSender successIntentTarget = ActivityManagerNative.getDefault()
+ final IIntentSender successIntentTarget = ActivityManager.getService()
.getIntentSender(
ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage,
null /*token*/, null /*resultWho*/, 0 /*requestCode*/,
- new Intent[] { ephemeralIntent },
+ new Intent[] { successIntent },
new String[] { resolvedType },
PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT
| PendingIntent.FLAG_IMMUTABLE,
@@ -192,7 +193,7 @@
return intent;
}
- private static EphemeralResponse filterEphemeralIntent(
+ private static AuxiliaryResolveInfo filterEphemeralIntent(
List<EphemeralResolveInfo> ephemeralResolveInfoList,
Intent intent, String resolvedType, int userId, String packageName,
EphemeralDigest digest, String token) {
@@ -212,7 +213,7 @@
ephemeralInfo.getIntentFilters();
// No filters; we need to start phase two
if (ephemeralFilters == null || ephemeralFilters.isEmpty()) {
- return new EphemeralResponse(ephemeralInfo,
+ return new AuxiliaryResolveInfo(ephemeralInfo,
new IntentFilter(Intent.ACTION_VIEW) /*intentFilter*/,
null /*splitName*/, token, true /*needsPhase2*/);
}
@@ -226,16 +227,15 @@
continue;
}
for (int k = splitFilters.size() - 1; k >= 0; --k) {
- final EphemeralResponse intentInfo =
- new EphemeralResponse(ephemeralInfo,
+ final AuxiliaryResolveInfo intentInfo =
+ new AuxiliaryResolveInfo(ephemeralInfo,
splitFilters.get(k), ephemeralFilter.getSplitName(),
token, false /*needsPhase2*/);
ephemeralResolver.addFilter(intentInfo);
}
}
- List<EphemeralResponse> matchedResolveInfoList = ephemeralResolver.queryIntent(
- intent, resolvedType, false /*defaultOnly*/, false /*visibleToEphemeral*/,
- false /*isInstant*/, userId);
+ List<AuxiliaryResolveInfo> matchedResolveInfoList = ephemeralResolver.queryIntent(
+ intent, resolvedType, false /*defaultOnly*/, userId);
if (!matchedResolveInfoList.isEmpty()) {
return matchedResolveInfoList.get(0);
}
diff --git a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java
index 2b6ce10..7f5973e 100644
--- a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java
+++ b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java
@@ -23,7 +23,6 @@
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.EphemeralResolveInfo;
-import android.content.pm.EphemeralResponse;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index 449d808..5abdb60 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -63,6 +63,9 @@
public static final int FLAG_CLEAR_CACHE_ONLY = 1 << 8;
public static final int FLAG_CLEAR_CODE_CACHE_ONLY = 1 << 9;
public static final int FLAG_USE_QUOTA = 1 << 12;
+ public static final int FLAG_FREE_CACHE_V2 = 1 << 13;
+ public static final int FLAG_FREE_CACHE_V2_DEFY_QUOTA = 1 << 14;
+ public static final int FLAG_FREE_CACHE_NOOP = 1 << 15;
private final boolean mIsolated;
@@ -465,6 +468,15 @@
}
}
+ public boolean isQuotaSupported(String volumeUuid) throws InstallerException {
+ if (!checkBeforeRemote()) return false;
+ try {
+ return mInstalld.isQuotaSupported(volumeUuid);
+ } catch (Exception e) {
+ throw InstallerException.from(e);
+ }
+ }
+
private static void assertValidInstructionSet(String instructionSet)
throws InstallerException {
for (String abi : Build.SUPPORTED_ABIS) {
diff --git a/services/core/java/com/android/server/pm/InstantAppRegistry.java b/services/core/java/com/android/server/pm/InstantAppRegistry.java
index 42934a4..55a5f72 100644
--- a/services/core/java/com/android/server/pm/InstantAppRegistry.java
+++ b/services/core/java/com/android/server/pm/InstantAppRegistry.java
@@ -42,6 +42,7 @@
import android.util.Xml;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.BackgroundThread;
+import com.android.internal.os.SomeArgs;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.XmlUtils;
import libcore.io.IoUtils;
@@ -115,8 +116,14 @@
}
public byte[] getInstantAppCookieLPw(@NonNull String packageName,
- @UserIdInt int userId) {
- byte[] pendingCookie = mCookiePersistence.getPendingPersistCookie(userId, packageName);
+ @UserIdInt int userId) {
+ // Only installed packages can get their own cookie
+ PackageParser.Package pkg = mService.mPackages.get(packageName);
+ if (pkg == null) {
+ return null;
+ }
+
+ byte[] pendingCookie = mCookiePersistence.getPendingPersistCookieLPr(pkg, userId);
if (pendingCookie != null) {
return pendingCookie;
}
@@ -132,7 +139,7 @@
}
public boolean setInstantAppCookieLPw(@NonNull String packageName,
- @Nullable byte[] cookie, @UserIdInt int userId) {
+ @Nullable byte[] cookie, @UserIdInt int userId) {
if (cookie != null && cookie.length > 0) {
final int maxCookieSize = mService.mContext.getPackageManager()
.getInstantAppCookieMaxSize();
@@ -143,25 +150,25 @@
}
}
- mCookiePersistence.schedulePersist(userId, packageName, cookie);
+ // Only an installed package can set its own cookie
+ PackageParser.Package pkg = mService.mPackages.get(packageName);
+ if (pkg == null) {
+ return false;
+ }
+
+ mCookiePersistence.schedulePersistLPw(userId, pkg, cookie);
return true;
}
private void persistInstantApplicationCookie(@Nullable byte[] cookie,
- @NonNull String packageName, @UserIdInt int userId) {
+ @NonNull String packageName, @NonNull File cookieFile, @UserIdInt int userId) {
synchronized (mService.mPackages) {
- PackageParser.Package pkg = mService.mPackages.get(packageName);
- if (pkg == null) {
- return;
- }
-
File appDir = getInstantApplicationDir(packageName, userId);
if (!appDir.exists() && !appDir.mkdirs()) {
Slog.e(LOG_TAG, "Cannot create instant app cookie directory");
return;
}
- File cookieFile = computeInstantCookieFile(pkg, userId);
if (cookieFile.exists() && !cookieFile.delete()) {
Slog.e(LOG_TAG, "Cannot delete instant app cookie file");
}
@@ -170,12 +177,11 @@
if (cookie == null || cookie.length <= 0) {
return;
}
-
- try (FileOutputStream fos = new FileOutputStream(cookieFile)) {
- fos.write(cookie, 0, cookie.length);
- } catch (IOException e) {
- Slog.e(LOG_TAG, "Error writing instant app cookie file: " + cookieFile, e);
- }
+ }
+ try (FileOutputStream fos = new FileOutputStream(cookieFile)) {
+ fos.write(cookie, 0, cookie.length);
+ } catch (IOException e) {
+ Slog.e(LOG_TAG, "Error writing instant app cookie file: " + cookieFile, e);
}
}
@@ -217,7 +223,7 @@
propagateInstantAppPermissionsIfNeeded(pkg.packageName, userId);
// Track instant apps
- if (pkg.applicationInfo.isInstantApp()) {
+ if (ps.getInstantApp(userId)) {
addInstantAppLPw(userId, ps.appId);
}
@@ -240,6 +246,8 @@
if (!currentCookieFile.equals(expectedCookeFile)) {
Slog.i(LOG_TAG, "Signature for package " + pkg.packageName
+ " changed - dropping cookie");
+ // Make sure a pending write for the old signed app is cancelled
+ mCookiePersistence.cancelPendingPersistLPw(pkg, userId);
currentCookieFile.delete();
}
}
@@ -257,7 +265,7 @@
continue;
}
- if (pkg.applicationInfo.isInstantApp()) {
+ if (ps.getInstantApp(userId)) {
// Add a record for an uninstalled instant app
addUninstalledInstantAppLPw(pkg, userId);
removeInstantAppLPw(userId, ps.appId);
@@ -533,11 +541,12 @@
final int packageCount = mService.mPackages.size();
for (int i = 0; i < packageCount; i++) {
- PackageParser.Package pkg = mService.mPackages.valueAt(i);
- if (!pkg.applicationInfo.isInstantApp()) {
+ final PackageParser.Package pkg = mService.mPackages.valueAt(i);
+ final PackageSetting ps = (PackageSetting) pkg.mExtras;
+ if (ps == null || !ps.getInstantApp(userId)) {
continue;
}
- InstantAppInfo info = createInstantAppInfoForPackage(
+ final InstantAppInfo info = createInstantAppInfoForPackage(
pkg, userId, true);
if (info == null) {
continue;
@@ -889,71 +898,90 @@
// In case you wonder why we stash the cookies aside, we use
// the user id for the message id and the package for the payload.
// Handler allows removing messages by id and tag where the
- // tag is is compared using ==. So to allow cancelling the
+ // tag is compared using ==. So to allow cancelling the
// pending persistence for an app under a given user we use
- // the fact that package names are interned in the system
- // process so the == comparison would match and we end up
- // with a way to cancel persisting the cookie for a user
- // and package.
- private final SparseArray<ArrayMap<String, byte[]>> mPendingPersistCookies =
- new SparseArray<>();
+ // the fact that package are cached by the system so the ==
+ // comparison would match and we end up with a way to cancel
+ // persisting the cookie for a user and package.
+ private final SparseArray<ArrayMap<PackageParser.Package, SomeArgs>> mPendingPersistCookies
+ = new SparseArray<>();
public CookiePersistence(Looper looper) {
super(looper);
}
- public void schedulePersist(@UserIdInt int userId,
- @NonNull String packageName, @NonNull byte[] cookie) {
- cancelPendingPersist(userId, packageName);
- addPendingPersistCookie(userId, packageName, cookie);
- sendMessageDelayed(obtainMessage(userId, packageName),
+ public void schedulePersistLPw(@UserIdInt int userId, @NonNull PackageParser.Package pkg,
+ @NonNull byte[] cookie) {
+ File cookieFile = computeInstantCookieFile(pkg, userId);
+ cancelPendingPersistLPw(pkg, userId);
+ addPendingPersistCookieLPw(userId, pkg, cookie, cookieFile);
+ sendMessageDelayed(obtainMessage(userId, pkg),
PERSIST_COOKIE_DELAY_MILLIS);
}
- public @Nullable byte[] getPendingPersistCookie(@UserIdInt int userId,
- @NonNull String packageName) {
- ArrayMap<String, byte[]> pendingWorkForUser = mPendingPersistCookies.get(userId);
+ public @Nullable byte[] getPendingPersistCookieLPr(@NonNull PackageParser.Package pkg,
+ @UserIdInt int userId) {
+ ArrayMap<PackageParser.Package, SomeArgs> pendingWorkForUser =
+ mPendingPersistCookies.get(userId);
if (pendingWorkForUser != null) {
- return pendingWorkForUser.remove(packageName);
+ SomeArgs state = pendingWorkForUser.get(pkg);
+ if (state != null) {
+ return (byte[]) state.arg1;
+ }
}
return null;
}
- private void cancelPendingPersist(@UserIdInt int userId,
- @NonNull String packageName) {
- removePendingPersistCookie(userId, packageName);
- removeMessages(userId, packageName);
+ public void cancelPendingPersistLPw(@NonNull PackageParser.Package pkg,
+ @UserIdInt int userId) {
+ removeMessages(userId, pkg);
+ SomeArgs state = removePendingPersistCookieLPr(pkg, userId);
+ if (state != null) {
+ state.recycle();
+ }
}
- private void addPendingPersistCookie(@UserIdInt int userId,
- @NonNull String packageName, @NonNull byte[] cookie) {
- ArrayMap<String, byte[]> pendingWorkForUser = mPendingPersistCookies.get(userId);
+ private void addPendingPersistCookieLPw(@UserIdInt int userId,
+ @NonNull PackageParser.Package pkg, @NonNull byte[] cookie,
+ @NonNull File cookieFile) {
+ ArrayMap<PackageParser.Package, SomeArgs> pendingWorkForUser =
+ mPendingPersistCookies.get(userId);
if (pendingWorkForUser == null) {
pendingWorkForUser = new ArrayMap<>();
mPendingPersistCookies.put(userId, pendingWorkForUser);
}
- pendingWorkForUser.put(packageName, cookie);
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = cookie;
+ args.arg2 = cookieFile;
+ pendingWorkForUser.put(pkg, args);
}
- private byte[] removePendingPersistCookie(@UserIdInt int userId,
- @NonNull String packageName) {
- ArrayMap<String, byte[]> pendingWorkForUser = mPendingPersistCookies.get(userId);
- byte[] cookie = null;
+ private SomeArgs removePendingPersistCookieLPr(@NonNull PackageParser.Package pkg,
+ @UserIdInt int userId) {
+ ArrayMap<PackageParser.Package, SomeArgs> pendingWorkForUser =
+ mPendingPersistCookies.get(userId);
+ SomeArgs state = null;
if (pendingWorkForUser != null) {
- cookie = pendingWorkForUser.remove(packageName);
+ state = pendingWorkForUser.remove(pkg);
if (pendingWorkForUser.isEmpty()) {
mPendingPersistCookies.remove(userId);
}
}
- return cookie;
+ return state;
}
@Override
public void handleMessage(Message message) {
int userId = message.what;
- String packageName = (String) message.obj;
- byte[] cookie = removePendingPersistCookie(userId, packageName);
- persistInstantApplicationCookie(cookie, packageName, userId);
+ PackageParser.Package pkg = (PackageParser.Package) message.obj;
+ SomeArgs state = removePendingPersistCookieLPr(pkg, userId);
+ if (state == null) {
+ return;
+ }
+ byte[] cookie = (byte[]) state.arg1;
+ File cookieFile = (File) state.arg2;
+ state.recycle();
+ persistInstantApplicationCookie(cookie, pkg.packageName, cookieFile, userId);
}
}
}
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index 96a2577..71bfa64 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -242,6 +242,12 @@
try {
UserInfo callingUserInfo = mUm.getUserInfo(callingUserId);
if (callingUserInfo.isManagedProfile()) {
+
+ // STOPSHIP Remove the whitelist.
+ if ("com.google.android.talk".equals(callingPackage)
+ || "com.google.android.quicksearchbox".equals(callingPackage)) {
+ return false;
+ }
Slog.wtfStack(TAG, message + " by " + callingPackage + " for another profile "
+ targetUserId + " from " + callingUserId);
@@ -436,8 +442,8 @@
@Override
public ParceledListSlice getShortcuts(String callingPackage, long changedSince,
- String packageName, List shortcutIds, ComponentName componentName, int flags,
- UserHandle targetUser) {
+ String packageName, List shortcutIds, ComponentName componentName, Intent intent,
+ int flags, UserHandle targetUser) {
ensureShortcutPermission(callingPackage);
if (!canAccessProfile(callingPackage, targetUser, "Cannot get shortcuts")
|| !isUserEnabled(targetUser)) {
@@ -448,11 +454,17 @@
"To query by shortcut ID, package name must also be set");
}
+ if ((flags & ShortcutQuery.FLAG_MATCH_CHOOSER) == 0
+ && intent != null) {
+ throw new IllegalArgumentException("Supplied an intent in the query, but did "
+ + "not request chooser targets");
+ }
+
// TODO(b/29399275): Eclipse compiler requires explicit List<ShortcutInfo> cast below.
return new ParceledListSlice<>((List<ShortcutInfo>)
mShortcutServiceInternal.getShortcuts(getCallingUserId(),
callingPackage, changedSince, packageName, shortcutIds,
- componentName, flags, targetUser.getIdentifier()));
+ componentName, intent, flags, targetUser.getIdentifier()));
}
@Override
@@ -900,6 +912,7 @@
cookie.packageName,
/* changedSince= */ 0, packageName, /* shortcutIds=*/ null,
/* component= */ null,
+ /* intent= */ null,
ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY
| ShortcutQuery.FLAG_GET_ALL_KINDS
, userId);
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
index db712ae..b589057 100644
--- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java
+++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
@@ -66,6 +66,9 @@
public static final int DEX_OPT_PERFORMED = 1;
public static final int DEX_OPT_FAILED = -1;
+ /** Special library name that skips shared libraries check during compilation. */
+ public static final String SKIP_SHARED_LIBRARY_CHECK = "&";
+
private final Installer mInstaller;
private final Object mInstallLock;
@@ -274,7 +277,7 @@
// TODO(calin): maybe add a separate call.
mInstaller.dexopt(path, info.uid, info.packageName, isa, /*dexoptNeeded*/ 0,
/*oatDir*/ null, dexoptFlags,
- compilerFilter, info.volumeUuid, /*sharedLibrariesPath*/ null);
+ compilerFilter, info.volumeUuid, SKIP_SHARED_LIBRARY_CHECK);
}
return DEX_OPT_PERFORMED;
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index efd3132..a7a1683 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -221,6 +221,10 @@
new File(Environment.getDataSystemDirectory(), "install_sessions.xml"));
mSessionsDir = new File(Environment.getDataSystemDirectory(), "install_sessions");
mSessionsDir.mkdirs();
+ }
+
+ public void systemReady() {
+ mAppOps = mContext.getSystemService(AppOpsManager.class);
synchronized (mSessions) {
readSessionsLocked();
@@ -245,10 +249,6 @@
}
}
- public void systemReady() {
- mAppOps = mContext.getSystemService(AppOpsManager.class);
- }
-
private void reconcileStagesLocked(String volumeUuid, boolean isEphemeral) {
final File stagingDir = buildStagingDir(volumeUuid, isEphemeral);
final ArraySet<File> unclaimedStages = newArraySet(
@@ -607,6 +607,12 @@
+ "to use the PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS flag");
}
+ if ((params.installFlags & PackageManager.INSTALL_FORWARD_LOCK) != 0
+ || (params.installFlags & PackageManager.INSTALL_EXTERNAL) != 0) {
+ throw new IllegalArgumentException(
+ "New installs into ASEC containers no longer supported");
+ }
+
// Defensively resize giant app icons
if (params.appIcon != null) {
final ActivityManager am = (ActivityManager) mContext.getSystemService(
@@ -683,9 +689,9 @@
File stageDir = null;
String stageCid = null;
if ((params.installFlags & PackageManager.INSTALL_INTERNAL) != 0) {
- final boolean isEphemeral =
- (params.installFlags & PackageManager.INSTALL_EPHEMERAL) != 0;
- stageDir = buildStageDir(params.volumeUuid, sessionId, isEphemeral);
+ final boolean isInstant =
+ (params.installFlags & PackageManager.INSTALL_INSTANT_APP) != 0;
+ stageDir = buildStageDir(params.volumeUuid, sessionId, isInstant);
} else {
stageCid = buildExternalStageCid(sessionId);
}
@@ -787,9 +793,6 @@
}
private File buildStagingDir(String volumeUuid, boolean isEphemeral) {
- if (isEphemeral) {
- return Environment.getDataAppEphemeralDirectory(volumeUuid);
- }
return Environment.getDataAppDirectory(volumeUuid);
}
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 067a136..1c5675a 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -24,6 +24,7 @@
import static android.system.OsConstants.O_CREAT;
import static android.system.OsConstants.O_RDONLY;
import static android.system.OsConstants.O_WRONLY;
+
import static com.android.server.pm.PackageInstallerService.prepareExternalStageCid;
import static com.android.server.pm.PackageInstallerService.prepareStageDir;
@@ -54,8 +55,8 @@
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.RemoteException;
-import android.os.SELinux;
import android.os.UserHandle;
+import android.os.storage.StorageManager;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
@@ -66,9 +67,6 @@
import android.util.MathUtils;
import android.util.Slog;
-import libcore.io.IoUtils;
-import libcore.io.Libcore;
-
import com.android.internal.annotations.GuardedBy;
import com.android.internal.content.NativeLibraryHelper;
import com.android.internal.content.PackageHelper;
@@ -78,6 +76,9 @@
import com.android.server.pm.Installer.InstallerException;
import com.android.server.pm.PackageInstallerService.PackageInstallObserverAdapter;
+import libcore.io.IoUtils;
+import libcore.io.Libcore;
+
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileFilter;
@@ -455,14 +456,9 @@
// If caller specified a total length, allocate it for them. Free up
// cache space to grow, if needed.
- if (lengthBytes > 0) {
- final StructStat stat = Libcore.os.fstat(targetFd);
- final long deltaBytes = lengthBytes - stat.st_size;
- // Only need to free up space when writing to internal stage
- if (stageDir != null && deltaBytes > 0) {
- mPm.freeStorage(params.volumeUuid, deltaBytes);
- }
- Libcore.os.posix_fallocate(targetFd, 0, lengthBytes);
+ if (stageDir != null && lengthBytes > 0) {
+ mContext.getSystemService(StorageManager.class).allocateBytes(targetFd,
+ lengthBytes, 0);
}
if (offsetBytes > 0) {
@@ -704,7 +700,7 @@
final ApkLite apk;
try {
int flags = PackageParser.PARSE_COLLECT_CERTIFICATES;
- if ((params.installFlags & PackageManager.INSTALL_EPHEMERAL) != 0) {
+ if ((params.installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) {
flags |= PackageParser.PARSE_IS_EPHEMERAL;
}
apk = PackageParser.parseApkLite(addedFile, flags);
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 0d63f72..116c0a3 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -41,7 +41,7 @@
import static android.content.pm.PackageManager.INSTALL_FAILED_CONFLICTING_PROVIDER;
import static android.content.pm.PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE;
import static android.content.pm.PackageManager.INSTALL_FAILED_DUPLICATE_PERMISSION;
-import static android.content.pm.PackageManager.INSTALL_FAILED_EPHEMERAL_INVALID;
+import static android.content.pm.PackageManager.INSTALL_FAILED_INSTANT_APP_INVALID;
import static android.content.pm.PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
import static android.content.pm.PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK;
@@ -128,10 +128,9 @@
import android.content.pm.AppsQueryHelper;
import android.content.pm.ChangedPackages;
import android.content.pm.ComponentInfo;
-import android.content.pm.InstantAppInfo;
import android.content.pm.EphemeralRequest;
import android.content.pm.EphemeralResolveInfo;
-import android.content.pm.EphemeralResponse;
+import android.content.pm.AuxiliaryResolveInfo;
import android.content.pm.FallbackCategoryProvider;
import android.content.pm.FeatureInfo;
import android.content.pm.IOnPermissionsChangeListener;
@@ -143,6 +142,7 @@
import android.content.pm.IPackageManager;
import android.content.pm.IPackageMoveObserver;
import android.content.pm.IPackageStatsObserver;
+import android.content.pm.InstantAppInfo;
import android.content.pm.InstrumentationInfo;
import android.content.pm.IntentFilterVerificationInfo;
import android.content.pm.KeySet;
@@ -164,6 +164,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;
@@ -203,15 +204,16 @@
import android.os.UserManager;
import android.os.UserManagerInternal;
import android.os.storage.IStorageManager;
-import android.os.storage.StorageManagerInternal;
import android.os.storage.StorageEventListener;
import android.os.storage.StorageManager;
+import android.os.storage.StorageManagerInternal;
import android.os.storage.VolumeInfo;
import android.os.storage.VolumeRecord;
import android.provider.Settings.Global;
import android.provider.Settings.Secure;
import android.security.KeyStore;
import android.security.SystemKeyStore;
+import android.service.pm.PackageServiceDumpProto;
import android.system.ErrnoException;
import android.system.Os;
import android.text.TextUtils;
@@ -234,6 +236,7 @@
import android.util.SparseIntArray;
import android.util.Xml;
import android.util.jar.StrictJarFile;
+import android.util.proto.ProtoOutputStream;
import android.view.Display;
import com.android.internal.R;
@@ -250,6 +253,7 @@
import com.android.internal.os.Zygote;
import com.android.internal.telephony.CarrierAppUtils;
import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.ConcurrentUtils;
import com.android.internal.util.FastPrintWriter;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.IndentingPrintWriter;
@@ -257,12 +261,14 @@
import com.android.internal.util.XmlUtils;
import com.android.server.AttributeCache;
import com.android.server.BackgroundDexOptJobService;
+import com.android.server.DeviceIdleController;
import com.android.server.EventLogTags;
import com.android.server.FgThread;
import com.android.server.IntentResolver;
import com.android.server.LocalServices;
import com.android.server.ServiceThread;
import com.android.server.SystemConfig;
+import com.android.server.SystemServerInitThreadPool;
import com.android.server.Watchdog;
import com.android.server.net.NetworkPolicyManagerInternal;
import com.android.server.pm.Installer.InstallerException;
@@ -312,14 +318,15 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
-import java.util.HashSet;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
@@ -390,8 +397,8 @@
private static final boolean DISABLE_EPHEMERAL_APPS = false;
private static final boolean HIDE_EPHEMERAL_APIS = false;
- private static final boolean ENABLE_QUOTA =
- SystemProperties.getBoolean("persist.fw.quota", false);
+ private static final boolean ENABLE_FREE_CACHE_V2 =
+ SystemProperties.getBoolean("fw.free_cache_v2", false);
private static final int RADIO_UID = Process.PHONE_UID;
private static final int LOG_UID = Process.LOG_UID;
@@ -421,8 +428,11 @@
static final int SCAN_CHECK_ONLY = 1<<13;
static final int SCAN_DONT_KILL_APP = 1<<14;
static final int SCAN_IGNORE_FROZEN = 1<<15;
- static final int REMOVE_CHATTY = 1<<16;
- static final int SCAN_FIRST_BOOT_OR_UPGRADE = 1<<17;
+ static final int SCAN_FIRST_BOOT_OR_UPGRADE = 1<<16;
+ static final int SCAN_AS_INSTANT_APP = 1<<17;
+ static final int SCAN_AS_FULL_APP = 1<<18;
+ /** Should not be with the scan flags */
+ static final int FLAGS_REMOVE_CHATTY = 1<<31;
private static final String STATIC_SHARED_LIB_DELIMITER = "_";
@@ -545,9 +555,6 @@
public static final int REASON_LAST = REASON_CORE_APP;
- /** Special library name that skips shared libraries check during compilation. */
- private static final String SKIP_SHARED_LIBRARY_CHECK = "&";
-
/** All dangerous permission names in the same order as the events in MetricsEvent */
private static final List<String> ALL_DANGEROUS_PERMISSIONS = Arrays.asList(
Manifest.permission.READ_CALENDAR,
@@ -626,7 +633,6 @@
/** Directory where installed third-party apps stored */
final File mAppInstallDir;
- final File mEphemeralInstallDir;
/**
* Directory to which applications installed internally have their
@@ -657,9 +663,12 @@
final ArrayMap<String, Set<String>> mKnownCodebase =
new ArrayMap<String, Set<String>>();
- // Tracks available target package names -> overlay package paths.
- final ArrayMap<String, ArrayMap<String, PackageParser.Package>> mOverlays =
- new ArrayMap<String, ArrayMap<String, PackageParser.Package>>();
+ // List of APK paths to load for each user and package. This data is never
+ // persisted by the package manager. Instead, the overlay manager will
+ // ensure the data is up-to-date in runtime.
+ @GuardedBy("mPackages")
+ final SparseArray<ArrayMap<String, ArrayList<String>>> mEnabledOverlayPaths =
+ new SparseArray<ArrayMap<String, ArrayList<String>>>();
/**
* Tracks new system packages [received in an OTA] that we expect to
@@ -833,12 +842,12 @@
private int mIntentFilterVerificationToken = 0;
/** The service connection to the ephemeral resolver */
- final EphemeralResolverConnection mEphemeralResolverConnection;
+ final EphemeralResolverConnection mInstantAppResolverConnection;
/** Component used to install ephemeral applications */
- ComponentName mEphemeralInstallerComponent;
- final ActivityInfo mEphemeralInstallerActivity = new ActivityInfo();
- final ResolveInfo mEphemeralInstallerInfo = new ResolveInfo();
+ ComponentName mInstantAppInstallerComponent;
+ final ActivityInfo mInstantAppInstallerActivity = new ActivityInfo();
+ final ResolveInfo mInstantAppInstallerInfo = new ResolveInfo();
final SparseArray<IntentFilterVerificationState> mIntentFilterVerificationStates
= new SparseArray<IntentFilterVerificationState>();
@@ -850,10 +859,14 @@
private UserManagerInternal mUserManagerInternal;
+ private DeviceIdleController.LocalService mDeviceIdleController;
+
private File mCacheDir;
private ArraySet<String> mPrivappPermissionsViolations;
+ private Future<?> mPrepareAppDataFuture;
+
private static class IFVerificationParams {
PackageParser.Package pkg;
boolean replacing;
@@ -1156,7 +1169,7 @@
static final int START_INTENT_FILTER_VERIFICATIONS = 17;
static final int INTENT_FILTER_VERIFIED = 18;
static final int WRITE_PACKAGE_LIST = 19;
- static final int EPHEMERAL_RESOLUTION_PHASE_TWO = 20;
+ static final int INSTANT_APP_RESOLUTION_PHASE_TWO = 20;
static final int WRITE_SETTINGS_DELAY = 10*1000; // 10 seconds
@@ -1727,11 +1740,11 @@
break;
}
- case EPHEMERAL_RESOLUTION_PHASE_TWO: {
+ case INSTANT_APP_RESOLUTION_PHASE_TWO: {
EphemeralResolver.doEphemeralResolutionPhaseTwo(mContext,
- mEphemeralResolverConnection,
+ mInstantAppResolverConnection,
(EphemeralRequest) msg.obj,
- mEphemeralInstallerActivity,
+ mInstantAppInstallerActivity,
mHandler);
}
}
@@ -1779,28 +1792,32 @@
// the first time vs. those who are seeing an update.
int[] firstUsers = EMPTY_INT_ARRAY;
int[] updateUsers = EMPTY_INT_ARRAY;
- if (res.origUsers == null || res.origUsers.length == 0) {
- firstUsers = res.newUsers;
- } else {
- for (int newUser : res.newUsers) {
- boolean isNew = true;
- for (int origUser : res.origUsers) {
- if (origUser == newUser) {
- isNew = false;
- break;
- }
+ final boolean allNewUsers = res.origUsers == null || res.origUsers.length == 0;
+ final PackageSetting ps = (PackageSetting) res.pkg.mExtras;
+ for (int newUser : res.newUsers) {
+ if (ps.getInstantApp(newUser)) {
+ continue;
+ }
+ if (allNewUsers) {
+ firstUsers = ArrayUtils.appendInt(firstUsers, newUser);
+ continue;
+ }
+ boolean isNew = true;
+ for (int origUser : res.origUsers) {
+ if (origUser == newUser) {
+ isNew = false;
+ break;
}
- if (isNew) {
- firstUsers = ArrayUtils.appendInt(firstUsers, newUser);
- } else {
- updateUsers = ArrayUtils.appendInt(updateUsers, newUser);
- }
+ }
+ if (isNew) {
+ firstUsers = ArrayUtils.appendInt(firstUsers, newUser);
+ } else {
+ updateUsers = ArrayUtils.appendInt(updateUsers, newUser);
}
}
- // Send installed broadcasts if the install/update is not ephemeral
- // and the package is not a static shared lib.
- if (!isEphemeral(res.pkg) && res.pkg.staticSharedLibName == null) {
+ // Send installed broadcasts if the package is not a static shared lib.
+ if (res.pkg.staticSharedLibName == null) {
mProcessLoggingHandler.invalidateProcessLoggingBaseApkHash(res.pkg.baseCodePath);
// Send added for users that see the package for the first time
@@ -1887,16 +1904,14 @@
}
}
- if (!isEphemeral(res.pkg)) {
- // Notify DexManager that the package was installed for new users.
- // The updated users should already be indexed and the package code paths
- // should not change.
- // Don't notify the manager for ephemeral apps as they are not expected to
- // survive long enough to benefit of background optimizations.
- for (int userId : firstUsers) {
- PackageInfo info = getPackageInfo(packageName, /*flags*/ 0, userId);
- mDexManager.notifyPackageInstalled(info, userId);
- }
+ // Notify DexManager that the package was installed for new users.
+ // The updated users should already be indexed and the package code paths
+ // should not change.
+ // Don't notify the manager for ephemeral apps as they are not expected to
+ // survive long enough to benefit of background optimizations.
+ for (int userId : firstUsers) {
+ PackageInfo info = getPackageInfo(packageName, /*flags*/ 0, userId);
+ mDexManager.notifyPackageInstalled(info, userId);
}
}
@@ -2285,7 +2300,6 @@
File dataDir = Environment.getDataDirectory();
mAppInstallDir = new File(dataDir, "app");
mAppLib32InstallDir = new File(dataDir, "app-lib");
- mEphemeralInstallDir = new File(dataDir, "app-ephemeral");
mAsecInternalPath = new File(dataDir, "app-asec").getPath();
mDrmAppPrivateInstallDir = new File(dataDir, "app-private");
sUserManager = new UserManagerService(context, this,
@@ -2401,7 +2415,7 @@
DEXOPT_PUBLIC,
getCompilerFilterForReason(REASON_SHARED_APK),
StorageManager.UUID_PRIVATE_INTERNAL,
- SKIP_SHARED_LIBRARY_CHECK);
+ PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK);
}
} catch (FileNotFoundException e) {
Slog.w(TAG, "Library not found: " + libPath);
@@ -2589,10 +2603,6 @@
| PackageParser.PARSE_FORWARD_LOCK,
scanFlags | SCAN_REQUIRE_KNOWN, 0);
- scanDirLI(mEphemeralInstallDir, mDefParseFlags
- | PackageParser.PARSE_IS_EPHEMERAL,
- scanFlags | SCAN_REQUIRE_KNOWN, 0);
-
/**
* Remove disable package settings for any updated system
* apps that were removed via an OTA. If they're not a
@@ -2757,8 +2767,32 @@
} else {
storageFlags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE;
}
- reconcileAppsDataLI(StorageManager.UUID_PRIVATE_INTERNAL, UserHandle.USER_SYSTEM,
- storageFlags, true /* migrateAppData */);
+ List<String> deferPackages = reconcileAppsDataLI(StorageManager.UUID_PRIVATE_INTERNAL,
+ UserHandle.USER_SYSTEM, storageFlags, true /* migrateAppData */,
+ true /* onlyCoreApps */);
+ mPrepareAppDataFuture = SystemServerInitThreadPool.get().submit(() -> {
+ if (deferPackages == null || deferPackages.isEmpty()) {
+ return;
+ }
+ int count = 0;
+ for (String pkgName : deferPackages) {
+ PackageParser.Package pkg = null;
+ synchronized (mPackages) {
+ PackageSetting ps = mSettings.getPackageLPr(pkgName);
+ if (ps != null && ps.getInstalled(UserHandle.USER_SYSTEM)) {
+ pkg = ps.pkg;
+ }
+ }
+ if (pkg != null) {
+ synchronized (mInstallLock) {
+ prepareAppDataAndMigrateLIF(pkg, UserHandle.USER_SYSTEM, storageFlags,
+ true /* maybeMigrateAppData */);
+ }
+ count++;
+ }
+ }
+ Slog.i(TAG, "Deferred reconcileAppsData finished " + count + " packages");
+ }, "prepareAppData");
// If this is first boot after an OTA, and a normal boot, then
// we need to clear code cache directories.
@@ -2861,17 +2895,17 @@
if (DEBUG_EPHEMERAL) {
Slog.i(TAG, "Ephemeral resolver: " + ephemeralResolverComponent);
}
- mEphemeralResolverConnection =
+ mInstantAppResolverConnection =
new EphemeralResolverConnection(mContext, ephemeralResolverComponent);
} else {
- mEphemeralResolverConnection = null;
+ mInstantAppResolverConnection = null;
}
- mEphemeralInstallerComponent = getEphemeralInstallerLPr();
- if (mEphemeralInstallerComponent != null) {
+ mInstantAppInstallerComponent = getEphemeralInstallerLPr();
+ if (mInstantAppInstallerComponent != null) {
if (DEBUG_EPHEMERAL) {
- Slog.i(TAG, "Ephemeral installer: " + mEphemeralInstallerComponent);
+ Slog.i(TAG, "Ephemeral installer: " + mInstantAppInstallerComponent);
}
- setUpEphemeralInstallerActivityLP(mEphemeralInstallerComponent);
+ setUpInstantAppInstallerActivityLP(mInstantAppInstallerComponent);
}
// Read and update the usage of dex files.
@@ -3335,14 +3369,14 @@
&& callingAppId != Process.ROOT_UID
&& checkUidPermission(Manifest.permission.ACCESS_INSTANT_APPS,
Binder.getCallingUid()) != PackageManager.PERMISSION_GRANTED) {
- final String ephemeralPackageName = getEphemeralPackageName(Binder.getCallingUid());
- if (ephemeralPackageName != null) {
+ final String instantAppPackageName = getInstantAppPackageName(Binder.getCallingUid());
+ if (instantAppPackageName != null) {
// ephemeral apps can only get information on themselves
- if (!ephemeralPackageName.equals(p.packageName)) {
+ if (!instantAppPackageName.equals(p.packageName)) {
return null;
}
} else {
- if (p.applicationInfo.isInstantApp()) {
+ if (ps.getInstantApp(userId)) {
// only get access to the ephemeral app if we've been granted access
if (!mInstantAppRegistry.isInstantAccessGranted(
userId, callingAppId, ps.appId)) {
@@ -3705,6 +3739,7 @@
ApplicationInfo ai = PackageParser.generateApplicationInfo(ps.pkg, flags,
ps.readUserState(userId), userId);
if (ai != null) {
+ rebaseEnabledOverlays(ai, userId);
ai.packageName = resolveExternalPackageNameLPr(ps.pkg);
}
return ai;
@@ -3739,6 +3774,7 @@
ApplicationInfo ai = PackageParser.generateApplicationInfo(
p, flags, ps.readUserState(userId), userId);
if (ai != null) {
+ rebaseEnabledOverlays(ai, userId);
ai.packageName = resolveExternalPackageNameLPr(p);
}
return ai;
@@ -3755,6 +3791,26 @@
return null;
}
+ private void rebaseEnabledOverlays(@NonNull ApplicationInfo ai, int userId) {
+ List<String> paths = new ArrayList<>();
+ ArrayMap<String, ArrayList<String>> userSpecificOverlays =
+ mEnabledOverlayPaths.get(userId);
+ if (userSpecificOverlays != null) {
+ if (!"android".equals(ai.packageName)) {
+ ArrayList<String> frameworkOverlays = userSpecificOverlays.get("android");
+ if (frameworkOverlays != null) {
+ paths.addAll(frameworkOverlays);
+ }
+ }
+
+ ArrayList<String> appOverlays = userSpecificOverlays.get(ai.packageName);
+ if (appOverlays != null) {
+ paths.addAll(appOverlays);
+ }
+ }
+ ai.resourceDirs = paths.size() > 0 ? paths.toArray(new String[paths.size()]) : null;
+ }
+
private String normalizePackageNameLPr(String packageName) {
String normalizedPackageName = mSettings.getRenamedPackageLPr(packageName);
return normalizedPackageName != null ? normalizedPackageName : packageName;
@@ -3765,25 +3821,19 @@
final IPackageDataObserver observer) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CLEAR_APP_CACHE, null);
- // Queue up an async operation since clearing cache may take a little while.
- mHandler.post(new Runnable() {
- public void run() {
- mHandler.removeCallbacks(this);
- boolean success = true;
- synchronized (mInstallLock) {
- try {
- mInstaller.freeCache(volumeUuid, freeStorageSize, 0);
- } catch (InstallerException e) {
- Slog.w(TAG, "Couldn't clear application caches: " + e);
- success = false;
- }
- }
- if (observer != null) {
- try {
- observer.onRemoveCompleted(null, success);
- } catch (RemoteException e) {
- Slog.w(TAG, "RemoveException when invoking call back");
- }
+ mHandler.post(() -> {
+ boolean success = false;
+ try {
+ freeStorage(volumeUuid, freeStorageSize, 0);
+ success = true;
+ } catch (IOException e) {
+ Slog.w(TAG, e);
+ }
+ if (observer != null) {
+ try {
+ observer.onRemoveCompleted(null, success);
+ } catch (RemoteException e) {
+ Slog.w(TAG, e);
}
}
});
@@ -3793,42 +3843,77 @@
public void freeStorage(final String volumeUuid, final long freeStorageSize,
final IntentSender pi) {
mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.CLEAR_APP_CACHE, null);
- // Queue up an async operation since clearing cache may take a little while.
- mHandler.post(new Runnable() {
- public void run() {
- mHandler.removeCallbacks(this);
- boolean success = true;
- synchronized (mInstallLock) {
- try {
- mInstaller.freeCache(volumeUuid, freeStorageSize, 0);
- } catch (InstallerException e) {
- Slog.w(TAG, "Couldn't clear application caches: " + e);
- success = false;
- }
- }
- if(pi != null) {
- try {
- // Callback via pending intent
- int code = success ? 1 : 0;
- pi.sendIntent(null, code, null,
- null, null);
- } catch (SendIntentException e1) {
- Slog.i(TAG, "Failed to send pending intent");
- }
+ android.Manifest.permission.CLEAR_APP_CACHE, TAG);
+ mHandler.post(() -> {
+ boolean success = false;
+ try {
+ freeStorage(volumeUuid, freeStorageSize, 0);
+ success = true;
+ } catch (IOException e) {
+ Slog.w(TAG, e);
+ }
+ if (pi != null) {
+ try {
+ pi.sendIntent(null, success ? 1 : 0, null, null, null);
+ } catch (SendIntentException e) {
+ Slog.w(TAG, e);
}
}
});
}
- void freeStorage(String volumeUuid, long freeStorageSize) throws IOException {
- synchronized (mInstallLock) {
- try {
- mInstaller.freeCache(volumeUuid, freeStorageSize, 0);
- } catch (InstallerException e) {
- throw new IOException("Failed to free enough space", e);
+ /**
+ * Blocking call to clear various types of cached data across the system
+ * until the requested bytes are available.
+ */
+ public void freeStorage(String volumeUuid, long bytes, int storageFlags) throws IOException {
+ final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ final File file = storage.findPathForUuid(volumeUuid);
+
+ if (ENABLE_FREE_CACHE_V2) {
+ final boolean aggressive = (storageFlags
+ & StorageManager.FLAG_ALLOCATE_AGGRESSIVE) != 0;
+
+ // 1. Pre-flight to determine if we have any chance to succeed
+ // 2. Consider preloaded data (after 1w honeymoon, unless aggressive)
+
+ // 3. Consider parsed APK data (aggressive only)
+ if (aggressive) {
+ FileUtils.deleteContents(mCacheDir);
}
+ if (file.getUsableSpace() >= bytes) return;
+
+ // 4. Consider cached app data (above quotas)
+ try {
+ mInstaller.freeCache(volumeUuid, bytes, Installer.FLAG_FREE_CACHE_V2);
+ } catch (InstallerException ignored) {
+ }
+ if (file.getUsableSpace() >= bytes) return;
+
+ // 5. Consider shared libraries with refcount=0 and age>2h
+ // 6. Consider dexopt output (aggressive only)
+ // 7. Consider ephemeral apps not used in last week
+
+ // 8. Consider cached app data (below quotas)
+ try {
+ mInstaller.freeCache(volumeUuid, bytes, Installer.FLAG_FREE_CACHE_V2
+ | Installer.FLAG_FREE_CACHE_V2_DEFY_QUOTA);
+ } catch (InstallerException ignored) {
+ }
+ if (file.getUsableSpace() >= bytes) return;
+
+ // 9. Consider DropBox entries
+ // 10. Consider ephemeral cookies
+
+ } else {
+ try {
+ mInstaller.freeCache(volumeUuid, bytes, 0);
+ } catch (InstallerException ignored) {
+ }
+ if (file.getUsableSpace() >= bytes) return;
}
+
+ throw new IOException("Failed to free " + bytes + " on storage device at " + file);
}
/**
@@ -3858,6 +3943,14 @@
return mUserManagerInternal;
}
+ private DeviceIdleController.LocalService getDeviceIdleController() {
+ if (mDeviceIdleController == null) {
+ mDeviceIdleController =
+ LocalServices.getService(DeviceIdleController.LocalService.class);
+ }
+ return mDeviceIdleController;
+ }
+
/**
* Update given flags when being used to request {@link PackageInfo}.
*/
@@ -3946,26 +4039,46 @@
/**
* Update given flags when being used to request {@link ResolveInfo}.
+ * <p>Instant apps are resolved specially, depending upon context. Minimally,
+ * {@code}flags{@code} must have the {@link PackageManager#MATCH_INSTANT}
+ * flag set. However, this flag is only honoured in three circumstances:
+ * <ul>
+ * <li>when called from a system process</li>
+ * <li>when the caller holds the permission {@code android.permission.ACCESS_INSTANT_APPS}</li>
+ * <li>when resolution occurs to start an activity with a {@code android.intent.action.VIEW}
+ * action and a {@code android.intent.category.BROWSABLE} category</li>
+ * </ul>
*/
- int updateFlagsForResolve(int flags, int userId, Object cookie) {
+ int updateFlagsForResolve(int flags, int userId, Intent intent, boolean includeInstantApp) {
// Safe mode means we shouldn't match any third-party components
if (mSafeMode) {
flags |= PackageManager.MATCH_SYSTEM_ONLY;
}
final int callingUid = Binder.getCallingUid();
- if (callingUid == Process.SYSTEM_UID || callingUid == 0) {
- // The system sees all components
- flags |= PackageManager.MATCH_EPHEMERAL;
- } else if (getEphemeralPackageName(callingUid) != null) {
+ if (getInstantAppPackageName(callingUid) != null) {
// But, ephemeral apps see both ephemeral and exposed, non-ephemeral components
- flags |= PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY;
- flags |= PackageManager.MATCH_EPHEMERAL;
+ flags |= PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY;
+ flags |= PackageManager.MATCH_INSTANT;
} else {
// Otherwise, prevent leaking ephemeral components
- flags &= ~PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY;
- flags &= ~PackageManager.MATCH_EPHEMERAL;
+ final boolean isSpecialProcess =
+ callingUid == Process.SYSTEM_UID
+ || callingUid == Process.SHELL_UID
+ || callingUid == 0;
+ final boolean allowMatchInstant =
+ (includeInstantApp
+ && Intent.ACTION_VIEW.equals(intent.getAction())
+ && intent.hasCategory(Intent.CATEGORY_BROWSABLE)
+ && hasWebURI(intent))
+ || isSpecialProcess
+ || mContext.checkCallingOrSelfPermission(
+ android.Manifest.permission.ACCESS_INSTANT_APPS) == PERMISSION_GRANTED;
+ flags &= ~PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY;
+ if (!allowMatchInstant) {
+ flags &= ~PackageManager.MATCH_INSTANT;
+ }
}
- return updateFlagsForComponent(flags, userId, cookie);
+ return updateFlagsForComponent(flags, userId, intent /*cookie*/);
}
@Override
@@ -4692,7 +4805,8 @@
return;
}
- if (pkg.applicationInfo.isInstantApp() && !bp.isInstant()) {
+ final PackageSetting ps = mSettings.mPackages.get(packageName);
+ if (ps.getInstantApp(userId) && !bp.isInstant()) {
throw new SecurityException("Cannot grant non-ephemeral permission"
+ name + " for package " + packageName);
}
@@ -5489,17 +5603,23 @@
@Override
public ResolveInfo resolveIntent(Intent intent, String resolvedType,
int flags, int userId) {
+ return resolveIntentInternal(
+ intent, resolvedType, flags, userId, false /*includeInstantApp*/);
+ }
+
+ private ResolveInfo resolveIntentInternal(Intent intent, String resolvedType,
+ int flags, int userId, boolean includeInstantApp) {
try {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "resolveIntent");
if (!sUserManager.exists(userId)) return null;
- flags = updateFlagsForResolve(flags, userId, intent);
+ flags = updateFlagsForResolve(flags, userId, intent, includeInstantApp);
enforceCrossUserPermission(Binder.getCallingUid(), userId,
false /*requireFullPermission*/, false /*checkShell*/, "resolve intent");
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "queryIntentActivities");
final List<ResolveInfo> query = queryIntentActivitiesInternal(intent, resolvedType,
- flags, userId);
+ flags, userId, includeInstantApp);
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
final ResolveInfo bestChoice =
@@ -5521,7 +5641,7 @@
}
intent = updateIntentForResolve(intent);
final String resolvedType = intent.resolveTypeIfNeeded(mContext.getContentResolver());
- final int flags = updateFlagsForResolve(0, userId, intent);
+ final int flags = updateFlagsForResolve(0, userId, intent, false);
final List<ResolveInfo> query = queryIntentActivitiesInternal(intent, resolvedType, flags,
userId);
synchronized (mPackages) {
@@ -5564,6 +5684,11 @@
false, false, false, userId);
}
+ /**
+ * Returns whether or not instant apps have been disabled remotely.
+ * <p><em>IMPORTANT</em> This should not be called with the package manager lock
+ * held. Otherwise we run the risk of deadlock.
+ */
private boolean isEphemeralDisabled() {
// ephemeral apps have been disabled across the board
if (DISABLE_EPHEMERAL_APPS) {
@@ -5584,18 +5709,14 @@
private boolean isEphemeralAllowed(
Intent intent, List<ResolveInfo> resolvedActivities, int userId,
boolean skipPackageCheck) {
- // Short circuit and return early if possible.
- if (isEphemeralDisabled()) {
- return false;
- }
final int callingUser = UserHandle.getCallingUserId();
if (callingUser != UserHandle.USER_SYSTEM) {
return false;
}
- if (mEphemeralResolverConnection == null) {
+ if (mInstantAppResolverConnection == null) {
return false;
}
- if (mEphemeralInstallerComponent == null) {
+ if (mInstantAppInstallerComponent == null) {
return false;
}
if (intent.getComponent() != null) {
@@ -5612,6 +5733,7 @@
return false;
}
// Deny ephemeral apps if the user chose _ALWAYS or _ALWAYS_ASK for intent resolution.
+ // Or if there's already an ephemeral app installed that handles the action
synchronized (mPackages) {
final int count = (resolvedActivities == null ? 0 : resolvedActivities.size());
for (int n = 0; n < count; n++) {
@@ -5630,6 +5752,9 @@
}
return false;
}
+ if (ps.getInstantApp(userId)) {
+ return false;
+ }
}
}
}
@@ -5637,11 +5762,11 @@
return true;
}
- private void requestEphemeralResolutionPhaseTwo(EphemeralResponse responseObj,
- Intent origIntent, String resolvedType, Intent launchIntent, String callingPackage,
+ private void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
+ Intent origIntent, String resolvedType, String callingPackage,
int userId) {
- final Message msg = mHandler.obtainMessage(EPHEMERAL_RESOLUTION_PHASE_TWO,
- new EphemeralRequest(responseObj, origIntent, resolvedType, launchIntent,
+ final Message msg = mHandler.obtainMessage(INSTANT_APP_RESOLUTION_PHASE_TWO,
+ new EphemeralRequest(responseObj, origIntent, resolvedType,
callingPackage, userId));
mHandler.sendMessage(msg);
}
@@ -5676,6 +5801,13 @@
if (ri != null) {
return ri;
}
+ // If we have an ephemeral app, use it
+ for (int i = 0; i < N; i++) {
+ ri = query.get(i);
+ if (ri.activityInfo.applicationInfo.isInstantApp()) {
+ return ri;
+ }
+ }
ri = new ResolveInfo(mResolveInfo);
ri.activityInfo = new ActivityInfo(ri.activityInfo);
ri.activityInfo.labelRes = ResolverActivity.getLabelRes(intent.getAction());
@@ -5741,8 +5873,7 @@
List<PersistentPreferredActivity> pprefs = ppir != null
? ppir.queryIntent(intent, resolvedType,
(flags & PackageManager.MATCH_DEFAULT_ONLY) != 0,
- (flags & PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0,
- (flags & PackageManager.MATCH_EPHEMERAL) != 0, userId)
+ userId)
: null;
if (pprefs != null && pprefs.size() > 0) {
final int M = pprefs.size();
@@ -5795,7 +5926,7 @@
List<ResolveInfo> query, int priority, boolean always,
boolean removeMatches, boolean debug, int userId) {
if (!sUserManager.exists(userId)) return null;
- flags = updateFlagsForResolve(flags, userId, intent);
+ flags = updateFlagsForResolve(flags, userId, intent, false);
intent = updateIntentForResolve(intent);
// writer
synchronized (mPackages) {
@@ -5814,8 +5945,7 @@
List<PreferredActivity> prefs = pir != null
? pir.queryIntent(intent, resolvedType,
(flags & PackageManager.MATCH_DEFAULT_ONLY) != 0,
- (flags & PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0,
- (flags & PackageManager.MATCH_EPHEMERAL) != 0, userId)
+ userId)
: null;
if (prefs != null && prefs.size() > 0) {
boolean changed = false;
@@ -5964,7 +6094,7 @@
// cross-profile app linking works only towards the parent.
final UserInfo parent = getProfileParent(sourceUserId);
synchronized(mPackages) {
- int flags = updateFlagsForResolve(0, parent.id, intent);
+ int flags = updateFlagsForResolve(0, parent.id, intent, false);
CrossProfileDomainInfo xpDomainInfo = getCrossProfileDomainPreferredLpr(
intent, resolvedType, flags, sourceUserId, parent.id);
return xpDomainInfo != null;
@@ -5986,8 +6116,7 @@
String resolvedType, int userId) {
CrossProfileIntentResolver resolver = mSettings.mCrossProfileIntentResolvers.get(userId);
if (resolver != null) {
- return resolver.queryIntent(intent, resolvedType, false /*defaultOnly*/,
- false /*visibleToEphemeral*/, false /*isInstant*/, userId);
+ return resolver.queryIntent(intent, resolvedType, false /*defaultOnly*/, userId);
}
return null;
}
@@ -6006,16 +6135,17 @@
}
/**
- * Returns the package name of the calling Uid if it's an ephemeral app. If it isn't
- * ephemeral, returns {@code null}.
+ * Returns the package name of the calling Uid if it's an instant app. If it isn't
+ * instant, returns {@code null}.
*/
- private String getEphemeralPackageName(int callingUid) {
+ private String getInstantAppPackageName(int callingUid) {
final int appId = UserHandle.getAppId(callingUid);
synchronized (mPackages) {
final Object obj = mSettings.getUserIdLPr(appId);
if (obj instanceof PackageSetting) {
final PackageSetting ps = (PackageSetting) obj;
- return ps.pkg.applicationInfo.isInstantApp() ? ps.pkg.packageName : null;
+ final boolean isInstantApp = ps.getInstantApp(UserHandle.getUserId(callingUid));
+ return isInstantApp ? ps.pkg.packageName : null;
}
}
return null;
@@ -6023,9 +6153,14 @@
private @NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent,
String resolvedType, int flags, int userId) {
+ return queryIntentActivitiesInternal(intent, resolvedType, flags, userId, false);
+ }
+
+ private @NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent,
+ String resolvedType, int flags, int userId, boolean includeInstantApp) {
if (!sUserManager.exists(userId)) return Collections.emptyList();
- final String ephemeralPkgName = getEphemeralPackageName(Binder.getCallingUid());
- flags = updateFlagsForResolve(flags, userId, intent);
+ final String instantAppPkgName = getInstantAppPackageName(Binder.getCallingUid());
+ flags = updateFlagsForResolve(flags, userId, intent, includeInstantApp);
enforceCrossUserPermission(Binder.getCallingUid(), userId,
false /* requireFullPermission */, false /* checkShell */,
"query intent activities");
@@ -6045,23 +6180,31 @@
// used when either 1) the calling package is normal and the activity is within
// an ephemeral application or 2) the calling package is ephemeral and the
// activity is not visible to ephemeral applications.
- boolean matchEphemeral =
- (flags & PackageManager.MATCH_EPHEMERAL) != 0;
- boolean ephemeralVisibleOnly =
- (flags & PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0;
- boolean blockResolution =
- (!matchEphemeral && ephemeralPkgName == null
- && (ai.applicationInfo.privateFlags
- & ApplicationInfo.PRIVATE_FLAG_EPHEMERAL) != 0)
- || (ephemeralVisibleOnly && ephemeralPkgName != null
- && (ai.flags & ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL) == 0);
+ final boolean matchInstantApp =
+ (flags & PackageManager.MATCH_INSTANT) != 0;
+ final boolean matchVisibleToInstantAppOnly =
+ (flags & PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY) != 0;
+ final boolean isCallerInstantApp =
+ instantAppPkgName != null;
+ final boolean isTargetSameInstantApp =
+ comp.getPackageName().equals(instantAppPkgName);
+ final boolean isTargetInstantApp =
+ (ai.applicationInfo.privateFlags
+ & ApplicationInfo.PRIVATE_FLAG_INSTANT) != 0;
+ final boolean isTargetHiddenFromInstantApp =
+ (ai.flags & ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL) == 0;
+ final boolean blockResolution =
+ !isTargetSameInstantApp
+ && ((!matchInstantApp && !isCallerInstantApp && isTargetInstantApp)
+ || (matchVisibleToInstantAppOnly && isCallerInstantApp
+ && isTargetHiddenFromInstantApp));
if (!blockResolution) {
final ResolveInfo ri = new ResolveInfo();
ri.activityInfo = ai;
list.add(ri);
}
}
- return list;
+ return applyPostResolutionFilter(list, instantAppPkgName);
}
// reader
@@ -6069,6 +6212,7 @@
boolean addEphemeral = false;
List<ResolveInfo> result;
final String pkgName = intent.getPackage();
+ final boolean ephemeralDisabled = isEphemeralDisabled();
synchronized (mPackages) {
if (pkgName == null) {
List<CrossProfileIntentFilter> matchingFilters =
@@ -6079,15 +6223,15 @@
if (xpResolveInfo != null) {
List<ResolveInfo> xpResult = new ArrayList<ResolveInfo>(1);
xpResult.add(xpResolveInfo);
- return filterForEphemeral(
- filterIfNotSystemUser(xpResult, userId), ephemeralPkgName);
+ return applyPostResolutionFilter(
+ filterIfNotSystemUser(xpResult, userId), instantAppPkgName);
}
// Check for results in the current profile.
result = filterIfNotSystemUser(mActivities.queryIntent(
intent, resolvedType, flags, userId), userId);
- addEphemeral =
- isEphemeralAllowed(intent, result, userId, false /*skipPackageCheck*/);
+ addEphemeral = !ephemeralDisabled
+ && isEphemeralAllowed(intent, result, userId, false /*skipPackageCheck*/);
// Check for cross profile results.
boolean hasNonNegativePriorityResult = hasNonNegativePriority(result);
@@ -6120,13 +6264,13 @@
// And we are not going to add emphemeral app, so we can return the
// result straight away.
result.add(xpDomainInfo.resolveInfo);
- return filterForEphemeral(result, ephemeralPkgName);
+ return applyPostResolutionFilter(result, instantAppPkgName);
}
} else if (result.size() <= 1 && !addEphemeral) {
// No result in parent user and <= 1 result in current profile, and we
// are not going to add emphemeral app, so we can return the result without
// further processing.
- return filterForEphemeral(result, ephemeralPkgName);
+ return applyPostResolutionFilter(result, instantAppPkgName);
}
// We have more than one candidate (combining results from current and parent
// profile), so we need filtering and sorting.
@@ -6137,15 +6281,16 @@
} else {
final PackageParser.Package pkg = mPackages.get(pkgName);
if (pkg != null) {
- result = filterForEphemeral(filterIfNotSystemUser(
+ result = applyPostResolutionFilter(filterIfNotSystemUser(
mActivities.queryIntentForPackage(
intent, resolvedType, flags, pkg.activities, userId),
- userId), ephemeralPkgName);
+ userId), instantAppPkgName);
} else {
// the caller wants to resolve for a particular package; however, there
// were no installed results, so, try to find an ephemeral result
- addEphemeral = isEphemeralAllowed(
- intent, null /*result*/, userId, true /*skipPackageCheck*/);
+ addEphemeral = !ephemeralDisabled
+ && isEphemeralAllowed(
+ intent, null /*result*/, userId, true /*skipPackageCheck*/);
result = new ArrayList<ResolveInfo>();
}
}
@@ -6154,15 +6299,16 @@
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "resolveEphemeral");
final EphemeralRequest requestObject = new EphemeralRequest(
null /*responseObj*/, intent /*origIntent*/, resolvedType,
- null /*launchIntent*/, null /*callingPackage*/, userId);
- final EphemeralResponse intentInfo = EphemeralResolver.doEphemeralResolutionPhaseOne(
- mContext, mEphemeralResolverConnection, requestObject);
- if (intentInfo != null) {
+ null /*callingPackage*/, userId);
+ final AuxiliaryResolveInfo auxiliaryResponse =
+ EphemeralResolver.doEphemeralResolutionPhaseOne(
+ mContext, mInstantAppResolverConnection, requestObject);
+ if (auxiliaryResponse != null) {
if (DEBUG_EPHEMERAL) {
Slog.v(TAG, "Adding ephemeral installer to the ResolveInfo list");
}
- final ResolveInfo ephemeralInstaller = new ResolveInfo(mEphemeralInstallerInfo);
- ephemeralInstaller.ephemeralResponse = intentInfo;
+ final ResolveInfo ephemeralInstaller = new ResolveInfo(mInstantAppInstallerInfo);
+ ephemeralInstaller.auxiliaryInfo = auxiliaryResponse;
// make sure this resolver is the default
ephemeralInstaller.isDefault = true;
ephemeralInstaller.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART
@@ -6178,7 +6324,7 @@
if (sortResult) {
Collections.sort(result, mResolvePrioritySorter);
}
- return filterForEphemeral(result, ephemeralPkgName);
+ return applyPostResolutionFilter(result, instantAppPkgName);
}
private static class CrossProfileDomainInfo {
@@ -6286,16 +6432,40 @@
* is performed.
* @return A filtered list of resolved activities.
*/
- private List<ResolveInfo> filterForEphemeral(List<ResolveInfo> resolveInfos,
+ private List<ResolveInfo> applyPostResolutionFilter(List<ResolveInfo> resolveInfos,
String ephemeralPkgName) {
+ // TODO: When adding on-demand split support for non-instant apps, remove this check
+ // and always apply post filtering
if (ephemeralPkgName == null) {
return resolveInfos;
}
for (int i = resolveInfos.size() - 1; i >= 0; i--) {
- ResolveInfo info = resolveInfos.get(i);
+ final ResolveInfo info = resolveInfos.get(i);
final boolean isEphemeralApp = info.activityInfo.applicationInfo.isInstantApp();
// allow activities that are defined in the provided package
if (isEphemeralApp && ephemeralPkgName.equals(info.activityInfo.packageName)) {
+ if (info.activityInfo.splitName != null
+ && !ArrayUtils.contains(info.activityInfo.applicationInfo.splitNames,
+ info.activityInfo.splitName)) {
+ // requested activity is defined in a split that hasn't been installed yet.
+ // add the installer to the resolve list
+ if (DEBUG_EPHEMERAL) {
+ Slog.v(TAG, "Adding ephemeral installer to the ResolveInfo list");
+ }
+ final ResolveInfo installerInfo = new ResolveInfo(mInstantAppInstallerInfo);
+ installerInfo.auxiliaryInfo = new AuxiliaryResolveInfo(
+ info.activityInfo.packageName, info.activityInfo.splitName,
+ info.activityInfo.applicationInfo.versionCode);
+ // make sure this resolver is the default
+ installerInfo.isDefault = true;
+ installerInfo.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART
+ | IntentFilter.MATCH_ADJUSTMENT_NORMAL;
+ // add a non-generic filter
+ installerInfo.filter = new IntentFilter();
+ // load resources from the correct package
+ installerInfo.resolvePackageName = info.getComponentInfo().packageName;
+ resolveInfos.set(i, installerInfo);
+ }
continue;
}
// allow activities that have been explicitly exposed to ephemeral apps
@@ -6619,7 +6789,7 @@
Intent[] specifics, String[] specificTypes, Intent intent,
String resolvedType, int flags, int userId) {
if (!sUserManager.exists(userId)) return Collections.emptyList();
- flags = updateFlagsForResolve(flags, userId, intent);
+ flags = updateFlagsForResolve(flags, userId, intent, false);
enforceCrossUserPermission(Binder.getCallingUid(), userId,
false /* requireFullPermission */, false /* checkShell */,
"query intent activity options");
@@ -6799,7 +6969,7 @@
private @NonNull List<ResolveInfo> queryIntentReceiversInternal(Intent intent,
String resolvedType, int flags, int userId) {
if (!sUserManager.exists(userId)) return Collections.emptyList();
- flags = updateFlagsForResolve(flags, userId, intent);
+ flags = updateFlagsForResolve(flags, userId, intent, false);
ComponentName comp = intent.getComponent();
if (comp == null) {
if (intent.getSelector() != null) {
@@ -6836,7 +7006,7 @@
@Override
public ResolveInfo resolveService(Intent intent, String resolvedType, int flags, int userId) {
if (!sUserManager.exists(userId)) return null;
- flags = updateFlagsForResolve(flags, userId, intent);
+ flags = updateFlagsForResolve(flags, userId, intent, false);
List<ResolveInfo> query = queryIntentServicesInternal(intent, resolvedType, flags, userId);
if (query != null) {
if (query.size() >= 1) {
@@ -6858,7 +7028,7 @@
private @NonNull List<ResolveInfo> queryIntentServicesInternal(Intent intent,
String resolvedType, int flags, int userId) {
if (!sUserManager.exists(userId)) return Collections.emptyList();
- flags = updateFlagsForResolve(flags, userId, intent);
+ flags = updateFlagsForResolve(flags, userId, intent, false);
ComponentName comp = intent.getComponent();
if (comp == null) {
if (intent.getSelector() != null) {
@@ -6902,7 +7072,7 @@
private @NonNull List<ResolveInfo> queryIntentContentProvidersInternal(
Intent intent, String resolvedType, int flags, int userId) {
if (!sUserManager.exists(userId)) return Collections.emptyList();
- flags = updateFlagsForResolve(flags, userId, intent);
+ flags = updateFlagsForResolve(flags, userId, intent, false);
ComponentName comp = intent.getComponent();
if (comp == null) {
if (intent.getSelector() != null) {
@@ -7074,6 +7244,7 @@
ai = PackageParser.generateApplicationInfo(ps.pkg, effectiveFlags,
ps.readUserState(userId), userId);
if (ai != null) {
+ rebaseEnabledOverlays(ai, userId);
ai.packageName = resolveExternalPackageNameLPr(ps.pkg);
}
} else {
@@ -7097,6 +7268,7 @@
ApplicationInfo ai = PackageParser.generateApplicationInfo(p, flags,
ps.readUserState(userId), userId);
if (ai != null) {
+ rebaseEnabledOverlays(ai, userId);
ai.packageName = resolveExternalPackageNameLPr(p);
list.add(ai);
}
@@ -7142,9 +7314,9 @@
return false;
}
synchronized (mPackages) {
- PackageParser.Package pkg = mPackages.get(packageName);
- if (pkg != null) {
- return pkg.applicationInfo.isInstantApp();
+ final PackageSetting ps = mSettings.mPackages.get(packageName);
+ if (ps != null) {
+ return ps.getInstantApp(userId);
}
}
return false;
@@ -7240,6 +7412,7 @@
ApplicationInfo ai = PackageParser.generateApplicationInfo(p, flags,
ps.readUserState(userId), userId);
if (ai != null) {
+ rebaseEnabledOverlays(ai, userId);
finalList.add(ai);
}
}
@@ -7299,7 +7472,7 @@
@Override
public @NonNull ParceledListSlice<ProviderInfo> queryContentProviders(String processName,
- int uid, int flags) {
+ int uid, int flags, String metaDataKey) {
final int userId = processName != null ? UserHandle.getUserId(uid)
: UserHandle.getCallingUserId();
if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList();
@@ -7317,6 +7490,14 @@
|| (p.info.processName.equals(processName)
&& UserHandle.isSameApp(p.info.applicationInfo.uid, uid)))
&& mSettings.isEnabledAndMatchLPr(p.info, flags, userId)) {
+
+ // See PM.queryContentProviders()'s javadoc for why we have the metaData
+ // parameter.
+ if (metaDataKey != null
+ && (p.metaData == null || !p.metaData.containsKey(metaDataKey))) {
+ continue;
+ }
+
if (finalList == null) {
finalList = new ArrayList<ProviderInfo>(3);
}
@@ -7375,60 +7556,6 @@
return finalList;
}
- private void createIdmapsForPackageLI(PackageParser.Package pkg) {
- ArrayMap<String, PackageParser.Package> overlays = mOverlays.get(pkg.packageName);
- if (overlays == null) {
- Slog.w(TAG, "Unable to create idmap for " + pkg.packageName + ": no overlay packages");
- return;
- }
- for (PackageParser.Package opkg : overlays.values()) {
- // Not much to do if idmap fails: we already logged the error
- // and we certainly don't want to abort installation of pkg simply
- // because an overlay didn't fit properly. For these reasons,
- // ignore the return value of createIdmapForPackagePairLI.
- createIdmapForPackagePairLI(pkg, opkg);
- }
- }
-
- private boolean createIdmapForPackagePairLI(PackageParser.Package pkg,
- PackageParser.Package opkg) {
- if (!opkg.mTrustedOverlay) {
- Slog.w(TAG, "Skipping target and overlay pair " + pkg.baseCodePath + " and " +
- opkg.baseCodePath + ": overlay not trusted");
- return false;
- }
- ArrayMap<String, PackageParser.Package> overlaySet = mOverlays.get(pkg.packageName);
- if (overlaySet == null) {
- Slog.e(TAG, "was about to create idmap for " + pkg.baseCodePath + " and " +
- opkg.baseCodePath + " but target package has no known overlays");
- return false;
- }
- final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid);
- // TODO: generate idmap for split APKs
- try {
- mInstaller.idmap(pkg.baseCodePath, opkg.baseCodePath, sharedGid);
- } catch (InstallerException e) {
- Slog.e(TAG, "Failed to generate idmap for " + pkg.baseCodePath + " and "
- + opkg.baseCodePath);
- return false;
- }
- PackageParser.Package[] overlayArray =
- overlaySet.values().toArray(new PackageParser.Package[0]);
- Comparator<PackageParser.Package> cmp = new Comparator<PackageParser.Package>() {
- public int compare(PackageParser.Package p1, PackageParser.Package p2) {
- return p1.mOverlayPriority - p2.mOverlayPriority;
- }
- };
- Arrays.sort(overlayArray, cmp);
-
- pkg.applicationInfo.resourceDirs = new String[overlayArray.length];
- int i = 0;
- for (PackageParser.Package p : overlayArray) {
- pkg.applicationInfo.resourceDirs[i++] = p.baseCodePath;
- }
- return true;
- }
-
private void scanDirTracedLI(File dir, final int parseFlags, int scanFlags, long currentTime) {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "scanDir [" + dir.getAbsolutePath() + "]");
try {
@@ -7647,7 +7774,7 @@
* @throws PackageManagerException on a parse error.
*/
private PackageParser.Package scanPackageLI(PackageParser.Package pkg, File scanFile,
- final int policyFlags, int scanFlags, long currentTime, UserHandle user)
+ final int policyFlags, int scanFlags, long currentTime, @Nullable UserHandle user)
throws PackageManagerException {
// If the package has children and this is the first dive in the function
// we scan the package with the SCAN_CHECK_ONLY flag set to see whether all
@@ -7687,7 +7814,7 @@
* @throws PackageManagerException on a parse error.
*/
private PackageParser.Package scanPackageInternalLI(PackageParser.Package pkg, File scanFile,
- int policyFlags, int scanFlags, long currentTime, UserHandle user)
+ int policyFlags, int scanFlags, long currentTime, @Nullable UserHandle user)
throws PackageManagerException {
PackageSetting ps = null;
PackageSetting updatedPkg;
@@ -7923,6 +8050,11 @@
pkg.setApplicationInfoBaseResourcePath(baseResourcePath);
pkg.setApplicationInfoSplitResourcePaths(pkg.splitCodePaths);
+ final int userId = ((user == null) ? 0 : user.getIdentifier());
+ if (ps != null && ps.getInstantApp(userId)) {
+ scanFlags |= SCAN_AS_INSTANT_APP;
+ }
+
// Note that we invoke the following method only if we are about to unpack an application
PackageParser.Package scannedPkg = scanPackageLI(pkg, policyFlags, scanFlags
| SCAN_UPDATE_SIGNATURE, currentTime, user);
@@ -8860,7 +8992,7 @@
}
private PackageParser.Package scanPackageTracedLI(PackageParser.Package pkg,
- final int policyFlags, int scanFlags, long currentTime, UserHandle user)
+ final int policyFlags, int scanFlags, long currentTime, @Nullable UserHandle user)
throws PackageManagerException {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "scanPackage");
// If the package has children and this is the first dive in the function
@@ -8899,7 +9031,8 @@
}
private PackageParser.Package scanPackageLI(PackageParser.Package pkg, final int policyFlags,
- int scanFlags, long currentTime, UserHandle user) throws PackageManagerException {
+ int scanFlags, long currentTime, @Nullable UserHandle user)
+ throws PackageManagerException {
boolean success = false;
try {
final PackageParser.Package res = scanPackageDirtyLI(pkg, policyFlags, scanFlags,
@@ -8965,7 +9098,7 @@
}
private PackageParser.Package scanPackageDirtyLI(PackageParser.Package pkg,
- final int policyFlags, final int scanFlags, long currentTime, UserHandle user)
+ final int policyFlags, final int scanFlags, long currentTime, @Nullable UserHandle user)
throws PackageManagerException {
if (DEBUG_PACKAGE_SCANNING) {
if ((policyFlags & PackageParser.PARSE_CHATTY) != 0)
@@ -9103,16 +9236,16 @@
if (pkgSetting == null) {
final String parentPackageName = (pkg.parentPackage != null)
? pkg.parentPackage.packageName : null;
-
+ final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0;
// REMOVE SharedUserSetting from method; update in a separate call
pkgSetting = Settings.createNewSetting(pkg.packageName, origPackage,
disabledPkgSetting, realName, suid, destCodeFile, destResourceFile,
pkg.applicationInfo.nativeLibraryRootDir, pkg.applicationInfo.primaryCpuAbi,
pkg.applicationInfo.secondaryCpuAbi, pkg.mVersionCode,
pkg.applicationInfo.flags, pkg.applicationInfo.privateFlags, user,
- true /*allowInstall*/, parentPackageName, pkg.getChildPackageNames(),
- UserManagerService.getInstance(), usesStaticLibraries,
- pkg.usesStaticLibrariesVersions);
+ true /*allowInstall*/, instantApp, parentPackageName,
+ pkg.getChildPackageNames(), UserManagerService.getInstance(),
+ usesStaticLibraries, pkg.usesStaticLibrariesVersions);
// SIDE EFFECTS; updates system state; move elsewhere
if (origPackage != null) {
mSettings.addRenamedPackageLPw(pkg.packageName, origPackage.name);
@@ -9179,9 +9312,8 @@
}
if (mFoundPolicyFile) {
- SELinuxMMAC.assignSeinfoValue(pkg);
+ SELinuxMMAC.assignSeInfoValue(pkg);
}
-
pkg.applicationInfo.uid = pkgSetting.appId;
pkg.mExtras = pkgSetting;
@@ -9416,11 +9548,11 @@
}
}
} else {
+ final int userId = user == null ? 0 : user.getIdentifier();
// Modify state for the given package setting
commitPackageSettings(pkg, pkgSetting, user, scanFlags,
(policyFlags & PackageParser.PARSE_CHATTY) != 0 /*chatty*/);
- if (isEphemeral(pkg)) {
- final int userId = user == null ? 0 : user.getIdentifier();
+ if (pkgSetting.getInstantApp(userId)) {
mInstantAppRegistry.addInstantAppLPw(userId, pkgSetting.appId);
}
}
@@ -9535,10 +9667,10 @@
"Packages declaring static-shared libs must target O SDK or higher");
}
- // Package declaring static a shared lib cannot be ephemeral
- if (pkg.applicationInfo.isInstantApp()) {
+ // Package declaring static a shared lib cannot be instant apps
+ if ((scanFlags & SCAN_AS_INSTANT_APP) != 0) {
throw new PackageManagerException(
- "Packages declaring static-shared libs cannot be ephemeral");
+ "Packages declaring static-shared libs cannot be instant apps");
}
// Package declaring static a shared lib cannot be renamed since the package
@@ -9781,7 +9913,6 @@
mPlatformPackage = pkg;
pkg.mVersionCode = mSdkVersion;
mAndroidApplication = pkg.applicationInfo;
-
if (!mResolverReplaced) {
mResolveActivity.applicationInfo = mAndroidApplication;
mResolveActivity.name = ResolverActivity.class.getName();
@@ -9913,7 +10044,6 @@
// writer
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "updateSettings");
- boolean createIdmapFailed = false;
synchronized (mPackages) {
// We don't expect installation to fail beyond this point
@@ -10070,10 +10200,10 @@
PackageParser.PermissionGroup cur = mPermissionGroups.get(pg.info.name);
final String curPackageName = cur == null ? null : cur.info.packageName;
// Dont allow ephemeral apps to define new permission groups.
- if (pkg.applicationInfo.isInstantApp()) {
+ if ((scanFlags & SCAN_AS_INSTANT_APP) != 0) {
Slog.w(TAG, "Permission group " + pg.info.name + " from package "
+ pg.info.packageName
- + " ignored: ephemeral apps cannot define new permission groups.");
+ + " ignored: instant apps cannot define new permission groups.");
continue;
}
final boolean isPackageUpdate = pg.info.packageName.equals(curPackageName);
@@ -10115,10 +10245,10 @@
PackageParser.Permission p = pkg.permissions.get(i);
// Dont allow ephemeral apps to define new permissions.
- if (pkg.applicationInfo.isInstantApp()) {
+ if ((scanFlags & SCAN_AS_INSTANT_APP) != 0) {
Slog.w(TAG, "Permission " + p.info.name + " from package "
+ p.info.packageName
- + " ignored: ephemeral apps cannot define new permissions.");
+ + " ignored: instant apps cannot define new permissions.");
continue;
}
@@ -10254,36 +10384,9 @@
mProtectedBroadcasts.add(pkg.protectedBroadcasts.get(i));
}
}
-
- // Create idmap files for pairs of (packages, overlay packages).
- // Note: "android", ie framework-res.apk, is handled by native layers.
- if (pkg.mOverlayTarget != null) {
- // This is an overlay package.
- if (pkg.mOverlayTarget != null && !pkg.mOverlayTarget.equals("android")) {
- if (!mOverlays.containsKey(pkg.mOverlayTarget)) {
- mOverlays.put(pkg.mOverlayTarget,
- new ArrayMap<String, PackageParser.Package>());
- }
- ArrayMap<String, PackageParser.Package> map = mOverlays.get(pkg.mOverlayTarget);
- map.put(pkg.packageName, pkg);
- PackageParser.Package orig = mPackages.get(pkg.mOverlayTarget);
- if (orig != null && !createIdmapForPackagePairLI(orig, pkg)) {
- createIdmapFailed = true;
- }
- }
- } else if (mOverlays.containsKey(pkg.packageName) &&
- !pkg.packageName.equals("android")) {
- // This is a regular package, with one or more known overlay packages.
- createIdmapsForPackageLI(pkg);
- }
}
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
-
- if (createIdmapFailed) {
- throw new PackageManagerException(INSTALL_FAILED_UPDATE_INCOMPATIBLE,
- "scanPackageLI failed to createIdmap");
- }
}
private static void maybeRenameForeignDexMarkers(PackageParser.Package existing,
@@ -10622,12 +10725,12 @@
}
}
- private void setUpEphemeralInstallerActivityLP(ComponentName installerComponent) {
+ private void setUpInstantAppInstallerActivityLP(ComponentName installerComponent) {
if (installerComponent == null) {
if (DEBUG_EPHEMERAL) {
Slog.d(TAG, "Clear ephemeral installer activity");
}
- mEphemeralInstallerActivity.applicationInfo = null;
+ mInstantAppInstallerActivity.applicationInfo = null;
return;
}
@@ -10636,21 +10739,21 @@
}
final PackageParser.Package pkg = mPackages.get(installerComponent.getPackageName());
// Set up information for ephemeral installer activity
- mEphemeralInstallerActivity.applicationInfo = pkg.applicationInfo;
- mEphemeralInstallerActivity.name = installerComponent.getClassName();
- mEphemeralInstallerActivity.packageName = pkg.applicationInfo.packageName;
- mEphemeralInstallerActivity.processName = pkg.applicationInfo.packageName;
- mEphemeralInstallerActivity.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
- mEphemeralInstallerActivity.flags = ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS
+ mInstantAppInstallerActivity.applicationInfo = pkg.applicationInfo;
+ mInstantAppInstallerActivity.name = installerComponent.getClassName();
+ mInstantAppInstallerActivity.packageName = pkg.applicationInfo.packageName;
+ mInstantAppInstallerActivity.processName = pkg.applicationInfo.packageName;
+ mInstantAppInstallerActivity.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
+ mInstantAppInstallerActivity.flags = ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS
| ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS;
- mEphemeralInstallerActivity.theme = 0;
- mEphemeralInstallerActivity.exported = true;
- mEphemeralInstallerActivity.enabled = true;
- mEphemeralInstallerInfo.activityInfo = mEphemeralInstallerActivity;
- mEphemeralInstallerInfo.priority = 0;
- mEphemeralInstallerInfo.preferredOrder = 1;
- mEphemeralInstallerInfo.isDefault = true;
- mEphemeralInstallerInfo.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART
+ mInstantAppInstallerActivity.theme = 0;
+ mInstantAppInstallerActivity.exported = true;
+ mInstantAppInstallerActivity.enabled = true;
+ mInstantAppInstallerInfo.activityInfo = mInstantAppInstallerActivity;
+ mInstantAppInstallerInfo.priority = 0;
+ mInstantAppInstallerInfo.preferredOrder = 1;
+ mInstantAppInstallerInfo.isDefault = true;
+ mInstantAppInstallerInfo.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART
| IntentFilter.MATCH_ADJUSTMENT_NORMAL;
}
@@ -11608,7 +11711,8 @@
if (!whitelisted) {
Slog.w(TAG, "Privileged permission " + perm + " for package "
+ pkg.packageName + " - not in privapp-permissions whitelist");
- if (!mSystemReady) {
+ // Only report violations for apps on system image
+ if (!mSystemReady && !pkg.isUpdatedSystemApp()) {
if (mPrivappPermissionsViolations == null) {
mPrivappPermissionsViolations = new ArraySet<>();
}
@@ -11740,13 +11844,10 @@
final class ActivityIntentResolver
extends IntentResolver<PackageParser.ActivityIntentInfo, ResolveInfo> {
public List<ResolveInfo> queryIntent(Intent intent, String resolvedType,
- boolean defaultOnly, boolean visibleToEphemeral, boolean isEphemeral, int userId) {
+ boolean defaultOnly, int userId) {
if (!sUserManager.exists(userId)) return null;
- mFlags = (defaultOnly ? PackageManager.MATCH_DEFAULT_ONLY : 0)
- | (visibleToEphemeral ? PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY : 0)
- | (isEphemeral ? PackageManager.MATCH_EPHEMERAL : 0);
- return super.queryIntent(intent, resolvedType, defaultOnly, visibleToEphemeral,
- isEphemeral, userId);
+ mFlags = (defaultOnly ? PackageManager.MATCH_DEFAULT_ONLY : 0);
+ return super.queryIntent(intent, resolvedType, defaultOnly, userId);
}
public List<ResolveInfo> queryIntent(Intent intent, String resolvedType, int flags,
@@ -11755,8 +11856,7 @@
mFlags = flags;
return super.queryIntent(intent, resolvedType,
(flags & PackageManager.MATCH_DEFAULT_ONLY) != 0,
- (flags & PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0,
- (flags & PackageManager.MATCH_EPHEMERAL) != 0, userId);
+ userId);
}
public List<ResolveInfo> queryIntentForPackage(Intent intent, String resolvedType,
@@ -11767,9 +11867,6 @@
}
mFlags = flags;
final boolean defaultOnly = (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0;
- final boolean vislbleToEphemeral =
- (flags & PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0;
- final boolean isEphemeral = (flags & PackageManager.MATCH_EPHEMERAL) != 0;
final int N = packageActivities.size();
ArrayList<PackageParser.ActivityIntentInfo[]> listCut =
new ArrayList<PackageParser.ActivityIntentInfo[]>(N);
@@ -11784,8 +11881,7 @@
listCut.add(array);
}
}
- return super.queryIntentFromList(intent, resolvedType, defaultOnly,
- vislbleToEphemeral, isEphemeral, listCut, userId);
+ return super.queryIntentFromList(intent, resolvedType, defaultOnly, listCut, userId);
}
/**
@@ -12197,11 +12293,24 @@
if (ps == null) {
return null;
}
+ final PackageUserState userState = ps.readUserState(userId);
ActivityInfo ai = PackageParser.generateActivityInfo(activity, mFlags,
- ps.readUserState(userId), userId);
+ userState, userId);
if (ai == null) {
return null;
}
+ final boolean matchVisibleToInstantApp =
+ (mFlags & PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY) != 0;
+ final boolean isInstantApp = (mFlags & PackageManager.MATCH_INSTANT) != 0;
+ // throw out filters that aren't visible to ephemeral apps
+ if (matchVisibleToInstantApp
+ && !(info.isVisibleToInstantApp() || userState.instantApp)) {
+ return null;
+ }
+ // throw out ephemeral filters if we're not explicitly requesting them
+ if (!isInstantApp && userState.instantApp) {
+ return null;
+ }
final ResolveInfo res = new ResolveInfo();
res.activityInfo = ai;
if ((mFlags&PackageManager.GET_RESOLVED_FILTER) != 0) {
@@ -12270,10 +12379,9 @@
private final class ServiceIntentResolver
extends IntentResolver<PackageParser.ServiceIntentInfo, ResolveInfo> {
public List<ResolveInfo> queryIntent(Intent intent, String resolvedType,
- boolean defaultOnly, boolean visibleToEphemeral, boolean isEphemeral, int userId) {
+ boolean defaultOnly, int userId) {
mFlags = defaultOnly ? PackageManager.MATCH_DEFAULT_ONLY : 0;
- return super.queryIntent(intent, resolvedType, defaultOnly, visibleToEphemeral,
- isEphemeral, userId);
+ return super.queryIntent(intent, resolvedType, defaultOnly, userId);
}
public List<ResolveInfo> queryIntent(Intent intent, String resolvedType, int flags,
@@ -12282,8 +12390,7 @@
mFlags = flags;
return super.queryIntent(intent, resolvedType,
(flags & PackageManager.MATCH_DEFAULT_ONLY) != 0,
- (flags & PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0,
- (flags & PackageManager.MATCH_EPHEMERAL) != 0, userId);
+ userId);
}
public List<ResolveInfo> queryIntentForPackage(Intent intent, String resolvedType,
@@ -12294,9 +12401,6 @@
}
mFlags = flags;
final boolean defaultOnly = (flags&PackageManager.MATCH_DEFAULT_ONLY) != 0;
- final boolean vislbleToEphemeral =
- (flags&PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0;
- final boolean isEphemeral = (flags&PackageManager.MATCH_EPHEMERAL) != 0;
final int N = packageServices.size();
ArrayList<PackageParser.ServiceIntentInfo[]> listCut =
new ArrayList<PackageParser.ServiceIntentInfo[]>(N);
@@ -12311,8 +12415,7 @@
listCut.add(array);
}
}
- return super.queryIntentFromList(intent, resolvedType, defaultOnly,
- vislbleToEphemeral, isEphemeral, listCut, userId);
+ return super.queryIntentFromList(intent, resolvedType, defaultOnly, listCut, userId);
}
public final void addService(PackageParser.Service s) {
@@ -12487,10 +12590,9 @@
private final class ProviderIntentResolver
extends IntentResolver<PackageParser.ProviderIntentInfo, ResolveInfo> {
public List<ResolveInfo> queryIntent(Intent intent, String resolvedType,
- boolean defaultOnly, boolean visibleToEphemeral, boolean isEphemeral, int userId) {
+ boolean defaultOnly, int userId) {
mFlags = defaultOnly ? PackageManager.MATCH_DEFAULT_ONLY : 0;
- return super.queryIntent(intent, resolvedType, defaultOnly, visibleToEphemeral,
- isEphemeral, userId);
+ return super.queryIntent(intent, resolvedType, defaultOnly, userId);
}
public List<ResolveInfo> queryIntent(Intent intent, String resolvedType, int flags,
@@ -12500,8 +12602,7 @@
mFlags = flags;
return super.queryIntent(intent, resolvedType,
(flags & PackageManager.MATCH_DEFAULT_ONLY) != 0,
- (flags & PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0,
- (flags & PackageManager.MATCH_EPHEMERAL) != 0, userId);
+ userId);
}
public List<ResolveInfo> queryIntentForPackage(Intent intent, String resolvedType,
@@ -12513,9 +12614,6 @@
}
mFlags = flags;
final boolean defaultOnly = (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0;
- final boolean isEphemeral = (flags&PackageManager.MATCH_EPHEMERAL) != 0;
- final boolean vislbleToEphemeral =
- (flags&PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0;
final int N = packageProviders.size();
ArrayList<PackageParser.ProviderIntentInfo[]> listCut =
new ArrayList<PackageParser.ProviderIntentInfo[]>(N);
@@ -12530,8 +12628,7 @@
listCut.add(array);
}
}
- return super.queryIntentFromList(intent, resolvedType, defaultOnly,
- vislbleToEphemeral, isEphemeral, listCut, userId);
+ return super.queryIntentFromList(intent, resolvedType, defaultOnly, listCut, userId);
}
public final void addProvider(PackageParser.Provider p) {
@@ -12699,7 +12796,7 @@
}
static final class EphemeralIntentResolver
- extends IntentResolver<EphemeralResponse, EphemeralResponse> {
+ extends IntentResolver<AuxiliaryResolveInfo, AuxiliaryResolveInfo> {
/**
* The result that has the highest defined order. Ordering applies on a
* per-package basis. Mapping is from package name to Pair of order and
@@ -12714,17 +12811,17 @@
final ArrayMap<String, Pair<Integer, EphemeralResolveInfo>> mOrderResult = new ArrayMap<>();
@Override
- protected EphemeralResponse[] newArray(int size) {
- return new EphemeralResponse[size];
+ protected AuxiliaryResolveInfo[] newArray(int size) {
+ return new AuxiliaryResolveInfo[size];
}
@Override
- protected boolean isPackageForFilter(String packageName, EphemeralResponse responseObj) {
+ protected boolean isPackageForFilter(String packageName, AuxiliaryResolveInfo responseObj) {
return true;
}
@Override
- protected EphemeralResponse newResult(EphemeralResponse responseObj, int match,
+ protected AuxiliaryResolveInfo newResult(AuxiliaryResolveInfo responseObj, int match,
int userId) {
if (!sUserManager.exists(userId)) {
return null;
@@ -12746,7 +12843,7 @@
}
@Override
- protected void filterResults(List<EphemeralResponse> results) {
+ protected void filterResults(List<AuxiliaryResolveInfo> results) {
// only do work if ordering is enabled [most of the time it won't be]
if (mOrderResult.size() == 0) {
return;
@@ -12985,6 +13082,12 @@
+ "to use the PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS flag");
}
+ if ((installFlags & PackageManager.INSTALL_FORWARD_LOCK) != 0
+ || (installFlags & PackageManager.INSTALL_EXTERNAL) != 0) {
+ throw new IllegalArgumentException(
+ "New installs into ASEC containers no longer supported");
+ }
+
final File originFile = new File(originPath);
final OriginInfo origin = OriginInfo.fromUntrustedFile(originFile);
@@ -13072,7 +13175,7 @@
String installerPackageName, int installerUid, UserHandle user,
Certificate[][] certificates) {
if (DEBUG_EPHEMERAL) {
- if ((sessionParams.installFlags & PackageManager.INSTALL_EPHEMERAL) != 0) {
+ if ((sessionParams.installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) {
Slog.d(TAG, "Ephemeral install of " + packageName);
}
}
@@ -13287,7 +13390,8 @@
* @hide
*/
@Override
- public int installExistingPackageAsUser(String packageName, int userId, int installReason) {
+ public int installExistingPackageAsUser(String packageName, int userId, int installFlags,
+ int installReason) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES,
null);
PackageSetting pkgSetting;
@@ -13302,6 +13406,10 @@
long callingId = Binder.clearCallingIdentity();
try {
boolean installed = false;
+ final boolean instantApp =
+ (installFlags & PackageManager.INSTALL_INSTANT_APP) != 0;
+ final boolean fullApp =
+ (installFlags & PackageManager.INSTALL_FULL_APP) != 0;
// writer
synchronized (mPackages) {
@@ -13316,7 +13424,11 @@
mSettings.writePackageRestrictionsLPr(userId);
mSettings.writeKernelMappingLPr(pkgSetting);
installed = true;
+ } else if (fullApp && pkgSetting.getInstantApp(userId)) {
+ // upgrade app from instant to full; we don't allow app downgrade
+ installed = true;
}
+ setInstantAppForUser(pkgSetting, userId, instantApp, fullApp);
}
if (installed) {
@@ -13338,6 +13450,29 @@
return PackageManager.INSTALL_SUCCEEDED;
}
+ void setInstantAppForUser(PackageSetting pkgSetting, int userId,
+ boolean instantApp, boolean fullApp) {
+ // no state specified; do nothing
+ if (!instantApp && !fullApp) {
+ return;
+ }
+ if (userId != UserHandle.USER_ALL) {
+ if (instantApp && !pkgSetting.getInstantApp(userId)) {
+ pkgSetting.setInstantApp(true /*instantApp*/, userId);
+ } else if (fullApp && pkgSetting.getInstantApp(userId)) {
+ pkgSetting.setInstantApp(false /*instantApp*/, userId);
+ }
+ } else {
+ for (int currentUserId : sUserManager.getUserIds()) {
+ if (instantApp && !pkgSetting.getInstantApp(currentUserId)) {
+ pkgSetting.setInstantApp(true /*instantApp*/, currentUserId);
+ } else if (fullApp && pkgSetting.getInstantApp(currentUserId)) {
+ pkgSetting.setInstantApp(false /*instantApp*/, currentUserId);
+ }
+ }
+ }
+ }
+
boolean isUserRestricted(int userId, String restrictionKey) {
Bundle restrictions = sUserManager.getUserRestrictions(userId);
if (restrictions.getBoolean(restrictionKey, false)) {
@@ -13696,7 +13831,7 @@
return false;
}
// Ephemeral apps don't get the full verification treatment
- if ((installFlags & PackageManager.INSTALL_EPHEMERAL) != 0) {
+ if ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) {
if (DEBUG_EPHEMERAL) {
Slog.d(TAG, "INSTALL_EPHEMERAL so skipping verification");
}
@@ -14129,88 +14264,6 @@
abstract void handleReturnCode();
}
- class MeasureParams extends HandlerParams {
- private final PackageStats mStats;
- private boolean mSuccess;
-
- private final IPackageStatsObserver mObserver;
-
- public MeasureParams(PackageStats stats, IPackageStatsObserver observer) {
- super(new UserHandle(stats.userHandle));
- mObserver = observer;
- mStats = stats;
- }
-
- @Override
- public String toString() {
- return "MeasureParams{"
- + Integer.toHexString(System.identityHashCode(this))
- + " " + mStats.packageName + "}";
- }
-
- @Override
- void handleStartCopy() throws RemoteException {
- synchronized (mInstallLock) {
- mSuccess = getPackageSizeInfoLI(mStats.packageName, mStats.userHandle, mStats);
- }
-
- if (mSuccess) {
- boolean mounted = false;
- try {
- final String status = Environment.getExternalStorageState();
- mounted = (Environment.MEDIA_MOUNTED.equals(status)
- || Environment.MEDIA_MOUNTED_READ_ONLY.equals(status));
- } catch (Exception e) {
- }
-
- if (mounted) {
- final UserEnvironment userEnv = new UserEnvironment(mStats.userHandle);
-
- mStats.externalCacheSize = calculateDirectorySize(mContainerService,
- userEnv.buildExternalStorageAppCacheDirs(mStats.packageName));
-
- mStats.externalDataSize = calculateDirectorySize(mContainerService,
- userEnv.buildExternalStorageAppDataDirs(mStats.packageName));
-
- // Always subtract cache size, since it's a subdirectory
- mStats.externalDataSize -= mStats.externalCacheSize;
-
- mStats.externalMediaSize = calculateDirectorySize(mContainerService,
- userEnv.buildExternalStorageAppMediaDirs(mStats.packageName));
-
- mStats.externalObbSize = calculateDirectorySize(mContainerService,
- userEnv.buildExternalStorageAppObbDirs(mStats.packageName));
- }
- }
- }
-
- @Override
- void handleReturnCode() {
- if (mObserver != null) {
- try {
- mObserver.onGetStatsCompleted(mStats, mSuccess);
- } catch (RemoteException e) {
- Slog.i(TAG, "Observer no longer exists.");
- }
- }
- }
-
- @Override
- void handleServiceError() {
- Slog.e(TAG, "Could not measure application " + mStats.packageName
- + " external storage");
- }
- }
-
- private static long calculateDirectorySize(IMediaContainerService mcs, File[] paths)
- throws RemoteException {
- long result = 0;
- for (File path : paths) {
- result += mcs.calculateDirectorySize(path.getAbsolutePath());
- }
- return result;
- }
-
private static void clearDirectory(IMediaContainerService mcs, File[] paths) {
for (File path : paths) {
try {
@@ -14488,7 +14541,7 @@
final boolean onSd = (installFlags & PackageManager.INSTALL_EXTERNAL) != 0;
final boolean onInt = (installFlags & PackageManager.INSTALL_INTERNAL) != 0;
- final boolean ephemeral = (installFlags & PackageManager.INSTALL_EPHEMERAL) != 0;
+ final boolean ephemeral = (installFlags & PackageManager.INSTALL_INSTANT_APP) != 0;
PackageInfoLite pkgLite = null;
if (onInt && onSd) {
@@ -14572,7 +14625,7 @@
if (DEBUG_EPHEMERAL) {
Slog.v(TAG, "...setting INSTALL_EPHEMERAL install flag");
}
- installFlags |= PackageManager.INSTALL_EPHEMERAL;
+ installFlags |= PackageManager.INSTALL_INSTANT_APP;
installFlags &= ~(PackageManager.INSTALL_EXTERNAL
|PackageManager.INSTALL_INTERNAL);
} else {
@@ -14665,6 +14718,9 @@
final List<ComponentName> sufficientVerifiers = matchVerifiers(pkgLite,
receivers, verificationState);
+ DeviceIdleController.LocalService idleController = getDeviceIdleController();
+ final long idleDuration = getVerificationTimeout();
+
/*
* If any sufficient verifiers were listed in the package
* manifest, attempt to ask them.
@@ -14677,6 +14733,9 @@
} else {
for (int i = 0; i < N; i++) {
final ComponentName verifierComponent = sufficientVerifiers.get(i);
+ idleController.addPowerSaveTempWhitelistApp(Process.myUid(),
+ verifierComponent.getPackageName(), idleDuration,
+ verifierUser.getIdentifier(), false, "package verifier");
final Intent sufficientIntent = new Intent(verification);
sufficientIntent.setComponent(verifierComponent);
@@ -14697,6 +14756,9 @@
* target BroadcastReceivers have run.
*/
verification.setComponent(requiredVerifierComponent);
+ idleController.addPowerSaveTempWhitelistApp(Process.myUid(),
+ requiredVerifierComponent.getPackageName(), idleDuration,
+ verifierUser.getIdentifier(), false, "package verifier");
mContext.sendOrderedBroadcastAsUser(verification, verifierUser,
android.Manifest.permission.PACKAGE_VERIFICATION_AGENT,
new BroadcastReceiver() {
@@ -14906,7 +14968,7 @@
}
protected boolean isEphemeral() {
- return (installFlags & PackageManager.INSTALL_EPHEMERAL) != 0;
+ return (installFlags & PackageManager.INSTALL_INSTANT_APP) != 0;
}
UserHandle getUser() {
@@ -14986,7 +15048,7 @@
}
try {
- final boolean isEphemeral = (installFlags & PackageManager.INSTALL_EPHEMERAL) != 0;
+ final boolean isEphemeral = (installFlags & PackageManager.INSTALL_INSTANT_APP) != 0;
final File tempDir =
mInstallerService.allocateStageDirLegacy(volumeUuid, isEphemeral);
codeFile = tempDir;
@@ -15813,7 +15875,7 @@
private void replacePackageLIF(PackageParser.Package pkg, final int policyFlags, int scanFlags,
UserHandle user, String installerPackageName, PackageInstalledInfo res,
int installReason) {
- final boolean isEphemeral = (policyFlags & PackageParser.PARSE_IS_EPHEMERAL) != 0;
+ final boolean isInstantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0;
final PackageParser.Package oldPackage;
final String pkgName = pkg.packageName;
@@ -15837,17 +15899,17 @@
return;
}
+ final PackageSetting ps = mSettings.mPackages.get(pkgName);
+
// don't allow an upgrade from full to ephemeral
- final boolean oldIsEphemeral = oldPackage.applicationInfo.isInstantApp();
- if (isEphemeral && !oldIsEphemeral) {
- // can't downgrade from full to ephemeral
- Slog.w(TAG, "Can't replace app with ephemeral: " + pkgName);
- res.setReturnCode(PackageManager.INSTALL_FAILED_EPHEMERAL_INVALID);
+ if (isInstantApp && !ps.getInstantApp(user.getIdentifier())) {
+ // can't downgrade from full to instant
+ Slog.w(TAG, "Can't replace app with instant app: " + pkgName);
+ res.setReturnCode(PackageManager.INSTALL_FAILED_INSTANT_APP_INVALID);
return;
}
// verify signatures are valid
- final PackageSetting ps = mSettings.mPackages.get(pkgName);
if (shouldCheckUpgradeKeySetLP(ps, scanFlags)) {
if (!checkUpgradeKeySetLP(ps, pkg)) {
res.setError(INSTALL_FAILED_UPDATE_INCOMPATIBLE,
@@ -16049,6 +16111,10 @@
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;
} catch (PackageManagerException e) {
@@ -16520,7 +16586,8 @@
final boolean forwardLocked = ((installFlags & PackageManager.INSTALL_FORWARD_LOCK) != 0);
final boolean onExternal = (((installFlags & PackageManager.INSTALL_EXTERNAL) != 0)
|| (args.volumeUuid != null));
- final boolean ephemeral = ((installFlags & PackageManager.INSTALL_EPHEMERAL) != 0);
+ final boolean instantApp = ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0);
+ final boolean fullApp = ((installFlags & PackageManager.INSTALL_FULL_APP) != 0);
final boolean forceSdk = ((installFlags & PackageManager.INSTALL_FORCE_SDK) != 0);
boolean replace = false;
int scanFlags = SCAN_NEW_INSTALL | SCAN_UPDATE_SIGNATURE;
@@ -16531,6 +16598,12 @@
if ((installFlags & PackageManager.INSTALL_DONT_KILL_APP) != 0) {
scanFlags |= SCAN_DONT_KILL_APP;
}
+ if (instantApp) {
+ scanFlags |= SCAN_AS_INSTANT_APP;
+ }
+ if (fullApp) {
+ scanFlags |= SCAN_AS_FULL_APP;
+ }
// Result object to be returned
res.setReturnCode(PackageManager.INSTALL_SUCCEEDED);
@@ -16538,10 +16611,10 @@
if (DEBUG_INSTALL) Slog.d(TAG, "installPackageLI: path=" + tmpPackageFile);
// Sanity check
- if (ephemeral && (forwardLocked || onExternal)) {
+ if (instantApp && (forwardLocked || onExternal)) {
Slog.i(TAG, "Incompatible ephemeral install; fwdLocked=" + forwardLocked
+ " external=" + onExternal);
- res.setReturnCode(PackageManager.INSTALL_FAILED_EPHEMERAL_INVALID);
+ res.setReturnCode(PackageManager.INSTALL_FAILED_INSTANT_APP_INVALID);
return;
}
@@ -16550,7 +16623,7 @@
| PackageParser.PARSE_ENFORCE_CODE
| (forwardLocked ? PackageParser.PARSE_FORWARD_LOCK : 0)
| (onExternal ? PackageParser.PARSE_EXTERNAL_STORAGE : 0)
- | (ephemeral ? PackageParser.PARSE_IS_EPHEMERAL : 0)
+ | (instantApp ? PackageParser.PARSE_IS_EPHEMERAL : 0)
| (forceSdk ? PackageParser.PARSE_FORCE_SDK : 0);
PackageParser pp = new PackageParser();
pp.setSeparateProcesses(mSeparateProcesses);
@@ -16569,7 +16642,7 @@
// // Ephemeral apps must have target SDK >= O.
// // TODO: Update conditional and error message when O gets locked down
-// if (ephemeral && pkg.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.N_MR1) {
+// if (instantApp && pkg.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.N_MR1) {
// res.setError(PackageManager.INSTALL_FAILED_EPHEMERAL_INVALID,
// "Ephemeral apps must have target SDK version of at least O");
// return;
@@ -16812,10 +16885,10 @@
res.setError(INSTALL_FAILED_INVALID_INSTALL_LOCATION,
"Cannot install updates to system apps on sdcard");
return;
- } else if (ephemeral) {
- // Abort update; system app can't be replaced with an ephemeral app
- res.setError(INSTALL_FAILED_EPHEMERAL_INVALID,
- "Cannot update a system app with an ephemeral app");
+ } else if (instantApp) {
+ // Abort update; system app can't be replaced with an instant app
+ res.setError(INSTALL_FAILED_INSTANT_APP_INVALID,
+ "Cannot update a system app with an instant app");
return;
}
}
@@ -17062,14 +17135,6 @@
return (ps.pkgFlags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0;
}
- private static boolean isEphemeral(PackageParser.Package pkg) {
- return pkg.applicationInfo.isInstantApp();
- }
-
- private static boolean isEphemeral(PackageSetting ps) {
- return ps.pkg != null && isEphemeral(ps.pkg);
- }
-
private static boolean isSystemApp(PackageParser.Package pkg) {
return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}
@@ -17092,9 +17157,6 @@
private int packageFlagsToInstallFlags(PackageSetting ps) {
int installFlags = 0;
- if (isEphemeral(ps)) {
- installFlags |= PackageManager.INSTALL_EPHEMERAL;
- }
if (isExternal(ps) && TextUtils.isEmpty(ps.volumeUuid)) {
// This existing package was an external ASEC install when we have
// the external flag without a UUID
@@ -17496,7 +17558,7 @@
try (PackageFreezer freezer = freezePackageForDelete(packageName, freezeUser,
deleteFlags, "deletePackageX")) {
res = deletePackageLIF(packageName, UserHandle.of(removeUser), true, allUsers,
- deleteFlags | REMOVE_CHATTY, info, true, null);
+ deleteFlags | FLAGS_REMOVE_CHATTY, info, true, null);
}
synchronized (mPackages) {
if (res) {
@@ -17646,7 +17708,7 @@
}
}
- removePackageLI(ps, (flags & REMOVE_CHATTY) != 0);
+ removePackageLI(ps, (flags & FLAGS_REMOVE_CHATTY) != 0);
if ((flags & PackageManager.DELETE_KEEP_DATA) == 0) {
final PackageParser.Package resolvedPkg;
@@ -18205,11 +18267,18 @@
Slog.d(TAG, "Marking package:" + ps.name + " uninstalled for user:" + nextUserId);
}
ps.setUserState(nextUserId, 0, COMPONENT_ENABLED_STATE_DEFAULT,
- false /*installed*/, true /*stopped*/, true /*notLaunched*/,
- false /*hidden*/, false /*suspended*/, null, null, null,
+ false /*installed*/,
+ true /*stopped*/,
+ true /*notLaunched*/,
+ false /*hidden*/,
+ false /*suspended*/,
+ false /*instantApp*/,
+ null /*lastDisableAppCaller*/,
+ null /*enabledComponents*/,
+ null /*disabledComponents*/,
false /*blockUninstall*/,
- ps.readUserState(nextUserId).domainVerificationStatus, 0,
- PackageManager.INSTALL_REASON_UNKNOWN);
+ ps.readUserState(nextUserId).domainVerificationStatus,
+ 0, PackageManager.INSTALL_REASON_UNKNOWN);
}
mSettings.writeKernelMappingLPr(ps);
}
@@ -18650,21 +18719,11 @@
@Override
public void getPackageSizeInfo(final String packageName, int userHandle,
final IPackageStatsObserver observer) {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.GET_PACKAGE_SIZE, null);
- if (packageName == null) {
- throw new IllegalArgumentException("Attempt to get size of null packageName");
+ Slog.w(TAG, "Shame on you for calling a hidden API. Shame!");
+ try {
+ observer.onGetStatsCompleted(null, false);
+ } catch (Throwable ignored) {
}
-
- PackageStats stats = new PackageStats(packageName, userHandle);
-
- /*
- * Queue up an async operation since the package measurement may take a
- * little while.
- */
- Message msg = mHandler.obtainMessage(INIT_COPY);
- msg.obj = new MeasureParams(stats, observer);
- mHandler.sendMessage(msg);
}
private boolean getPackageSizeInfoLI(String packageName, int userId, PackageStats stats) {
@@ -20079,6 +20138,14 @@
}
}
+ public void waitForAppDataPrepared() {
+ if (mPrepareAppDataFuture == null) {
+ return;
+ }
+ ConcurrentUtils.waitForFutureNoInterrupt(mPrepareAppDataFuture, "wait for prepareAppData");
+ mPrepareAppDataFuture = null;
+ }
+
@Override
public boolean isSafeMode() {
return mSafeMode;
@@ -20125,6 +20192,7 @@
public static final int DUMP_FROZEN = 1 << 19;
public static final int DUMP_DEXOPT = 1 << 20;
public static final int DUMP_COMPILER_STATS = 1 << 21;
+ public static final int DUMP_ENABLED_OVERLAYS = 1 << 22;
public static final int OPTION_SHOW_FILTERS = 1 << 0;
@@ -20244,12 +20312,16 @@
pw.println(" check-permission <permission> <package> [<user>]: does pkg hold perm?");
pw.println(" dexopt: dump dexopt state");
pw.println(" compiler-stats: dump compiler statistics");
+ pw.println(" enabled-overlays: dump list of enabled overlay packages");
pw.println(" <package.name>: info about given package");
return;
} else if ("--checkin".equals(opt)) {
checkin = true;
} else if ("-f".equals(opt)) {
dumpState.setOptionEnabled(DumpState.OPTION_SHOW_FILTERS);
+ } else if ("--proto".equals(opt)) {
+ dumpProto(fd);
+ return;
} else {
pw.println("Unknown argument: " + opt + "; use -h for help");
}
@@ -20372,6 +20444,8 @@
dumpState.setDump(DumpState.DUMP_DEXOPT);
} else if ("compiler-stats".equals(cmd)) {
dumpState.setDump(DumpState.DUMP_COMPILER_STATS);
+ } else if ("enabled-overlays".equals(cmd)) {
+ dumpState.setDump(DumpState.DUMP_ENABLED_OVERLAYS);
} else if ("write".equals(cmd)) {
synchronized (mPackages) {
mSettings.writeLPr();
@@ -20742,6 +20816,11 @@
dumpCompilerStatsLPr(pw, packageName);
}
+ if (!checkin && dumpState.isDumping(DumpState.DUMP_ENABLED_OVERLAYS)) {
+ if (dumpState.onTitlePrinted()) pw.println();
+ dumpEnabledOverlaysLPr(pw);
+ }
+
if (!checkin && dumpState.isDumping(DumpState.DUMP_MESSAGES) && packageName == null) {
if (dumpState.onTitlePrinted()) pw.println();
mSettings.dumpReadMessagesLPr(pw, dumpState);
@@ -20780,6 +20859,98 @@
}
}
+ private void dumpProto(FileDescriptor fd) {
+ final ProtoOutputStream proto = new ProtoOutputStream(fd);
+
+ synchronized (mPackages) {
+ final long requiredVerifierPackageToken =
+ proto.start(PackageServiceDumpProto.REQUIRED_VERIFIER_PACKAGE);
+ proto.write(PackageServiceDumpProto.PackageShortProto.NAME, mRequiredVerifierPackage);
+ proto.write(
+ PackageServiceDumpProto.PackageShortProto.UID,
+ getPackageUid(
+ mRequiredVerifierPackage,
+ MATCH_DEBUG_TRIAGED_MISSING,
+ UserHandle.USER_SYSTEM));
+ proto.end(requiredVerifierPackageToken);
+
+ if (mIntentFilterVerifierComponent != null) {
+ String verifierPackageName = mIntentFilterVerifierComponent.getPackageName();
+ final long verifierPackageToken =
+ proto.start(PackageServiceDumpProto.VERIFIER_PACKAGE);
+ proto.write(PackageServiceDumpProto.PackageShortProto.NAME, verifierPackageName);
+ proto.write(
+ PackageServiceDumpProto.PackageShortProto.UID,
+ getPackageUid(
+ verifierPackageName,
+ MATCH_DEBUG_TRIAGED_MISSING,
+ UserHandle.USER_SYSTEM));
+ proto.end(verifierPackageToken);
+ }
+
+ dumpSharedLibrariesProto(proto);
+ dumpFeaturesProto(proto);
+ mSettings.dumpPackagesProto(proto);
+ mSettings.dumpSharedUsersProto(proto);
+ dumpMessagesProto(proto);
+ }
+ proto.flush();
+ }
+
+ private void dumpMessagesProto(ProtoOutputStream proto) {
+ BufferedReader in = null;
+ String line = null;
+ try {
+ in = new BufferedReader(new FileReader(getSettingsProblemFile()));
+ while ((line = in.readLine()) != null) {
+ if (line.contains("ignored: updated version")) continue;
+ proto.write(PackageServiceDumpProto.MESSAGES, line);
+ }
+ } catch (IOException ignored) {
+ } finally {
+ IoUtils.closeQuietly(in);
+ }
+ }
+
+ private void dumpFeaturesProto(ProtoOutputStream proto) {
+ synchronized (mAvailableFeatures) {
+ final int count = mAvailableFeatures.size();
+ for (int i = 0; i < count; i++) {
+ final FeatureInfo feat = mAvailableFeatures.valueAt(i);
+ final long featureToken = proto.start(PackageServiceDumpProto.FEATURES);
+ proto.write(PackageServiceDumpProto.FeatureProto.NAME, feat.name);
+ proto.write(PackageServiceDumpProto.FeatureProto.VERSION, feat.version);
+ proto.end(featureToken);
+ }
+ }
+ }
+
+ private void dumpSharedLibrariesProto(ProtoOutputStream proto) {
+ final int count = mSharedLibraries.size();
+ for (int i = 0; i < count; i++) {
+ final String libName = mSharedLibraries.keyAt(i);
+ SparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.get(libName);
+ if (versionedLib == null) {
+ continue;
+ }
+ final int versionCount = versionedLib.size();
+ for (int j = 0; j < versionCount; j++) {
+ final SharedLibraryEntry libEntry = versionedLib.valueAt(j);
+ final long sharedLibraryToken =
+ proto.start(PackageServiceDumpProto.SHARED_LIBRARIES);
+ proto.write(PackageServiceDumpProto.SharedLibraryProto.NAME, libEntry.info.getName());
+ final boolean isJar = (libEntry.path != null);
+ proto.write(PackageServiceDumpProto.SharedLibraryProto.IS_JAR, isJar);
+ if (isJar) {
+ proto.write(PackageServiceDumpProto.SharedLibraryProto.PATH, libEntry.path);
+ } else {
+ proto.write(PackageServiceDumpProto.SharedLibraryProto.APK, libEntry.apk);
+ }
+ proto.end(sharedLibraryToken);
+ }
+ }
+ }
+
private void dumpDexoptStateLPr(PrintWriter pw, String packageName) {
final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120);
ipw.println();
@@ -20838,6 +21009,23 @@
}
}
+ private void dumpEnabledOverlaysLPr(PrintWriter pw) {
+ pw.println("Enabled overlay paths:");
+ final int N = mEnabledOverlayPaths.size();
+ for (int i = 0; i < N; i++) {
+ final int userId = mEnabledOverlayPaths.keyAt(i);
+ pw.println(String.format(" User %d:", userId));
+ final ArrayMap<String, ArrayList<String>> userSpecificOverlays =
+ mEnabledOverlayPaths.valueAt(i);
+ final int M = userSpecificOverlays.size();
+ for (int j = 0; j < M; j++) {
+ final String targetPackageName = userSpecificOverlays.keyAt(j);
+ final ArrayList<String> overlayPackagePaths = userSpecificOverlays.valueAt(j);
+ pw.println(String.format(" %s: %s", targetPackageName, overlayPackagePaths));
+ }
+ }
+ }
+
private String dumpDomainString(String packageName) {
List<IntentFilterVerificationInfo> iviList = getIntentFilterVerifications(packageName)
.getList();
@@ -21529,6 +21717,11 @@
}
}
+ private void reconcileAppsDataLI(String volumeUuid, int userId, int flags,
+ boolean migrateAppData) {
+ reconcileAppsDataLI(volumeUuid, userId, flags, migrateAppData, false /* onlyCoreApps */);
+ }
+
/**
* Reconcile all app data on given mounted volume.
* <p>
@@ -21537,11 +21730,13 @@
* <p>
* Verifies that directories exist and that ownership and labeling is
* correct for all installed apps.
+ * @returns list of skipped non-core packages (if {@code onlyCoreApps} is true)
*/
- private void reconcileAppsDataLI(String volumeUuid, int userId, int flags,
- boolean migrateAppData) {
+ private List<String> reconcileAppsDataLI(String volumeUuid, int userId, int flags,
+ boolean migrateAppData, boolean onlyCoreApps) {
Slog.v(TAG, "reconcileAppsData for " + volumeUuid + " u" + userId + " 0x"
+ Integer.toHexString(flags) + " migrateAppData=" + migrateAppData);
+ List<String> result = onlyCoreApps ? new ArrayList<>() : null;
final File ceDir = Environment.getDataUserCeDirectory(volumeUuid, userId);
final File deDir = Environment.getDataUserDeDirectory(volumeUuid, userId);
@@ -21605,21 +21800,20 @@
// and reconcile again once they're scanned
continue;
}
+ // Skip non-core apps if requested
+ if (onlyCoreApps && !ps.pkg.coreApp) {
+ result.add(packageName);
+ continue;
+ }
if (ps.getInstalled(userId)) {
- prepareAppDataLIF(ps.pkg, userId, flags);
-
- if (migrateAppData && maybeMigrateAppDataLIF(ps.pkg, userId)) {
- // We may have just shuffled around app data directories, so
- // prepare them one more time
- prepareAppDataLIF(ps.pkg, userId, flags);
- }
-
+ prepareAppDataAndMigrateLIF(ps.pkg, userId, flags, migrateAppData);
preparedCount++;
}
}
Slog.v(TAG, "reconcileAppsData finished " + preparedCount + " packages");
+ return result;
}
/**
@@ -21680,6 +21874,17 @@
}
}
+ private void prepareAppDataAndMigrateLIF(PackageParser.Package pkg, int userId, int flags,
+ boolean maybeMigrateAppData) {
+ prepareAppDataLIF(pkg, userId, flags);
+
+ if (maybeMigrateAppData && maybeMigrateAppDataLIF(pkg, userId)) {
+ // We may have just shuffled around app data directories, so
+ // prepare them one more time
+ prepareAppDataLIF(pkg, userId, flags);
+ }
+ }
+
private void prepareAppDataLeafLIF(PackageParser.Package pkg, int userId, int flags) {
if (DEBUG_APP_DATA) {
Slog.v(TAG, "prepareAppData for " + pkg.packageName + " u" + userId + " 0x"
@@ -21691,12 +21896,12 @@
final ApplicationInfo app = pkg.applicationInfo;
final int appId = UserHandle.getAppId(app.uid);
- Preconditions.checkNotNull(app.seinfo);
+ Preconditions.checkNotNull(app.seInfo);
long ceDataInode = -1;
try {
ceDataInode = mInstaller.createAppData(volumeUuid, packageName, userId, flags,
- appId, app.seinfo, app.targetSdkVersion);
+ appId, app.seInfo, app.targetSdkVersion);
} catch (InstallerException e) {
if (app.isSystemApp()) {
logCriticalInfo(Log.ERROR, "Failed to create app data for " + packageName
@@ -21704,7 +21909,7 @@
destroyAppDataLeafLIF(pkg, userId, flags);
try {
ceDataInode = mInstaller.createAppData(volumeUuid, packageName, userId, flags,
- appId, app.seinfo, app.targetSdkVersion);
+ appId, app.seInfo, app.targetSdkVersion);
logCriticalInfo(Log.DEBUG, "Recovery succeeded!");
} catch (InstallerException e2) {
logCriticalInfo(Log.DEBUG, "Recovery failed!");
@@ -22006,7 +22211,7 @@
installerPackageName = ps.installerPackageName;
packageAbiOverride = ps.cpuAbiOverrideString;
appId = UserHandle.getAppId(pkg.applicationInfo.uid);
- seinfo = pkg.applicationInfo.seinfo;
+ seinfo = pkg.applicationInfo.seInfo;
label = String.valueOf(pm.getApplicationLabel(pkg.applicationInfo));
targetSdkVersion = pkg.applicationInfo.targetSdkVersion;
freezer = freezePackage(packageName, "movePackageInternal");
@@ -22815,8 +23020,8 @@
@Override
public boolean isPackageEphemeral(int userId, String packageName) {
synchronized (mPackages) {
- PackageParser.Package p = mPackages.get(packageName);
- return p != null ? p.applicationInfo.isInstantApp() : false;
+ final PackageSetting ps = mSettings.mPackages.get(packageName);
+ return ps != null ? ps.getInstantApp(userId) : false;
}
}
@@ -22847,11 +23052,10 @@
}
@Override
- public void requestEphemeralResolutionPhaseTwo(EphemeralResponse responseObj,
- Intent origIntent, String resolvedType, Intent launchIntent,
- String callingPackage, int userId) {
- PackageManagerService.this.requestEphemeralResolutionPhaseTwo(
- responseObj, origIntent, resolvedType, launchIntent, callingPackage, userId);
+ public void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
+ Intent origIntent, String resolvedType, String callingPackage, int userId) {
+ PackageManagerService.this.requestInstantAppResolutionPhaseTwo(
+ responseObj, origIntent, resolvedType, callingPackage, userId);
}
@Override
@@ -22922,12 +23126,50 @@
return targetPackages;
}
-
@Override
- public boolean setEnabledOverlayPackages(int userId, String targetPackageName,
- List<String> overlayPackageNames) {
- // TODO: implement when we integrate OMS properly
- return false;
+ public boolean setEnabledOverlayPackages(int userId, @NonNull String targetPackageName,
+ @Nullable List<String> overlayPackageNames) {
+ synchronized (mPackages) {
+ if (targetPackageName == null || mPackages.get(targetPackageName) == null) {
+ Slog.e(TAG, "failed to find package " + targetPackageName);
+ return false;
+ }
+
+ ArrayList<String> paths = null;
+ if (overlayPackageNames != null) {
+ final int N = overlayPackageNames.size();
+ paths = new ArrayList<String>(N);
+ for (int i = 0; i < N; i++) {
+ final String packageName = overlayPackageNames.get(i);
+ final PackageParser.Package pkg = mPackages.get(packageName);
+ if (pkg == null) {
+ Slog.e(TAG, "failed to find package " + packageName);
+ return false;
+ }
+ paths.add(pkg.baseCodePath);
+ }
+ }
+
+ ArrayMap<String, ArrayList<String>> userSpecificOverlays =
+ mEnabledOverlayPaths.get(userId);
+ if (userSpecificOverlays == null) {
+ userSpecificOverlays = new ArrayMap<String, ArrayList<String>>();
+ mEnabledOverlayPaths.put(userId, userSpecificOverlays);
+ }
+
+ if (paths != null && paths.size() > 0) {
+ userSpecificOverlays.put(targetPackageName, paths);
+ } else {
+ userSpecificOverlays.remove(targetPackageName);
+ }
+ return true;
+ }
+ }
+
+ public ResolveInfo resolveIntent(Intent intent, String resolvedType,
+ int flags, int userId) {
+ return resolveIntentInternal(
+ intent, resolvedType, flags, userId, true /*includeInstantApp*/);
}
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 1203e4d..a7349fc 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -39,6 +39,7 @@
import android.content.pm.PermissionInfo;
import android.content.pm.PackageInstaller.SessionInfo;
import android.content.pm.PackageInstaller.SessionParams;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.pm.VersionedPackage;
import android.content.res.AssetManager;
@@ -116,6 +117,8 @@
return runInstallRemove();
case "install-write":
return runInstallWrite();
+ case "install-existing":
+ return runInstallExisting();
case "compile":
return runCompile();
case "reconcile-secondary-dex-files":
@@ -301,6 +304,51 @@
return doRemoveSplit(sessionId, splitName, true /*logSuccess*/);
}
+ private int runInstallExisting() throws RemoteException {
+ final PrintWriter pw = getOutPrintWriter();
+ int userId = UserHandle.USER_SYSTEM;
+ int installFlags = 0;
+ String opt;
+ while ((opt = getNextOption()) != null) {
+ switch (opt) {
+ case "--user":
+ userId = UserHandle.parseUserArg(getNextArgRequired());
+ break;
+ case "--ephemeral":
+ case "--instant":
+ installFlags |= PackageManager.INSTALL_INSTANT_APP;
+ installFlags &= ~PackageManager.INSTALL_FULL_APP;
+ break;
+ case "--full":
+ installFlags &= ~PackageManager.INSTALL_INSTANT_APP;
+ installFlags |= PackageManager.INSTALL_FULL_APP;
+ break;
+ default:
+ pw.println("Error: Unknown option: " + opt);
+ return 1;
+ }
+ }
+
+ final String packageName = getNextArg();
+ if (packageName == null) {
+ pw.println("Error: package name not specified");
+ return 1;
+ }
+
+ try {
+ final int res = mInterface.installExistingPackageAsUser(packageName, userId,
+ installFlags, PackageManager.INSTALL_REASON_UNKNOWN);
+ if (res == PackageManager.INSTALL_FAILED_INVALID_URI) {
+ throw new NameNotFoundException("Package " + packageName + " doesn't exist");
+ }
+ pw.println("Package " + packageName + " installed for user: " + userId);
+ return 0;
+ } catch (RemoteException | NameNotFoundException e) {
+ pw.println(e.toString());
+ return 1;
+ }
+ }
+
private int runCompile() throws RemoteException {
final PrintWriter pw = getOutPrintWriter();
boolean checkProfiles = SystemProperties.getBoolean("dalvik.vm.usejitprofiles", false);
@@ -1145,8 +1193,12 @@
sessionParams.abiOverride = checkAbiArgument(getNextArg());
break;
case "--ephemeral":
+ case "--instantapp":
sessionParams.setInstallAsInstantApp(true /*isInstantApp*/);
break;
+ case "--full":
+ sessionParams.setInstallAsInstantApp(false /*isInstantApp*/);
+ break;
case "--user":
params.userId = UserHandle.parseUserArg(getNextArgRequired());
break;
diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java
index 5f348ab..b4bba88 100644
--- a/services/core/java/com/android/server/pm/PackageSetting.java
+++ b/services/core/java/com/android/server/pm/PackageSetting.java
@@ -19,6 +19,9 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
+import android.content.pm.UserInfo;
+import android.service.pm.PackageProto;
+import android.util.proto.ProtoOutputStream;
import java.io.File;
import java.util.List;
@@ -128,4 +131,32 @@
}
return true;
}
+
+ public void writeToProto(ProtoOutputStream proto, long fieldId, List<UserInfo> users) {
+ final long packageToken = proto.start(fieldId);
+ proto.write(PackageProto.NAME, (realName != null ? realName : name));
+ proto.write(PackageProto.UID, appId);
+ proto.write(PackageProto.VERSION_CODE, versionCode);
+ proto.write(PackageProto.VERSION_STRING, pkg.mVersionName);
+ proto.write(PackageProto.INSTALL_TIME_MS, firstInstallTime);
+ proto.write(PackageProto.UPDATE_TIME_MS, lastUpdateTime);
+ proto.write(PackageProto.INSTALLER_NAME, installerPackageName);
+
+ if (pkg != null) {
+ long splitToken = proto.start(PackageProto.SPLITS);
+ proto.write(PackageProto.SplitProto.NAME, "base");
+ proto.write(PackageProto.SplitProto.REVISION_CODE, pkg.baseRevisionCode);
+ proto.end(splitToken);
+ if (pkg.splitNames != null) {
+ for (int i = 0; i < pkg.splitNames.length; i++) {
+ splitToken = proto.start(PackageProto.SPLITS);
+ proto.write(PackageProto.SplitProto.NAME, pkg.splitNames[i]);
+ proto.write(PackageProto.SplitProto.REVISION_CODE, pkg.splitRevisionCodes[i]);
+ proto.end(splitToken);
+ }
+ }
+ }
+ writeUsersInfoToProto(proto, PackageProto.USERS);
+ proto.end(packageToken);
+ }
}
diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java
index 0e11b0c..b9c43da 100644
--- a/services/core/java/com/android/server/pm/PackageSettingBase.java
+++ b/services/core/java/com/android/server/pm/PackageSettingBase.java
@@ -25,8 +25,10 @@
import android.content.pm.PackageManager;
import android.content.pm.PackageUserState;
import android.os.storage.VolumeInfo;
+import android.service.pm.PackageProto;
import android.util.ArraySet;
import android.util.SparseArray;
+import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.VisibleForTesting;
@@ -397,11 +399,19 @@
modifyUserState(userId).blockUninstall = blockUninstall;
}
+ boolean getInstantApp(int userId) {
+ return readUserState(userId).instantApp;
+ }
+
+ void setInstantApp(boolean instantApp, int userId) {
+ modifyUserState(userId).instantApp = instantApp;
+ }
+
void setUserState(int userId, long ceDataInode, int enabled, boolean installed, boolean stopped,
- boolean notLaunched, boolean hidden, boolean suspended,
+ boolean notLaunched, boolean hidden, boolean suspended, boolean instantApp,
String lastDisableAppCaller, ArraySet<String> enabledComponents,
- ArraySet<String> disabledComponents, boolean blockUninstall, int domainVerifState,
- int linkGeneration, int installReason) {
+ ArraySet<String> disabledComponents, boolean blockUninstall,
+ int domainVerifState, int linkGeneration, int installReason) {
PackageUserState state = modifyUserState(userId);
state.ceDataInode = ceDataInode;
state.enabled = enabled;
@@ -417,6 +427,7 @@
state.domainVerificationStatus = domainVerifState;
state.appLinkGeneration = linkGeneration;
state.installReason = installReason;
+ state.instantApp = instantApp;
}
ArraySet<String> getEnabledComponents(int userId) {
@@ -555,4 +566,32 @@
modifyUserState(userId).domainVerificationStatus =
PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
}
+
+ protected void writeUsersInfoToProto(ProtoOutputStream proto, long fieldId) {
+ int count = userState.size();
+ for (int i = 0; i < count; i++) {
+ final long userToken = proto.start(fieldId);
+ final int userId = userState.keyAt(i);
+ final PackageUserState state = userState.valueAt(i);
+ proto.write(PackageProto.UserInfoProto.ID, userId);
+ final int installType;
+ if (state.instantApp) {
+ installType = PackageProto.UserInfoProto.INSTANT_APP_INSTALL;
+ } else if (state.installed) {
+ installType = PackageProto.UserInfoProto.FULL_APP_INSTALL;
+ } else {
+ installType = PackageProto.UserInfoProto.NOT_INSTALLED_FOR_USER;
+ }
+ proto.write(PackageProto.UserInfoProto.INSTALL_TYPE, installType);
+ proto.write(PackageProto.UserInfoProto.IS_HIDDEN, state.hidden);
+ proto.write(PackageProto.UserInfoProto.IS_SUSPENDED, state.suspended);
+ proto.write(PackageProto.UserInfoProto.IS_STOPPED, state.stopped);
+ proto.write(PackageProto.UserInfoProto.IS_LAUNCHED, !state.notLaunched);
+ proto.write(PackageProto.UserInfoProto.ENABLED_STATE, state.enabled);
+ proto.write(
+ PackageProto.UserInfoProto.LAST_DISABLED_APP_CALLER,
+ state.lastDisableAppCaller);
+ proto.end(userToken);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/pm/SELinuxMMAC.java b/services/core/java/com/android/server/pm/SELinuxMMAC.java
index 7e7de21..188e66f 100644
--- a/services/core/java/com/android/server/pm/SELinuxMMAC.java
+++ b/services/core/java/com/android/server/pm/SELinuxMMAC.java
@@ -17,6 +17,8 @@
package com.android.server.pm;
import android.content.pm.PackageParser;
+import android.content.pm.PackageUserState;
+import android.content.pm.SELinuxUtil;
import android.content.pm.Signature;
import android.os.Environment;
import android.util.Slog;
@@ -69,9 +71,6 @@
// Append v2 to existing seinfo label
private static final String SANDBOX_V2_STR = ":v2";
- // Append ephemeral to existing seinfo label
- private static final String EPHEMERAL_APP_STR = ":ephemeralapp";
-
// Append targetSdkVersion=n to existing seinfo label where n is the app's targetSdkVersion
private static final String TARGETSDKVERSION_STR = ":targetSdkVersion=";
@@ -279,31 +278,28 @@
*
* @param pkg object representing the package to be labeled.
*/
- public static void assignSeinfoValue(PackageParser.Package pkg) {
+ public static void assignSeInfoValue(PackageParser.Package pkg) {
synchronized (sPolicies) {
for (Policy policy : sPolicies) {
- String seinfo = policy.getMatchedSeinfo(pkg);
- if (seinfo != null) {
- pkg.applicationInfo.seinfo = seinfo;
+ String seInfo = policy.getMatchedSeInfo(pkg);
+ if (seInfo != null) {
+ pkg.applicationInfo.seInfo = seInfo;
break;
}
}
}
- if (pkg.applicationInfo.isInstantApp())
- pkg.applicationInfo.seinfo += EPHEMERAL_APP_STR;
-
if (pkg.applicationInfo.targetSandboxVersion == 2)
- pkg.applicationInfo.seinfo += SANDBOX_V2_STR;
+ pkg.applicationInfo.seInfo += SANDBOX_V2_STR;
if (pkg.applicationInfo.isPrivilegedApp())
- pkg.applicationInfo.seinfo += PRIVILEGED_APP_STR;
+ pkg.applicationInfo.seInfo += PRIVILEGED_APP_STR;
- pkg.applicationInfo.seinfo += TARGETSDKVERSION_STR + pkg.applicationInfo.targetSdkVersion;
+ pkg.applicationInfo.seInfo += TARGETSDKVERSION_STR + pkg.applicationInfo.targetSdkVersion;
if (DEBUG_POLICY_INSTALL) {
Slog.i(TAG, "package (" + pkg.packageName + ") labeled with " +
- "seinfo=" + pkg.applicationInfo.seinfo);
+ "seinfo=" + pkg.applicationInfo.seInfo);
}
}
}
@@ -438,7 +434,7 @@
* @return A string representing the seinfo matched during policy lookup.
* A value of null can also be returned if no match occured.
*/
- public String getMatchedSeinfo(PackageParser.Package pkg) {
+ public String getMatchedSeInfo(PackageParser.Package pkg) {
// Check for exact signature matches across all certs.
Signature[] certs = mCerts.toArray(new Signature[0]);
if (!Signature.areExactMatch(certs, pkg.mSignatures)) {
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 6156802..570b31f 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -65,6 +65,7 @@
import android.os.UserManager;
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
+import android.service.pm.PackageServiceDumpProto;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -77,6 +78,7 @@
import android.util.SparseIntArray;
import android.util.SparseLongArray;
import android.util.Xml;
+import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.BackgroundThread;
@@ -219,6 +221,7 @@
private static final String ATTR_DOMAIN_VERIFICATON_STATE = "domainVerificationStatus";
private static final String ATTR_APP_LINK_GENERATION = "app-link-generation";
private static final String ATTR_INSTALL_REASON = "install-reason";
+ private static final String ATTR_INSTANT_APP = "instant-app";
private static final String ATTR_PACKAGE_NAME = "packageName";
private static final String ATTR_FINGERPRINT = "fingerprint";
@@ -687,7 +690,7 @@
PackageSetting disabledPkg, String realPkgName, SharedUserSetting sharedUser,
File codePath, File resourcePath, String legacyNativeLibraryPath, String primaryCpuAbi,
String secondaryCpuAbi, int versionCode, int pkgFlags, int pkgPrivateFlags,
- UserHandle installUser, boolean allowInstall, String parentPkgName,
+ UserHandle installUser, boolean allowInstall, boolean instantApp, String parentPkgName,
List<String> childPkgNames, UserManagerService userManager,
String[] usesStaticLibraries, int[] usesStaticLibrariesVersions) {
final PackageSetting pkgSetting;
@@ -745,14 +748,17 @@
|| installUserId == user.id;
pkgSetting.setUserState(user.id, 0, COMPONENT_ENABLED_STATE_DEFAULT,
installed,
- true, // stopped,
- true, // notLaunched
- false, // hidden
- false, // suspended
- null, null, null,
- false, // blockUninstall
- INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED, 0,
- PackageManager.INSTALL_REASON_UNKNOWN);
+ true /*stopped*/,
+ true /*notLaunched*/,
+ false /*hidden*/,
+ false /*suspended*/,
+ instantApp,
+ null /*lastDisableAppCaller*/,
+ null /*enabledComponents*/,
+ null /*disabledComponents*/,
+ false /*blockUninstall*/,
+ INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED,
+ 0, PackageManager.INSTALL_REASON_UNKNOWN);
}
}
}
@@ -883,9 +889,9 @@
}
if (p.appId < 0) {
PackageManagerService.reportSettingsProblem(Log.WARN,
- "Package " + p.name + " could not be assigned a valid uid");
+ "Package " + p.name + " could not be assigned a valid UID");
throw new PackageManagerException(INSTALL_FAILED_INSUFFICIENT_STORAGE,
- "Creating application package " + p.name + " failed");
+ "Package " + p.name + " could not be assigned a valid UID");
}
}
@@ -1643,15 +1649,18 @@
// consider all applications to be installed.
for (PackageSetting pkg : mPackages.values()) {
pkg.setUserState(userId, 0, COMPONENT_ENABLED_STATE_DEFAULT,
- true, // installed
- false, // stopped
- false, // notLaunched
- false, // hidden
- false, // suspended
- null, null, null,
- false, // blockUninstall
- INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED, 0,
- PackageManager.INSTALL_REASON_UNKNOWN);
+ true /*installed*/,
+ false /*stopped*/,
+ false /*notLaunched*/,
+ false /*hidden*/,
+ false /*suspended*/,
+ false /*instantApp*/,
+ null /*lastDisableAppCaller*/,
+ null /*enabledComponents*/,
+ null /*disabledComponents*/,
+ false /*blockUninstall*/,
+ INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED,
+ 0, PackageManager.INSTALL_REASON_UNKNOWN);
}
return;
}
@@ -1718,6 +1727,8 @@
false);
final boolean blockUninstall = XmlUtils.readBooleanAttribute(parser,
ATTR_BLOCK_UNINSTALL, false);
+ final boolean instantApp = XmlUtils.readBooleanAttribute(parser,
+ ATTR_INSTANT_APP, false);
final int enabled = XmlUtils.readIntAttribute(parser, ATTR_ENABLED,
COMPONENT_ENABLED_STATE_DEFAULT);
final String enabledCaller = parser.getAttributeValue(null,
@@ -1754,8 +1765,9 @@
}
ps.setUserState(userId, ceDataInode, enabled, installed, stopped, notLaunched,
- hidden, suspended, enabledCaller, enabledComponents, disabledComponents,
- blockUninstall, verifState, linkGeneration, installReason);
+ hidden, suspended, instantApp, enabledCaller, enabledComponents,
+ disabledComponents, blockUninstall, verifState, linkGeneration,
+ installReason);
} else if (tagName.equals("preferred-activities")) {
readPreferredActivitiesLPw(parser, userId);
} else if (tagName.equals(TAG_PERSISTENT_PREFERRED_ACTIVITIES)) {
@@ -2025,6 +2037,9 @@
if (ustate.blockUninstall) {
serializer.attribute(null, ATTR_BLOCK_UNINSTALL, "true");
}
+ if (ustate.instantApp) {
+ serializer.attribute(null, ATTR_INSTANT_APP, "true");
+ }
if (ustate.enabled != COMPONENT_ENABLED_STATE_DEFAULT) {
serializer.attribute(null, ATTR_ENABLED,
Integer.toString(ustate.enabled));
@@ -2682,7 +2697,7 @@
sb.append(isDebug ? " 1 " : " 0 ");
sb.append(dataPath);
sb.append(" ");
- sb.append(ai.seinfo);
+ sb.append(ai.seInfo);
sb.append(" ");
if (gids != null && gids.length > 0) {
sb.append(gids[0]);
@@ -3357,7 +3372,7 @@
private void applyDefaultPreferredActivityLPw(PackageManagerService service,
Intent intent, int flags, ComponentName cn, String scheme, PatternMatcher ssp,
IntentFilter.AuthorityEntry auth, PatternMatcher path, int userId) {
- flags = service.updateFlagsForResolve(flags, userId, intent);
+ flags = service.updateFlagsForResolve(flags, userId, intent, false);
List<ResolveInfo> ri = service.mActivities.queryIntent(intent,
intent.getType(), flags, 0);
if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Queried " + intent
@@ -4140,7 +4155,7 @@
volumeUuids[i] = ps.volumeUuid;
names[i] = ps.name;
appIds[i] = ps.appId;
- seinfos[i] = ps.pkg.applicationInfo.seinfo;
+ seinfos[i] = ps.pkg.applicationInfo.seInfo;
targetSdkVersions[i] = ps.pkg.applicationInfo.targetSdkVersion;
}
}
@@ -4429,7 +4444,7 @@
ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE, "DEFAULT_TO_DEVICE_PROTECTED_STORAGE",
ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE, "DIRECT_BOOT_AWARE",
ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE, "PARTIALLY_DIRECT_BOOT_AWARE",
- ApplicationInfo.PRIVATE_FLAG_EPHEMERAL, "EPHEMERAL",
+ ApplicationInfo.PRIVATE_FLAG_INSTANT, "EPHEMERAL",
ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER, "REQUIRED_FOR_SYSTEM_USER",
ApplicationInfo.PRIVATE_FLAG_RESIZEABLE_ACTIVITIES_EXPLICITLY_SET, "RESIZEABLE_ACTIVITIES_EXPLICITLY_SET",
ApplicationInfo.PRIVATE_FLAG_RESIZEABLE_ACTIVITIES_VIA_SDK_VERSION, "RESIZEABLE_ACTIVITIES_VIA_SDK_VERSION",
@@ -4502,6 +4517,7 @@
pw.print(ps.getSuspended(user.id) ? "SU" : "su");
pw.print(ps.getStopped(user.id) ? "S" : "s");
pw.print(ps.getNotLaunched(user.id) ? "l" : "L");
+ pw.print(ps.getInstantApp(user.id) ? "IA" : "ia");
pw.print(",");
pw.print(ps.getEnabled(user.id));
String lastDisabledAppCaller = ps.getLastDisabledAppCaller(user.id);
@@ -4755,6 +4771,8 @@
pw.print(ps.getNotLaunched(user.id));
pw.print(" enabled=");
pw.println(ps.getEnabled(user.id));
+ pw.print(" instant=");
+ pw.println(ps.getInstantApp(user.id));
String lastDisabledAppCaller = ps.getLastDisabledAppCaller(user.id);
if (lastDisabledAppCaller != null) {
pw.print(prefix); pw.print(" lastDisabledCaller: ");
@@ -4860,6 +4878,16 @@
}
}
+ void dumpPackagesProto(ProtoOutputStream proto) {
+ List<UserInfo> users = getAllUsers(UserManagerService.getInstance());
+
+ final int count = mPackages.size();
+ for (int i = 0; i < count; i++) {
+ final PackageSetting ps = mPackages.valueAt(i);
+ ps.writeToProto(proto, PackageServiceDumpProto.PACKAGES, users);
+ }
+ }
+
void dumpPermissionsLPr(PrintWriter pw, String packageName, ArraySet<String> permissionNames,
DumpState dumpState) {
boolean printedSomething = false;
@@ -4950,6 +4978,17 @@
}
}
+ void dumpSharedUsersProto(ProtoOutputStream proto) {
+ final int count = mSharedUsers.size();
+ for (int i = 0; i < count; i++) {
+ final SharedUserSetting su = mSharedUsers.valueAt(i);
+ final long sharedUserToken = proto.start(PackageServiceDumpProto.SHARED_USERS);
+ proto.write(PackageServiceDumpProto.SharedUserProto.USER_ID, su.userId);
+ proto.write(PackageServiceDumpProto.SharedUserProto.NAME, su.name);
+ proto.end(sharedUserToken);
+ }
+ }
+
void dumpReadMessagesLPr(PrintWriter pw, DumpState dumpState) {
pw.println("Settings parse messages:");
pw.print(mReadMessages.toString());
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java
index 3085c9c..ac98ab9 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackage.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackage.java
@@ -20,6 +20,7 @@
import android.annotation.UserIdInt;
import android.content.ComponentName;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.PackageInfo;
import android.content.pm.ShortcutInfo;
import android.content.res.Resources;
@@ -31,6 +32,7 @@
import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
import com.android.internal.util.XmlUtils;
import com.android.server.pm.ShortcutService.ShortcutOperation;
@@ -68,6 +70,9 @@
private static final String TAG_EXTRAS = "extras";
private static final String TAG_SHORTCUT = "shortcut";
private static final String TAG_CATEGORIES = "categories";
+ private static final String TAG_CHOOSER_EXTRAS = "chooser-extras";
+ private static final String TAG_CHOOSER_INTENT_FILTERS = "chooser-intent-filters";
+ private static final String TAG_CHOOSER_COMPONENT_NAMES = "chooser-component-names";
private static final String ATTR_NAME = "name";
private static final String ATTR_CALL_COUNT = "call-count";
@@ -91,6 +96,7 @@
private static final String ATTR_ICON_RES_ID = "icon-res";
private static final String ATTR_ICON_RES_NAME = "icon-resname";
private static final String ATTR_BITMAP_PATH = "bitmap-path";
+ private static final String ATTR_COMPONENT_NAMES = "component-names";
private static final String NAME_CATEGORIES = "categories";
@@ -200,7 +206,7 @@
if (shortcut != null) {
mShortcutUser.mService.removeIcon(getPackageUserId(), shortcut);
shortcut.clearFlags(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_PINNED
- | ShortcutInfo.FLAG_MANIFEST);
+ | ShortcutInfo.FLAG_MANIFEST | ShortcutInfo.FLAG_CHOOSER);
}
return shortcut;
}
@@ -226,7 +232,7 @@
Preconditions.checkArgument(newShortcut.isEnabled(),
"add/setDynamicShortcuts() cannot publish disabled shortcuts");
- newShortcut.addFlags(ShortcutInfo.FLAG_DYNAMIC);
+ addCorrectDynamicFlags(newShortcut);
final ShortcutInfo oldShortcut = mShortcuts.get(newShortcut.getId());
@@ -250,6 +256,17 @@
addShortcutInner(newShortcut);
}
+ // TODO: Sample code & JavaDoc for ShortcutManager needs updating to reflect the fact that
+ // Chooser shortcuts are not always dynamic.
+ public void addCorrectDynamicFlags(@NonNull ShortcutInfo shortcut) {
+ if (shortcut.getIntent() != null) {
+ shortcut.addFlags(ShortcutInfo.FLAG_DYNAMIC);
+ }
+ if (!ArrayUtils.isEmpty(shortcut.getChooserIntentFilters())) {
+ shortcut.addFlags(ShortcutInfo.FLAG_CHOOSER);
+ }
+ }
+
/**
* Remove all shortcuts that aren't pinned nor dynamic.
*/
@@ -282,11 +299,11 @@
boolean changed = false;
for (int i = mShortcuts.size() - 1; i >= 0; i--) {
final ShortcutInfo si = mShortcuts.valueAt(i);
- if (si.isDynamic()) {
+ if (si.isDynamic() || si.isChooser()) {
changed = true;
si.setTimestamp(now);
- si.clearFlags(ShortcutInfo.FLAG_DYNAMIC);
+ si.clearFlags(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_CHOOSER);
si.setRank(0); // It may still be pinned, so clear the rank.
}
}
@@ -355,7 +372,8 @@
if (oldShortcut.isPinned()) {
oldShortcut.setRank(0);
- oldShortcut.clearFlags(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_MANIFEST);
+ oldShortcut.clearFlags(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_MANIFEST
+ | ShortcutInfo.FLAG_CHOOSER);
if (disable) {
oldShortcut.addFlags(ShortcutInfo.FLAG_DISABLED);
}
@@ -1116,8 +1134,8 @@
// Don't adjust ranks for manifest shortcuts.
continue;
}
- // At this point, it must be dynamic.
- if (!si.isDynamic()) {
+ // At this point, it must be dynamic or a chooser.
+ if (!si.isDynamicOrChooser()) {
s.wtf("Non-dynamic shortcut found.");
continue;
}
@@ -1294,7 +1312,7 @@
ShortcutService.writeAttr(out, ATTR_FLAGS,
si.getFlags() &
~(ShortcutInfo.FLAG_HAS_ICON_FILE | ShortcutInfo.FLAG_HAS_ICON_RES
- | ShortcutInfo.FLAG_DYNAMIC));
+ | ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_CHOOSER));
} else {
// When writing for backup, ranks shouldn't be saved, since shortcuts won't be restored
// as dynamic.
@@ -1317,15 +1335,36 @@
}
final Intent[] intentsNoExtras = si.getIntentsNoExtras();
final PersistableBundle[] intentsExtras = si.getIntentPersistableExtrases();
- final int numIntents = intentsNoExtras.length;
- for (int i = 0; i < numIntents; i++) {
- out.startTag(null, TAG_INTENT);
- ShortcutService.writeAttr(out, ATTR_INTENT_NO_EXTRA, intentsNoExtras[i]);
- ShortcutService.writeTagExtra(out, TAG_EXTRAS, intentsExtras[i]);
- out.endTag(null, TAG_INTENT);
+ if (intentsNoExtras != null) {
+ final int numIntents = intentsNoExtras.length;
+ for (int i = 0; i < numIntents; i++) {
+ out.startTag(null, TAG_INTENT);
+ ShortcutService.writeAttr(out, ATTR_INTENT_NO_EXTRA, intentsNoExtras[i]);
+ ShortcutService.writeTagExtra(out, TAG_EXTRAS, intentsExtras[i]);
+ out.endTag(null, TAG_INTENT);
+ }
+ }
+ ShortcutService.writeTagExtra(out, TAG_EXTRAS, si.getExtras());
+
+ ShortcutService.writeTagExtra(out, TAG_CHOOSER_EXTRAS, si.getChooserExtras());
+
+ final IntentFilter[] intentFilters = si.getChooserIntentFilters();
+ if (intentFilters != null) {
+ for (int i = 0; i < intentFilters.length; i++) {
+ out.startTag(null, TAG_CHOOSER_INTENT_FILTERS);
+ intentFilters[i].writeToXml(out);
+ out.endTag(null, TAG_CHOOSER_INTENT_FILTERS);
+ }
}
- ShortcutService.writeTagExtra(out, TAG_EXTRAS, si.getExtras());
+ final ComponentName[] componentNames = si.getChooserComponentNames();
+ if (componentNames != null) {
+ for (int i = 0; i < componentNames.length; i++) {
+ out.startTag(null, TAG_CHOOSER_COMPONENT_NAMES);
+ ShortcutService.writeAttr(out, ATTR_COMPONENT_NAMES, componentNames[i]);
+ out.endTag(null, TAG_CHOOSER_COMPONENT_NAMES);
+ }
+ }
out.endTag(null, TAG_SHORTCUT);
}
@@ -1398,6 +1437,9 @@
String iconResName;
String bitmapPath;
ArraySet<String> categories = null;
+ PersistableBundle chooserExtras;
+ List<IntentFilter> chooserIntentFilters = new ArrayList<>();
+ List<ComponentName> chooserComponentNames = new ArrayList<>();
id = ShortcutService.parseStringAttribute(parser, ATTR_ID);
activityComponent = ShortcutService.parseComponentNameAttribute(parser,
@@ -1458,6 +1500,18 @@
}
}
continue;
+ case TAG_CHOOSER_EXTRAS:
+ chooserExtras = PersistableBundle.restoreFromXml(parser);
+ continue;
+ case TAG_CHOOSER_COMPONENT_NAMES:
+ chooserComponentNames.add(ShortcutService.parseComponentNameAttribute(parser,
+ ATTR_ACTIVITY));
+ continue;
+ case TAG_CHOOSER_INTENT_FILTERS:
+ IntentFilter toAdd = new IntentFilter();
+ toAdd.readFromXml(parser);
+ chooserIntentFilters.add(toAdd);
+ continue;
}
throw ShortcutService.throwForInvalidTag(depth, tag);
}
@@ -1551,10 +1605,10 @@
// Verify each shortcut's status.
for (int i = mShortcuts.size() - 1; i >= 0; i--) {
final ShortcutInfo si = mShortcuts.valueAt(i);
- if (!(si.isDeclaredInManifest() || si.isDynamic() || si.isPinned())) {
+ if (!(si.isDeclaredInManifest() || si.isDynamicOrChooser() || si.isPinned())) {
failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
- + " is not manifest, dynamic or pinned.");
+ + " is not manifest, dynamic, chooser or pinned.");
}
if (si.isDeclaredInManifest() && si.isDynamic()) {
failed = true;
@@ -1581,6 +1635,11 @@
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " still has an icon");
}
+ if (si.hasMaskableBitmap() && !si.hasIconFile()) {
+ failed = true;
+ Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ + " has maskable bitmap but was not saved to a file.");
+ }
if (si.hasIconFile() && si.hasIconResource()) {
failed = true;
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
@@ -1591,6 +1650,11 @@
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ " has a dummy target activity");
}
+ if (si.getIntent() == null && !si.isChooser()) {
+ failed = true;
+ Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
+ + " has a null intent, but is not a chooser");
+ }
}
if (failed) {
diff --git a/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java b/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java
index 6eac5e3..b0689b8 100644
--- a/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java
+++ b/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java
@@ -48,7 +48,7 @@
/**
* Internal for {@link android.content.pm.LauncherApps.PinItemRequest} which receives callbacks.
*/
- private static class PinItemRequestInner extends IPinItemRequest.Stub {
+ private abstract static class PinItemRequestInner extends IPinItemRequest.Stub {
protected final ShortcutRequestPinProcessor mProcessor;
private final IntentSender mResultIntent;
private final int mLauncherUid;
@@ -63,6 +63,14 @@
mLauncherUid = launcherUid;
}
+ public ShortcutInfo getShortcutInfo() {
+ return null;
+ }
+
+ public AppWidgetProviderInfo getAppWidgetProviderInfo() {
+ return null;
+ }
+
/**
* Returns true if the caller is same as the default launcher app when this request
* object was created.
@@ -126,6 +134,26 @@
/**
* Internal for {@link android.content.pm.LauncherApps.PinItemRequest} which receives callbacks.
*/
+ private static class PinAppWidgetRequestInner extends PinItemRequestInner {
+ final AppWidgetProviderInfo mAppWidgetProviderInfo;
+
+ private PinAppWidgetRequestInner(ShortcutRequestPinProcessor processor,
+ IntentSender resultIntent, int launcherUid,
+ AppWidgetProviderInfo appWidgetProviderInfo) {
+ super(processor, resultIntent, launcherUid);
+
+ mAppWidgetProviderInfo = appWidgetProviderInfo;
+ }
+
+ @Override
+ public AppWidgetProviderInfo getAppWidgetProviderInfo() {
+ return mAppWidgetProviderInfo;
+ }
+ }
+
+ /**
+ * Internal for {@link android.content.pm.LauncherApps.PinItemRequest} which receives callbacks.
+ */
private static class PinShortcutRequestInner extends PinItemRequestInner {
/** Original shortcut passed by the app. */
public final ShortcutInfo shortcutOriginal;
@@ -153,6 +181,11 @@
}
@Override
+ public ShortcutInfo getShortcutInfo() {
+ return shortcutForLauncher;
+ }
+
+ @Override
protected boolean tryAccept() {
if (DEBUG) {
Slog.d(TAG, "Launcher accepted shortcut. ID=" + shortcutOriginal.getId()
@@ -208,8 +241,9 @@
} else {
int launcherUid = mService.injectGetPackageUid(
confirmActivity.first.getPackageName(), launcherUserId);
- request = new PinItemRequest(inAppWidget,
- new PinItemRequestInner(this, resultIntent, launcherUid));
+ request = new PinItemRequest(
+ new PinAppWidgetRequestInner(this, resultIntent, launcherUid, inAppWidget),
+ PinItemRequest.REQUEST_TYPE_APPWIDGET);
}
return startRequestConfirmActivity(confirmActivity.first, launcherUserId, request,
requestType);
@@ -319,7 +353,7 @@
mService.injectGetPackageUid(launcherPackage, launcherUserId),
existsAlready);
- return new PinItemRequest(shortcutForLauncher, inner);
+ return new PinItemRequest(inner, PinItemRequest.REQUEST_TYPE_SHORTCUT);
}
private void validateExistingShortcut(ShortcutInfo shortcutInfo) {
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index d8857b7..74eb340 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -27,6 +27,7 @@
import android.appwidget.AppWidgetProviderInfo;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -64,6 +65,7 @@
import android.os.Handler;
import android.os.LocaleList;
import android.os.Looper;
+import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
import android.os.Process;
@@ -1216,7 +1218,8 @@
// he XML we'd lose the icon. We just remove all dangling files after saving the XML.
shortcut.setIconResourceId(0);
shortcut.setIconResName(null);
- shortcut.clearFlags(ShortcutInfo.FLAG_HAS_ICON_FILE | ShortcutInfo.FLAG_HAS_ICON_RES);
+ shortcut.clearFlags(ShortcutInfo.FLAG_HAS_ICON_FILE |
+ ShortcutInfo.FLAG_MASKABLE_BITMAP | ShortcutInfo.FLAG_HAS_ICON_RES);
}
public void cleanupBitmapsForPackage(@UserIdInt int userId, String packageName) {
@@ -1351,7 +1354,8 @@
shortcut.addFlags(ShortcutInfo.FLAG_HAS_ICON_RES);
return;
}
- case Icon.TYPE_BITMAP: {
+ case Icon.TYPE_BITMAP:
+ case Icon.TYPE_BITMAP_MASKABLE: {
bitmap = icon.getBitmap(); // Don't recycle in this case.
break;
}
@@ -1382,6 +1386,9 @@
shortcut.setBitmapPath(out.getFile().getAbsolutePath());
shortcut.addFlags(ShortcutInfo.FLAG_HAS_ICON_FILE);
+ if (icon.getType() == Icon.TYPE_BITMAP_MASKABLE) {
+ shortcut.addFlags(ShortcutInfo.FLAG_MASKABLE_BITMAP);
+ }
} finally {
IoUtils.closeQuietly(out);
}
@@ -1745,6 +1752,7 @@
ps.clearAllImplicitRanks();
assignImplicitRanks(newShortcuts);
+ // TODO: Consider removing Chooser fields. If so, the FLAG_CHOOSER should be removed
for (int i = 0; i < size; i++) {
final ShortcutInfo source = newShortcuts.get(i);
fixUpIncomingShortcutInfo(source, /* forUpdate= */ true);
@@ -1784,6 +1792,13 @@
if (replacingIcon || source.hasStringResources()) {
fixUpShortcutResourceNamesAndValues(target);
}
+
+ // While updating, we keep the dynamic flag as it previously was, but refresh the
+ // chooser flag.
+ // TODO: If we support clearing Chooser fields, we should also remove the flag.
+ if (target.getChooserIntentFilters() != null) {
+ target.addFlags(ShortcutInfo.FLAG_CHOOSER);
+ }
}
// Lastly, adjust the ranks.
@@ -1847,6 +1862,7 @@
return true;
}
+ // TODO: Ensure non-launchable shortcuts can not be pinned
@Override
public boolean requestPinShortcut(String packageName, ShortcutInfo shortcut,
IntentSender resultIntent, int userId) {
@@ -2002,7 +2018,7 @@
return getShortcutsWithQueryLocked(
packageName, userId, ShortcutInfo.CLONE_REMOVE_FOR_CREATOR,
- ShortcutInfo::isDynamic);
+ ShortcutInfo::isDynamicOrChooser);
}
}
@@ -2195,6 +2211,14 @@
synchronized (mLock) {
throwIfUserLockedL(userId);
+ // For the chooser, we just check is the system is calling.
+ // STOPSHIP: We need to implement a new permission here rather than this terrible check.
+ // The packageName check is to try to distinguish between when an actual
+ // launcher is making the call, and when it's the system.
+ if (isCallerSystem() && packageName.equals("android")) {
+ return true;
+ }
+
final ShortcutUser user = getUserShortcutsLocked(userId);
// Always trust the cached component.
@@ -2367,7 +2391,7 @@
public List<ShortcutInfo> getShortcuts(int launcherUserId,
@NonNull String callingPackage, long changedSince,
@Nullable String packageName, @Nullable List<String> shortcutIds,
- @Nullable ComponentName componentName,
+ @Nullable ComponentName componentName, @Nullable Intent intent,
int queryFlags, int userId) {
final ArrayList<ShortcutInfo> ret = new ArrayList<>();
@@ -2389,13 +2413,13 @@
if (packageName != null) {
getShortcutsInnerLocked(launcherUserId,
callingPackage, packageName, shortcutIds, changedSince,
- componentName, queryFlags, userId, ret, cloneFlag);
+ componentName, intent, queryFlags, userId, ret, cloneFlag);
} else {
final List<String> shortcutIdsF = shortcutIds;
getUserShortcutsLocked(userId).forAllPackages(p -> {
getShortcutsInnerLocked(launcherUserId,
callingPackage, p.getPackageName(), shortcutIdsF, changedSince,
- componentName, queryFlags, userId, ret, cloneFlag);
+ componentName, intent, queryFlags, userId, ret, cloneFlag);
});
}
}
@@ -2404,7 +2428,7 @@
private void getShortcutsInnerLocked(int launcherUserId, @NonNull String callingPackage,
@Nullable String packageName, @Nullable List<String> shortcutIds, long changedSince,
- @Nullable ComponentName componentName, int queryFlags,
+ @Nullable ComponentName componentName, Intent intent, int queryFlags,
int userId, ArrayList<ShortcutInfo> ret, int cloneFlag) {
final ArraySet<String> ids = shortcutIds == null ? null
: new ArraySet<>(shortcutIds);
@@ -2429,6 +2453,15 @@
return false;
}
}
+ if (intent != null
+ && !si.hasMatchingFilter(mContext.getContentResolver(), intent)) {
+ return false;
+ }
+
+ if (((queryFlags & ShortcutQuery.FLAG_MATCH_CHOOSER) != 0)
+ && si.isChooser()) {
+ return true;
+ }
if (((queryFlags & ShortcutQuery.FLAG_GET_DYNAMIC) != 0)
&& si.isDynamic()) {
return true;
diff --git a/services/core/java/com/android/server/policy/AccessibilityShortcutController.java b/services/core/java/com/android/server/policy/AccessibilityShortcutController.java
index 133881a..eec1fef 100644
--- a/services/core/java/com/android/server/policy/AccessibilityShortcutController.java
+++ b/services/core/java/com/android/server/policy/AccessibilityShortcutController.java
@@ -140,8 +140,11 @@
String toastMessage = String.format(toastMessageFormatString,
serviceInfo.getResolveInfo()
.loadLabel(mContext.getPackageManager()).toString());
- mFrameworkObjectProvider.makeToastFromText(mContext, toastMessage, Toast.LENGTH_LONG)
- .show();
+ Toast warningToast = mFrameworkObjectProvider.makeToastFromText(
+ mContext, toastMessage, Toast.LENGTH_LONG);
+ warningToast.getWindowParams().privateFlags |=
+ WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+ warningToast.show();
mFrameworkObjectProvider.getAccessibilityManagerInstance(mContext)
.performAccessibilityShortcut();
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 3e05157..0d6cd80 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -236,6 +236,7 @@
import com.android.server.statusbar.StatusBarManagerInternal;
import com.android.server.wm.AppTransition;
import com.android.server.vr.VrManagerInternal;
+import com.android.server.vr.PersistentVrStateListener;
import java.io.File;
import java.io.FileReader;
@@ -416,6 +417,9 @@
AppOpsManager mAppOpsManager;
private boolean mHasFeatureWatch;
+ // Assigned on main thread, accessed on UI thread
+ volatile VrManagerInternal mVrManagerInternal;
+
// Vibrator pattern for haptic feedback of a long press.
long[] mLongPressVibePattern;
@@ -503,6 +507,8 @@
volatile boolean mGoingToSleep;
volatile boolean mRecentsVisible;
volatile boolean mTvPictureInPictureVisible;
+ // Written by vr manager thread, only read in this class
+ volatile boolean mPersistentVrModeEnabled;
// Used to hold the last user key used to wake the device. This helps us prevent up events
// from being passed to the foregrounded app without a corresponding down event
@@ -982,6 +988,14 @@
}
MyOrientationListener mOrientationListener;
+ final PersistentVrStateListener mPersistentVrModeListener =
+ new PersistentVrStateListener() {
+ @Override
+ public void onPersistentVrStateChanged(boolean enabled) {
+ mPersistentVrModeEnabled = enabled;
+ }
+ };
+
private final StatusBarController mStatusBarController = new StatusBarController();
private final BarController mNavigationBarController = new BarController("NavigationBar",
@@ -1914,24 +1928,36 @@
if (mStatusBar != null) {
requestTransientBars(mStatusBar);
}
+ if (mPersistentVrModeEnabled) {
+ exitPersistentVrMode();
+ }
}
@Override
public void onSwipeFromBottom() {
if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_BOTTOM) {
requestTransientBars(mNavigationBar);
}
+ if (mPersistentVrModeEnabled) {
+ exitPersistentVrMode();
+ }
}
@Override
public void onSwipeFromRight() {
if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_RIGHT) {
requestTransientBars(mNavigationBar);
}
+ if (mPersistentVrModeEnabled) {
+ exitPersistentVrMode();
+ }
}
@Override
public void onSwipeFromLeft() {
if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_LEFT) {
requestTransientBars(mNavigationBar);
}
+ if (mPersistentVrModeEnabled) {
+ exitPersistentVrMode();
+ }
}
@Override
public void onFling(int duration) {
@@ -2730,6 +2756,15 @@
if (DEBUG_SPLASH_SCREEN) Slog.d(TAG, "addSplashScreen " + packageName
+ ": nonLocalizedLabel=" + nonLocalizedLabel + " theme="
+ Integer.toHexString(theme));
+
+ // Obtain proper context to launch on the right display.
+ final Context displayContext = getDisplayContext(context, displayId);
+ if (displayContext == null) {
+ // Can't show splash screen on requested display, so skip showing at all.
+ return null;
+ }
+ context = displayContext;
+
if (theme != context.getThemeResId() || labelRes != 0) {
try {
context = context.createPackageContext(packageName, 0);
@@ -2814,14 +2849,7 @@
}
params.setTitle("Splash Screen " + packageName);
-
- // Obtain proper context to launch on the right display.
- final Context displayContext = getDisplayContext(context, displayId);
- if (displayContext == null) {
- // Can't show splash screen on requested display, so skip showing at all.
- return null;
- }
- wm = (WindowManager) displayContext.getSystemService(WINDOW_SERVICE);
+ wm = (WindowManager) context.getSystemService(WINDOW_SERVICE);
view = win.getDecorView();
if (DEBUG_SPLASH_SCREEN) Slog.d(TAG, "Adding splash screen window for "
@@ -5736,7 +5764,7 @@
mScreenshotChordVolumeDownKeyConsumed = false;
cancelPendingPowerKeyAction();
interceptScreenshotChord();
- if (!keyguardActive) {
+ if (!isKeyguardLocked()) {
interceptAccessibilityShortcutChord();
}
}
@@ -5754,7 +5782,7 @@
mA11yShortcutChordVolumeUpKeyConsumed = false;
cancelPendingPowerKeyAction();
cancelPendingScreenshotChordAction();
- if (!keyguardActive) {
+ if (!isKeyguardLocked()) {
interceptAccessibilityShortcutChord();
}
}
@@ -6487,11 +6515,17 @@
}
private void reportScreenStateToVrManager(boolean isScreenOn) {
- VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
- if (vrService == null) {
+ if (mVrManagerInternal == null) {
return;
}
- vrService.onScreenStateChanged(isScreenOn);
+ mVrManagerInternal.onScreenStateChanged(isScreenOn);
+ }
+
+ private void exitPersistentVrMode() {
+ if (mVrManagerInternal == null) {
+ return;
+ }
+ mVrManagerInternal.setPersistentVrModeEnabled(false);
}
private void finishWindowsDrawn() {
@@ -6980,6 +7014,11 @@
});
mKeyguardDelegate.onSystemReady();
+ mVrManagerInternal = LocalServices.getService(VrManagerInternal.class);
+ if (mVrManagerInternal != null) {
+ mVrManagerInternal.addPersistentVrModeStateListener(mPersistentVrModeListener);
+ }
+
readCameraLensCoverState();
updateUiMode();
boolean bindKeyguardNow;
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index ffbb428..d3931fb 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -51,21 +51,23 @@
import android.os.UserHandle;
import android.os.WorkSource;
import android.provider.Settings;
-import android.provider.Settings.Secure;
import android.provider.Settings.SettingNotFoundException;
import android.service.dreams.DreamManagerInternal;
+import android.service.power.PowerServiceDumpProto;
+import android.service.power.PowerServiceSettingsAndConfigurationDumpProto;
+import android.service.power.SuspendBlockerProto;
+import android.service.power.WakeLockProto;
import android.service.vr.IVrManager;
import android.service.vr.IVrStateCallbacks;
import android.util.EventLog;
import android.util.KeyValueListParser;
-import android.util.Log;
import android.util.PrintWriterPrinter;
import android.util.Slog;
import android.util.SparseArray;
import android.util.TimeUtils;
+import android.util.proto.ProtoOutputStream;
import android.view.Display;
import android.view.WindowManagerPolicy;
-
import com.android.internal.app.IAppOpsService;
import com.android.internal.app.IBatteryStats;
import com.android.internal.os.BackgroundThread;
@@ -78,7 +80,7 @@
import com.android.server.am.BatteryStatsService;
import com.android.server.lights.Light;
import com.android.server.lights.LightsManager;
-import com.android.server.vr.VrManagerService;
+
import libcore.util.Objects;
import java.io.FileDescriptor;
@@ -575,6 +577,13 @@
pw.print(" "); pw.print(KEY_NO_CACHED_WAKE_LOCKS); pw.print("=");
pw.println(NO_CACHED_WAKE_LOCKS);
}
+
+ void dumpProto(ProtoOutputStream proto) {
+ final long constantsToken = proto.start(PowerServiceDumpProto.CONSTANTS);
+ proto.write(PowerServiceDumpProto.ConstantsProto.IS_NO_CACHED_WAKE_LOCKS,
+ NO_CACHED_WAKE_LOCKS);
+ proto.end(constantsToken);
+ }
}
final Constants mConstants;
@@ -674,9 +683,6 @@
mAppOps, createSuspendBlockerLocked("PowerManagerService.Broadcasts"),
mPolicy);
- final ContentResolver resolver = mContext.getContentResolver();
- mConstants.start(resolver);
-
mWirelessChargerDetector = new WirelessChargerDetector(sensorManager,
createSuspendBlockerLocked("PowerManagerService.WirelessChargerDetector"),
mHandler);
@@ -689,57 +695,6 @@
mDisplayManagerInternal.initPowerManagement(
mDisplayPowerCallbacks, mHandler, sensorManager);
- // Register for settings changes.
- resolver.registerContentObserver(Settings.Secure.getUriFor(
- Settings.Secure.SCREENSAVER_ENABLED),
- false, mSettingsObserver, UserHandle.USER_ALL);
- resolver.registerContentObserver(Settings.Secure.getUriFor(
- Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP),
- false, mSettingsObserver, UserHandle.USER_ALL);
- resolver.registerContentObserver(Settings.Secure.getUriFor(
- Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK),
- false, mSettingsObserver, UserHandle.USER_ALL);
- resolver.registerContentObserver(Settings.System.getUriFor(
- Settings.System.SCREEN_OFF_TIMEOUT),
- false, mSettingsObserver, UserHandle.USER_ALL);
- resolver.registerContentObserver(Settings.Secure.getUriFor(
- Settings.Secure.SLEEP_TIMEOUT),
- false, mSettingsObserver, UserHandle.USER_ALL);
- resolver.registerContentObserver(Settings.Global.getUriFor(
- Settings.Global.STAY_ON_WHILE_PLUGGED_IN),
- false, mSettingsObserver, UserHandle.USER_ALL);
- resolver.registerContentObserver(Settings.System.getUriFor(
- Settings.System.SCREEN_BRIGHTNESS),
- false, mSettingsObserver, UserHandle.USER_ALL);
- resolver.registerContentObserver(Settings.System.getUriFor(
- Settings.System.SCREEN_BRIGHTNESS_FOR_VR),
- false, mSettingsObserver, UserHandle.USER_ALL);
- resolver.registerContentObserver(Settings.System.getUriFor(
- Settings.System.SCREEN_BRIGHTNESS_MODE),
- false, mSettingsObserver, UserHandle.USER_ALL);
- resolver.registerContentObserver(Settings.System.getUriFor(
- Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ),
- false, mSettingsObserver, UserHandle.USER_ALL);
- resolver.registerContentObserver(Settings.Global.getUriFor(
- Settings.Global.LOW_POWER_MODE),
- false, mSettingsObserver, UserHandle.USER_ALL);
- resolver.registerContentObserver(Settings.Global.getUriFor(
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
- false, mSettingsObserver, UserHandle.USER_ALL);
- resolver.registerContentObserver(Settings.Global.getUriFor(
- Settings.Global.THEATER_MODE_ON),
- false, mSettingsObserver, UserHandle.USER_ALL);
- resolver.registerContentObserver(Settings.Secure.getUriFor(
- Settings.Secure.DOUBLE_TAP_TO_WAKE),
- false, mSettingsObserver, UserHandle.USER_ALL);
- IVrManager vrManager = (IVrManager) getBinderService(Context.VR_SERVICE);
- if (vrManager != null) {
- try {
- vrManager.registerListener(mVrStateCallbacks);
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to register VR mode state listener: " + e);
- }
- }
// Go.
readConfigurationLocked();
updateSettingsLocked();
@@ -747,6 +702,61 @@
updatePowerStateLocked();
}
+ final ContentResolver resolver = mContext.getContentResolver();
+ mConstants.start(resolver);
+
+ // Register for settings changes.
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.SCREENSAVER_ENABLED),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.System.getUriFor(
+ Settings.System.SCREEN_OFF_TIMEOUT),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.SLEEP_TIMEOUT),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Global.getUriFor(
+ Settings.Global.STAY_ON_WHILE_PLUGGED_IN),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.System.getUriFor(
+ Settings.System.SCREEN_BRIGHTNESS),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.System.getUriFor(
+ Settings.System.SCREEN_BRIGHTNESS_FOR_VR),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.System.getUriFor(
+ Settings.System.SCREEN_BRIGHTNESS_MODE),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.System.getUriFor(
+ Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Global.getUriFor(
+ Settings.Global.LOW_POWER_MODE),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Global.getUriFor(
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Global.getUriFor(
+ Settings.Global.THEATER_MODE_ON),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.DOUBLE_TAP_TO_WAKE),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ IVrManager vrManager = (IVrManager) getBinderService(Context.VR_SERVICE);
+ if (vrManager != null) {
+ try {
+ vrManager.registerListener(mVrStateCallbacks);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to register VR mode state listener: " + e);
+ }
+ }
+
// Register for broadcasts from other components of the system.
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
@@ -3243,6 +3253,354 @@
}
}
+ private void dumpProto(FileDescriptor fd) {
+ final WirelessChargerDetector wcd;
+ final ProtoOutputStream proto = new ProtoOutputStream(fd);
+
+ synchronized (mLock) {
+ mConstants.dumpProto(proto);
+ proto.write(PowerServiceDumpProto.DIRTY, mDirty);
+ proto.write(PowerServiceDumpProto.WAKEFULNESS, mWakefulness);
+ proto.write(PowerServiceDumpProto.IS_WAKEFULNESS_CHANGING, mWakefulnessChanging);
+ proto.write(PowerServiceDumpProto.IS_POWERED, mIsPowered);
+ proto.write(PowerServiceDumpProto.PLUG_TYPE, mPlugType);
+ proto.write(PowerServiceDumpProto.BATTERY_LEVEL, mBatteryLevel);
+ proto.write(
+ PowerServiceDumpProto.BATTERY_LEVEL_WHEN_DREAM_STARTED,
+ mBatteryLevelWhenDreamStarted);
+ proto.write(PowerServiceDumpProto.DOCK_STATE, mDockState);
+ proto.write(PowerServiceDumpProto.IS_STAY_ON, mStayOn);
+ proto.write(PowerServiceDumpProto.IS_PROXIMITY_POSITIVE, mProximityPositive);
+ proto.write(PowerServiceDumpProto.IS_BOOT_COMPLETED, mBootCompleted);
+ proto.write(PowerServiceDumpProto.IS_SYSTEM_READY, mSystemReady);
+ proto.write(
+ PowerServiceDumpProto.IS_HAL_AUTO_SUSPEND_MODE_ENABLED,
+ mHalAutoSuspendModeEnabled);
+ proto.write(
+ PowerServiceDumpProto.IS_HAL_AUTO_INTERACTIVE_MODE_ENABLED,
+ mHalInteractiveModeEnabled);
+
+ final long activeWakeLocksToken = proto.start(PowerServiceDumpProto.ACTIVE_WAKE_LOCKS);
+ proto.write(
+ PowerServiceDumpProto.ActiveWakeLocksProto.IS_CPU,
+ (mWakeLockSummary & WAKE_LOCK_CPU) != 0);
+ proto.write(
+ PowerServiceDumpProto.ActiveWakeLocksProto.IS_SCREEN_BRIGHT,
+ (mWakeLockSummary & WAKE_LOCK_SCREEN_BRIGHT) != 0);
+ proto.write(
+ PowerServiceDumpProto.ActiveWakeLocksProto.IS_SCREEN_DIM,
+ (mWakeLockSummary & WAKE_LOCK_SCREEN_DIM) != 0);
+ proto.write(
+ PowerServiceDumpProto.ActiveWakeLocksProto.IS_BUTTON_BRIGHT,
+ (mWakeLockSummary & WAKE_LOCK_BUTTON_BRIGHT) != 0);
+ proto.write(
+ PowerServiceDumpProto.ActiveWakeLocksProto.IS_PROXIMITY_SCREEN_OFF,
+ (mWakeLockSummary & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0);
+ proto.write(
+ PowerServiceDumpProto.ActiveWakeLocksProto.IS_STAY_AWAKE,
+ (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) != 0);
+ proto.write(
+ PowerServiceDumpProto.ActiveWakeLocksProto.IS_DOZE,
+ (mWakeLockSummary & WAKE_LOCK_DOZE) != 0);
+ proto.write(
+ PowerServiceDumpProto.ActiveWakeLocksProto.IS_DRAW,
+ (mWakeLockSummary & WAKE_LOCK_DRAW) != 0);
+ proto.end(activeWakeLocksToken);
+
+ proto.write(PowerServiceDumpProto.NOTIFY_LONG_SCHEDULED_MS, mNotifyLongScheduled);
+ proto.write(PowerServiceDumpProto.NOTIFY_LONG_DISPATCHED_MS, mNotifyLongDispatched);
+ proto.write(PowerServiceDumpProto.NOTIFY_LONG_NEXT_CHECK_MS, mNotifyLongNextCheck);
+
+ final long userActivityToken = proto.start(PowerServiceDumpProto.USER_ACTIVITY);
+ proto.write(
+ PowerServiceDumpProto.UserActivityProto.IS_SCREEN_BRIGHT,
+ (mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0);
+ proto.write(
+ PowerServiceDumpProto.UserActivityProto.IS_SCREEN_DIM,
+ (mUserActivitySummary & USER_ACTIVITY_SCREEN_DIM) != 0);
+ proto.write(
+ PowerServiceDumpProto.UserActivityProto.IS_SCREEN_DREAM,
+ (mUserActivitySummary & USER_ACTIVITY_SCREEN_DREAM) != 0);
+ proto.end(userActivityToken);
+
+ proto.write(
+ PowerServiceDumpProto.IS_REQUEST_WAIT_FOR_NEGATIVE_PROXIMITY,
+ mRequestWaitForNegativeProximity);
+ proto.write(PowerServiceDumpProto.IS_SANDMAN_SCHEDULED, mSandmanScheduled);
+ proto.write(PowerServiceDumpProto.IS_SANDMAN_SUMMONED, mSandmanSummoned);
+ proto.write(PowerServiceDumpProto.IS_LOW_POWER_MODE_ENABLED, mLowPowerModeEnabled);
+ proto.write(PowerServiceDumpProto.IS_BATTERY_LEVEL_LOW, mBatteryLevelLow);
+ proto.write(PowerServiceDumpProto.IS_LIGHT_DEVICE_IDLE_MODE, mLightDeviceIdleMode);
+ proto.write(PowerServiceDumpProto.IS_DEVICE_IDLE_MODE, mDeviceIdleMode);
+
+ for (int id : mDeviceIdleWhitelist) {
+ proto.write(PowerServiceDumpProto.DEVICE_IDLE_WHITELIST, id);
+ }
+ for (int id : mDeviceIdleTempWhitelist) {
+ proto.write(PowerServiceDumpProto.DEVICE_IDLE_TEMP_WHITELIST, id);
+ }
+
+ proto.write(PowerServiceDumpProto.LAST_WAKE_TIME_MS, mLastWakeTime);
+ proto.write(PowerServiceDumpProto.LAST_SLEEP_TIME_MS, mLastSleepTime);
+ proto.write(PowerServiceDumpProto.LAST_USER_ACTIVITY_TIME_MS, mLastUserActivityTime);
+ proto.write(
+ PowerServiceDumpProto.LAST_USER_ACTIVITY_TIME_NO_CHANGE_LIGHTS_MS,
+ mLastUserActivityTimeNoChangeLights);
+ proto.write(
+ PowerServiceDumpProto.LAST_INTERACTIVE_POWER_HINT_TIME_MS,
+ mLastInteractivePowerHintTime);
+ proto.write(
+ PowerServiceDumpProto.LAST_SCREEN_BRIGHTNESS_BOOST_TIME_MS,
+ mLastScreenBrightnessBoostTime);
+ proto.write(
+ PowerServiceDumpProto.IS_SCREEN_BRIGHTNESS_BOOST_IN_PROGRESS,
+ mScreenBrightnessBoostInProgress);
+ proto.write(PowerServiceDumpProto.IS_DISPLAY_READY, mDisplayReady);
+ proto.write(
+ PowerServiceDumpProto.IS_HOLDING_WAKE_LOCK_SUSPEND_BLOCKER,
+ mHoldingWakeLockSuspendBlocker);
+ proto.write(
+ PowerServiceDumpProto.IS_HOLDING_DISPLAY_SUSPEND_BLOCKER,
+ mHoldingDisplaySuspendBlocker);
+
+ final long settingsAndConfigurationToken =
+ proto.start(PowerServiceDumpProto.SETTINGS_AND_CONFIGURATION);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .IS_DECOUPLE_HAL_AUTO_SUSPEND_MODE_FROM_DISPLAY_CONFIG,
+ mDecoupleHalAutoSuspendModeFromDisplayConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .IS_DECOUPLE_HAL_INTERACTIVE_MODE_FROM_DISPLAY_CONFIG,
+ mDecoupleHalInteractiveModeFromDisplayConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .IS_WAKE_UP_WHEN_PLUGGED_OR_UNPLUGGED_CONFIG,
+ mWakeUpWhenPluggedOrUnpluggedConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .IS_WAKE_UP_WHEN_PLUGGED_OR_UNPLUGGED_IN_THEATER_MODE_CONFIG,
+ mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.IS_THEATER_MODE_ENABLED,
+ mTheaterModeEnabled);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .IS_SUSPEND_WHEN_SCREEN_OFF_DUE_TO_PROXIMITY_CONFIG,
+ mSuspendWhenScreenOffDueToProximityConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.ARE_DREAMS_SUPPORTED_CONFIG,
+ mDreamsSupportedConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .ARE_DREAMS_ENABLED_BY_DEFAULT_CONFIG,
+ mDreamsEnabledByDefaultConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .ARE_DREAMS_ACTIVATED_ON_SLEEP_BY_DEFAULT_CONFIG,
+ mDreamsActivatedOnSleepByDefaultConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .ARE_DREAMS_ACTIVATED_ON_DOCK_BY_DEFAULT_CONFIG,
+ mDreamsActivatedOnDockByDefaultConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .ARE_DREAMS_ENABLED_ON_BATTERY_CONFIG,
+ mDreamsEnabledOnBatteryConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .DREAMS_BATTERY_LEVEL_MINIMUM_WHEN_POWERED_CONFIG,
+ mDreamsBatteryLevelMinimumWhenPoweredConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .DREAMS_BATTERY_LEVEL_MINIMUM_WHEN_NOT_POWERED_CONFIG,
+ mDreamsBatteryLevelMinimumWhenNotPoweredConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .DREAMS_BATTERY_LEVEL_DRAIN_CUTOFF_CONFIG,
+ mDreamsBatteryLevelDrainCutoffConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.ARE_DREAMS_ENABLED_SETTING,
+ mDreamsEnabledSetting);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .ARE_DREAMS_ACTIVATE_ON_SLEEP_SETTING,
+ mDreamsActivateOnSleepSetting);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .ARE_DREAMS_ACTIVATE_ON_DOCK_SETTING,
+ mDreamsActivateOnDockSetting);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.IS_DOZE_AFTER_SCREEN_OFF_CONFIG,
+ mDozeAfterScreenOffConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.IS_LOW_POWER_MODE_SETTING,
+ mLowPowerModeSetting);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.IS_AUTO_LOW_POWER_MODE_CONFIGURED,
+ mAutoLowPowerModeConfigured);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.IS_AUTO_LOW_POWER_MODE_SNOOZING,
+ mAutoLowPowerModeSnoozing);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .MINIMUM_SCREEN_OFF_TIMEOUT_CONFIG_MS,
+ mMinimumScreenOffTimeoutConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .MAXIMUM_SCREEN_DIM_DURATION_CONFIG_MS,
+ mMaximumScreenDimDurationConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.MAXIMUM_SCREEN_DIM_RATIO_CONFIG,
+ mMaximumScreenDimRatioConfig);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.SCREEN_OFF_TIMEOUT_SETTING_MS,
+ mScreenOffTimeoutSetting);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.SLEEP_TIMEOUT_SETTING_MS,
+ mSleepTimeoutSetting);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .MAXIMUM_SCREEN_OFF_TIMEOUT_FROM_DEVICE_ADMIN_MS,
+ mMaximumScreenOffTimeoutFromDeviceAdmin);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .IS_MAXIMUM_SCREEN_OFF_TIMEOUT_FROM_DEVICE_ADMIN_ENFORCED_LOCKED,
+ isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked());
+
+ final long stayOnWhilePluggedInToken =
+ proto.start(
+ PowerServiceSettingsAndConfigurationDumpProto.STAY_ON_WHILE_PLUGGED_IN);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.StayOnWhilePluggedInProto
+ .IS_STAY_ON_WHILE_PLUGGED_IN_AC,
+ ((mStayOnWhilePluggedInSetting & BatteryManager.BATTERY_PLUGGED_AC) != 0));
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.StayOnWhilePluggedInProto
+ .IS_STAY_ON_WHILE_PLUGGED_IN_USB,
+ ((mStayOnWhilePluggedInSetting & BatteryManager.BATTERY_PLUGGED_USB) != 0));
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.StayOnWhilePluggedInProto
+ .IS_STAY_ON_WHILE_PLUGGED_IN_WIRELESS,
+ ((mStayOnWhilePluggedInSetting & BatteryManager.BATTERY_PLUGGED_WIRELESS)
+ != 0));
+ proto.end(stayOnWhilePluggedInToken);
+
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.SCREEN_BRIGHTNESS_SETTING,
+ mScreenBrightnessSetting);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .SCREEN_AUTO_BRIGHTNESS_ADJUSTMENT_SETTING,
+ mScreenAutoBrightnessAdjustmentSetting);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.SCREEN_BRIGHTNESS_MODE_SETTING,
+ mScreenBrightnessModeSetting);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .SCREEN_BRIGHTNESS_OVERRIDE_FROM_WINDOW_MANAGER,
+ mScreenBrightnessOverrideFromWindowManager);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .USER_ACTIVITY_TIMEOUT_OVERRIDE_FROM_WINDOW_MANAGER_MS,
+ mUserActivityTimeoutOverrideFromWindowManager);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .IS_USER_INACTIVE_OVERRIDE_FROM_WINDOW_MANAGER,
+ mUserInactiveOverrideFromWindowManager);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .TEMPORARY_SCREEN_BRIGHTNESS_SETTING_OVERRIDE,
+ mTemporaryScreenBrightnessSettingOverride);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .TEMPORARY_SCREEN_AUTO_BRIGHTNESS_ADJUSTMENT_SETTING_OVERRIDE,
+ mTemporaryScreenAutoBrightnessAdjustmentSettingOverride);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .DOZE_SCREEN_STATE_OVERRIDE_FROM_DREAM_MANAGER,
+ mDozeScreenStateOverrideFromDreamManager);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .DOZED_SCREEN_BRIGHTNESS_OVERRIDE_FROM_DREAM_MANAGER,
+ mDozeScreenBrightnessOverrideFromDreamManager);
+
+ final long screenBrightnessSettingLimitsToken =
+ proto.start(
+ PowerServiceSettingsAndConfigurationDumpProto
+ .SCREEN_BRIGHTNESS_SETTING_LIMITS);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.ScreenBrightnessSettingLimitsProto
+ .SETTING_MINIMUM,
+ mScreenBrightnessSettingMinimum);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.ScreenBrightnessSettingLimitsProto
+ .SETTING_MAXIMUM,
+ mScreenBrightnessSettingMaximum);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.ScreenBrightnessSettingLimitsProto
+ .SETTING_DEFAULT,
+ mScreenBrightnessSettingDefault);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.ScreenBrightnessSettingLimitsProto
+ .SETTING_FOR_VR_DEFAULT,
+ mScreenBrightnessForVrSettingDefault);
+ proto.end(screenBrightnessSettingLimitsToken);
+
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.SCREEN_BRIGHTNESS_FOR_VR_SETTING,
+ mScreenBrightnessForVrSetting);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.IS_DOUBLE_TAP_WAKE_ENABLED,
+ mDoubleTapWakeEnabled);
+ proto.write(
+ PowerServiceSettingsAndConfigurationDumpProto.IS_VR_MODE_ENABLED,
+ mIsVrModeEnabled);
+ proto.end(settingsAndConfigurationToken);
+
+ final int sleepTimeout = getSleepTimeoutLocked();
+ final int screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout);
+ final int screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
+ proto.write(PowerServiceDumpProto.SLEEP_TIMEOUT_MS, sleepTimeout);
+ proto.write(PowerServiceDumpProto.SCREEN_OFF_TIMEOUT_MS, screenOffTimeout);
+ proto.write(PowerServiceDumpProto.SCREEN_DIM_DURATION_MS, screenDimDuration);
+ proto.write(PowerServiceDumpProto.ARE_UIDS_CHANGING, mUidsChanging);
+ proto.write(PowerServiceDumpProto.ARE_UIDS_CHANGED, mUidsChanged);
+
+ for (int i = 0; i < mUidState.size(); i++) {
+ final UidState state = mUidState.valueAt(i);
+ final long uIDToken = proto.start(PowerServiceDumpProto.UIDS);
+ final int uid = mUidState.keyAt(i);
+ proto.write(PowerServiceDumpProto.UidProto.UID, uid);
+ proto.write(PowerServiceDumpProto.UidProto.UID_STRING, UserHandle.formatUid(uid));
+ proto.write(PowerServiceDumpProto.UidProto.IS_ACTIVE, state.mActive);
+ proto.write(PowerServiceDumpProto.UidProto.NUM_WAKE_LOCKS, state.mNumWakeLocks);
+ if (state.mProcState == ActivityManager.PROCESS_STATE_UNKNOWN) {
+ proto.write(PowerServiceDumpProto.UidProto.IS_PROCESS_STATE_UNKNOWN, true);
+ } else {
+ proto.write(PowerServiceDumpProto.UidProto.PROCESS_STATE, state.mProcState);
+ }
+ proto.end(uIDToken);
+ }
+
+ mHandler.getLooper().writeToProto(proto, PowerServiceDumpProto.LOOPER);
+
+ for (WakeLock wl : mWakeLocks) {
+ wl.writeToProto(proto, PowerServiceDumpProto.WAKE_LOCKS);
+ }
+
+ for (SuspendBlocker sb : mSuspendBlockers) {
+ sb.writeToProto(proto, PowerServiceDumpProto.SUSPEND_BLOCKERS);
+ }
+ wcd = mWirelessChargerDetector;
+ }
+
+ if (wcd != null) {
+ wcd.writeToProto(proto, PowerServiceDumpProto.WIRELESS_CHARGER_DETECTOR);
+ }
+ proto.flush();
+ }
+
private SuspendBlocker createSuspendBlockerLocked(String name) {
SuspendBlocker suspendBlocker = new SuspendBlockerImpl(name);
mSuspendBlockers.add(suspendBlocker);
@@ -3470,6 +3828,32 @@
return sb.toString();
}
+ public void writeToProto(ProtoOutputStream proto, long fieldId) {
+ final long wakeLockToken = proto.start(fieldId);
+ proto.write(WakeLockProto.LOCK_LEVEL, (mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK));
+ proto.write(WakeLockProto.TAG, mTag);
+
+ final long wakeLockFlagsToken = proto.start(WakeLockProto.FLAGS);
+ proto.write(WakeLockProto.WakeLockFlagsProto.IS_ACQUIRE_CAUSES_WAKEUP,
+ (mFlags & PowerManager.ACQUIRE_CAUSES_WAKEUP)!=0);
+ proto.write(WakeLockProto.WakeLockFlagsProto.IS_ON_AFTER_RELEASE,
+ (mFlags & PowerManager.ON_AFTER_RELEASE)!=0);
+ proto.end(wakeLockFlagsToken);
+
+ proto.write(WakeLockProto.IS_DISABLED, mDisabled);
+ if (mNotifiedAcquired) {
+ proto.write(WakeLockProto.ACQ_MS, mAcquireTime);
+ }
+ proto.write(WakeLockProto.IS_NOTIFIED_LONG, mNotifiedLong);
+ proto.write(WakeLockProto.UID, mOwnerUid);
+ proto.write(WakeLockProto.PID, mOwnerPid);
+
+ if (mWorkSource != null) {
+ mWorkSource.writeToProto(proto, WakeLockProto.WORK_SOURCE);
+ }
+ proto.end(wakeLockToken);
+ }
+
@SuppressWarnings("deprecation")
private String getLockLevelString() {
switch (mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) {
@@ -3567,6 +3951,15 @@
return mName + ": ref count=" + mReferenceCount;
}
}
+
+ public void writeToProto(ProtoOutputStream proto, long fieldId) {
+ final long sbToken = proto.start(fieldId);
+ synchronized (this) {
+ proto.write(SuspendBlockerProto.NAME, mName);
+ proto.write(SuspendBlockerProto.REFERENCE_COUNT, mReferenceCount);
+ }
+ proto.end(sbToken);
+ }
}
static final class UidState {
@@ -4054,8 +4447,19 @@
}
final long ident = Binder.clearCallingIdentity();
+
+ boolean isDumpProto = false;
+ for (String arg : args) {
+ if (arg.equals("--proto")) {
+ isDumpProto = true;
+ }
+ }
try {
- dumpInternal(pw);
+ if (isDumpProto) {
+ dumpProto(fd);
+ } else {
+ dumpInternal(pw);
+ }
} finally {
Binder.restoreCallingIdentity(ident);
}
diff --git a/services/core/java/com/android/server/power/SuspendBlocker.java b/services/core/java/com/android/server/power/SuspendBlocker.java
index 70b278a..30b35f0 100644
--- a/services/core/java/com/android/server/power/SuspendBlocker.java
+++ b/services/core/java/com/android/server/power/SuspendBlocker.java
@@ -16,6 +16,8 @@
package com.android.server.power;
+import android.util.proto.ProtoOutputStream;
+
/**
* Low-level suspend blocker mechanism equivalent to holding a partial wake lock.
*
@@ -40,4 +42,6 @@
* The system may crash.
*/
void release();
+
+ void writeToProto(ProtoOutputStream proto, long fieldId);
}
diff --git a/services/core/java/com/android/server/power/WirelessChargerDetector.java b/services/core/java/com/android/server/power/WirelessChargerDetector.java
index 38f5d77..6ee9dcd 100644
--- a/services/core/java/com/android/server/power/WirelessChargerDetector.java
+++ b/services/core/java/com/android/server/power/WirelessChargerDetector.java
@@ -24,8 +24,10 @@
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
+import android.service.power.WirelessChargerDetectorProto;
import android.util.Slog;
import android.util.TimeUtils;
+import android.util.proto.ProtoOutputStream;
import java.io.PrintWriter;
@@ -170,6 +172,44 @@
}
}
+ public void writeToProto(ProtoOutputStream proto, long fieldId) {
+ final long wcdToken = proto.start(fieldId);
+ synchronized (mLock) {
+ proto.write(WirelessChargerDetectorProto.IS_POWERED_WIRELESSLY, mPoweredWirelessly);
+ proto.write(WirelessChargerDetectorProto.IS_AT_REST, mAtRest);
+
+ final long restVectorToken = proto.start(WirelessChargerDetectorProto.REST);
+ proto.write(WirelessChargerDetectorProto.VectorProto.X, mRestX);
+ proto.write(WirelessChargerDetectorProto.VectorProto.Y, mRestY);
+ proto.write(WirelessChargerDetectorProto.VectorProto.Z, mRestZ);
+ proto.end(restVectorToken);
+
+ proto.write(
+ WirelessChargerDetectorProto.IS_DETECTION_IN_PROGRESS, mDetectionInProgress);
+ proto.write(WirelessChargerDetectorProto.DETECTION_START_TIME_MS, mDetectionStartTime);
+ proto.write(
+ WirelessChargerDetectorProto.IS_MUST_UPDATE_REST_POSITION,
+ mMustUpdateRestPosition);
+ proto.write(WirelessChargerDetectorProto.TOTAL_SAMPLES, mTotalSamples);
+ proto.write(WirelessChargerDetectorProto.MOVING_SAMPLES, mMovingSamples);
+
+ final long firstSampleVectorToken =
+ proto.start(WirelessChargerDetectorProto.FIRST_SAMPLE);
+ proto.write(WirelessChargerDetectorProto.VectorProto.X, mFirstSampleX);
+ proto.write(WirelessChargerDetectorProto.VectorProto.Y, mFirstSampleY);
+ proto.write(WirelessChargerDetectorProto.VectorProto.Z, mFirstSampleZ);
+ proto.end(firstSampleVectorToken);
+
+ final long lastSampleVectorToken =
+ proto.start(WirelessChargerDetectorProto.LAST_SAMPLE);
+ proto.write(WirelessChargerDetectorProto.VectorProto.X, mLastSampleX);
+ proto.write(WirelessChargerDetectorProto.VectorProto.Y, mLastSampleY);
+ proto.write(WirelessChargerDetectorProto.VectorProto.Z, mLastSampleZ);
+ proto.end(lastSampleVectorToken);
+ }
+ proto.end(wcdToken);
+ }
+
/**
* Updates the charging state and returns true if docking was detected.
*
diff --git a/services/core/java/com/android/server/search/SearchManagerService.java b/services/core/java/com/android/server/search/SearchManagerService.java
index b5aa4a9..edeb774 100644
--- a/services/core/java/com/android/server/search/SearchManagerService.java
+++ b/services/core/java/com/android/server/search/SearchManagerService.java
@@ -18,6 +18,7 @@
import android.app.ActivityManager;
import android.app.AppGlobals;
+import android.app.AppOpsManager;
import android.app.IActivityManager;
import android.app.ISearchManager;
import android.app.SearchManager;
@@ -28,6 +29,7 @@
import android.content.Intent;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
+import android.content.pm.ParceledListSlice;
import android.content.pm.ResolveInfo;
import android.database.ContentObserver;
import android.os.Binder;
@@ -37,6 +39,8 @@
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
+import android.speech.RecognitionService;
+import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
@@ -271,6 +275,52 @@
}
}
+ private boolean isDefaultRecognizerPackage(String packageName) {
+ ResolveInfo resolveInfo = mContext.getPackageManager().resolveService(
+ new Intent(RecognitionService.SERVICE_INTERFACE),
+ PackageManager.GET_META_DATA);
+ if (resolveInfo == null || resolveInfo.serviceInfo == null) {
+ Log.w(TAG, "Unable to resolve default voice recognition service.");
+ return false;
+ }
+ if (!TextUtils.isEmpty(packageName) && TextUtils.equals(packageName,
+ resolveInfo.serviceInfo.packageName)) {
+ return true;
+ }
+ return false;
+ }
+
+ private ComponentName getLegacyAssistReceiverComponent(int userHandle) {
+ try {
+ userHandle = ActivityManager.handleIncomingUser(Binder.getCallingPid(),
+ Binder.getCallingUid(), userHandle, true, false,
+ "getLegacyAssistReceiverComponent", null);
+ IPackageManager pm = AppGlobals.getPackageManager();
+ Intent assistIntent = new Intent(Intent.ACTION_ASSIST);
+ ParceledListSlice<ResolveInfo> infoParceledList =
+ pm.queryIntentReceivers(assistIntent,
+ assistIntent.resolveTypeIfNeeded(mContext.getContentResolver()),
+ PackageManager.MATCH_DEFAULT_ONLY, userHandle);
+ if (infoParceledList != null) {
+ List<ResolveInfo> infoList = infoParceledList.getList();
+ if (infoList != null && infoList.size() > 0) {
+ if (isDefaultRecognizerPackage(
+ infoList.get(0).activityInfo.applicationInfo.packageName)) {
+ return new ComponentName(
+ infoList.get(0).activityInfo.applicationInfo.packageName,
+ infoList.get(0).activityInfo.name);
+ }
+ }
+ }
+ } catch (RemoteException re) {
+ // Local call
+ Log.e(TAG, "RemoteException in getLegacyAssistReceiverComponent: " + re);
+ } catch (Exception e) {
+ Log.e(TAG, "Exception in getLegacyAssistReceiverComponent: " + e);
+ }
+ return null;
+ }
+
private ComponentName getLegacyAssistComponent(int userHandle) {
try {
userHandle = ActivityManager.handleIncomingUser(Binder.getCallingPid(),
@@ -297,7 +347,7 @@
@Override
public boolean launchLegacyAssist(String hint, int userHandle, Bundle args) {
- ComponentName comp = getLegacyAssistComponent(userHandle);
+ ComponentName comp = getLegacyAssistReceiverComponent(userHandle);
if (comp == null) {
return false;
}
@@ -305,9 +355,13 @@
try {
Intent intent = new Intent(Intent.ACTION_ASSIST);
intent.setComponent(comp);
+ if (args != null) {
+ intent.putExtras(args);
+ }
IActivityManager am = ActivityManager.getService();
- return am.launchAssistIntent(intent, ActivityManager.ASSIST_CONTEXT_BASIC, hint,
- userHandle, args);
+ return am.broadcastIntent(null, intent, null, null, 0, null, null, null,
+ AppOpsManager.OP_NONE, null, false, false,
+ userHandle) == ActivityManager.BROADCAST_SUCCESS;
} catch (RemoteException e) {
} finally {
Binder.restoreCallingIdentity(ident);
diff --git a/services/core/java/com/android/server/storage/AppCollector.java b/services/core/java/com/android/server/storage/AppCollector.java
index cf05e9f..ee9c5bf 100644
--- a/services/core/java/com/android/server/storage/AppCollector.java
+++ b/services/core/java/com/android/server/storage/AppCollector.java
@@ -16,6 +16,7 @@
package com.android.server.storage;
+import android.annotation.NonNull;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageStatsObserver;
@@ -32,6 +33,7 @@
import android.os.storage.VolumeInfo;
import android.util.Log;
import com.android.internal.os.BackgroundThread;
+import com.android.internal.util.Preconditions;
import java.util.ArrayList;
import java.util.List;
@@ -56,7 +58,9 @@
* @param context Android context used to get
* @param volume Volume to check for apps.
*/
- public AppCollector(Context context, VolumeInfo volume) {
+ public AppCollector(Context context, @NonNull VolumeInfo volume) {
+ Preconditions.checkNotNull(volume);
+
mBackgroundHandler = new BackgroundHandler(BackgroundThread.get().getLooper(),
volume,
context.getPackageManager(),
@@ -117,7 +121,7 @@
private final PackageManager mPm;
private final UserManager mUm;
- BackgroundHandler(Looper looper, VolumeInfo volume, PackageManager pm, UserManager um) {
+ BackgroundHandler(Looper looper, @NonNull VolumeInfo volume, PackageManager pm, UserManager um) {
super(looper);
mVolume = volume;
mPm = pm;
diff --git a/services/core/java/com/android/server/storage/CacheQuotaStrategy.java b/services/core/java/com/android/server/storage/CacheQuotaStrategy.java
new file mode 100644
index 0000000..10d30aa
--- /dev/null
+++ b/services/core/java/com/android/server/storage/CacheQuotaStrategy.java
@@ -0,0 +1,226 @@
+/*
+ * 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.storage;
+
+import android.annotation.MainThread;
+import android.app.usage.CacheQuotaHint;
+import android.app.usage.CacheQuotaService;
+import android.app.usage.ICacheQuotaService;
+import android.app.usage.UsageStats;
+import android.app.usage.UsageStatsManager;
+import android.app.usage.UsageStatsManagerInternal;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.content.pm.UserInfo;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.RemoteCallback;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.text.format.DateUtils;
+import android.util.Slog;
+
+import com.android.internal.util.Preconditions;
+import com.android.server.pm.Installer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * CacheQuotaStrategy is a strategy for determining cache quotas using usage stats and foreground
+ * time using the calculation as defined in the refuel rocket.
+ */
+public class CacheQuotaStrategy implements RemoteCallback.OnResultListener {
+ private static final String TAG = "CacheQuotaStrategy";
+
+ private final Object mLock = new Object();
+
+ private final Context mContext;
+ private final UsageStatsManagerInternal mUsageStats;
+ private final Installer mInstaller;
+ private ServiceConnection mServiceConnection;
+ private ICacheQuotaService mRemoteService;
+
+ public CacheQuotaStrategy(
+ Context context, UsageStatsManagerInternal usageStatsManager, Installer installer) {
+ mContext = Preconditions.checkNotNull(context);
+ mUsageStats = Preconditions.checkNotNull(usageStatsManager);
+ mInstaller = Preconditions.checkNotNull(installer);
+ }
+
+ /**
+ * Recalculates the quotas and stores them to installd.
+ */
+ public void recalculateQuotas() {
+ createServiceConnection();
+
+ ComponentName component = getServiceComponentName();
+ if (component != null) {
+ Intent intent = new Intent();
+ intent.setComponent(component);
+ mContext.bindServiceAsUser(
+ intent, mServiceConnection, Context.BIND_AUTO_CREATE, UserHandle.CURRENT);
+ }
+ }
+
+ private void createServiceConnection() {
+ // If we're already connected, don't create a new connection.
+ if (mServiceConnection != null) {
+ return;
+ }
+
+ mServiceConnection = new ServiceConnection() {
+ @Override
+ @MainThread
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ Runnable runnable = new Runnable() {
+ @Override
+ public void run() {
+ synchronized (mLock) {
+ mRemoteService = ICacheQuotaService.Stub.asInterface(service);
+ List<CacheQuotaHint> requests = getUnfulfilledRequests();
+ final RemoteCallback remoteCallback =
+ new RemoteCallback(CacheQuotaStrategy.this);
+ try {
+ mRemoteService.computeCacheQuotaHints(remoteCallback, requests);
+ } catch (RemoteException ex) {
+ Slog.w(TAG,
+ "Remote exception occurred while trying to get cache quota",
+ ex);
+ }
+ }
+ }
+ };
+ AsyncTask.execute(runnable);
+ }
+
+ @Override
+ @MainThread
+ public void onServiceDisconnected(ComponentName name) {
+ synchronized (mLock) {
+ mRemoteService = null;
+ }
+ }
+ };
+ }
+
+ /**
+ * Returns a list of CacheQuotaRequests which do not have their quotas filled out for apps
+ * which have been used in the last year.
+ */
+ private List<CacheQuotaHint> getUnfulfilledRequests() {
+ long timeNow = System.currentTimeMillis();
+ long oneYearAgo = timeNow - DateUtils.YEAR_IN_MILLIS;
+
+ List<CacheQuotaHint> requests = new ArrayList<>();
+ UserManager um = mContext.getSystemService(UserManager.class);
+ final List<UserInfo> users = um.getUsers();
+ final int userCount = users.size();
+ final PackageManager packageManager = mContext.getPackageManager();
+ for (int i = 0; i < userCount; i++) {
+ UserInfo info = users.get(i);
+ List<UsageStats> stats =
+ mUsageStats.queryUsageStatsForUser(info.id, UsageStatsManager.INTERVAL_BEST,
+ oneYearAgo, timeNow);
+ if (stats == null) {
+ continue;
+ }
+
+ for (UsageStats stat : stats) {
+ String packageName = stat.getPackageName();
+ try {
+ // We need the app info to determine the uid and the uuid of the volume
+ // where the app is installed.
+ ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName, 0);
+ requests.add(
+ new CacheQuotaHint.Builder()
+ .setVolumeUuid(appInfo.volumeUuid)
+ .setUid(appInfo.uid)
+ .setUsageStats(stat)
+ .setQuota(CacheQuotaHint.QUOTA_NOT_SET)
+ .build());
+ } catch (PackageManager.NameNotFoundException e) {
+ Slog.w(TAG, "Unable to find package for quota calculation", e);
+ continue;
+ }
+ }
+ }
+ return requests;
+ }
+
+ @Override
+ public void onResult(Bundle data) {
+ final List<CacheQuotaHint> processedRequests =
+ data.getParcelableArrayList(
+ CacheQuotaService.REQUEST_LIST_KEY);
+ final int requestSize = processedRequests.size();
+ for (int i = 0; i < requestSize; i++) {
+ CacheQuotaHint request = processedRequests.get(i);
+ long proposedQuota = request.getQuota();
+ if (proposedQuota == CacheQuotaHint.QUOTA_NOT_SET) {
+ continue;
+ }
+
+ try {
+ int uid = request.getUid();
+ mInstaller.setAppQuota(request.getVolumeUuid(),
+ UserHandle.getUserId(uid),
+ UserHandle.getAppId(uid), proposedQuota);
+ } catch (Installer.InstallerException ex) {
+ Slog.w(TAG,
+ "Failed to set cache quota for " + request.getUid(),
+ ex);
+ }
+ }
+
+ disconnectService();
+ }
+
+ private void disconnectService() {
+ mContext.unbindService(mServiceConnection);
+ mServiceConnection = null;
+ }
+
+ private ComponentName getServiceComponentName() {
+ String packageName =
+ mContext.getPackageManager().getServicesSystemSharedLibraryPackageName();
+ if (packageName == null) {
+ Slog.w(TAG, "could not access the cache quota service: no package!");
+ return null;
+ }
+
+ Intent intent = new Intent(CacheQuotaService.SERVICE_INTERFACE);
+ intent.setPackage(packageName);
+ ResolveInfo resolveInfo = mContext.getPackageManager().resolveService(intent,
+ PackageManager.GET_SERVICES | PackageManager.GET_META_DATA);
+ if (resolveInfo == null || resolveInfo.serviceInfo == null) {
+ Slog.w(TAG, "No valid components found.");
+ return null;
+ }
+ ServiceInfo serviceInfo = resolveInfo.serviceInfo;
+ return new ComponentName(serviceInfo.packageName, serviceInfo.name);
+ }
+}
diff --git a/services/core/java/com/android/server/storage/DiskStatsLoggingService.java b/services/core/java/com/android/server/storage/DiskStatsLoggingService.java
index 7c43162..4035ade 100644
--- a/services/core/java/com/android/server/storage/DiskStatsLoggingService.java
+++ b/services/core/java/com/android/server/storage/DiskStatsLoggingService.java
@@ -29,6 +29,7 @@
import android.os.Environment;
import android.os.Environment.UserEnvironment;
import android.os.UserHandle;
+import android.os.storage.VolumeInfo;
import android.provider.Settings;
import android.util.Log;
@@ -61,10 +62,16 @@
return false;
}
+
+ VolumeInfo volume = getPackageManager().getPrimaryStorageCurrentVolume();
+ // volume is null if the primary storage is not yet mounted.
+ if (volume == null) {
+ return false;
+ }
+ AppCollector collector = new AppCollector(this, volume);
+
final int userId = UserHandle.myUserId();
UserEnvironment environment = new UserEnvironment(userId);
- AppCollector collector = new AppCollector(this,
- getPackageManager().getPrimaryStorageCurrentVolume());
LogRunnable task = new LogRunnable();
task.setRootDirectory(environment.getExternalStorageDirectory());
task.setDownloadsDirectory(
diff --git a/services/core/java/com/android/server/trust/TrustAgentWrapper.java b/services/core/java/com/android/server/trust/TrustAgentWrapper.java
index 6c1648c..996a3d2 100644
--- a/services/core/java/com/android/server/trust/TrustAgentWrapper.java
+++ b/services/core/java/com/android/server/trust/TrustAgentWrapper.java
@@ -16,6 +16,7 @@
package com.android.server.trust;
+import android.annotation.TargetApi;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.admin.DevicePolicyManager;
@@ -27,6 +28,7 @@
import android.content.ServiceConnection;
import android.net.Uri;
import android.os.Binder;
+import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
@@ -35,11 +37,11 @@
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
-import android.util.Log;
-import android.util.Slog;
import android.service.trust.ITrustAgentService;
import android.service.trust.ITrustAgentServiceCallback;
-
+import android.service.trust.TrustAgentService;
+import android.util.Log;
+import android.util.Slog;
import java.util.Collections;
import java.util.List;
@@ -47,6 +49,7 @@
* A wrapper around a TrustAgentService interface. Coordinates communication between
* TrustManager and the actual TrustAgent.
*/
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class TrustAgentWrapper {
private static final String EXTRA_COMPONENT_NAME = "componentName";
private static final String TRUST_EXPIRED_ACTION = "android.server.trust.TRUST_EXPIRED_ACTION";
@@ -60,6 +63,10 @@
private static final int MSG_RESTART_TIMEOUT = 4;
private static final int MSG_SET_TRUST_AGENT_FEATURES_COMPLETED = 5;
private static final int MSG_MANAGING_TRUST = 6;
+ private static final int MSG_ADD_ESCROW_TOKEN = 7;
+ private static final int MSG_REMOVE_ESCROW_TOKEN = 8;
+ private static final int MSG_ESCROW_TOKEN_STATE = 9;
+ private static final int MSG_UNLOCK_USER = 10;
/**
* Time in uptime millis that we wait for the service connection, both when starting
@@ -71,6 +78,9 @@
* Long extra for {@link #MSG_GRANT_TRUST}
*/
private static final String DATA_DURATION = "duration";
+ private static final String DATA_ESCROW_TOKEN = "escrow_token";
+ private static final String DATA_HANDLE = "handle";
+ private static final String DATA_USER_ID = "user_id";
private final TrustManagerService mTrustManagerService;
private final int mUserId;
@@ -190,6 +200,49 @@
mTrustManagerService.mArchive.logManagingTrust(mUserId, mName, mManagingTrust);
mTrustManagerService.updateTrust(mUserId, 0);
break;
+ case MSG_ADD_ESCROW_TOKEN: {
+ byte[] eToken = msg.getData().getByteArray(DATA_ESCROW_TOKEN);
+ int userId = msg.getData().getInt(DATA_USER_ID);
+ long handle = mTrustManagerService.addEscrowToken(eToken, userId);
+ try {
+ mTrustAgentService.onEscrowTokenAdded(
+ eToken, handle, UserHandle.of(userId));
+ } catch (RemoteException e) {
+ onError(e);
+ }
+ break;
+ }
+ case MSG_ESCROW_TOKEN_STATE: {
+ long handle = msg.getData().getLong(DATA_HANDLE);
+ int userId = msg.getData().getInt(DATA_USER_ID);
+ boolean active = mTrustManagerService.isEscrowTokenActive(handle, userId);
+ try {
+ mTrustAgentService.onTokenStateReceived(handle,
+ active ? TrustAgentService.TOKEN_STATE_ACTIVE
+ : TrustAgentService.TOKEN_STATE_INACTIVE);
+ } catch (RemoteException e) {
+ onError(e);
+ }
+ break;
+ }
+ case MSG_REMOVE_ESCROW_TOKEN: {
+ long handle = msg.getData().getLong(DATA_HANDLE);
+ int userId = msg.getData().getInt(DATA_USER_ID);
+ boolean success = mTrustManagerService.removeEscrowToken(handle, userId);
+ try {
+ mTrustAgentService.onEscrowTokenRemoved(handle, success);
+ } catch (RemoteException e) {
+ onError(e);
+ }
+ break;
+ }
+ case MSG_UNLOCK_USER: {
+ long handle = msg.getData().getLong(DATA_HANDLE);
+ int userId = msg.getData().getInt(DATA_USER_ID);
+ byte[] eToken = msg.getData().getByteArray(DATA_ESCROW_TOKEN);
+ mTrustManagerService.unlockUserWithToken(handle, eToken, userId);
+ break;
+ }
}
}
};
@@ -225,6 +278,67 @@
mHandler.obtainMessage(MSG_SET_TRUST_AGENT_FEATURES_COMPLETED,
result ? 1 : 0, 0, token).sendToTarget();
}
+
+ @Override
+ public void addEscrowToken(byte[] token, int userId) {
+ if (mContext.getResources()
+ .getBoolean(com.android.internal.R.bool.config_allowEscrowTokenForTrustAgent)) {
+ Slog.e(TAG, "Escrow token API is not allowed.");
+ return;
+ }
+
+ if (DEBUG) Slog.d(TAG, "adding escrow token for user " + userId);
+ Message msg = mHandler.obtainMessage(MSG_ADD_ESCROW_TOKEN);
+ msg.getData().putByteArray(DATA_ESCROW_TOKEN, token);
+ msg.getData().putInt(DATA_USER_ID, userId);
+ msg.sendToTarget();
+ }
+
+ @Override
+ public void isEscrowTokenActive(long handle, int userId) {
+ if (mContext.getResources()
+ .getBoolean(com.android.internal.R.bool.config_allowEscrowTokenForTrustAgent)) {
+ Slog.e(TAG, "Escrow token API is not allowed.");
+ return;
+ }
+
+ if (DEBUG) Slog.d(TAG, "checking the state of escrow token on user " + userId);
+ Message msg = mHandler.obtainMessage(MSG_ESCROW_TOKEN_STATE);
+ msg.getData().putLong(DATA_HANDLE, handle);
+ msg.getData().putInt(DATA_USER_ID, userId);
+ msg.sendToTarget();
+ }
+
+ @Override
+ public void removeEscrowToken(long handle, int userId) {
+ if (mContext.getResources()
+ .getBoolean(com.android.internal.R.bool.config_allowEscrowTokenForTrustAgent)) {
+ Slog.e(TAG, "Escrow token API is not allowed.");
+ return;
+ }
+
+ if (DEBUG) Slog.d(TAG, "removing escrow token on user " + userId);
+ Message msg = mHandler.obtainMessage(MSG_REMOVE_ESCROW_TOKEN);
+ msg.getData().putLong(DATA_HANDLE, handle);
+ msg.getData().putInt(DATA_USER_ID, userId);
+ msg.sendToTarget();
+ }
+
+ @Override
+ public void unlockUserWithToken(long handle, byte[] token, int userId) {
+ if (mContext.getResources()
+ .getBoolean(com.android.internal.R.bool.config_allowEscrowTokenForTrustAgent)) {
+ Slog.e(TAG, "Escrow token API is not allowed.");
+ return;
+ }
+
+ if (DEBUG) Slog.d(TAG, "unlocking user " + userId);
+ Message msg = mHandler.obtainMessage(MSG_UNLOCK_USER);
+ msg.getData().putInt(DATA_USER_ID, userId);
+ msg.getData().putLong(DATA_HANDLE, handle);
+ msg.getData().putByteArray(DATA_ESCROW_TOKEN, token);
+ msg.sendToTarget();
+ }
};
private final ServiceConnection mConnection = new ServiceConnection() {
@@ -294,7 +408,7 @@
}
private void onError(Exception e) {
- Slog.w(TAG , "Remote Exception", e);
+ Slog.w(TAG , "Exception ", e);
}
private void onTrustTimeout() {
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index 71b725e..4570b0d 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -16,14 +16,6 @@
package com.android.server.trust;
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.content.PackageMonitor;
-import com.android.internal.widget.LockPatternUtils;
-import com.android.server.SystemService;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
import android.Manifest;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
@@ -65,12 +57,17 @@
import android.util.Xml;
import android.view.IWindowManager;
import android.view.WindowManagerGlobal;
-
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.content.PackageMonitor;
+import com.android.internal.widget.LockPatternUtils;
+import com.android.server.SystemService;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
/**
* Manages trust agents and trust listeners.
@@ -229,6 +226,22 @@
TRUST_USUALLY_MANAGED_FLUSH_DELAY);
}
+ public long addEscrowToken(byte[] token, int userId) {
+ return mLockPatternUtils.addEscrowToken(token, userId);
+ }
+
+ public boolean removeEscrowToken(long handle, int userId) {
+ return mLockPatternUtils.removeEscrowToken(handle, userId);
+ }
+
+ public boolean isEscrowTokenActive(long handle, int userId) {
+ return mLockPatternUtils.isEscrowTokenActive(handle, userId);
+ }
+
+ public void unlockUserWithToken(long handle, byte[] token, int userId) {
+ mLockPatternUtils.unlockUserWithToken(handle, token, userId);
+ }
+
void refreshAgentList(int userIdOrAll) {
if (DEBUG) Slog.d(TAG, "refreshAgentList(" + userIdOrAll + ")");
if (!mTrustAgentsCanRun) {
@@ -329,7 +342,7 @@
if (!StorageManager.isUserKeyUnlocked(userInfo.id)
&& !directUnlock) {
if (DEBUG) Slog.d(TAG, "refreshAgentList: skipping user " + userInfo.id
- + "'s trust agent " + name + ": FDE still locked and "
+ + "'s trust agent " + name + ": FBE still locked and "
+ " the agent cannot unlock user profile.");
continue;
}
diff --git a/services/core/java/com/android/server/updates/TzDataInstallReceiver.java b/services/core/java/com/android/server/updates/TzDataInstallReceiver.java
index b704eb1..3c73c88 100644
--- a/services/core/java/com/android/server/updates/TzDataInstallReceiver.java
+++ b/services/core/java/com/android/server/updates/TzDataInstallReceiver.java
@@ -20,7 +20,7 @@
import java.io.File;
import java.io.IOException;
-import libcore.tzdata.update2.TimeZoneBundleInstaller;
+import libcore.tzdata.update2.TimeZoneDistroInstaller;
/**
* An install receiver responsible for installing timezone data updates.
@@ -34,14 +34,14 @@
private static final String UPDATE_DIR_NAME = TZ_DATA_DIR.getPath() + "/updates/";
private static final String UPDATE_METADATA_DIR_NAME = "metadata/";
private static final String UPDATE_VERSION_FILE_NAME = "version";
- private static final String UPDATE_CONTENT_FILE_NAME = "tzdata_bundle.zip";
+ private static final String UPDATE_CONTENT_FILE_NAME = "tzdata_distro.zip";
- private final TimeZoneBundleInstaller installer;
+ private final TimeZoneDistroInstaller installer;
public TzDataInstallReceiver() {
super(UPDATE_DIR_NAME, UPDATE_CONTENT_FILE_NAME, UPDATE_METADATA_DIR_NAME,
UPDATE_VERSION_FILE_NAME);
- installer = new TimeZoneBundleInstaller(TAG, SYSTEM_TZ_DATA_FILE, TZ_DATA_DIR);
+ installer = new TimeZoneDistroInstaller(TAG, SYSTEM_TZ_DATA_FILE, TZ_DATA_DIR);
}
@Override
diff --git a/core/java/android/companion/ICompanionDeviceManagerService.aidl b/services/core/java/com/android/server/vr/PersistentVrStateListener.java
similarity index 60%
copy from core/java/android/companion/ICompanionDeviceManagerService.aidl
copy to services/core/java/com/android/server/vr/PersistentVrStateListener.java
index ff2a7eb..bccd5f1 100644
--- a/core/java/android/companion/ICompanionDeviceManagerService.aidl
+++ b/services/core/java/com/android/server/vr/PersistentVrStateListener.java
@@ -1,4 +1,4 @@
-/*
+/**
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,17 +13,19 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package com.android.server.vr;
-package android.companion;
+/**
+ * Listener for state changes to persistent VR mode.
+ *
+ * @hide Only for use within system server.
+ */
+public abstract class PersistentVrStateListener {
-import android.companion.AssociationRequest;
-import android.companion.IOnAssociateCallback;
-
-
-/** @hide */
-interface ICompanionDeviceManagerService {
- void startDiscovery(
- in AssociationRequest request,
- in IOnAssociateCallback callback,
- in String callingPackage);
+ /**
+ * Called when the Persistent VR mode state changes.
+ *
+ * @param enabled {@code true} if persistent VR mode is enabled.
+ */
+ public abstract void onPersistentVrStateChanged(boolean enabled);
}
diff --git a/services/core/java/com/android/server/vr/VrManagerInternal.java b/services/core/java/com/android/server/vr/VrManagerInternal.java
index 45b7baf..58e4bdc 100644
--- a/services/core/java/com/android/server/vr/VrManagerInternal.java
+++ b/services/core/java/com/android/server/vr/VrManagerInternal.java
@@ -88,4 +88,9 @@
* @param enabled true if the device should be placed in persistent VR mode.
*/
public abstract void setPersistentVrModeEnabled(boolean enabled);
+
+ /**
+ * Adds listener that reports state changes to persistent VR mode.
+ */
+ public abstract void addPersistentVrModeStateListener(PersistentVrStateListener listener);
}
diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java
index 69a9f80..3df4d24 100644
--- a/services/core/java/com/android/server/vr/VrManagerService.java
+++ b/services/core/java/com/android/server/vr/VrManagerService.java
@@ -122,16 +122,19 @@
private boolean mGuard;
private final RemoteCallbackList<IVrStateCallbacks> mRemoteCallbacks =
new RemoteCallbackList<>();
+ private final ArrayList<PersistentVrStateListener> mPersistentVrStateListeners =
+ new ArrayList<>();
private int mPreviousCoarseLocationMode = INVALID_APPOPS_MODE;
private int mPreviousManageOverlayMode = INVALID_APPOPS_MODE;
private VrState mPendingState;
private final ArrayDeque<VrState> mLoggingDeque = new ArrayDeque<>(EVENT_LOG_SIZE);
private final NotificationAccessManager mNotifAccessManager = new NotificationAccessManager();
/** Tracks the state of the screen and keyguard UI.*/
- private int mSystemSleepFlags = FLAG_NONE;
+ private int mSystemSleepFlags = FLAG_AWAKE;
private static final int MSG_VR_STATE_CHANGE = 0;
private static final int MSG_PENDING_VR_STATE_CHANGE = 1;
+ private static final int MSG_PERSISTENT_VR_MODE_STATE_CHANGE = 2;
/**
* Set whether VR mode may be enabled.
@@ -151,7 +154,7 @@
} else {
// Disable persistent mode when VR mode isn't allowed, allows an escape hatch to
// exit persistent VR mode when screen is turned off.
- mPersistentVrModeEnabled = false;
+ setPersistentModeAndNotifyListenersLocked(false);
// Set pending state to current state.
mPendingState = (mVrModeEnabled && mCurrentVrService != null)
@@ -213,6 +216,13 @@
}
}
} break;
+ case MSG_PERSISTENT_VR_MODE_STATE_CHANGE : {
+ boolean state = (msg.arg1 == 1);
+ for (int i = 0; i < mPersistentVrStateListeners.size(); i++) {
+ mPersistentVrStateListeners.get(i).onPersistentVrStateChanged(
+ state);
+ }
+ } break;
default :
throw new IllegalStateException("Unknown message type: " + msg.what);
}
@@ -383,7 +393,7 @@
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (getContext().checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
!= PackageManager.PERMISSION_GRANTED) {
- pw.println("permission denied: can't dump VrManagerService from pid="
+ pw.println("Permission Denial: can't dump VrManagerService from pid="
+ Binder.getCallingPid() + ", uid=" + Binder.getCallingUid());
return;
}
@@ -424,6 +434,16 @@
pw.println(n.flattenToString());
}
}
+ pw.println("Attached persistent mode listeners:");
+ if (mPersistentVrStateListeners == null ||
+ mPersistentVrStateListeners.size() == 0) {
+ pw.println("None");
+ } else {
+ for (PersistentVrStateListener l : mPersistentVrStateListeners) {
+ pw.print(tab);
+ pw.println("listener: " + l);
+ }
+ }
pw.println("\n");
pw.println("********* End of VrManagerService Dump *********");
}
@@ -471,6 +491,11 @@
public void setPersistentVrModeEnabled(boolean enabled) {
VrManagerService.this.setPersistentVrModeEnabled(enabled);
}
+
+ @Override
+ public void addPersistentVrModeStateListener(PersistentVrStateListener listener) {
+ VrManagerService.this.addPersistentVrModeStateListener(listener);
+ }
}
public VrManagerService(Context context) {
@@ -655,10 +680,10 @@
}
}
- mCurrentVrModeComponent = calling;
if (calling != null && !Objects.equals(calling, mCurrentVrModeComponent)) {
sendUpdatedCaller = true;
}
+ mCurrentVrModeComponent = calling;
if (mCurrentVrModeUser != userId) {
mCurrentVrModeUser = userId;
@@ -1013,9 +1038,8 @@
}
private void setPersistentVrModeEnabled(boolean enabled) {
- synchronized (mLock) {
- mPersistentVrModeEnabled = enabled;
-
+ synchronized(mLock) {
+ setPersistentModeAndNotifyListenersLocked(enabled);
// Disabling persistent mode when not showing a VR should disable the overall vr mode.
if (!enabled && mCurrentVrModeComponent == null) {
setVrMode(false, null, 0, null);
@@ -1023,6 +1047,22 @@
}
}
+ private void setPersistentModeAndNotifyListenersLocked(boolean enabled) {
+ if (mPersistentVrModeEnabled == enabled) {
+ return;
+ }
+ mPersistentVrModeEnabled = enabled;
+
+ mHandler.sendMessage(mHandler.obtainMessage(MSG_PERSISTENT_VR_MODE_STATE_CHANGE,
+ (mPersistentVrModeEnabled) ? 1 : 0, 0));
+ }
+
+ private void addPersistentVrModeStateListener(PersistentVrStateListener listener) {
+ synchronized (mLock) {
+ mPersistentVrStateListeners.add(listener);
+ }
+ }
+
private int hasVrPackage(@NonNull ComponentName targetPackageName, int userId) {
synchronized (mLock) {
return mComponentObserver.isValid(targetPackageName, userId);
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index f7a9e41..b7479da 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -226,8 +226,8 @@
Matrix outMatrix) {
sTempFloats[Matrix.MSCALE_X] = windowState.mWinAnimator.mDsDx;
sTempFloats[Matrix.MSKEW_Y] = windowState.mWinAnimator.mDtDx;
- sTempFloats[Matrix.MSKEW_X] = windowState.mWinAnimator.mDsDy;
- sTempFloats[Matrix.MSCALE_Y] = windowState.mWinAnimator.mDtDy;
+ sTempFloats[Matrix.MSKEW_X] = windowState.mWinAnimator.mDtDy;
+ sTempFloats[Matrix.MSCALE_Y] = windowState.mWinAnimator.mDsDy;
sTempFloats[Matrix.MTRANS_X] = windowState.mShownPosition.x;
sTempFloats[Matrix.MTRANS_Y] = windowState.mShownPosition.y;
sTempFloats[Matrix.MPERSP_0] = 0;
diff --git a/services/core/java/com/android/server/wm/AlertWindowNotification.java b/services/core/java/com/android/server/wm/AlertWindowNotification.java
new file mode 100644
index 0000000..0d282ef
--- /dev/null
+++ b/services/core/java/com/android/server/wm/AlertWindowNotification.java
@@ -0,0 +1,144 @@
+/*
+ * 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.wm;
+
+import static android.app.Notification.VISIBILITY_PRIVATE;
+import static android.app.NotificationManager.IMPORTANCE_MIN;
+import static android.app.PendingIntent.FLAG_CANCEL_CURRENT;
+import static android.content.Context.NOTIFICATION_SERVICE;
+import static android.content.Intent.EXTRA_PACKAGE_NAME;
+import static android.content.Intent.EXTRA_UID;
+import static com.android.server.wm.WindowManagerService.ACTION_REVOKE_SYSTEM_ALERT_WINDOW_PERMISSION;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import com.android.internal.R;
+
+/** Displays an ongoing notification for a process displaying an alert window */
+class AlertWindowNotification {
+ private static final String CHANNEL_PREFIX = "com.android.server.wm.AlertWindowNotification - ";
+ private static final int NOTIFICATION_ID = 0;
+
+ private static int sNextRequestCode = 0;
+ private final int mRequestCode;
+ private final WindowManagerService mService;
+ private String mNotificationTag;
+ private final NotificationManager mNotificationManager;
+ private final String mPackageName;
+ private final int mUid;
+ private boolean mCancelled;
+
+ AlertWindowNotification(WindowManagerService service, String packageName, int uid) {
+ mService = service;
+ mPackageName = packageName;
+ mUid = uid;
+ mNotificationManager =
+ (NotificationManager) mService.mContext.getSystemService(NOTIFICATION_SERVICE);
+ mNotificationTag = CHANNEL_PREFIX + mPackageName;
+ mRequestCode = sNextRequestCode++;
+
+ // We can't create/post the notification while the window manager lock is held since it will
+ // end up calling into activity manager. So, we post a message to do it later.
+ mService.mH.post(this::postNotification);
+ }
+
+ /** Cancels the notification */
+ void cancel() {
+ mNotificationManager.cancel(mNotificationTag, NOTIFICATION_ID);
+ mCancelled = true;
+ }
+
+ /** Don't call with the window manager lock held! */
+ private void postNotification() {
+ final Context context = mService.mContext;
+ final PackageManager pm = context.getPackageManager();
+ final ApplicationInfo aInfo = getApplicationInfo(pm, mPackageName);
+ final String appName = (aInfo != null)
+ ? pm.getApplicationLabel(aInfo).toString() : mPackageName;
+
+ createNotificationChannelIfNeeded(context, appName);
+
+ final String message = context.getString(R.string.alert_windows_notification_message);
+ final Notification.Builder builder = new Notification.Builder(context, mNotificationTag)
+ .setOngoing(true)
+ .setContentTitle(
+ context.getString(R.string.alert_windows_notification_title, appName))
+ .setContentText(message)
+ .setSmallIcon(R.drawable.alert_window_layer)
+ .setColor(context.getColor(R.color.system_notification_accent_color))
+ .setStyle(new Notification.BigTextStyle().bigText(message))
+ .setLocalOnly(true)
+ .addAction(getTurnOffAction(context, mPackageName, mUid));
+
+ if (aInfo != null) {
+ final Bitmap bitmap = ((BitmapDrawable) pm.getApplicationIcon(aInfo)).getBitmap();
+ builder.setLargeIcon(bitmap);
+ }
+
+ synchronized (mService.mWindowMap) {
+ if (mCancelled) {
+ // Notification was cancelled, so nothing more to do...
+ return;
+ }
+ mNotificationManager.notify(mNotificationTag, NOTIFICATION_ID, builder.build());
+ }
+ }
+
+ private Notification.Action getTurnOffAction(Context context, String packageName, int uid) {
+ final Intent intent = new Intent(ACTION_REVOKE_SYSTEM_ALERT_WINDOW_PERMISSION);
+ intent.putExtra(EXTRA_PACKAGE_NAME, packageName);
+ intent.putExtra(EXTRA_UID, uid);
+ // Calls into activity manager...
+ final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, mRequestCode,
+ intent, FLAG_CANCEL_CURRENT);
+ return new Notification.Action.Builder(R.drawable.alert_window_layer,
+ context.getString(R.string.alert_windows_notification_turn_off_action),
+ pendingIntent).build();
+
+ }
+
+ private void createNotificationChannelIfNeeded(Context context, String appName) {
+ if (mNotificationManager.getNotificationChannel(mNotificationTag) != null) {
+ return;
+ }
+ final String nameChannel =
+ context.getString(R.string.alert_windows_notification_channel_name, appName);
+ final NotificationChannel channel =
+ new NotificationChannel(mNotificationTag, nameChannel, IMPORTANCE_MIN);
+ channel.enableLights(false);
+ channel.enableVibration(false);
+ mNotificationManager.createNotificationChannel(channel);
+ }
+
+
+ private ApplicationInfo getApplicationInfo(PackageManager pm, String packageName) {
+ try {
+ return pm.getApplicationInfo(packageName, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ return null;
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/wm/BoundsAnimationController.java b/services/core/java/com/android/server/wm/BoundsAnimationController.java
index cf5cecda..837b69e 100644
--- a/services/core/java/com/android/server/wm/BoundsAnimationController.java
+++ b/services/core/java/com/android/server/wm/BoundsAnimationController.java
@@ -176,7 +176,7 @@
// we trigger any size changes, so it can swap surfaces
// in to appropriate modes, or do as it wishes otherwise.
if (!mReplacement) {
- mTarget.onAnimationStart();
+ mTarget.onAnimationStart(mMoveToFullScreen);
}
// Immediately update the task bounds if they have to become larger, but preserve
@@ -263,7 +263,7 @@
*/
boolean setPinnedStackSize(Rect bounds, Rect taskBounds);
- void onAnimationStart();
+ void onAnimationStart(boolean toFullscreen);
/**
* Callback for the target to inform it that the animation has ended, so it can do some
@@ -272,18 +272,10 @@
void onAnimationEnd();
void moveToFullscreen();
-
- void getFullScreenBounds(Rect bounds);
}
- void animateBounds(final AnimateBoundsUser target, Rect from, Rect to, int animationDuration) {
- boolean moveToFullscreen = false;
- if (to == null) {
- to = new Rect();
- target.getFullScreenBounds(to);
- moveToFullscreen = true;
- }
-
+ void animateBounds(final AnimateBoundsUser target, Rect from, Rect to, int animationDuration,
+ boolean moveToFullscreen) {
final BoundsAnimator existing = mRunningAnimations.get(target);
final boolean replacing = existing != null;
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 8f38be8..2f9868e 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -919,10 +919,6 @@
void updateDisplayInfo() {
mDisplay.getDisplayInfo(mDisplayInfo);
mDisplay.getMetrics(mDisplayMetrics);
-
- // Check if display metrics changed and update base values if needed.
- updateBaseDisplayMetricsIfNeeded();
-
for (int i = mTaskStackContainers.size() - 1; i >= 0; --i) {
mTaskStackContainers.get(i).updateDisplayInfo(null);
}
@@ -938,8 +934,10 @@
}
}
- updateBaseDisplayMetrics(mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight,
- mDisplayInfo.logicalDensityDpi);
+ mBaseDisplayWidth = mInitialDisplayWidth = mDisplayInfo.logicalWidth;
+ mBaseDisplayHeight = mInitialDisplayHeight = mDisplayInfo.logicalHeight;
+ mBaseDisplayDensity = mInitialDisplayDensity = mDisplayInfo.logicalDensityDpi;
+ mBaseDisplayRect.set(0, 0, mBaseDisplayWidth, mBaseDisplayHeight);
}
void getLogicalDisplayRect(Rect out) {
@@ -969,30 +967,6 @@
}
}
- /** If display metrics changed and it's not just a rotation - update base values. */
- private void updateBaseDisplayMetricsIfNeeded() {
- final int orientation = mDisplayInfo.rotation;
- final boolean rotated = (orientation == ROTATION_90 || orientation == ROTATION_270);
- final int newWidth = rotated ? mDisplayInfo.logicalHeight : mDisplayInfo.logicalWidth;
- final int newHeight = rotated ? mDisplayInfo.logicalWidth : mDisplayInfo.logicalHeight;
-
- boolean displayMetricsChanged
- = mBaseDisplayWidth != newWidth || mBaseDisplayHeight != newHeight;
- displayMetricsChanged |= mBaseDisplayDensity != mDisplayInfo.logicalDensityDpi;
-
- if (displayMetricsChanged) {
- updateBaseDisplayMetrics(newWidth, newHeight, mDisplayInfo.logicalDensityDpi);
- mService.reconfigureDisplayLocked(this);
- }
- }
-
- void updateBaseDisplayMetrics(int baseWidth, int baseHeight, int baseDensity) {
- mBaseDisplayWidth = mInitialDisplayWidth = baseWidth;
- mBaseDisplayHeight = mInitialDisplayHeight = baseHeight;
- mBaseDisplayDensity = mInitialDisplayDensity = baseDensity;
- mBaseDisplayRect.set(0, 0, mBaseDisplayWidth, mBaseDisplayHeight);
- }
-
void getContentRect(Rect out) {
out.set(mContentRect);
}
@@ -1614,9 +1588,24 @@
// TODO(multidisplay): Needs some serious rethought when the target and IME are not on the
// same display. Or even when the current IME/target are not on the same screen as the next
// IME/target. For now only look for input windows on the main screen.
- mUpdateImeTarget = updateImeTarget;
- WindowState target = getWindow(mComputeImeTargetPredicate);
+ // The target candidate provided by the IME tells us which window token, but not which
+ // window within the token (e.g. child windows...). So, we use the token to look-up the
+ // best target window.
+ // TODO: Have the input method service report the right window with the token vs. just the
+ // base window of the token.
+ final WindowState baseWin = mService.getWindow(mService.mInputMethodTargetCandidate);
+ final WindowToken targetToken = baseWin != null ? baseWin.mToken : null;
+ WindowState target = targetToken != null ?
+ targetToken.getWindow(mComputeImeTargetPredicate) : null;
+ // If there isn't a better candidate in the token (maybe because they are not visible), then
+ // fall back to targeting the base window of the token, so the IME can still maintain the
+ // right z-order based on the last person that set it vs. changing its z-order to the very
+ // up since there if target is null.
+ // TODO: Consider z-ordering IME to bottom instead of top if there is no visible target.
+ // Also, consider tying the visible the visibility of the IME to the current target. I.e if
+ // target isn't visible, then IME shouldn't be visible.
+ target = target == null ? baseWin : target;
// Yet more tricksyness! If this window is a "starting" window, we do actually want
// to be on top of it, but it is not -really- where input will go. So look down below
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index 0a92a81..75a79fd 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -152,11 +152,6 @@
int getSmallestWidthDpForBounds(Rect bounds) {
final DisplayInfo di = mDisplayContent.getDisplayInfo();
- // If the bounds are fullscreen, return the value of the fullscreen configuration
- if (bounds == null || (bounds.left == 0 && bounds.top == 0
- && bounds.right == di.logicalWidth && bounds.bottom == di.logicalHeight)) {
- return mDisplayContent.getConfiguration().smallestScreenWidthDp;
- }
final int baseDisplayWidth = mDisplayContent.mBaseDisplayWidth;
final int baseDisplayHeight = mDisplayContent.mBaseDisplayHeight;
int minWidth = Integer.MAX_VALUE;
@@ -185,7 +180,7 @@
mTmpRect2.width(), mTmpRect2.height(), getContentWidth());
mService.mPolicy.getStableInsetsLw(rotation, mTmpRect2.width(), mTmpRect2.height(),
mTmpRect3);
- mService.subtractInsets(mTmpRect2, mTmpRect3, mTmpRect);
+ mService.intersectDisplayInsetBounds(mTmpRect2, mTmpRect3, mTmpRect);
minWidth = Math.min(mTmpRect.width(), minWidth);
}
return (int) (minWidth / mDisplayContent.getDisplayMetrics().density);
diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java
index 37b8deb..dc4806a 100644
--- a/services/core/java/com/android/server/wm/InputMonitor.java
+++ b/services/core/java/com/android/server/wm/InputMonitor.java
@@ -631,14 +631,26 @@
return;
}
- if (mAddPipInputConsumerHandle
- && w.getStackId() == PINNED_STACK_ID
- && inputWindowHandle.layer <= pipInputConsumer.mWindowHandle.layer) {
- // Update the bounds of the Pip input consumer to match the Pinned stack
- w.getStack().getBounds(pipTouchableBounds);
- pipInputConsumer.mWindowHandle.touchableRegion.set(pipTouchableBounds);
- addInputWindowHandle(pipInputConsumer.mWindowHandle);
- mAddPipInputConsumerHandle = false;
+ final int flags = w.mAttrs.flags;
+ final int privateFlags = w.mAttrs.privateFlags;
+ final int type = w.mAttrs.type;
+ final boolean hasFocus = w == mInputFocus;
+ final boolean isVisible = w.isVisibleLw();
+
+ if (w.getStackId() == PINNED_STACK_ID) {
+ if (mAddPipInputConsumerHandle
+ && (inputWindowHandle.layer <= pipInputConsumer.mWindowHandle.layer)) {
+ // Update the bounds of the Pip input consumer to match the Pinned stack
+ w.getStack().getBounds(pipTouchableBounds);
+ pipInputConsumer.mWindowHandle.touchableRegion.set(pipTouchableBounds);
+ addInputWindowHandle(pipInputConsumer.mWindowHandle);
+ mAddPipInputConsumerHandle = false;
+ }
+ // TODO: Fix w.canReceiveTouchInput() to handle this case
+ if (!hasFocus) {
+ // Skip this pinned stack window if it does not have focus
+ return;
+ }
}
if (mAddInputConsumerHandle
@@ -655,12 +667,6 @@
}
}
- final int flags = w.mAttrs.flags;
- final int privateFlags = w.mAttrs.privateFlags;
- final int type = w.mAttrs.type;
-
- final boolean hasFocus = w == mInputFocus;
- final boolean isVisible = w.isVisibleLw();
if ((privateFlags & PRIVATE_FLAG_DISABLE_WALLPAPER_TOUCH_EVENTS) != 0) {
mDisableWallpaperTouchEvents = true;
}
diff --git a/services/core/java/com/android/server/wm/PinnedStackController.java b/services/core/java/com/android/server/wm/PinnedStackController.java
index a872ea4..2a20a70 100644
--- a/services/core/java/com/android/server/wm/PinnedStackController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackController.java
@@ -105,6 +105,7 @@
private final DisplayMetrics mTmpMetrics = new DisplayMetrics();
private final Rect mTmpInsets = new Rect();
private final Rect mTmpRect = new Rect();
+ private final Point mTmpDisplaySize = new Point();
/**
* The callback object passed to listeners for them to notify the controller of state changes.
@@ -209,6 +210,9 @@
final int top = (int) (stackBounds.centerY() - height / 2f);
stackBounds.set(left, top, left + width, top + height);
mSnapAlgorithm.applySnapFraction(stackBounds, getMovementBounds(stackBounds), snapFraction);
+ if (mIsMinimized) {
+ applyMinimizedOffset(stackBounds, getMovementBounds(stackBounds));
+ }
return stackBounds;
}
@@ -226,58 +230,37 @@
}
/**
- * @return the movement bounds for the given {@param stackBounds} and the current state of the
- * controller.
+ * Updates the display info, calculating and returning the new stack and movement bounds in the
+ * new orientation of the device if necessary.
*/
- Rect getMovementBounds(Rect stackBounds) {
- return getMovementBounds(stackBounds, true /* adjustForIme */);
- }
-
- /**
- * @return the movement bounds for the given {@param stackBounds} and the current state of the
- * controller.
- */
- Rect getMovementBounds(Rect stackBounds, boolean adjustForIme) {
- final Rect movementBounds = new Rect();
- getInsetBounds(movementBounds);
-
- // Apply the movement bounds adjustments based on the current state
- mSnapAlgorithm.getMovementBounds(stackBounds, movementBounds, movementBounds,
- (adjustForIme && mIsImeShowing) ? mImeHeight : 0);
- return movementBounds;
- }
-
- /**
- * @param preChangeTargetBounds The final bounds of the stack if it is currently animating
- * @return the repositioned PIP bounds given it's pre-change bounds, and the new display
- * content.
- */
- Rect onDisplayChanged(Rect preChangeStackBounds, Rect preChangeTargetBounds,
- DisplayContent displayContent) {
- final Rect postChangeStackBounds = new Rect(preChangeTargetBounds);
- final DisplayInfo displayInfo = displayContent.getDisplayInfo();
- if (!mDisplayInfo.equals(displayInfo)) {
- // Calculate the snap fraction of the current stack along the old movement bounds, and
- // then update the stack bounds to the same fraction along the rotated movement bounds.
- final Rect preChangeMovementBounds = getMovementBounds(preChangeStackBounds);
- final float snapFraction = mSnapAlgorithm.getSnapFraction(preChangeStackBounds,
- preChangeMovementBounds);
- mDisplayInfo.copyFrom(displayInfo);
-
- final Rect postChangeMovementBounds = getMovementBounds(preChangeStackBounds,
- false /* adjustForIme */);
- mSnapAlgorithm.applySnapFraction(postChangeStackBounds, postChangeMovementBounds,
- snapFraction);
- if (mIsMinimized) {
- final Point displaySize = new Point(mDisplayInfo.logicalWidth,
- mDisplayInfo.logicalHeight);
- mService.getStableInsetsLocked(displayContent.getDisplayId(), mStableInsets);
- mSnapAlgorithm.applyMinimizedOffset(postChangeStackBounds, postChangeMovementBounds,
- displaySize, mStableInsets);
- }
- notifyMovementBoundsChanged(false /* fromImeAdjustment */);
+ void onTaskStackBoundsChanged(Rect targetBounds, Rect outBounds) {
+ final DisplayInfo displayInfo = mDisplayContent.getDisplayInfo();
+ if (mDisplayInfo.equals(displayInfo)) {
+ return;
}
- return postChangeStackBounds;
+
+ mTmpRect.set(targetBounds);
+ final Rect postChangeStackBounds = mTmpRect;
+
+ // Calculate the snap fraction of the current stack along the old movement bounds
+ final Rect preChangeMovementBounds = getMovementBounds(postChangeStackBounds);
+ final float snapFraction = mSnapAlgorithm.getSnapFraction(postChangeStackBounds,
+ preChangeMovementBounds);
+ mDisplayInfo.copyFrom(displayInfo);
+
+ // Calculate the stack bounds in the new orientation to the same same fraction along the
+ // rotated movement bounds.
+ final Rect postChangeMovementBounds = getMovementBounds(postChangeStackBounds,
+ false /* adjustForIme */);
+ mSnapAlgorithm.applySnapFraction(postChangeStackBounds, postChangeMovementBounds,
+ snapFraction);
+ if (mIsMinimized) {
+ applyMinimizedOffset(postChangeStackBounds, postChangeMovementBounds);
+ }
+
+ notifyMovementBoundsChanged(false /* fromImeAdjustment */);
+
+ outBounds.set(postChangeStackBounds);
}
/**
@@ -387,6 +370,38 @@
}
/**
+ * @return the movement bounds for the given {@param stackBounds} and the current state of the
+ * controller.
+ */
+ private Rect getMovementBounds(Rect stackBounds) {
+ return getMovementBounds(stackBounds, true /* adjustForIme */);
+ }
+
+ /**
+ * @return the movement bounds for the given {@param stackBounds} and the current state of the
+ * controller.
+ */
+ private Rect getMovementBounds(Rect stackBounds, boolean adjustForIme) {
+ final Rect movementBounds = new Rect();
+ getInsetBounds(movementBounds);
+
+ // Apply the movement bounds adjustments based on the current state
+ mSnapAlgorithm.getMovementBounds(stackBounds, movementBounds, movementBounds,
+ (adjustForIme && mIsImeShowing) ? mImeHeight : 0);
+ return movementBounds;
+ }
+
+ /**
+ * Applies the minimized offsets to the given stack bounds.
+ */
+ private void applyMinimizedOffset(Rect stackBounds, Rect movementBounds) {
+ mTmpDisplaySize.set(mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight);
+ mService.getStableInsetsLocked(mDisplayContent.getDisplayId(), mStableInsets);
+ mSnapAlgorithm.applyMinimizedOffset(stackBounds, movementBounds, mTmpDisplaySize,
+ mStableInsets);
+ }
+
+ /**
* @return the pixels for a given dp value.
*/
private int dpToPx(float dpValue, DisplayMetrics dm) {
diff --git a/services/core/java/com/android/server/wm/PinnedStackWindowController.java b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
new file mode 100644
index 0000000..71f88de
--- /dev/null
+++ b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
@@ -0,0 +1,122 @@
+/*
+ * 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.wm;
+
+import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID;
+
+import android.app.RemoteAction;
+import android.graphics.Rect;
+
+import com.android.server.UiThread;
+
+import java.util.List;
+
+/**
+ * Controller for the pinned stack container. See {@link StackWindowController}.
+ */
+public class PinnedStackWindowController extends StackWindowController {
+
+ private Rect mTmpBoundsRect = new Rect();
+
+ public PinnedStackWindowController(int stackId, StackWindowListener listener, int displayId,
+ boolean onTop, Rect outBounds) {
+ super(stackId, listener, displayId, onTop, outBounds, WindowManagerService.getInstance());
+ }
+
+ /**
+ * Animates the pinned stack.
+ */
+ public void animateResizePinnedStack(Rect bounds, int animationDuration) {
+ synchronized (mWindowMap) {
+ if (mContainer == null) {
+ throw new IllegalArgumentException("Pinned stack container not found :(");
+ }
+
+ // Get non-null fullscreen bounds if the bounds are null
+ final boolean moveToFullscreen = bounds == null;
+ bounds = getPinnedStackAnimationBounds(bounds);
+
+ // If the bounds are truly null, then there was no fullscreen stack at this time, so
+ // animate this to the full display bounds
+ final Rect toBounds;
+ if (bounds == null) {
+ toBounds = new Rect();
+ mContainer.getDisplayContent().getLogicalDisplayRect(toBounds);
+ } else {
+ toBounds = bounds;
+ }
+
+ final Rect originalBounds = new Rect();
+ mContainer.getBounds(originalBounds);
+ mContainer.setAnimatingBounds(toBounds);
+ UiThread.getHandler().post(() -> {
+ mService.mBoundsAnimationController.animateBounds(mContainer, originalBounds,
+ toBounds, animationDuration, moveToFullscreen);
+ });
+ }
+ }
+
+ /**
+ * Sets the current picture-in-picture aspect ratio.
+ */
+ public void setPictureInPictureAspectRatio(float aspectRatio) {
+ synchronized (mWindowMap) {
+ if (!mService.mSupportsPictureInPicture || mContainer == null) {
+ return;
+ }
+
+ final int displayId = mContainer.getDisplayContent().getDisplayId();
+ final Rect toBounds = mService.getPictureInPictureBounds(displayId, aspectRatio);
+ final Rect targetBounds = new Rect();
+ mContainer.getAnimatingBounds(targetBounds);
+ if (!toBounds.equals(targetBounds)) {
+ animateResizePinnedStack(toBounds, -1 /* duration */);
+ }
+
+ final PinnedStackController pinnedStackController =
+ mContainer.getDisplayContent().getPinnedStackController();
+ pinnedStackController.setAspectRatio(
+ pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)
+ ? aspectRatio : -1f);
+ }
+ }
+
+ /**
+ * Sets the current picture-in-picture actions.
+ */
+ public void setPictureInPictureActions(List<RemoteAction> actions) {
+ synchronized (mWindowMap) {
+ if (!mService.mSupportsPictureInPicture || mContainer == null) {
+ return;
+ }
+
+ mContainer.getDisplayContent().getPinnedStackController().setActions(actions);
+ }
+ }
+
+ /**
+ * Checks the {@param bounds} and retirms non-null fullscreen bounds for the pinned stack
+ * animation if necessary.
+ */
+ private Rect getPinnedStackAnimationBounds(Rect bounds) {
+ mService.getStackBounds(FULLSCREEN_WORKSPACE_STACK_ID, mTmpBoundsRect);
+ if (bounds == null && !mTmpBoundsRect.isEmpty()) {
+ bounds = new Rect(mTmpBoundsRect);
+ }
+ return bounds;
+ }
+}
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index 782f9f2..5355f31 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -16,7 +16,10 @@
package com.android.server.wm;
+import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
+import static android.view.WindowManager.LayoutParams.isSystemAlertWindowType;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DRAG;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_POSITIONING;
import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
@@ -54,6 +57,8 @@
import com.android.server.wm.WindowManagerService.H;
import java.io.PrintWriter;
+import java.util.HashSet;
+import java.util.Set;
/**
* This class represents an active client session. There is generally one
@@ -70,9 +75,15 @@
private final String mStringName;
SurfaceSession mSurfaceSession;
private int mNumWindow = 0;
- private int mNumOverlayWindow = 0;
+ // Set of visible application overlay window surfaces connected to this session.
+ private final Set<WindowSurfaceController> mAppOverlaySurfaces = new HashSet<>();
+ // Set of visible alert window surfaces connected to this session.
+ private final Set<WindowSurfaceController> mAlertWindowSurfaces = new HashSet<>();
+ final boolean mCanAddInternalSystemWindow;
+ private AlertWindowNotification mAlertWindowNotification;
private boolean mClientDead = false;
private float mLastReportedAnimatorScale;
+ private String mPackageName;
public Session(WindowManagerService service, IWindowSessionCallback callback,
IInputMethodClient client, IInputContext inputContext) {
@@ -82,6 +93,8 @@
mUid = Binder.getCallingUid();
mPid = Binder.getCallingPid();
mLastReportedAnimatorScale = service.getCurrentAnimatorScale();
+ mCanAddInternalSystemWindow = service.mContext.checkCallingPermission(
+ INTERNAL_SYSTEM_WINDOW) == PERMISSION_GRANTED;
StringBuilder sb = new StringBuilder();
sb.append("Session{");
sb.append(Integer.toHexString(System.identityHashCode(this)));
@@ -544,7 +557,8 @@
}
}
- void windowAddedLocked(int type) {
+ void windowAddedLocked(String packageName) {
+ mPackageName = packageName;
if (mSurfaceSession == null) {
if (WindowManagerService.localLOGV) Slog.v(
TAG_WM, "First window added to " + this + ", creating SurfaceSession");
@@ -557,24 +571,57 @@
}
}
mNumWindow++;
- if (type == TYPE_APPLICATION_OVERLAY) {
- mNumOverlayWindow++;
- setHasOverlayUi(true);
- }
}
- void windowRemovedLocked(int type) {
+ void windowRemovedLocked() {
mNumWindow--;
- if (type == TYPE_APPLICATION_OVERLAY) {
- mNumOverlayWindow--;
- if (mNumOverlayWindow == 0) {
- setHasOverlayUi(false);
- } else if (mNumOverlayWindow < 0) {
- throw new IllegalStateException("mNumOverlayWindow=" + mNumOverlayWindow
- + " less than 0 for session=" + this);
+ killSessionLocked();
+ }
+
+
+ void onWindowSurfaceVisibilityChanged(WindowSurfaceController surfaceController,
+ boolean visible, int type) {
+
+ if (!isSystemAlertWindowType(type)) {
+ return;
+ }
+
+ boolean changed;
+
+ if (!mCanAddInternalSystemWindow) {
+ // We want to track non-system signature apps adding alert windows so we can post an
+ // on-going notification for the user to control their visibility.
+ if (visible) {
+ changed = mAlertWindowSurfaces.add(surfaceController);
+ } else {
+ changed = mAlertWindowSurfaces.remove(surfaceController);
+ }
+
+ if (changed) {
+ if (mAlertWindowSurfaces.isEmpty()) {
+ cancelAlertWindowNotification();
+ } else if (mAlertWindowNotification == null){
+ mAlertWindowNotification = new AlertWindowNotification(
+ mService, mPackageName, mUid);
+ }
}
}
- killSessionLocked();
+
+ if (type != TYPE_APPLICATION_OVERLAY) {
+ return;
+ }
+
+ if (visible) {
+ changed = mAppOverlaySurfaces.add(surfaceController);
+ } else {
+ changed = mAppOverlaySurfaces.remove(surfaceController);
+ }
+
+ if (changed) {
+ // Notify activity manager of changes to app overlay windows so it can adjust the
+ // importance score for the process.
+ setHasOverlayUi(!mAppOverlaySurfaces.isEmpty());
+ }
}
private void killSessionLocked() {
@@ -597,16 +644,28 @@
+ " in session " + this + ": " + e.toString());
}
mSurfaceSession = null;
+ mAlertWindowSurfaces.clear();
+ mAppOverlaySurfaces.clear();
setHasOverlayUi(false);
+ cancelAlertWindowNotification();
}
private void setHasOverlayUi(boolean hasOverlayUi) {
mService.mH.obtainMessage(H.SET_HAS_OVERLAY_UI, mPid, hasOverlayUi ? 1 : 0).sendToTarget();
}
+ private void cancelAlertWindowNotification() {
+ if (mAlertWindowNotification == null) {
+ return;
+ }
+ mAlertWindowNotification.cancel();
+ mAlertWindowNotification = null;
+ }
+
void dump(PrintWriter pw, String prefix) {
pw.print(prefix); pw.print("mNumWindow="); pw.print(mNumWindow);
- pw.print(" mNumOverlayWindow="); pw.print(mNumOverlayWindow);
+ pw.print(" mAppOverlaySurfaces="); pw.print(mAppOverlaySurfaces);
+ pw.print(" mAlertWindowSurfaces="); pw.print(mAlertWindowSurfaces);
pw.print(" mClientDead="); pw.print(mClientDead);
pw.print(" mSurfaceSession="); pw.println(mSurfaceSession);
}
diff --git a/services/core/java/com/android/server/wm/StackWindowController.java b/services/core/java/com/android/server/wm/StackWindowController.java
index 36d07e0..b0e115b 100644
--- a/services/core/java/com/android/server/wm/StackWindowController.java
+++ b/services/core/java/com/android/server/wm/StackWindowController.java
@@ -16,6 +16,9 @@
package com.android.server.wm;
+import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
+
+import android.app.ActivityManager.StackId;
import android.app.RemoteAction;
import android.content.res.Configuration;
import android.graphics.Rect;
@@ -24,6 +27,8 @@
import android.os.Message;
import android.util.Slog;
import android.util.SparseArray;
+import android.view.DisplayInfo;
+
import com.android.server.UiThread;
import com.android.internal.annotations.VisibleForTesting;
@@ -48,6 +53,12 @@
private final H mHandler;
+ // Temp bounds only used in adjustConfigurationForBounds()
+ private final Rect mTmpRect = new Rect();
+ private final Rect mTmpStableInsets = new Rect();
+ private final Rect mTmpNonDecorInsets = new Rect();
+ private final Rect mTmpDisplayBounds = new Rect();
+
public StackWindowController(int stackId, StackWindowListener listener,
int displayId, boolean onTop, Rect outBounds) {
this(stackId, listener, displayId, onTop, outBounds, WindowManagerService.getInstance());
@@ -188,59 +199,6 @@
}
}
- // TODO: This and similar methods should be separated into PinnedStackWindowContainerController
- public void animateResizePinnedStack(final Rect bounds, final int animationDuration) {
- synchronized (mWindowMap) {
- if (mContainer == null) {
- throw new IllegalArgumentException("Pinned stack container not found :(");
- }
- final Rect originalBounds = new Rect();
- mContainer.getBounds(originalBounds);
- mContainer.setAnimatingBounds(bounds);
- UiThread.getHandler().post(new Runnable() {
- @Override
- public void run() {
- mService.mBoundsAnimationController.animateBounds(
- mContainer, originalBounds, bounds, animationDuration);
- }
- });
- }
- }
-
- /** Sets the current picture-in-picture aspect ratio. */
- public void setPictureInPictureAspectRatio(float aspectRatio) {
- synchronized (mWindowMap) {
- if (!mService.mSupportsPictureInPicture || mContainer == null) {
- return;
- }
-
- final int displayId = mContainer.getDisplayContent().getDisplayId();
- final Rect toBounds = mService.getPictureInPictureBounds(displayId, aspectRatio);
- final Rect targetBounds = new Rect();
- mContainer.getAnimatingBounds(targetBounds);
- if (!toBounds.equals(targetBounds)) {
- animateResizePinnedStack(toBounds, -1 /* duration */);
- }
-
- final PinnedStackController pinnedStackController =
- mContainer.getDisplayContent().getPinnedStackController();
- pinnedStackController.setAspectRatio(
- pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)
- ? aspectRatio : -1f);
- }
- }
-
- /** Sets the current picture-in-picture actions. */
- public void setPictureInPictureActions(List<RemoteAction> actions) {
- synchronized (mWindowMap) {
- if (!mService.mSupportsPictureInPicture || mContainer == null) {
- return;
- }
-
- mContainer.getDisplayContent().getPinnedStackController().setActions(actions);
- }
- }
-
public void getStackDockedModeBounds(Rect outBounds, Rect outTempBounds,
Rect outTempInsetBounds, boolean ignoreVisibility) {
synchronized (mWindowMap) {
@@ -289,6 +247,107 @@
}
}
+ /**
+ * Adjusts the screen size in dp's for the {@param config} for the given params.
+ */
+ public void adjustConfigurationForBounds(Rect bounds, Rect insetBounds,
+ Rect nonDecorBounds, Rect stableBounds, boolean overrideWidth,
+ boolean overrideHeight, float density, Configuration config,
+ Configuration parentConfig) {
+ synchronized (mWindowMap) {
+ final TaskStack stack = mContainer;
+ final DisplayContent displayContent = stack.getDisplayContent();
+ final DisplayInfo di = displayContent.getDisplayInfo();
+
+ // Get the insets and display bounds
+ mService.mPolicy.getStableInsetsLw(di.rotation, di.logicalWidth, di.logicalHeight,
+ mTmpStableInsets);
+ mService.mPolicy.getNonDecorInsetsLw(di.rotation, di.logicalWidth, di.logicalHeight,
+ mTmpNonDecorInsets);
+ mTmpDisplayBounds.set(0, 0, di.logicalWidth, di.logicalHeight);
+
+ int width;
+ int height;
+ if (StackId.tasksAreFloating(mStackId)) {
+ // Floating tasks should not be resized to the screen's bounds.
+
+ if (bounds.width() == mTmpDisplayBounds.width() &&
+ bounds.height() == mTmpDisplayBounds.height()) {
+ // If the bounds we are animating is the same as the fullscreen stack
+ // dimensions, then apply the same inset calculations that we normally do for
+ // the fullscreen stack, without intersecting it with the display bounds
+ stableBounds.inset(mTmpStableInsets);
+ nonDecorBounds.inset(mTmpNonDecorInsets);
+ }
+ width = (int) (stableBounds.width() / density);
+ height = (int) (stableBounds.height() / density);
+ } else {
+ // For calculating screenWidthDp, screenWidthDp, we use the stable inset screen
+ // area, i.e. the screen area without the system bars.
+ // Additionally task dimensions should not be bigger than its parents dimensions.
+ // The non decor inset are areas that could never be removed in Honeycomb. See
+ // {@link WindowManagerPolicy#getNonDecorInsetsLw}.
+ intersectDisplayBoundsExcludeInsets(nonDecorBounds,
+ insetBounds != null ? insetBounds : bounds, mTmpNonDecorInsets,
+ mTmpDisplayBounds, overrideWidth, overrideHeight);
+ intersectDisplayBoundsExcludeInsets(stableBounds,
+ insetBounds != null ? insetBounds : bounds, mTmpStableInsets,
+ mTmpDisplayBounds, overrideWidth, overrideHeight);
+ width = Math.min((int) (stableBounds.width() / density),
+ parentConfig.screenWidthDp);
+ height = Math.min((int) (stableBounds.height() / density),
+ parentConfig.screenHeightDp);
+ }
+
+ config.screenWidthDp = width;
+ config.screenHeightDp = height;
+ config.smallestScreenWidthDp = getSmallestWidthForTaskBounds(
+ insetBounds != null ? insetBounds : bounds, density);
+ }
+ }
+
+ /**
+ * Intersects the specified {@code inOutBounds} with the display frame that excludes the stable
+ * inset areas.
+ *
+ * @param inOutBounds The inOutBounds to subtract the stable inset areas from.
+ */
+ private void intersectDisplayBoundsExcludeInsets(Rect inOutBounds, Rect inInsetBounds,
+ Rect stableInsets, Rect displayBounds, boolean overrideWidth, boolean overrideHeight) {
+ mTmpRect.set(inInsetBounds);
+ mService.intersectDisplayInsetBounds(displayBounds, stableInsets, mTmpRect);
+ int leftInset = mTmpRect.left - inInsetBounds.left;
+ int topInset = mTmpRect.top - inInsetBounds.top;
+ int rightInset = overrideWidth ? 0 : inInsetBounds.right - mTmpRect.right;
+ int bottomInset = overrideHeight ? 0 : inInsetBounds.bottom - mTmpRect.bottom;
+ inOutBounds.inset(leftInset, topInset, rightInset, bottomInset);
+ }
+
+ /**
+ * Calculates the smallest width for a task given the {@param bounds}.
+ *
+ * @return the smallest width to be used in the Configuration, in dips
+ */
+ private int getSmallestWidthForTaskBounds(Rect bounds, float density) {
+ final DisplayContent displayContent = mContainer.getDisplayContent();
+ final DisplayInfo displayInfo = displayContent.getDisplayInfo();
+
+ if (bounds == null || (bounds.width() == displayInfo.logicalWidth &&
+ bounds.height() == displayInfo.logicalHeight)) {
+ // If the bounds are fullscreen, return the value of the fullscreen configuration
+ return displayContent.getConfiguration().smallestScreenWidthDp;
+ } else if (StackId.tasksAreFloating(mStackId)) {
+ // For floating tasks, calculate the smallest width from the bounds of the task
+ return (int) (Math.min(bounds.width(), bounds.height()) / density);
+ } else {
+ // Iterating across all screen orientations, and return the minimum of the task
+ // width taking into account that the bounds might change because the snap algorithm
+ // snaps to a different value
+ return displayContent.getDockedDividerController()
+ .getSmallestWidthDpForBounds(bounds);
+ }
+ }
+
void requestResize(Rect bounds) {
mHandler.obtainMessage(H.REQUEST_RESIZE, bounds).sendToTarget();
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index ab9a378..da5fcf3 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -592,8 +592,15 @@
return mStack != null && mStack.mStackId == PINNED_STACK_ID;
}
+ /**
+ * When we are in a floating stack (Freeform, Pinned, ...) we calculate
+ * insets differently. However if we are animating to the fullscreen stack
+ * we need to begin calculating insets as if we were fullscreen, otherwise
+ * we will have a jump at the end.
+ */
boolean isFloating() {
- return StackId.tasksAreFloating(mStack.mStackId);
+ return StackId.tasksAreFloating(mStack.mStackId)
+ && !mStack.isBoundsAnimatingToFullscreen();
}
WindowState getTopVisibleAppMainWindow() {
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index 2b74f84..5041138 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -19,6 +19,7 @@
import static android.app.ActivityManager.ENABLE_TASK_SNAPSHOTS;
import android.annotation.Nullable;
+import android.app.ActivityManager;
import android.app.ActivityManager.StackId;
import android.app.ActivityManager.TaskSnapshot;
import android.graphics.GraphicBuffer;
@@ -65,26 +66,22 @@
}
void onTransitionStarting() {
- if (!ENABLE_TASK_SNAPSHOTS) {
- return;
- }
handleClosingApps(mService.mClosingApps);
}
-
/**
* Called when the visibility of an app changes outside of the regular app transition flow.
*/
void notifyAppVisibilityChanged(AppWindowToken appWindowToken, boolean visible) {
- if (!ENABLE_TASK_SNAPSHOTS) {
- return;
- }
if (!visible) {
handleClosingApps(Sets.newArraySet(appWindowToken));
}
}
private void handleClosingApps(ArraySet<AppWindowToken> closingApps) {
+ if (!ENABLE_TASK_SNAPSHOTS || ActivityManager.isLowRamDeviceStatic()) {
+ return;
+ }
// We need to take a snapshot of the task if and only if all activities of the task are
// either closing or hidden.
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
index cfcbbd0..9f52412 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
@@ -226,7 +226,8 @@
@Override
public void resized(Rect frame, Rect overscanInsets, Rect contentInsets, Rect visibleInsets,
Rect stableInsets, Rect outsets, boolean reportDraw, Configuration newConfig,
- Rect backDropFrame, boolean forceLayout, boolean alwaysConsumeNavBar) {
+ Rect backDropFrame, boolean forceLayout, boolean alwaysConsumeNavBar,
+ int displayId) {
if (reportDraw) {
sHandler.obtainMessage(MSG_REPORT_DRAW, mOuter).sendToTarget();
}
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index b09d699..34e99a6 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -19,6 +19,7 @@
import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT;
import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT;
import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
+import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.StackId.HOME_STACK_ID;
import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
@@ -125,6 +126,7 @@
// perfectly fit the region it would have been cropped to. We may also avoid certain logic we
// would otherwise apply while resizing, while resizing in the bounds animating mode.
private boolean mBoundsAnimating = false;
+ private boolean mBoundsAnimatingToFullscreen = false;
private Rect mBoundsAnimationTarget = new Rect();
// Temporary storage for the new bounds that should be used after the configuration change.
@@ -260,6 +262,12 @@
if (mDisplayContent != null) {
mDisplayContent.mDimLayerController.updateDimLayer(this);
+ if (mStackId == PINNED_STACK_ID) {
+ // Update the bounds based on any changes to the display info
+ getAnimatingBounds(mTmpRect2);
+ mDisplayContent.mPinnedStackControllerLocked.onTaskStackBoundsChanged(mTmpRect2,
+ bounds);
+ }
mAnimationBackgroundSurface.setBounds(bounds);
}
@@ -389,15 +397,18 @@
return false;
}
+ if (StackId.tasksAreFloating(mStackId)) {
+ // Update stack bounds again since the display info has changed since updateDisplayInfo,
+ // however, for floating tasks, we don't need to apply the new rotation to the bounds,
+ // we can just update and return them here
+ setBounds(mBounds);
+ mBoundsAfterRotation.set(mBounds);
+ return true;
+ }
+
mTmpRect2.set(mBounds);
mDisplayContent.rotateBounds(mRotation, newRotation, mTmpRect2);
switch (mStackId) {
- case PINNED_STACK_ID:
- Rect targetBounds = new Rect();
- getAnimatingBounds(targetBounds);
- mTmpRect2 = mDisplayContent.getPinnedStackController().onDisplayChanged(mBounds,
- targetBounds, mDisplayContent);
- break;
case DOCKED_STACK_ID:
repositionDockedStackAfterRotation(mTmpRect2);
snapDockedStackAfterRotation(mTmpRect2);
@@ -649,7 +660,6 @@
mAnimationBackgroundSurface = new DimLayer(mService, this, mDisplayContent.getDisplayId(),
"animation background stackId=" + mStackId);
- final Rect oldBounds = new Rect(mBounds);
Rect bounds = null;
final TaskStack dockedStack = dc.getDockedStackIgnoringVisibility();
if (mStackId == DOCKED_STACK_ID
@@ -673,15 +683,6 @@
}
updateDisplayInfo(bounds);
-
- // Update the pinned stack controller after the display info is updated
- if (mStackId == PINNED_STACK_ID) {
- Rect targetBounds = new Rect();
- getAnimatingBounds(targetBounds);
- mDisplayContent.getPinnedStackController().onDisplayChanged(oldBounds, targetBounds,
- mDisplayContent);
- }
-
super.onDisplayChanged(dc);
}
@@ -1443,9 +1444,10 @@
}
@Override // AnimatesBounds
- public void onAnimationStart() {
+ public void onAnimationStart(boolean toFullscreen) {
synchronized (mService.mWindowMap) {
mBoundsAnimating = true;
+ mBoundsAnimatingToFullscreen = toFullscreen;
}
}
@@ -1474,16 +1476,11 @@
}
}
- @Override
- public void getFullScreenBounds(Rect bounds) {
- getDisplayContent().getContentRect(bounds);
- }
-
public boolean hasMovementAnimations() {
return StackId.hasMovementAnimations(mStackId);
}
- public boolean getForceScaleToStack() {
+ public boolean isForceScaled() {
return mBoundsAnimating;
}
@@ -1491,6 +1488,10 @@
return mBoundsAnimating;
}
+ public boolean isBoundsAnimatingToFullscreen() {
+ return mBoundsAnimating && mBoundsAnimatingToFullscreen;
+ }
+
/** Returns true if a removal action is still being deferred. */
boolean checkCompleteDeferredRemoval() {
if (isAnimating()) {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index a53102f..2a4dfc4 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -16,16 +16,19 @@
package com.android.server.wm;
-import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
import static android.Manifest.permission.MANAGE_APP_TOKENS;
import static android.Manifest.permission.REGISTER_WINDOW_MANAGER_LISTENERS;
import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT;
import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
+import static android.app.AppOpsManager.MODE_IGNORED;
+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.ACTION_USER_REMOVED;
+import static android.content.Intent.EXTRA_PACKAGE_NAME;
+import static android.content.Intent.EXTRA_UID;
import static android.content.Intent.EXTRA_USER_HANDLE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
-import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.UserHandle.USER_NULL;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.DOCKED_INVALID;
@@ -64,8 +67,7 @@
import static com.android.server.wm.AppTransition.TRANSIT_UNSET;
import static com.android.server.wm.AppWindowAnimator.PROLONG_ANIMATION_AT_END;
import static com.android.server.wm.AppWindowAnimator.PROLONG_ANIMATION_AT_START;
-import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER;
-import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_FREEFORM;
+import static com.android.server.wm.KeyguardDisableHandler.KEYGUARD_POLICY_CHANGED;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
@@ -106,7 +108,6 @@
import android.app.ActivityManagerInternal;
import android.app.AppOpsManager;
import android.app.IActivityManager;
-import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
@@ -343,20 +344,34 @@
final private KeyguardDisableHandler mKeyguardDisableHandler;
- final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ static final String ACTION_REVOKE_SYSTEM_ALERT_WINDOW_PERMISSION =
+ "com.android.server.wm.ACTION_REVOKE_SYSTEM_ALERT_WINDOW_PERMISSION";
+
+ private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED.equals(action)) {
- mKeyguardDisableHandler.sendEmptyMessage(
- KeyguardDisableHandler.KEYGUARD_POLICY_CHANGED);
- } else if (ACTION_USER_REMOVED.equals(action)) {
- final int userId = intent.getIntExtra(EXTRA_USER_HANDLE, USER_NULL);
- if (userId != USER_NULL) {
- synchronized (mWindowMap) {
- mScreenCaptureDisabled.remove(userId);
+ switch (intent.getAction()) {
+ case ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED:
+ mKeyguardDisableHandler.sendEmptyMessage(KEYGUARD_POLICY_CHANGED);
+ break;
+ case ACTION_USER_REMOVED:
+ final int userId = intent.getIntExtra(EXTRA_USER_HANDLE, USER_NULL);
+ if (userId != USER_NULL) {
+ synchronized (mWindowMap) {
+ mScreenCaptureDisabled.remove(userId);
+ }
}
- }
+ break;
+ case ACTION_REVOKE_SYSTEM_ALERT_WINDOW_PERMISSION:
+ final String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
+ final int uid = intent.getIntExtra(EXTRA_UID, -1);
+ if (packageName != null && uid != -1) {
+ synchronized (mWindowMap) {
+ // Revoke permission.
+ mAppOps.setMode(OP_SYSTEM_ALERT_WINDOW, uid, packageName, MODE_IGNORED);
+ }
+ }
+ break;
}
}
};
@@ -606,9 +621,14 @@
WindowState mCurrentFocus = null;
WindowState mLastFocus = null;
- /** This just indicates the window the input method is on top of, not
- * necessarily the window its input is going to. */
+ // TODO: All the IME window tracking should be moved to DisplayContent and tracked per display.
+ // This just indicates the window the input method is on top of, not necessarily the window its
+ // input is going to.
WindowState mInputMethodTarget = null;
+ // The binder token currently using the IME as determined by the input method service.
+ // Window manager uses this to determine the final input method target
+ // (almost always this candidate) for z-ordering.
+ IBinder mInputMethodTargetCandidate = null;
/** If true hold off on modifying the animation layer of mInputMethodTarget */
boolean mInputMethodTargetWaitingAnim;
@@ -1018,7 +1038,7 @@
updateAppOpsState();
}
};
- mAppOps.startWatchingMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, null, opListener);
+ mAppOps.startWatchingMode(OP_SYSTEM_ALERT_WINDOW, null, opListener);
mAppOps.startWatchingMode(AppOpsManager.OP_TOAST_WINDOW, null, opListener);
// Get persisted window scale setting
@@ -1034,9 +1054,10 @@
IntentFilter filter = new IntentFilter();
// Track changes to DevicePolicyManager state so we can enable/disable keyguard.
- filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
+ filter.addAction(ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
// Listen to user removal broadcasts so that we can remove the user-specific data.
filter.addAction(Intent.ACTION_USER_REMOVED);
+ filter.addAction(ACTION_REVOKE_SYSTEM_ALERT_WINDOW_PERMISSION);
mContext.registerReceiver(mBroadcastReceiver, filter);
mSettingsObserver = new SettingsObserver();
@@ -1111,8 +1132,6 @@
long origId;
final int callingUid = Binder.getCallingUid();
final int type = attrs.type;
- final boolean ownerCanAddInternalSystemWindow =
- mContext.checkCallingPermission(INTERNAL_SYSTEM_WINDOW) == PERMISSION_GRANTED;
synchronized(mWindowMap) {
if (!mDisplayReady) {
@@ -1215,7 +1234,7 @@
}
}
token = new WindowToken(this, attrs.token, type, false, displayContent,
- ownerCanAddInternalSystemWindow);
+ session.mCanAddInternalSystemWindow);
} else if (rootType >= FIRST_APPLICATION_WINDOW && rootType <= LAST_APPLICATION_WINDOW) {
atoken = token.asAppWindowToken();
if (atoken == null) {
@@ -1286,12 +1305,12 @@
// instead make a new token for it (as if null had been passed in for the token).
attrs.token = null;
token = new WindowToken(this, null, type, false, displayContent,
- ownerCanAddInternalSystemWindow);
+ session.mCanAddInternalSystemWindow);
}
final WindowState win = new WindowState(this, session, client, token, parentWindow,
appOp[0], seq, attrs, viewVisibility, session.mUid,
- ownerCanAddInternalSystemWindow);
+ session.mCanAddInternalSystemWindow);
if (win.mDeathRecipient == null) {
// Client has apparently died, so there is no reason to
// continue.
@@ -1984,7 +2003,7 @@
if (viewVisibility == View.VISIBLE &&
(win.mAppToken == null || win.mAttrs.type == TYPE_APPLICATION_STARTING
|| !win.mAppToken.clientHidden)) {
- result = relayoutVisibleWindow(outConfig, result, win, winAnimator, attrChanges,
+ result = win.relayoutVisibleWindow(outConfig, result, attrChanges,
oldVisibility);
try {
result = createSurfaceControl(outSurface, result, win, winAnimator);
@@ -2202,69 +2221,6 @@
return result;
}
- private int relayoutVisibleWindow(Configuration outConfig, int result, WindowState win,
- WindowStateAnimator winAnimator, int attrChanges, int oldVisibility) {
- result |= !win.isVisibleLw() ? WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME : 0;
- if (win.mAnimatingExit) {
- Slog.d(TAG, "relayoutVisibleWindow: " + win + " mAnimatingExit=true, mRemoveOnExit="
- + win.mRemoveOnExit + ", mDestroying=" + win.mDestroying);
-
- winAnimator.cancelExitAnimationForNextAnimationLocked();
- win.mAnimatingExit = false;
- }
- if (win.mDestroying) {
- win.mDestroying = false;
- mDestroySurface.remove(win);
- }
- if (oldVisibility == View.GONE) {
- winAnimator.mEnterAnimationPending = true;
- }
-
- win.mLastVisibleLayoutRotation = mRotation;
-
- winAnimator.mEnteringAnimation = true;
- if ((result & WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME) != 0) {
- win.prepareWindowToDisplayDuringRelayout(outConfig);
- }
- if ((attrChanges & LayoutParams.FORMAT_CHANGED) != 0) {
- // If the format can't be changed in place, preserve the old surface until the app draws
- // on the new one. This prevents blinking when we change elevation of freeform and
- // pinned windows.
- if (!winAnimator.tryChangeFormatInPlaceLocked()) {
- winAnimator.preserveSurfaceLocked();
- result |= RELAYOUT_RES_SURFACE_CHANGED
- | WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME;
- }
- }
-
- // If we're starting a drag-resize, we'll be changing the surface size as well as
- // notifying the client to render to with an offset from the surface's top-left.
- if (win.isDragResizeChanged() || win.isResizedWhileNotDragResizing()) {
- win.setDragResizing();
- win.setResizedWhileNotDragResizing(false);
- // We can only change top level windows to the full-screen surface when
- // resizing (as we only have one full-screen surface). So there is no need
- // to preserve and destroy windows which are attached to another, they
- // will keep their surface and its size may change over time.
- if (win.mHasSurface && !win.isChildWindow()) {
- winAnimator.preserveSurfaceLocked();
- result |= WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME;
- }
- }
- final boolean freeformResizing = win.isDragResizing()
- && win.getResizeMode() == DRAG_RESIZE_MODE_FREEFORM;
- final boolean dockedResizing = win.isDragResizing()
- && win.getResizeMode() == DRAG_RESIZE_MODE_DOCKED_DIVIDER;
- result |= freeformResizing ? WindowManagerGlobal.RELAYOUT_RES_DRAG_RESIZING_FREEFORM : 0;
- result |= dockedResizing ? WindowManagerGlobal.RELAYOUT_RES_DRAG_RESIZING_DOCKED : 0;
- if (win.isAnimatingWithSavedSurface()) {
- // If we're animating with a saved surface now, request client to report draw.
- // We still need to know when the real thing is drawn.
- result |= WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME;
- }
- return result;
- }
-
public void performDeferredDestroyWindow(Session session, IWindow client) {
long origId = Binder.clearCallingIdentity();
@@ -5216,7 +5172,7 @@
// Async Handler
// -------------------------------------------------------------
- final class H extends Handler {
+ final class H extends android.os.Handler {
public static final int REPORT_FOCUS_CHANGE = 2;
public static final int REPORT_LOSING_FOCUS = 3;
public static final int DO_TRAVERSAL = 4;
@@ -5932,8 +5888,8 @@
if (displayContent.mBaseDisplayWidth != width
|| displayContent.mBaseDisplayHeight != height) {
Slog.i(TAG_WM, "FORCED DISPLAY SIZE: " + width + "x" + height);
- displayContent.updateBaseDisplayMetrics(width, height,
- displayContent.mBaseDisplayDensity);
+ displayContent.mBaseDisplayWidth = width;
+ displayContent.mBaseDisplayHeight = height;
}
} catch (NumberFormatException ex) {
}
@@ -5958,7 +5914,8 @@
// displayContent must not be null
private void setForcedDisplaySizeLocked(DisplayContent displayContent, int width, int height) {
Slog.i(TAG_WM, "Using new display size: " + width + "x" + height);
- displayContent.updateBaseDisplayMetrics(width, height, displayContent.mBaseDisplayDensity);
+ displayContent.mBaseDisplayWidth = width;
+ displayContent.mBaseDisplayHeight = height;
reconfigureDisplayLocked(displayContent);
}
@@ -6146,6 +6103,7 @@
* Get an array with display ids ordered by focus priority - last items should be given
* focus first. Sparse array just maps position to displayId.
*/
+ // TODO: Maintain display list in focus order in ActivityManager and remove this call.
public void getDisplaysInFocusOrder(SparseIntArray displaysInFocusOrder) {
synchronized(mWindowMap) {
mRoot.getDisplaysInFocusOrder(displaysInFocusOrder);
@@ -6993,8 +6951,9 @@
pw.print(" mLastFocus="); pw.println(mLastFocus);
}
pw.print(" mFocusedApp="); pw.println(mFocusedApp);
- if (mInputMethodTarget != null) {
- pw.print(" mInputMethodTarget="); pw.println(mInputMethodTarget);
+ if (mInputMethodTarget != null || mInputMethodTargetCandidate != null) {
+ pw.println(" mInputMethodTarget=" + mInputMethodTarget
+ + " mInputMethodTargetCandidate=" + getWindow(mInputMethodTargetCandidate));
}
pw.print(" mInTouchMode="); pw.print(mInTouchMode);
pw.print(" mLayoutSeq="); pw.println(mLayoutSeq);
@@ -7309,10 +7268,6 @@
return mRoot.getDisplayContentOrCreate(DEFAULT_DISPLAY);
}
- private DisplayInfo getDefaultDisplayInfoLocked() {
- return getDefaultDisplayContentLocked().getDisplayInfo();
- }
-
public void onDisplayAdded(int displayId) {
mH.sendMessage(mH.obtainMessage(H.DO_DISPLAY_ADDED, displayId, 0));
}
@@ -7543,63 +7498,12 @@
}
}
- private void getNonDecorInsetsLocked(Rect outInsets) {
- final DisplayInfo di = getDefaultDisplayInfoLocked();
- mPolicy.getNonDecorInsetsLw(di.rotation, di.logicalWidth, di.logicalHeight, outInsets);
- }
-
- /**
- * Intersects the specified {@code inOutBounds} with the display frame that excludes the stable
- * inset areas.
- *
- * @param inOutBounds The inOutBounds to subtract the stable inset areas from.
- */
- public void subtractStableInsets(Rect inOutBounds) {
- synchronized (mWindowMap) {
- getStableInsetsLocked(DEFAULT_DISPLAY, mTmpRect2);
- final DisplayInfo di = getDefaultDisplayInfoLocked();
- mTmpRect.set(0, 0, di.logicalWidth, di.logicalHeight);
- subtractInsets(mTmpRect, mTmpRect2, inOutBounds);
- }
- }
-
- /**
- * Intersects the specified {@code inOutBounds} with the display frame that excludes
- * areas that could never be removed in Honeycomb. See
- * {@link WindowManagerPolicy#getNonDecorInsetsLw}.
- *
- * @param inOutBounds The inOutBounds to subtract the inset areas from.
- */
- public void subtractNonDecorInsets(Rect inOutBounds) {
- synchronized (mWindowMap) {
- getNonDecorInsetsLocked(mTmpRect2);
- final DisplayInfo di = getDefaultDisplayInfoLocked();
- mTmpRect.set(0, 0, di.logicalWidth, di.logicalHeight);
- subtractInsets(mTmpRect, mTmpRect2, inOutBounds);
- }
- }
-
- void subtractInsets(Rect display, Rect insets, Rect inOutBounds) {
+ void intersectDisplayInsetBounds(Rect display, Rect insets, Rect inOutBounds) {
mTmpRect3.set(display);
mTmpRect3.inset(insets);
inOutBounds.intersect(mTmpRect3);
}
- /**
- * Calculates the smallest width for a task given the {@param bounds}. It does that by iterating
- * across all screen orientations, and returns the minimum of the task width taking into account
- * that the bounds might change because the snap algorithm snaps to a different value.
- *
- * @return the smallest width to be used in the Configuration, in dips
- */
- public int getSmallestWidthForTaskBounds(Rect bounds) {
- synchronized (mWindowMap) {
- // TODO(multi-display): Use correct display content here
- return getDefaultDisplayContentLocked().getDockedDividerController()
- .getSmallestWidthDpForBounds(bounds);
- }
- }
-
MousePositionTracker mMousePositionTracker = new MousePositionTracker();
private static class MousePositionTracker implements PointerEventListener {
@@ -7914,13 +7818,30 @@
}
@Override
- public void updateInputMethodWindowStatus(IBinder imeToken, boolean imeWindowVisible,
- IBinder targetWindowToken) {
- // TODO (b/34628091): Use this method to address the window animation issue.
- if (DEBUG_INPUT_METHOD) {
- Slog.w(TAG_WM, "updateInputMethodWindowStatus: imeToken=" + imeToken
- + " imeWindowVisible=" + imeWindowVisible
- + " targetWindowToken=" + targetWindowToken);
+ public void updateInputMethodWindowStatus(@NonNull IBinder imeToken,
+ boolean imeWindowVisible, @Nullable IBinder targetWindowToken) {
+ synchronized (mWindowMap) {
+ final WindowState newTargetWin = getWindow(targetWindowToken);
+ final WindowState currentTargetWin = getWindow(mInputMethodTargetCandidate);
+
+ if (DEBUG_INPUT_METHOD) Slog.w(TAG_WM, "updateInputMethodWindowStatus: imeToken="
+ + imeToken + " imeWindowVisible=" + imeWindowVisible
+ + " targetWindowToken=" + targetWindowToken
+ + " newTargetWin=" + newTargetWin
+ + " currentTargetWin=" + currentTargetWin);
+
+ if (newTargetWin == currentTargetWin) {
+ return;
+ }
+
+ final DisplayContent dc = newTargetWin != null
+ ? newTargetWin.getDisplayContent() : currentTargetWin.getDisplayContent();
+
+ // It is possible the window for the target candidate isn't added yet, so we
+ // remember the token instead and use it to look-up the window each time we compute
+ // the ime target.
+ mInputMethodTargetCandidate = targetWindowToken;
+ dc.computeImeTarget(true /* updateImeTarget */);
}
}
@@ -7966,6 +7887,10 @@
}
}
+ WindowState getWindow(IBinder binder) {
+ return binder == null ? null : mWindowMap.get(binder);
+ }
+
void registerAppFreezeListener(AppFreezeListener listener) {
if (!mAppFreezeListeners.contains(listener)) {
mAppFreezeListeners.add(listener);
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 65e1f84..945a349 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -40,6 +40,7 @@
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
import static android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
+import static android.view.WindowManager.LayoutParams.FORMAT_CHANGED;
import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.MATCH_PARENT;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
@@ -56,6 +57,10 @@
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
+import static android.view.WindowManagerGlobal.RELAYOUT_RES_DRAG_RESIZING_DOCKED;
+import static android.view.WindowManagerGlobal.RELAYOUT_RES_DRAG_RESIZING_FREEFORM;
+import static android.view.WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME;
+import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED;
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
import static android.view.WindowManagerPolicy.TRANSIT_ENTER;
import static android.view.WindowManagerPolicy.TRANSIT_EXIT;
@@ -540,6 +545,12 @@
private static final Region sEmptyRegion = new Region();
/**
+ * Surface insets from the previous call to relayout(), used to track
+ * if we are changing the Surface insets.
+ */
+ final Rect mLastSurfaceInsets = new Rect();
+
+ /**
* Compares two window sub-layers and returns -1 if the first is lesser than the second in terms
* of z-order and 1 otherwise.
*/
@@ -665,7 +676,7 @@
void attach() {
if (localLOGV) Slog.v(TAG, "Attaching " + this + " token=" + mToken);
- mSession.windowAddedLocked(mAttrs.type);
+ mSession.windowAddedLocked(mAttrs.packageName);
}
@Override
@@ -1581,7 +1592,7 @@
// Anyway we don't need to synchronize position and content updates for these
// windows since they aren't at the base layer and could be moved around anyway.
if (!computeDragResizing() && mAttrs.type == TYPE_BASE_APPLICATION &&
- !getTask().mStack.getBoundsAnimating() && !isGoneForLayoutLw() &&
+ !mWinAnimator.isForceScaled() && !isGoneForLayoutLw() &&
!getTask().inPinnedWorkspace()) {
setResizedWhileNotDragResizing(true);
}
@@ -1738,7 +1749,7 @@
mWinAnimator.destroyDeferredSurfaceLocked();
mWinAnimator.destroySurfaceLocked();
- mSession.windowRemovedLocked(mAttrs.type);
+ mSession.windowRemovedLocked();
try {
mClient.asBinder().unlinkToDeath(mDeathRecipient, 0);
} catch (RuntimeException e) {
@@ -3027,6 +3038,7 @@
final Rect outsets = mLastOutsets;
final boolean reportDraw = mWinAnimator.mDrawState == DRAW_PENDING;
final boolean reportOrientation = mReportOrientationChanged;
+ final int displayId = getDisplayId();
if (mAttrs.type != WindowManager.LayoutParams.TYPE_APPLICATION_STARTING
&& mClient instanceof IWindow.Stub) {
// To prevent deadlock simulate one-way call if win.mClient is a local object.
@@ -3036,7 +3048,7 @@
try {
dispatchResized(frame, overscanInsets, contentInsets, visibleInsets,
stableInsets, outsets, reportDraw, newConfig,
- reportOrientation);
+ reportOrientation, displayId);
} catch (RemoteException e) {
// Not a remote call, RemoteException won't be raised.
}
@@ -3044,7 +3056,7 @@
});
} else {
dispatchResized(frame, overscanInsets, contentInsets, visibleInsets, stableInsets,
- outsets, reportDraw, newConfig, reportOrientation);
+ outsets, reportDraw, newConfig, reportOrientation, displayId);
}
//TODO (multidisplay): Accessibility supported only for the default display.
@@ -3101,13 +3113,14 @@
private void dispatchResized(Rect frame, Rect overscanInsets, Rect contentInsets,
Rect visibleInsets, Rect stableInsets, Rect outsets, boolean reportDraw,
- Configuration newConfig, boolean reportOrientation) throws RemoteException {
+ Configuration newConfig, boolean reportOrientation, int displayId)
+ throws RemoteException {
final boolean forceRelayout = isDragResizeChanged() || mResizedWhileNotDragResizing
|| reportOrientation;
mClient.resized(frame, overscanInsets, contentInsets, visibleInsets, stableInsets, outsets,
reportDraw, newConfig, getBackdropFrame(frame),
- forceRelayout, mPolicy.isNavBarForcedShownLw(this));
+ forceRelayout, mPolicy.isNavBarForcedShownLw(this), displayId);
mDragResizingChangeReported = true;
}
@@ -3876,7 +3889,7 @@
}
private boolean forAllWindowBottomToTop(ToBooleanFunction<WindowState> callback) {
- // We want to consumer the negative sublayer children first because they need to appear
+ // We want to consume the negative sublayer children first because they need to appear
// below the parent, then this window (the parent), and then the positive sublayer children
// because they need to appear above the parent.
int i = 0;
@@ -3884,7 +3897,7 @@
WindowState child = mChildren.get(i);
while (i < count && child.mSubLayer < 0) {
- if (callback.apply(child)) {
+ if (child.applyInOrderWithImeWindows(callback, false /* traverseTopToBottom */)) {
return true;
}
i++;
@@ -3899,7 +3912,7 @@
}
while (i < count) {
- if (callback.apply(child)) {
+ if (child.applyInOrderWithImeWindows(callback, false /* traverseTopToBottom */)) {
return true;
}
i++;
@@ -3913,14 +3926,14 @@
}
private boolean forAllWindowTopToBottom(ToBooleanFunction<WindowState> callback) {
- // We want to consumer the positive sublayer children first because they need to appear
+ // We want to consume the positive sublayer children first because they need to appear
// above the parent, then this window (the parent), and then the negative sublayer children
// because they need to appear above the parent.
int i = mChildren.size() - 1;
WindowState child = mChildren.get(i);
while (i >= 0 && child.mSubLayer >= 0) {
- if (callback.apply(child)) {
+ if (child.applyInOrderWithImeWindows(callback, true /* traverseTopToBottom */)) {
return true;
}
--i;
@@ -3935,7 +3948,7 @@
}
while (i >= 0) {
- if (callback.apply(child)) {
+ if (child.applyInOrderWithImeWindows(callback, true /* traverseTopToBottom */)) {
return true;
}
--i;
@@ -3978,10 +3991,43 @@
}
WindowState getWindow(Predicate<WindowState> callback) {
+ if (mChildren.isEmpty()) {
+ return callback.test(this) ? this : null;
+ }
+
+ // We want to consume the positive sublayer children first because they need to appear
+ // above the parent, then this window (the parent), and then the negative sublayer children
+ // because they need to appear above the parent.
+ int i = mChildren.size() - 1;
+ WindowState child = mChildren.get(i);
+
+ while (i >= 0 && child.mSubLayer >= 0) {
+ if (callback.test(child)) {
+ return child;
+ }
+ --i;
+ if (i < 0) {
+ break;
+ }
+ child = mChildren.get(i);
+ }
+
if (callback.test(this)) {
return this;
}
- return super.getWindow(callback);
+
+ while (i >= 0) {
+ if (callback.test(child)) {
+ return child;
+ }
+ --i;
+ if (i < 0) {
+ break;
+ }
+ child = mChildren.get(i);
+ }
+
+ return null;
}
boolean isWindowAnimationSet() {
@@ -4296,6 +4342,78 @@
-mAttrs.surfaceInsets.bottom);
}
+ boolean surfaceInsetsChanging() {
+ return !mLastSurfaceInsets.equals(mAttrs.surfaceInsets);
+ }
+
+ int relayoutVisibleWindow(Configuration outConfig, int result,
+ int attrChanges, int oldVisibility) {
+ result |= !isVisibleLw() ? RELAYOUT_RES_FIRST_TIME : 0;
+ if (mAnimatingExit) {
+ Slog.d(TAG, "relayoutVisibleWindow: " + this + " mAnimatingExit=true, mRemoveOnExit="
+ + mRemoveOnExit + ", mDestroying=" + mDestroying);
+
+ mWinAnimator.cancelExitAnimationForNextAnimationLocked();
+ mAnimatingExit = false;
+ }
+ if (mDestroying) {
+ mDestroying = false;
+ mService.mDestroySurface.remove(this);
+ }
+ if (oldVisibility == View.GONE) {
+ mWinAnimator.mEnterAnimationPending = true;
+ }
+
+ mLastVisibleLayoutRotation = mService.mRotation;
+
+ mWinAnimator.mEnteringAnimation = true;
+ if ((result & RELAYOUT_RES_FIRST_TIME) != 0) {
+ prepareWindowToDisplayDuringRelayout(outConfig);
+ }
+ if ((attrChanges & FORMAT_CHANGED) != 0) {
+ // If the format can't be changed in place, preserve the old surface until the app draws
+ // on the new one. This prevents blinking when we change elevation of freeform and
+ // pinned windows.
+ if (!mWinAnimator.tryChangeFormatInPlaceLocked()) {
+ mWinAnimator.preserveSurfaceLocked();
+ result |= RELAYOUT_RES_SURFACE_CHANGED
+ | RELAYOUT_RES_FIRST_TIME;
+ }
+ }
+
+ // When we change the Surface size, in scenarios which may require changing
+ // the surface position in sync with the resize, we use a preserved surface
+ // so we can freeze it while waiting for the client to report draw on the newly
+ // sized surface.
+ if (isDragResizeChanged() || isResizedWhileNotDragResizing()
+ || surfaceInsetsChanging()) {
+ mLastSurfaceInsets.set(mAttrs.surfaceInsets);
+
+ setDragResizing();
+ setResizedWhileNotDragResizing(false);
+ // We can only change top level windows to the full-screen surface when
+ // resizing (as we only have one full-screen surface). So there is no need
+ // to preserve and destroy windows which are attached to another, they
+ // will keep their surface and its size may change over time.
+ if (mHasSurface && !isChildWindow()) {
+ mWinAnimator.preserveSurfaceLocked();
+ result |= RELAYOUT_RES_FIRST_TIME;
+ }
+ }
+ final boolean freeformResizing = isDragResizing()
+ && getResizeMode() == DRAG_RESIZE_MODE_FREEFORM;
+ final boolean dockedResizing = isDragResizing()
+ && getResizeMode() == DRAG_RESIZE_MODE_DOCKED_DIVIDER;
+ result |= freeformResizing ? RELAYOUT_RES_DRAG_RESIZING_FREEFORM : 0;
+ result |= dockedResizing ? RELAYOUT_RES_DRAG_RESIZING_DOCKED : 0;
+ if (isAnimatingWithSavedSurface()) {
+ // If we're animating with a saved surface now, request client to report draw.
+ // We still need to know when the real thing is drawn.
+ result |= RELAYOUT_RES_FIRST_TIME;
+ }
+ return result;
+ }
+
// TODO: Hack to work around the number of states AppWindowToken needs to access without having
// access to its windows children. Need to investigate re-writing
// {@link AppWindowToken#updateReportedVisibilityLocked} so this can be removed.
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index d2ea64c8..98598e1 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -172,7 +172,7 @@
private boolean mAnimateMove = false;
float mDsDx=1, mDtDx=0, mDsDy=0, mDtDy=1;
- float mLastDsDx=1, mLastDtDx=0, mLastDsDy=0, mLastDtDy=1;
+ private float mLastDsDx=1, mLastDtDx=0, mLastDsDy=0, mLastDtDy=1;
boolean mHaveMatrix;
@@ -945,8 +945,8 @@
tmpMatrix.getValues(tmpFloats);
mDsDx = tmpFloats[Matrix.MSCALE_X];
mDtDx = tmpFloats[Matrix.MSKEW_Y];
- mDsDy = tmpFloats[Matrix.MSKEW_X];
- mDtDy = tmpFloats[Matrix.MSCALE_Y];
+ mDtDy = tmpFloats[Matrix.MSKEW_X];
+ mDsDy = tmpFloats[Matrix.MSCALE_Y];
float x = tmpFloats[Matrix.MTRANS_X];
float y = tmpFloats[Matrix.MTRANS_Y];
mWin.mShownPosition.set(Math.round(x), Math.round(y));
@@ -959,7 +959,7 @@
mShownAlpha = mAlpha;
if (!mService.mLimitedAlphaCompositing
|| (!PixelFormat.formatHasAlpha(mWin.mAttrs.format)
- || (mWin.isIdentityMatrix(mDsDx, mDtDx, mDsDy, mDtDy)
+ || (mWin.isIdentityMatrix(mDsDx, mDtDx, mDtDy, mDsDy)
&& x == frame.left && y == frame.top))) {
//Slog.i(TAG_WM, "Applying alpha transform");
if (selfTransformation) {
@@ -1038,8 +1038,8 @@
mHaveMatrix = true;
mDsDx = tmpFloats[Matrix.MSCALE_X];
mDtDx = tmpFloats[Matrix.MSKEW_Y];
- mDsDy = tmpFloats[Matrix.MSKEW_X];
- mDtDy = tmpFloats[Matrix.MSCALE_Y];
+ mDtDy = tmpFloats[Matrix.MSKEW_X];
+ mDsDy = tmpFloats[Matrix.MSCALE_Y];
float x = tmpFloats[Matrix.MTRANS_X];
float y = tmpFloats[Matrix.MTRANS_Y];
mWin.mShownPosition.set(Math.round(x), Math.round(y));
@@ -1054,8 +1054,8 @@
mHaveMatrix = false;
mDsDx = mWin.mGlobalScale;
mDtDx = 0;
- mDsDy = 0;
- mDtDy = mWin.mGlobalScale;
+ mDtDy = 0;
+ mDsDy = mWin.mGlobalScale;
}
}
@@ -1318,7 +1318,7 @@
float surfaceWidth = mSurfaceController.getWidth();
float surfaceHeight = mSurfaceController.getHeight();
- if ((task != null && task.mStack.getForceScaleToStack()) || mForceScaleUntilResize) {
+ if (isForceScaled()) {
int hInsets = w.getAttrs().surfaceInsets.left + w.getAttrs().surfaceInsets.right;
int vInsets = w.getAttrs().surfaceInsets.top + w.getAttrs().surfaceInsets.bottom;
if (!mForceScaleUntilResize) {
@@ -1328,8 +1328,8 @@
task.mStack.getDimBounds(mTmpStackBounds);
// We want to calculate the scaling based on the content area, not based on
// the entire surface, so that we scale in sync with windows that don't have insets.
- mExtraHScale = (mTmpStackBounds.width() - hInsets) / (float)(surfaceWidth - hInsets);
- mExtraVScale = (mTmpStackBounds.height() - vInsets) / (float)(surfaceHeight - vInsets);
+ mExtraHScale = mTmpStackBounds.width() / (float)(surfaceWidth - hInsets);
+ mExtraVScale = mTmpStackBounds.height() / (float)(surfaceHeight - vInsets);
// In the case of ForceScaleToStack we scale entire tasks together,
// and so we need to scale our offsets relative to the task bounds
@@ -1353,6 +1353,7 @@
// expose the whole window in buffer space, and not risk extending
// past where the system would have cropped us
clipRect = null;
+ finalClipRect = null;
// Various surfaces in the scaled stack may resize at different times.
// We need to ensure for each surface, that we disable transformation matrix
@@ -1383,8 +1384,8 @@
applyCrop(clipRect, finalClipRect, recoveringMemory);
mSurfaceController.setMatrixInTransaction(mDsDx * w.mHScale * mExtraHScale,
mDtDx * w.mVScale * mExtraVScale,
- mDsDy * w.mHScale * mExtraHScale,
- mDtDy * w.mVScale * mExtraVScale, recoveringMemory);
+ mDtDy * w.mHScale * mExtraHScale,
+ mDsDy * w.mVScale * mExtraVScale, recoveringMemory);
}
if (mSurfaceResized) {
@@ -1466,15 +1467,15 @@
"alpha=" + mShownAlpha + " layer=" + mAnimLayer
+ " matrix=[" + mDsDx + "*" + w.mHScale
+ "," + mDtDx + "*" + w.mVScale
- + "][" + mDsDy + "*" + w.mHScale
- + "," + mDtDy + "*" + w.mVScale + "]", false);
+ + "][" + mDtDy + "*" + w.mHScale
+ + "," + mDsDy + "*" + w.mVScale + "]", false);
boolean prepared =
mSurfaceController.prepareToShowInTransaction(mShownAlpha, mAnimLayer,
mDsDx * w.mHScale * mExtraHScale,
mDtDx * w.mVScale * mExtraVScale,
- mDsDy * w.mHScale * mExtraHScale,
- mDtDy * w.mVScale * mExtraVScale,
+ mDtDy * w.mHScale * mExtraHScale,
+ mDsDy * w.mVScale * mExtraVScale,
recoveringMemory);
if (prepared && mLastHidden && mDrawState == HAS_DRAWN) {
@@ -1776,8 +1777,8 @@
pw.print(prefix); pw.print("mGlobalScale="); pw.print(mWin.mGlobalScale);
pw.print(" mDsDx="); pw.print(mDsDx);
pw.print(" mDtDx="); pw.print(mDtDx);
- pw.print(" mDsDy="); pw.print(mDsDy);
- pw.print(" mDtDy="); pw.println(mDtDy);
+ pw.print(" mDtDy="); pw.print(mDtDy);
+ pw.print(" mDsDy="); pw.println(mDsDy);
}
if (mAnimationStartDelayed) {
pw.print(prefix); pw.print("mAnimationStartDelayed="); pw.print(mAnimationStartDelayed);
@@ -1925,15 +1926,15 @@
float DsDx = mService.mTmpFloats[Matrix.MSCALE_X];
float DtDx = mService.mTmpFloats[Matrix.MSKEW_Y];
- float DsDy = mService.mTmpFloats[Matrix.MSKEW_X];
- float DtDy = mService.mTmpFloats[Matrix.MSCALE_Y];
+ float DtDy = mService.mTmpFloats[Matrix.MSKEW_X];
+ float DsDy = mService.mTmpFloats[Matrix.MSCALE_Y];
float nx = mService.mTmpFloats[Matrix.MTRANS_X];
float ny = mService.mTmpFloats[Matrix.MTRANS_Y];
mSurfaceController.setPositionInTransaction(nx, ny, false);
mSurfaceController.setMatrixInTransaction(DsDx * w.mHScale,
DtDx * w.mVScale,
- DsDy * w.mHScale,
- DtDy * w.mVScale, false);
+ DtDy * w.mHScale,
+ DsDy * w.mVScale, false);
}
}
@@ -1952,4 +1953,16 @@
}
}
}
+
+ /** The force-scaled state for a given window can persist past
+ * the state for it's stack as the windows complete resizing
+ * independently of one another.
+ */
+ boolean isForceScaled() {
+ final Task task = mWin.getTask();
+ if (task != null && task.mStack.isForceScaled()) {
+ return true;
+ }
+ return mForceScaleUntilResize;
+ }
}
diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java
index 1096ede..f8e7428 100644
--- a/services/core/java/com/android/server/wm/WindowSurfaceController.java
+++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java
@@ -52,6 +52,7 @@
private SurfaceControl mSurfaceControl;
+ // Should only be set from within setShown().
private boolean mSurfaceShown = false;
private float mSurfaceX = 0;
private float mSurfaceY = 0;
@@ -79,6 +80,9 @@
private final WindowManagerService mService;
+ private final int mWindowType;
+ private final Session mWindowSession;
+
public WindowSurfaceController(SurfaceSession s, String name, int w, int h, int format,
int flags, WindowStateAnimator animator, int windowType, int ownerUid) {
mAnimator = animator;
@@ -89,16 +93,16 @@
title = name;
mService = animator.mService;
+ final WindowState win = animator.mWin;
+ mWindowType = windowType;
+ mWindowSession = win.mSession;
- // For opaque child windows placed under parent windows,
- // we use a special SurfaceControl which mirrors commands
- // to a black-out layer placed one Z-layer below the surface.
+ // For opaque child windows placed under parent windows, we use a special SurfaceControl
+ // which mirrors commands to a black-out layer placed one Z-layer below the surface.
// This prevents holes to whatever app/wallpaper is underneath.
- if (animator.mWin.isChildWindow() &&
- animator.mWin.mSubLayer < 0 &&
- animator.mWin.mAppToken != null) {
- mSurfaceControl = new SurfaceControlWithBackground(s,
- name, w, h, format, flags, animator.mWin.mAppToken, windowType, ownerUid);
+ if (win.isChildWindow() && win.mSubLayer < 0 && win.mAppToken != null) {
+ mSurfaceControl = new SurfaceControlWithBackground(
+ s, name, w, h, format, flags, win.mAppToken, windowType, ownerUid);
} else if (DEBUG_SURFACE_TRACE) {
mSurfaceControl = new SurfaceTrace(
s, name, w, h, format, flags, windowType, ownerUid);
@@ -109,8 +113,7 @@
if (mService.mRoot.mSurfaceTraceEnabled) {
mSurfaceControl = new RemoteSurfaceTrace(
- mService.mRoot.mSurfaceTraceFd.getFileDescriptor(),
- mSurfaceControl, animator.mWin);
+ mService.mRoot.mSurfaceTraceFd.getFileDescriptor(), mSurfaceControl, win);
}
}
@@ -141,13 +144,14 @@
}
private void hideSurface() {
- if (mSurfaceControl != null) {
- mSurfaceShown = false;
- try {
- mSurfaceControl.hide();
- } catch (RuntimeException e) {
- Slog.w(TAG, "Exception hiding surface in " + this);
- }
+ if (mSurfaceControl == null) {
+ return;
+ }
+ setShown(false);
+ try {
+ mSurfaceControl.hide();
+ } catch (RuntimeException e) {
+ Slog.w(TAG, "Exception hiding surface in " + this);
}
}
@@ -165,7 +169,7 @@
mSurfaceControl.setLayer(layer);
mSurfaceControl.setAlpha(0);
- mSurfaceShown = false;
+ setShown(false);
} catch (RuntimeException e) {
Slog.w(TAG, "Error creating surface in " + this, e);
mAnimator.reclaimSomeSurfaceMemory("create-init", true);
@@ -188,7 +192,7 @@
} catch (RuntimeException e) {
Slog.w(TAG, "Error destroying surface in: " + this, e);
} finally {
- mSurfaceShown = false;
+ setShown(false);
mSurfaceControl = null;
}
}
@@ -447,7 +451,7 @@
private boolean showSurface() {
try {
- mSurfaceShown = true;
+ setShown(true);
mSurfaceControl.show();
return true;
} catch (RuntimeException e) {
@@ -515,6 +519,10 @@
void setShown(boolean surfaceShown) {
mSurfaceShown = surfaceShown;
+
+ if (mWindowSession != null) {
+ mWindowSession.onWindowSurfaceVisibilityChanged(this, mSurfaceShown, mWindowType);
+ }
}
float getX() {
diff --git a/services/core/jni/Android.mk b/services/core/jni/Android.mk
index eab5d8a..ac95db5 100644
--- a/services/core/jni/Android.mk
+++ b/services/core/jni/Android.mk
@@ -19,6 +19,7 @@
$(LOCAL_REL_DIR)/com_android_server_location_GnssLocationProvider.cpp \
$(LOCAL_REL_DIR)/com_android_server_power_PowerManagerService.cpp \
$(LOCAL_REL_DIR)/com_android_server_SerialService.cpp \
+ $(LOCAL_REL_DIR)/com_android_server_SyntheticPasswordManager.cpp \
$(LOCAL_REL_DIR)/com_android_server_storage_AppFuseBridge.cpp \
$(LOCAL_REL_DIR)/com_android_server_SystemServer.cpp \
$(LOCAL_REL_DIR)/com_android_server_tv_TvUinputBridge.cpp \
@@ -29,16 +30,18 @@
$(LOCAL_REL_DIR)/com_android_server_UsbHostManager.cpp \
$(LOCAL_REL_DIR)/com_android_server_VibratorService.cpp \
$(LOCAL_REL_DIR)/com_android_server_PersistentDataBlockService.cpp \
+ $(LOCAL_REL_DIR)/com_android_server_GraphicsStatsService.cpp \
$(LOCAL_REL_DIR)/onload.cpp
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE) \
+ external/scrypt/lib/crypto \
frameworks/base/services \
frameworks/base/libs \
- frameworks/base/libs/hwui \
frameworks/base/core/jni \
frameworks/native/services \
system/core/libappfuse/include \
+ system/gatekeeper/include \
system/security/keystore/include \
$(call include-path-for, libhardware)/hardware \
$(call include-path-for, libhardware_legacy)/hardware_legacy \
@@ -50,6 +53,7 @@
libappfuse \
libbinder \
libcutils \
+ libcrypto \
liblog \
libhardware \
libhardware_legacy \
@@ -72,6 +76,7 @@
libhidltransport \
libhwbinder \
libutils \
+ libhwui \
android.hardware.audio.common@2.0 \
android.hardware.contexthub@1.0 \
android.hardware.gnss@1.0 \
@@ -83,3 +88,5 @@
android.hardware.tv.input@1.0 \
android.hardware.vibrator@1.0 \
android.hardware.vr@1.0 \
+
+LOCAL_STATIC_LIBRARIES += libscrypt_static
\ No newline at end of file
diff --git a/services/core/jni/com_android_server_GraphicsStatsService.cpp b/services/core/jni/com_android_server_GraphicsStatsService.cpp
new file mode 100644
index 0000000..5d5728d
--- /dev/null
+++ b/services/core/jni/com_android_server_GraphicsStatsService.cpp
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "GraphicsStatsService"
+
+#include <jni.h>
+#include <log/log.h>
+#include <nativehelper/JNIHelp.h>
+#include <ScopedPrimitiveArray.h>
+#include <ScopedUtfChars.h>
+#include <JankTracker.h>
+#include <service/GraphicsStatsService.h>
+
+namespace android {
+
+using namespace android::uirenderer;
+
+static jint getAshmemSize(JNIEnv*, jobject) {
+ return sizeof(ProfileData);
+}
+
+static jlong createDump(JNIEnv*, jobject, jint fd, jboolean isProto) {
+ GraphicsStatsService::Dump* dump = GraphicsStatsService::createDump(fd, isProto
+ ? GraphicsStatsService::DumpType::Protobuf : GraphicsStatsService::DumpType::Text);
+ return reinterpret_cast<jlong>(dump);
+}
+
+static void addToDump(JNIEnv* env, jobject, jlong dumpPtr, jstring jpath, jstring jpackage,
+ jint versionCode, jlong startTime, jlong endTime, jbyteArray jdata) {
+ std::string path;
+ const ProfileData* data = nullptr;
+ LOG_ALWAYS_FATAL_IF(jdata == nullptr && jpath == nullptr, "Path and data can't both be null");
+ if (jdata != nullptr) {
+ ScopedByteArrayRO buffer(env, jdata);
+ LOG_ALWAYS_FATAL_IF(buffer.size() != sizeof(ProfileData),
+ "Buffer size %zu doesn't match expected %zu!", buffer.size(), sizeof(ProfileData));
+ data = reinterpret_cast<const ProfileData*>(buffer.get());
+ }
+ if (jpath != nullptr) {
+ ScopedUtfChars pathChars(env, jpath);
+ LOG_ALWAYS_FATAL_IF(pathChars.size() <= 0 || !pathChars.c_str(), "Failed to get path chars");
+ path.assign(pathChars.c_str(), pathChars.size());
+ }
+ ScopedUtfChars packageChars(env, jpackage);
+ LOG_ALWAYS_FATAL_IF(packageChars.size() <= 0 || !packageChars.c_str(), "Failed to get path chars");
+ GraphicsStatsService::Dump* dump = reinterpret_cast<GraphicsStatsService::Dump*>(dumpPtr);
+ LOG_ALWAYS_FATAL_IF(!dump, "null passed for dump pointer");
+
+ const std::string package(packageChars.c_str(), packageChars.size());
+ GraphicsStatsService::addToDump(dump, path, package, versionCode, startTime, endTime, data);
+}
+
+static void addFileToDump(JNIEnv* env, jobject, jlong dumpPtr, jstring jpath) {
+ ScopedUtfChars pathChars(env, jpath);
+ LOG_ALWAYS_FATAL_IF(pathChars.size() <= 0 || !pathChars.c_str(), "Failed to get path chars");
+ const std::string path(pathChars.c_str(), pathChars.size());
+ GraphicsStatsService::Dump* dump = reinterpret_cast<GraphicsStatsService::Dump*>(dumpPtr);
+ GraphicsStatsService::addToDump(dump, path);
+}
+
+static void finishDump(JNIEnv*, jobject, jlong dumpPtr) {
+ GraphicsStatsService::Dump* dump = reinterpret_cast<GraphicsStatsService::Dump*>(dumpPtr);
+ GraphicsStatsService::finishDump(dump);
+}
+
+static void saveBuffer(JNIEnv* env, jobject clazz, jstring jpath, jstring jpackage,
+ jint versionCode, jlong startTime, jlong endTime, jbyteArray jdata) {
+ ScopedByteArrayRO buffer(env, jdata);
+ LOG_ALWAYS_FATAL_IF(buffer.size() != sizeof(ProfileData),
+ "Buffer size %zu doesn't match expected %zu!", buffer.size(), sizeof(ProfileData));
+ ScopedUtfChars pathChars(env, jpath);
+ LOG_ALWAYS_FATAL_IF(pathChars.size() <= 0 || !pathChars.c_str(), "Failed to get path chars");
+ ScopedUtfChars packageChars(env, jpackage);
+ LOG_ALWAYS_FATAL_IF(packageChars.size() <= 0 || !packageChars.c_str(), "Failed to get path chars");
+
+ const std::string path(pathChars.c_str(), pathChars.size());
+ const std::string package(packageChars.c_str(), packageChars.size());
+ const ProfileData* data = reinterpret_cast<const ProfileData*>(buffer.get());
+ GraphicsStatsService::saveBuffer(path, package, versionCode, startTime, endTime, data);
+}
+
+static const JNINativeMethod sMethods[] = {
+ { "nGetAshmemSize", "()I", (void*) getAshmemSize },
+ { "nCreateDump", "(IZ)J", (void*) createDump },
+ { "nAddToDump", "(JLjava/lang/String;Ljava/lang/String;IJJ[B)V", (void*) addToDump },
+ { "nAddToDump", "(JLjava/lang/String;)V", (void*) addFileToDump },
+ { "nFinishDump", "(J)V", (void*) finishDump },
+ { "nSaveBuffer", "(Ljava/lang/String;Ljava/lang/String;IJJ[B)V", (void*) saveBuffer },
+};
+
+int register_android_server_GraphicsStatsService(JNIEnv* env)
+{
+ return jniRegisterNativeMethods(env, "com/android/server/GraphicsStatsService",
+ sMethods, NELEM(sMethods));
+}
+
+} // namespace android
\ No newline at end of file
diff --git a/services/core/jni/com_android_server_SyntheticPasswordManager.cpp b/services/core/jni/com_android_server_SyntheticPasswordManager.cpp
new file mode 100644
index 0000000..a9f7b9f
--- /dev/null
+++ b/services/core/jni/com_android_server_SyntheticPasswordManager.cpp
@@ -0,0 +1,90 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "SyntheticPasswordManager"
+
+#include "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>
+#include <gatekeeper/password_handle.h>
+
+
+extern "C" {
+#include "crypto_scrypt.h"
+}
+
+namespace android {
+
+static jlong android_server_SyntheticPasswordManager_nativeSidFromPasswordHandle(JNIEnv* env, jobject, jbyteArray handleArray) {
+
+ jbyte* data = (jbyte*)env->GetPrimitiveArrayCritical(handleArray, NULL);
+
+ if (data != NULL) {
+ const gatekeeper::password_handle_t *handle =
+ reinterpret_cast<const gatekeeper::password_handle_t *>(data);
+ jlong sid = handle->user_id;
+ env->ReleasePrimitiveArrayCritical(handleArray, data, JNI_ABORT);
+ return sid;
+ } else {
+ return 0;
+ }
+}
+
+static jbyteArray android_server_SyntheticPasswordManager_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 */
+ {"nativeSidFromPasswordHandle", "([B)J", (void*)android_server_SyntheticPasswordManager_nativeSidFromPasswordHandle},
+ {"nativeScrypt", "([B[BIIII)[B", (void*)android_server_SyntheticPasswordManager_nativeScrypt},
+};
+
+int register_android_server_SyntheticPasswordManager(JNIEnv* env) {
+ return jniRegisterNativeMethods(env, "com/android/server/SyntheticPasswordManager",
+ sMethods, NELEM(sMethods));
+}
+
+} /* namespace android */
diff --git a/services/core/jni/com_android_server_hdmi_HdmiCecController.cpp b/services/core/jni/com_android_server_hdmi_HdmiCecController.cpp
index 7790d15..4df7256 100644
--- a/services/core/jni/com_android_server_hdmi_HdmiCecController.cpp
+++ b/services/core/jni/com_android_server_hdmi_HdmiCecController.cpp
@@ -336,7 +336,7 @@
static jlong nativeInit(JNIEnv* env, jclass clazz, jobject callbacksObj,
jobject messageQueueObj) {
// TODO(b/31632518)
- sp<IHdmiCec> hdmiCec = IHdmiCec::getService("tv.cec");
+ sp<IHdmiCec> hdmiCec = IHdmiCec::getService();
if (hdmiCec == nullptr) {
ALOGE("Couldn't get tv.cec service.");
return 0;
diff --git a/services/core/jni/com_android_server_location_ContextHubService.cpp b/services/core/jni/com_android_server_location_ContextHubService.cpp
index 05ef0d1..27d2b6d 100644
--- a/services/core/jni/com_android_server_location_ContextHubService.cpp
+++ b/services/core/jni/com_android_server_location_ContextHubService.cpp
@@ -558,7 +558,7 @@
void initContextHubService() {
db.hubInfo.numHubs = 0;
- db.hubInfo.contextHub = IContexthub::getService("context_hub");
+ db.hubInfo.contextHub = IContexthub::getService();
if (db.hubInfo.contextHub == nullptr) {
ALOGE("Could not load context hub hal");
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index 1578562..20b70a6 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -289,6 +289,40 @@
return env;
}
+static jobject translateLocation(JNIEnv* env, const hardware::gnss::V1_0::GnssLocation& location) {
+ JavaObject object(env, "android/location/Location", "gps");
+
+ uint16_t flags = static_cast<uint32_t>(location.gnssLocationFlags);
+ if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_LAT_LONG) {
+ SET(Latitude, location.latitudeDegrees);
+ SET(Longitude, location.longitudeDegrees);
+ }
+ if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_ALTITUDE) {
+ SET(Altitude, location.altitudeMeters);
+ }
+ if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_SPEED) {
+ SET(Speed, location.speedMetersPerSec);
+ }
+ if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_BEARING) {
+ SET(Bearing, location.bearingDegrees);
+ }
+ if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_HORIZONTAL_ACCURACY) {
+ SET(Accuracy, location.horizontalAccuracyMeters);
+ }
+ if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_VERTICAL_ACCURACY) {
+ SET(VerticalAccuracyMeters, location.verticalAccuracyMeters);
+ }
+ if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_SPEED_ACCURACY) {
+ SET(SpeedAccuracyMetersPerSecond, location.speedAccuracyMetersPerSecond);
+ }
+ if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_BEARING_ACCURACY) {
+ SET(BearingAccuracyDegrees, location.bearingAccuracyDegrees);
+ }
+ SET(Time, location.timestamp);
+
+ return object.get();
+}
+
/*
* GnssCallback class implements the callback methods for IGnss interface.
*/
@@ -321,19 +355,15 @@
Return<void> GnssCallback::gnssLocationCb(
const ::android::hardware::gnss::V1_0::GnssLocation& location) {
JNIEnv* env = getJniEnv();
+
+ jobject jLocation = translateLocation(env, location);
+ bool hasLatLong = (static_cast<uint32_t>(location.gnssLocationFlags) &
+ hardware::gnss::V1_0::GnssLocationFlags::HAS_LAT_LONG) != 0;
+
env->CallVoidMethod(mCallbacksObj,
method_reportLocation,
- location.gnssLocationFlags,
- static_cast<jdouble>(location.latitudeDegrees),
- static_cast<jdouble>(location.longitudeDegrees),
- static_cast<jdouble>(location.altitudeMeters),
- static_cast<jfloat>(location.speedMetersPerSec),
- static_cast<jfloat>(location.bearingDegrees),
- static_cast<jfloat>(location.horizontalAccuracyMeters),
- static_cast<jfloat>(location.verticalAccuracyMeters),
- static_cast<jfloat>(location.speedAccuracyMetersPerSecond),
- static_cast<jfloat>(location.bearingAccuracyDegrees),
- static_cast<jlong>(location.timestamp));
+ boolToJbool(hasLatLong),
+ jLocation);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
return Void();
}
@@ -463,20 +493,12 @@
hardware::gnss::V1_0::GnssUtcTime timestamp) {
JNIEnv* env = getJniEnv();
+ jobject jLocation = translateLocation(env, location);
+
env->CallVoidMethod(mCallbacksObj,
method_reportGeofenceTransition,
geofenceId,
- location.gnssLocationFlags,
- static_cast<jdouble>(location.latitudeDegrees),
- static_cast<jdouble>(location.longitudeDegrees),
- static_cast<jdouble>(location.altitudeMeters),
- static_cast<jfloat>(location.speedMetersPerSec),
- static_cast<jfloat>(location.bearingDegrees),
- static_cast<jfloat>(location.horizontalAccuracyMeters),
- static_cast<jfloat>(location.verticalAccuracyMeters),
- static_cast<jfloat>(location.speedAccuracyMetersPerSecond),
- static_cast<jfloat>(location.bearingAccuracyDegrees),
- static_cast<jlong>(location.timestamp),
+ jLocation,
transition,
timestamp);
@@ -488,20 +510,13 @@
GeofenceAvailability status,
const android::hardware::gnss::V1_0::GnssLocation& location) {
JNIEnv* env = getJniEnv();
+
+ jobject jLocation = translateLocation(env, location);
+
env->CallVoidMethod(mCallbacksObj,
method_reportGeofenceStatus,
status,
- location.gnssLocationFlags,
- static_cast<jdouble>(location.latitudeDegrees),
- static_cast<jdouble>(location.longitudeDegrees),
- static_cast<jdouble>(location.altitudeMeters),
- static_cast<jfloat>(location.speedMetersPerSec),
- static_cast<jfloat>(location.bearingDegrees),
- static_cast<jfloat>(location.horizontalAccuracyMeters),
- static_cast<jfloat>(location.verticalAccuracyMeters),
- static_cast<jfloat>(location.speedAccuracyMetersPerSecond),
- static_cast<jfloat>(location.bearingAccuracyDegrees),
- static_cast<jlong>(location.timestamp));
+ jLocation);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
return Void();
}
@@ -949,9 +964,6 @@
Return<void> gnssLocationBatchCb(
const ::android::hardware::hidl_vec<hardware::gnss::V1_0::GnssLocation> & locations)
override;
- private:
- jobject translateLocation(
- JNIEnv* env, const hardware::gnss::V1_0::GnssLocation* location);
};
Return<void> GnssBatchingCallback::gnssLocationBatchCb(
@@ -962,7 +974,7 @@
env->FindClass("android/location/Location"), nullptr);
for (uint16_t i = 0; i < locations.size(); ++i) {
- jobject jLocation = translateLocation(env, &locations[i]);
+ jobject jLocation = translateLocation(env, locations[i]);
env->SetObjectArrayElement(jLocations, i, jLocation);
env->DeleteLocalRef(jLocation);
}
@@ -975,45 +987,9 @@
return Void();
}
-// TODO: Use this common code to translate location for Geofencing and regular Location
-jobject GnssBatchingCallback::translateLocation(
- JNIEnv* env, const hardware::gnss::V1_0::GnssLocation* location) {
- JavaObject object(env, "android/location/Location", "gps");
-
- uint16_t flags = static_cast<uint32_t>(location->gnssLocationFlags);
- if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_LAT_LONG) {
- SET(Latitude, location->latitudeDegrees);
- SET(Longitude, location->longitudeDegrees);
- }
- if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_ALTITUDE) {
- SET(Altitude, location->altitudeMeters);
- }
- if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_SPEED) {
- SET(Speed, location->speedMetersPerSec);
- }
- if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_BEARING) {
- SET(Bearing, location->bearingDegrees);
- }
- if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_HORIZONTAL_ACCURACY) {
- SET(Accuracy, location->horizontalAccuracyMeters);
- }
- if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_VERTICAL_ACCURACY) {
- SET(VerticalAccuracyMeters, location->verticalAccuracyMeters);
- }
- if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_SPEED_ACCURACY) {
- SET(SpeedAccuracyMetersPerSecond, location->speedAccuracyMetersPerSecond);
- }
- if (flags & hardware::gnss::V1_0::GnssLocationFlags::HAS_BEARING_ACCURACY) {
- SET(BearingAccuracyDegrees, location->bearingAccuracyDegrees);
- }
- SET(Time, location->timestamp);
-
- return object.get();
-}
-
-
static void android_location_GnssLocationProvider_class_init_native(JNIEnv* env, jclass clazz) {
- method_reportLocation = env->GetMethodID(clazz, "reportLocation", "(IDDDFFFFFFJ)V");
+ method_reportLocation = env->GetMethodID(clazz, "reportLocation",
+ "(ZLandroid/location/Location;)V");
method_reportStatus = env->GetMethodID(clazz, "reportStatus", "(I)V");
method_reportSvStatus = env->GetMethodID(clazz, "reportSvStatus", "()V");
method_reportAGpsStatus = env->GetMethodID(clazz, "reportAGpsStatus", "(II[B)V");
@@ -1027,9 +1003,9 @@
method_requestSetID = env->GetMethodID(clazz, "requestSetID", "(I)V");
method_requestUtcTime = env->GetMethodID(clazz, "requestUtcTime", "()V");
method_reportGeofenceTransition = env->GetMethodID(clazz, "reportGeofenceTransition",
- "(IIDDDFFFFFFJIJ)V");
+ "(ILandroid/location/Location;IJ)V");
method_reportGeofenceStatus = env->GetMethodID(clazz, "reportGeofenceStatus",
- "(IIDDDFFFFFFJ)V");
+ "(ILandroid/location/Location;)V");
method_reportGeofenceAddStatus = env->GetMethodID(clazz, "reportGeofenceAddStatus",
"(II)V");
method_reportGeofenceRemoveStatus = env->GetMethodID(clazz, "reportGeofenceRemoveStatus",
@@ -1060,7 +1036,7 @@
}
// TODO(b/31632518)
- gnssHal = IGnss::getService("gnss");
+ gnssHal = IGnss::getService();
if (gnssHal != nullptr) {
auto gnssXtra = gnssHal->getExtensionXtra();
if (!gnssXtra.isOk()) {
diff --git a/services/core/jni/com_android_server_vr_VrManagerService.cpp b/services/core/jni/com_android_server_vr_VrManagerService.cpp
index e06e051..9052697 100644
--- a/services/core/jni/com_android_server_vr_VrManagerService.cpp
+++ b/services/core/jni/com_android_server_vr_VrManagerService.cpp
@@ -38,7 +38,7 @@
return;
}
- gVr = IVr::getService("vr");
+ gVr = IVr::getService();
if (gVr == nullptr) {
ALOGW("%s: Could not open IVr interface", __FUNCTION__);
return;
diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp
index 6f505d5..f22b330 100644
--- a/services/core/jni/onload.cpp
+++ b/services/core/jni/onload.cpp
@@ -45,6 +45,8 @@
int register_android_server_PersistentDataBlockService(JNIEnv* env);
int register_android_server_Watchdog(JNIEnv* env);
int register_android_server_HardwarePropertiesManagerService(JNIEnv* env);
+int register_android_server_SyntheticPasswordManager(JNIEnv* env);
+int register_android_server_GraphicsStatsService(JNIEnv* env);
};
using namespace android;
@@ -85,6 +87,8 @@
register_android_server_Watchdog(env);
register_android_server_HardwarePropertiesManagerService(env);
register_android_server_storage_AppFuse(env);
+ register_android_server_SyntheticPasswordManager(env);
+ register_android_server_GraphicsStatsService(env);
return JNI_VERSION_1_4;
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 2b2bb48..17e6bba 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -41,6 +41,7 @@
import static android.app.admin.DevicePolicyManager.DELEGATION_PACKAGE_ACCESS;
import static android.app.admin.DevicePolicyManager.DELEGATION_PERMISSION_GRANT;
import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
+import static android.app.admin.DevicePolicyManager.PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER;
import static android.app.admin.DevicePolicyManager.WIPE_EXTERNAL_STORAGE;
import static android.app.admin.DevicePolicyManager.WIPE_RESET_PROTECTION_DATA;
import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES;
@@ -161,6 +162,7 @@
import android.view.inputmethod.InputMethodManager;
import com.android.internal.R;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.statusbar.IStatusBarService;
@@ -193,6 +195,7 @@
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.text.DateFormat;
+import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -238,12 +241,16 @@
private static final String TAG_ADMIN_BROADCAST_PENDING = "admin-broadcast-pending";
+ private static final String TAG_DEFAULT_INPUT_METHOD_SET = "default-ime-set";
+
private static final String ATTR_ID = "id";
private static final String ATTR_VALUE = "value";
private static final String TAG_INITIALIZATION_BUNDLE = "initialization-bundle";
+ private static final String TAG_PASSWORD_TOKEN_HANDLE = "password-token";
+
private static final int REQUEST_EXPIRE_PASSWORD = 5571;
private static final long MS_PER_DAY = TimeUnit.DAYS.toMillis(1);
@@ -326,15 +333,6 @@
}
/**
- * Keyguard features that when set on a managed profile that doesn't have its own challenge will
- * affect the profile's parent user. These can also be set on the managed profile's parent DPM
- * instance.
- */
- private static final int PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER =
- DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS
- | DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT;
-
- /**
* Keyguard features that when set on a profile affect the profile content or challenge only.
* These cannot be set on the managed profile's parent DPM instance
*/
@@ -400,6 +398,8 @@
private final AtomicBoolean mRemoteBugreportServiceIsActive = new AtomicBoolean();
private final AtomicBoolean mRemoteBugreportSharingAccepted = new AtomicBoolean();
+ private SetupContentObserver mSetupContentObserver;
+
private final Runnable mRemoteBugreportTimeoutRunnable = new Runnable() {
@Override
public void run() {
@@ -502,10 +502,14 @@
long mLastNetworkLogsRetrievalTime = -1;
+ boolean mDefaultInputMethodSet = false;
+
// Used for initialization of users created by createAndManageUsers.
boolean mAdminBroadcastPending = false;
PersistableBundle mInitBundle = null;
+ long mPasswordTokenHandle = 0;
+
public DevicePolicyData(int userHandle) {
mUserHandle = userHandle;
}
@@ -1697,6 +1701,11 @@
name, def, userHandle);
}
+ String settingsSecureGetStringForUser(String name, int userHandle) {
+ return Settings.Secure.getStringForUser(mContext.getContentResolver(), name,
+ userHandle);
+ }
+
void settingsSecurePutIntForUser(String name, int value, int userHandle) {
Settings.Secure.putIntForUser(mContext.getContentResolver(),
name, value, userHandle);
@@ -1812,6 +1821,8 @@
mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, filter, null, mHandler);
LocalServices.addService(DevicePolicyManagerInternal.class, mLocalService);
+
+ mSetupContentObserver = new SetupContentObserver(mHandler);
}
/**
@@ -2557,6 +2568,18 @@
out.endTag(null, TAG_INITIALIZATION_BUNDLE);
}
+ if (policy.mPasswordTokenHandle != 0) {
+ out.startTag(null, TAG_PASSWORD_TOKEN_HANDLE);
+ out.attribute(null, ATTR_VALUE,
+ Long.toString(policy.mPasswordTokenHandle));
+ out.endTag(null, TAG_PASSWORD_TOKEN_HANDLE);
+ }
+
+ if (policy.mDefaultInputMethodSet) {
+ out.startTag(null, TAG_DEFAULT_INPUT_METHOD_SET);
+ out.endTag(null, TAG_DEFAULT_INPUT_METHOD_SET);
+ }
+
out.endTag(null, "policies");
out.endDocument();
@@ -2763,6 +2786,11 @@
m.symbols = Integer.parseInt(parser.getAttributeValue(null, "symbols"));
m.nonLetter = Integer.parseInt(parser.getAttributeValue(null, "nonletter"));
}
+ } else if (TAG_PASSWORD_TOKEN_HANDLE.equals(tag)) {
+ policy.mPasswordTokenHandle = Long.parseLong(
+ parser.getAttributeValue(null, ATTR_VALUE));
+ } else if (TAG_DEFAULT_INPUT_METHOD_SET.equals(tag)) {
+ policy.mDefaultInputMethodSet = true;
} else {
Slog.w(LOG_TAG, "Unknown tag: " + tag);
XmlUtils.skipCurrentTag(parser);
@@ -2876,15 +2904,45 @@
}
}
+ private void ensureUnknownSourcesRestrictionForProfileOwners() {
+ synchronized (this) {
+ for (int userId : mOwners.getProfileOwnerKeys()) {
+ if (!mUserManager.isManagedProfile(userId) ||
+ mInjector.settingsSecureGetIntForUser(
+ Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED, 0, userId) == 0) {
+ continue;
+ }
+ setUserRestrictionOnBehalfOfProfileOwnerLocked(
+ UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, userId);
+ mInjector.settingsSecurePutIntForUser(
+ Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED, 0, userId);
+ }
+ }
+ }
+
+ private void setUserRestrictionOnBehalfOfProfileOwnerLocked(String userRestrictionKey,
+ int userId) {
+ if (UserRestrictionsUtils.isValidRestriction(userRestrictionKey) &&
+ UserRestrictionsUtils.canProfileOwnerChange(userRestrictionKey, userId)) {
+ ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userId);
+ if (profileOwner == null) {
+ return;
+ }
+ Bundle restrictions = profileOwner.ensureUserRestrictions();
+ restrictions.putBoolean(userRestrictionKey, true);
+ saveUserRestrictionsLocked(userId);
+ }
+ }
+
private void onLockSettingsReady() {
getUserData(UserHandle.USER_SYSTEM);
loadOwners();
cleanUpOldUsers();
-
+ ensureUnknownSourcesRestrictionForProfileOwners();
onStartUser(UserHandle.USER_SYSTEM);
- // Register an observer for watching for user setup complete.
- new SetupContentObserver(mHandler).register();
+ // Register an observer for watching for user setup complete and settings changes.
+ mSetupContentObserver.register();
// Initialize the user setup state, to handle the upgrade case.
updateUserSetupCompleteAndPaired();
@@ -3178,7 +3236,6 @@
// If admin is a device or profile owner tidy that up first.
if (isDeviceOwner(adminReceiver, userHandle)) {
clearDeviceOwnerLocked(getDeviceOwnerAdminLocked(), userHandle);
- clearDeviceOwnerUserRestrictionLocked(UserHandle.of(userHandle));
}
if (isProfileOwner(adminReceiver, userHandle)) {
final ActiveAdmin admin = getActiveAdminUncheckedLocked(adminReceiver,
@@ -3194,10 +3251,8 @@
}
}
- // It's temporary solution to clear DISALLOW_ADD_USER after CTS
- // STOPSHIP(b/31952368) when the restriction is moved from system to the device owner,
- // it can be removed.
private void clearDeviceOwnerUserRestrictionLocked(UserHandle userHandle) {
+ // ManagedProvisioning/DPC sets DISALLOW_ADD_USER. Clear to recover to the original state
if (mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER, userHandle)) {
mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_USER, false, userHandle);
}
@@ -4074,12 +4129,8 @@
mInjector.binderRestoreCallingIdentity(token);
}
}
-
@Override
public boolean resetPassword(String passwordOrNull, int flags) throws RemoteException {
- if (!mHasFeature) {
- return false;
- }
final int callingUid = mInjector.binderGetCallingUid();
final int userHandle = mInjector.userHandleGetCallingUserId();
@@ -4090,15 +4141,18 @@
enforceNotManagedProfile(userHandle, "clear the active password");
}
- int quality;
synchronized (this) {
// If caller has PO (or DO) it can change the password, so see if that's the case first.
ActiveAdmin admin = getActiveAdminWithPolicyForUidLocked(
null, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER, callingUid);
final boolean preN;
if (admin != null) {
- preN = getTargetSdk(admin.info.getPackageName(),
- userHandle) <= android.os.Build.VERSION_CODES.M;
+ final int targetSdk = getTargetSdk(admin.info.getPackageName(), userHandle);
+ if (targetSdk >= Build.VERSION_CODES.O) {
+ throw new SecurityException("resetPassword() is deprecated for DPC targeting O"
+ + " or later");
+ }
+ preN = targetSdk <= android.os.Build.VERSION_CODES.M;
} else {
// Otherwise, make sure the caller has any active admin with the right policy.
admin = getActiveAdminForCallerLocked(null,
@@ -4149,7 +4203,15 @@
return false;
}
}
+ }
+ return resetPasswordInternal(password, 0, null, flags, callingUid, userHandle);
+ }
+
+ private boolean resetPasswordInternal(String password, long tokenHandle, byte[] token,
+ int flags, int callingUid, int userHandle) {
+ int quality;
+ synchronized (this) {
quality = getPasswordQuality(null, userHandle, /* parent */ false);
if (quality == DevicePolicyManager.PASSWORD_QUALITY_MANAGED) {
quality = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
@@ -4239,11 +4301,20 @@
// Don't do this with the lock held, because it is going to call
// back in to the service.
final long ident = mInjector.binderClearCallingIdentity();
+ final boolean result;
try {
- if (!TextUtils.isEmpty(password)) {
- mLockPatternUtils.saveLockPassword(password, null, quality, userHandle);
+ if (token == null) {
+ if (!TextUtils.isEmpty(password)) {
+ mLockPatternUtils.saveLockPassword(password, null, quality, userHandle);
+ } else {
+ mLockPatternUtils.clearLock(null, userHandle);
+ }
+ result = true;
} else {
- mLockPatternUtils.clearLock(null, userHandle);
+ result = mLockPatternUtils.setLockCredentialWithToken(password,
+ TextUtils.isEmpty(password) ? LockPatternUtils.CREDENTIAL_TYPE_NONE
+ : LockPatternUtils.CREDENTIAL_TYPE_PASSWORD,
+ tokenHandle, token, userHandle);
}
boolean requireEntry = (flags & DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY) != 0;
if (requireEntry) {
@@ -4260,8 +4331,7 @@
} finally {
mInjector.binderRestoreCallingIdentity(ident);
}
-
- return true;
+ return result;
}
private boolean isLockScreenSecureUnchecked(int userId) {
@@ -4781,19 +4851,15 @@
private void sendPrivateKeyAliasResponse(final String alias, final IBinder responseBinder) {
final IKeyChainAliasCallback keyChainAliasResponse =
IKeyChainAliasCallback.Stub.asInterface(responseBinder);
- new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... unused) {
- try {
- keyChainAliasResponse.alias(alias);
- } catch (Exception e) {
- // Catch everything (not just RemoteException): caller could throw a
- // RuntimeException back across processes.
- Log.e(LOG_TAG, "error while responding to callback", e);
- }
- return null;
- }
- }.execute();
+ // Send the response. It's OK to do this from the main thread because IKeyChainAliasCallback
+ // is oneway, which means it won't block if the recipient lives in another process.
+ try {
+ keyChainAliasResponse.alias(alias);
+ } catch (Exception e) {
+ // Caller could throw RuntimeException or RemoteException back across processes. Catch
+ // everything just to be sure.
+ Log.e(LOG_TAG, "error while responding to callback", e);
+ }
}
/**
@@ -6532,18 +6598,22 @@
admin.forceEphemeralUsers = false;
admin.isNetworkLoggingEnabled = false;
mUserManagerInternal.setForceEphemeralUsers(admin.forceEphemeralUsers);
- final DevicePolicyData policyData = getUserData(UserHandle.USER_SYSTEM);
- policyData.mLastSecurityLogRetrievalTime = -1;
- policyData.mLastBugReportRequestTime = -1;
- policyData.mLastNetworkLogsRetrievalTime = -1;
- saveSettingsLocked(UserHandle.USER_SYSTEM);
}
+ final DevicePolicyData policyData = getUserData(userId);
+ policyData.mDefaultInputMethodSet = false;
+ saveSettingsLocked(userId);
+ final DevicePolicyData systemPolicyData = getUserData(UserHandle.USER_SYSTEM);
+ systemPolicyData.mLastSecurityLogRetrievalTime = -1;
+ systemPolicyData.mLastBugReportRequestTime = -1;
+ systemPolicyData.mLastNetworkLogsRetrievalTime = -1;
+ saveSettingsLocked(UserHandle.USER_SYSTEM);
clearUserPoliciesLocked(userId);
mOwners.clearDeviceOwner();
mOwners.writeDeviceOwner();
updateDeviceOwnerLocked();
+ clearDeviceOwnerUserRestrictionLocked(UserHandle.of(userId));
mInjector.securityLogSetLoggingEnabledProperty(false);
mSecurityLogMonitor.stop();
setNetworkLoggingActiveInternal(false);
@@ -6587,6 +6657,17 @@
mOwners.writeProfileOwner(userHandle);
Slog.i(LOG_TAG, "Profile owner set: " + who + " on user " + userHandle);
+ final long id = mInjector.binderClearCallingIdentity();
+ try {
+ if (mUserManager.isManagedProfile(userHandle)) {
+ setUserRestrictionOnBehalfOfProfileOwnerLocked(
+ UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, userHandle);
+ mInjector.settingsSecurePutIntForUser(
+ Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED, 0, userHandle);
+ }
+ } finally {
+ mInjector.binderRestoreCallingIdentity(id);
+ }
return true;
}
}
@@ -6596,14 +6677,16 @@
if (!mHasFeature) {
return;
}
- final UserHandle callingUser = mInjector.binderGetCallingUserHandle();
- final int userId = callingUser.getIdentifier();
+ Preconditions.checkNotNull(who, "ComponentName is null");
+
+ final int userId = mInjector.userHandleGetCallingUserId();
enforceNotManagedProfile(userId, "clear profile owner");
enforceUserUnlocked(userId);
- // Check if this is the profile owner who is calling
- final ActiveAdmin admin =
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
synchronized (this) {
+ // Check if this is the profile owner who is calling
+ final ActiveAdmin admin =
+ getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
+
final long ident = mInjector.binderClearCallingIdentity();
try {
clearProfileOwnerLocked(admin, userId);
@@ -6621,6 +6704,9 @@
admin.userRestrictions = null;
admin.defaultEnabledRestrictionsAlreadySet.clear();
}
+ final DevicePolicyData policyData = getUserData(userId);
+ policyData.mDefaultInputMethodSet = false;
+ saveSettingsLocked(userId);
clearUserPoliciesLocked(userId);
mOwners.removeProfileOwner(userId);
mOwners.writeProfileOwner(userId);
@@ -7863,7 +7949,7 @@
// Install the profile owner if not present.
if (!mIPackageManager.isPackageAvailable(adminPkg, userHandle)) {
mIPackageManager.installExistingPackageAsUser(adminPkg, userHandle,
- PackageManager.INSTALL_REASON_POLICY);
+ 0 /*installFlags*/, PackageManager.INSTALL_REASON_POLICY);
}
} catch (RemoteException e) {
Slog.e(LOG_TAG, "Failed to make remote calls for createAndManageUser, "
@@ -8182,7 +8268,7 @@
// Install the app.
mIPackageManager.installExistingPackageAsUser(packageName, userId,
- PackageManager.INSTALL_REASON_POLICY);
+ 0 /*installFlags*/, PackageManager.INSTALL_REASON_POLICY);
} catch (RemoteException re) {
// shouldn't happen
@@ -8224,7 +8310,7 @@
if (isSystemApp(mIPackageManager, packageName, parentUserId)) {
numberOfAppsInstalled++;
mIPackageManager.installExistingPackageAsUser(packageName, userId,
- PackageManager.INSTALL_REASON_POLICY);
+ 0 /*installFlags*/, PackageManager.INSTALL_REASON_POLICY);
} else {
Slog.d(LOG_TAG, "Not enabling " + packageName + " since is not a"
+ " system app");
@@ -8668,9 +8754,43 @@
throw new SecurityException(String.format(
"Permission denial: Profile owners cannot update %1$s", setting));
}
-
+ if (setting.equals(Settings.Secure.INSTALL_NON_MARKET_APPS)) {
+ if (getTargetSdk(who.getPackageName(), callingUserId) >= Build.VERSION_CODES.O) {
+ throw new UnsupportedOperationException(Settings.Secure.INSTALL_NON_MARKET_APPS
+ + " is deprecated. Please use the user restriction "
+ + UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES + " instead.");
+ }
+ if (!mUserManager.isManagedProfile(callingUserId)) {
+ Slog.e(LOG_TAG, "Ignoring setSecureSetting request for "
+ + setting + ". User restriction "
+ + UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES
+ + " should be used instead.");
+ } else {
+ try {
+ setUserRestriction(who, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES,
+ (Integer.parseInt(value) == 0) ? true : false);
+ } catch (NumberFormatException exc) {
+ Slog.e(LOG_TAG, "Invalid value: " + value + " for setting " + setting);
+ }
+ }
+ return;
+ }
long id = mInjector.binderClearCallingIdentity();
try {
+ if (Settings.Secure.DEFAULT_INPUT_METHOD.equals(setting)) {
+ final String currentValue = mInjector.settingsSecureGetStringForUser(
+ Settings.Secure.DEFAULT_INPUT_METHOD, callingUserId);
+ if (!TextUtils.equals(currentValue, value)) {
+ // Tell the content observer that the next change will be due to the owner
+ // changing the value. There is a small race condition here that we cannot
+ // avoid: Change notifications are sent asynchronously, so it is possible
+ // that there are prior notifications queued up before the one we are about
+ // to trigger. This is a corner case that will have no impact in practice.
+ mSetupContentObserver.addPendingChangeByOwnerLocked(callingUserId);
+ }
+ getUserData(callingUserId).mDefaultInputMethodSet = true;
+ saveSettingsLocked(callingUserId);
+ }
mInjector.settingsSecurePutStringForUser(setting, value, callingUserId);
} finally {
mInjector.binderRestoreCallingIdentity(id);
@@ -8811,12 +8931,16 @@
}
private class SetupContentObserver extends ContentObserver {
-
private final Uri mUserSetupComplete = Settings.Secure.getUriFor(
Settings.Secure.USER_SETUP_COMPLETE);
private final Uri mDeviceProvisioned = Settings.Global.getUriFor(
Settings.Global.DEVICE_PROVISIONED);
private final Uri mPaired = Settings.Secure.getUriFor(Settings.Secure.DEVICE_PAIRED);
+ private final Uri mDefaultImeChanged = Settings.Secure.getUriFor(
+ Settings.Secure.DEFAULT_INPUT_METHOD);
+
+ @GuardedBy("DevicePolicyManagerService.this")
+ private Set<Integer> mUserIdsWithPendingChangesByOwner = new ArraySet<>();
public SetupContentObserver(Handler handler) {
super(handler);
@@ -8828,10 +8952,15 @@
if (mIsWatch) {
mInjector.registerContentObserver(mPaired, false, this, UserHandle.USER_ALL);
}
+ mInjector.registerContentObserver(mDefaultImeChanged, false, this, UserHandle.USER_ALL);
+ }
+
+ private void addPendingChangeByOwnerLocked(int userId) {
+ mUserIdsWithPendingChangesByOwner.add(userId);
}
@Override
- public void onChange(boolean selfChange, Uri uri) {
+ public void onChange(boolean selfChange, Uri uri, int userId) {
if (mUserSetupComplete.equals(uri) || (mIsWatch && mPaired.equals(uri))) {
updateUserSetupCompleteAndPaired();
} else if (mDeviceProvisioned.equals(uri)) {
@@ -8840,6 +8969,19 @@
// is delayed until device is marked as provisioned.
setDeviceOwnerSystemPropertyLocked();
}
+ } else if (mDefaultImeChanged.equals(uri)) {
+ synchronized (DevicePolicyManagerService.this) {
+ if (mUserIdsWithPendingChangesByOwner.contains(userId)) {
+ // This change notification was triggered by the owner changing the default
+ // IME. Ignore it.
+ mUserIdsWithPendingChangesByOwner.remove(userId);
+ } else {
+ // This change notification was triggered by the user manually changing the
+ // default IME.
+ getUserData(userId).mDefaultInputMethodSet = false;
+ saveSettingsLocked(userId);
+ }
+ }
}
}
}
@@ -9092,13 +9234,16 @@
}
final String deviceOwnerPackageName = mOwners.getDeviceOwnerComponent()
.getPackageName();
- final String[] pkgs = mInjector.getPackageManager().getPackagesForUid(callerUid);
-
- for (String pkg : pkgs) {
- if (deviceOwnerPackageName.equals(pkg)) {
- return true;
+ try {
+ String[] pkgs = mInjector.getIPackageManager().getPackagesForUid(callerUid);
+ for (String pkg : pkgs) {
+ if (deviceOwnerPackageName.equals(pkg)) {
+ return true;
+ }
+ }
+ } catch (RemoteException e) {
+ return false;
}
- }
}
return false;
@@ -10621,4 +10766,109 @@
enforceDeviceOwnerOrManageUsers();
return getUserData(UserHandle.USER_SYSTEM).mLastNetworkLogsRetrievalTime;
}
+
+ @Override
+ public boolean setResetPasswordToken(ComponentName admin, byte[] token) {
+ if (!mHasFeature) {
+ return false;
+ }
+ if (token == null || token.length < 32) {
+ throw new IllegalArgumentException("token must be at least 32-byte long");
+ }
+ synchronized (this) {
+ final int userHandle = mInjector.userHandleGetCallingUserId();
+ getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
+
+ DevicePolicyData policy = getUserData(userHandle);
+ long ident = mInjector.binderClearCallingIdentity();
+ try {
+ if (policy.mPasswordTokenHandle != 0) {
+ mLockPatternUtils.removeEscrowToken(policy.mPasswordTokenHandle, userHandle);
+ }
+
+ policy.mPasswordTokenHandle = mLockPatternUtils.addEscrowToken(token, userHandle);
+ saveSettingsLocked(userHandle);
+ return policy.mPasswordTokenHandle != 0;
+ } finally {
+ mInjector.binderRestoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ @Override
+ public boolean clearResetPasswordToken(ComponentName admin) {
+ if (!mHasFeature) {
+ return false;
+ }
+ synchronized (this) {
+ final int userHandle = mInjector.userHandleGetCallingUserId();
+ getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
+
+ DevicePolicyData policy = getUserData(userHandle);
+ if (policy.mPasswordTokenHandle != 0) {
+ long ident = mInjector.binderClearCallingIdentity();
+ try {
+ boolean result = mLockPatternUtils.removeEscrowToken(
+ policy.mPasswordTokenHandle, userHandle);
+ policy.mPasswordTokenHandle = 0;
+ saveSettingsLocked(userHandle);
+ return result;
+ } finally {
+ mInjector.binderRestoreCallingIdentity(ident);
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isResetPasswordTokenActive(ComponentName admin) {
+ synchronized (this) {
+ final int userHandle = mInjector.userHandleGetCallingUserId();
+ getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
+
+ DevicePolicyData policy = getUserData(userHandle);
+ if (policy.mPasswordTokenHandle != 0) {
+ long ident = mInjector.binderClearCallingIdentity();
+ try {
+ return mLockPatternUtils.isEscrowTokenActive(policy.mPasswordTokenHandle,
+ userHandle);
+ } finally {
+ mInjector.binderRestoreCallingIdentity(ident);
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean resetPasswordWithToken(ComponentName admin, String passwordOrNull, byte[] token,
+ int flags) {
+ Preconditions.checkNotNull(token);
+ synchronized (this) {
+ final int userHandle = mInjector.userHandleGetCallingUserId();
+ getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
+
+ DevicePolicyData policy = getUserData(userHandle);
+ if (policy.mPasswordTokenHandle != 0) {
+ final String password = passwordOrNull != null ? passwordOrNull : "";
+ return resetPasswordInternal(password, policy.mPasswordTokenHandle, token,
+ flags, mInjector.binderGetCallingUid(), userHandle);
+ } else {
+ Slog.w(LOG_TAG, "No saved token handle");
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isDefaultInputMethodSetByOwner(@NonNull UserHandle user) {
+ final int userId = user.getIdentifier();
+ enforceProfileOwnerOrSystemUser(null);
+ if (!isCallerWithSystemUid() && mInjector.userHandleGetCallingUserId() != userId) {
+ throw new SecurityException(
+ "Only the system can use this method to query information about another user");
+ }
+ return getUserData(userId).mDefaultInputMethodSet;
+ }
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 83e209d..e586482 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -35,6 +35,7 @@
import android.os.IIncidentManager;
import android.os.Looper;
import android.os.PowerManager;
+import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.StrictMode;
@@ -60,10 +61,9 @@
import com.android.server.accessibility.AccessibilityManagerService;
import com.android.server.am.ActivityManagerService;
import com.android.server.audio.AudioService;
-import com.android.server.camera.CameraService;
+import com.android.server.camera.CameraServiceProxy;
import com.android.server.clipboard.ClipboardService;
import com.android.server.connectivity.IpConnectivityMetrics;
-import com.android.server.connectivity.MetricsLoggerService;
import com.android.server.coverage.CoverageService;
import com.android.server.devicepolicy.DevicePolicyManagerService;
import com.android.server.display.DisplayManagerService;
@@ -82,6 +82,7 @@
import com.android.server.net.NetworkPolicyManagerService;
import com.android.server.net.NetworkStatsService;
import com.android.server.notification.NotificationManagerService;
+import com.android.server.om.OverlayManagerService;
import com.android.server.os.DeviceIdentifiersPolicyService;
import com.android.server.os.SchedulingPolicyService;
import com.android.server.pm.Installer;
@@ -182,10 +183,8 @@
"com.google.android.clockwork.ThermalObserver";
private static final String WEAR_BLUETOOTH_SERVICE_CLASS =
"com.google.android.clockwork.bluetooth.WearBluetoothService";
- private static final String WEAR_WIFI_MEDIATOR_SERVICE_CLASS =
- "com.google.android.clockwork.wifi.WearWifiMediatorService";
- private static final String WEAR_CELLULAR_MEDIATOR_SERVICE_CLASS =
- "com.google.android.clockwork.cellular.WearCellularMediatorService";
+ private static final String WEAR_CONNECTIVITY_SERVICE_CLASS =
+ "com.google.android.clockwork.connectivity.WearConnectivityService";
private static final String WEAR_TIME_SERVICE_CLASS =
"com.google.android.clockwork.time.WearTimeService";
private static final String ACCOUNT_SERVICE_CLASS =
@@ -236,6 +235,8 @@
private static final String START_SENSOR_SERVICE = "StartSensorService";
private Future<?> mSensorServiceStart;
+ private Future<?> mZygotePreload;
+
/**
* Start the sensor service. This is a blocking call and can take time.
@@ -374,6 +375,7 @@
startBootstrapServices();
startCoreServices();
startOtherServices();
+ SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
@@ -381,7 +383,6 @@
} finally {
traceEnd();
}
- SystemServerInitThreadPool.shutdown();
// For debug builds, log event loop stalls to dropbox for analysis.
if (StrictMode.conditionallyEnableDebugLogging()) {
@@ -592,6 +593,11 @@
mActivityManagerService.setSystemProcess();
traceEnd();
+ // Manages Overlay packages
+ traceBeginAndSlog("StartOverlayManagerService");
+ mSystemServiceManager.startService(new OverlayManagerService(mSystemContext, installer));
+ traceEnd();
+
// The sensor service needs access to package manager service, app ops
// service, and permissions service, therefore we start it after them.
// Start sensor service in a separate thread. Completion should be checked
@@ -688,6 +694,26 @@
}
try {
+ final String SECONDARY_ZYGOTE_PRELOAD = "SecondaryZygotePreload";
+ // We start the preload ~1s before the webview factory preparation, to
+ // ensure that it completes before the 32 bit relro process is forked
+ // from the zygote. In the event that it takes too long, the webview
+ // RELRO process will block, but it will do so without holding any locks.
+ mZygotePreload = SystemServerInitThreadPool.get().submit(() -> {
+ try {
+ Slog.i(TAG, SECONDARY_ZYGOTE_PRELOAD);
+ BootTimingsTraceLog traceLog = new BootTimingsTraceLog(
+ SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);
+ traceLog.traceBegin(SECONDARY_ZYGOTE_PRELOAD);
+ if (!Process.zygoteProcess.preloadDefault(Build.SUPPORTED_32_BIT_ABIS[0])) {
+ Slog.e(TAG, "Unable to preload default resources");
+ }
+ traceLog.traceEnd();
+ } catch (Exception ex) {
+ Slog.e(TAG, "Exception preloading default resources", ex);
+ }
+ }, SECONDARY_ZYGOTE_PRELOAD);
+
traceBeginAndSlog("StartKeyAttestationApplicationIdProviderService");
ServiceManager.addService("sec_key_att_app_id_provider",
new KeyAttestationApplicationIdProviderService(context));
@@ -713,9 +739,9 @@
mContentResolver = context.getContentResolver();
if (!disableCameraService) {
- Slog.i(TAG, "Camera Service");
- traceBeginAndSlog("StartCameraService");
- mSystemServiceManager.startService(CameraService.class);
+ Slog.i(TAG, "Camera Service Proxy");
+ traceBeginAndSlog("StartCameraServiceProxy");
+ mSystemServiceManager.startService(CameraServiceProxy.class);
traceEnd();
}
@@ -806,10 +832,6 @@
traceEnd();
}
- traceBeginAndSlog("ConnectivityMetricsLoggerService");
- mSystemServiceManager.startService(MetricsLoggerService.class);
- traceEnd();
-
traceBeginAndSlog("IpConnectivityMetrics");
mSystemServiceManager.startService(IpConnectivityMetrics.class);
traceEnd();
@@ -1441,16 +1463,10 @@
mSystemServiceManager.startService(WEAR_BLUETOOTH_SERVICE_CLASS);
traceEnd();
- traceBeginAndSlog("StartWearWifiMediator");
- mSystemServiceManager.startService(WEAR_WIFI_MEDIATOR_SERVICE_CLASS);
+ traceBeginAndSlog("StartWearConnectivityService");
+ mSystemServiceManager.startService(WEAR_CONNECTIVITY_SERVICE_CLASS);
traceEnd();
- if (SystemProperties.getBoolean("config.enable_cellmediator", false)) {
- traceBeginAndSlog("StartWearCellularMediator");
- mSystemServiceManager.startService(WEAR_CELLULAR_MEDIATOR_SERVICE_CLASS);
- traceEnd();
- }
-
if (!disableNonCoreServices) {
traceBeginAndSlog("StartWearTimeService");
mSystemServiceManager.startService(WEAR_TIME_SERVICE_CLASS);
@@ -1615,6 +1631,8 @@
BootTimingsTraceLog traceLog = new BootTimingsTraceLog(
SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);
traceLog.traceBegin(WEBVIEW_PREPARATION);
+ ConcurrentUtils.waitForFutureNoInterrupt(mZygotePreload, "Zygote preload");
+ mZygotePreload = null;
mWebViewUpdateService.prepareWebViewInSystemServer();
traceLog.traceEnd();
}, WEBVIEW_PREPARATION);
@@ -1674,6 +1692,9 @@
Watchdog.getInstance().start();
traceEnd();
+ // Wait for all packages to be prepared
+ mPackageManagerService.waitForAppDataPrepared();
+
// It is now okay to let the various system services start their
// third party code...
traceBeginAndSlog("PhaseThirdPartyAppsCanStart");
diff --git a/services/print/java/com/android/server/print/CompanionDeviceManagerService.java b/services/print/java/com/android/server/print/CompanionDeviceManagerService.java
index 9824c1d..9ac8295 100644
--- a/services/print/java/com/android/server/print/CompanionDeviceManagerService.java
+++ b/services/print/java/com/android/server/print/CompanionDeviceManagerService.java
@@ -19,20 +19,28 @@
import static com.android.internal.util.Preconditions.checkNotNull;
-import android.app.PendingIntent;
+import android.Manifest;
import android.companion.AssociationRequest;
+import android.companion.CompanionDeviceManager;
+import android.companion.ICompanionDeviceDiscoveryService;
+import android.companion.ICompanionDeviceDiscoveryServiceCallback;
import android.companion.ICompanionDeviceManager;
-import android.companion.ICompanionDeviceManagerService;
-import android.companion.IOnAssociateCallback;
+import android.companion.IFindDeviceCallback;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.net.NetworkPolicyManager;
import android.os.Binder;
import android.os.IBinder;
+import android.os.IDeviceIdleController;
import android.os.RemoteException;
-import android.util.Log;
+import android.os.ServiceManager;
+import android.util.Slog;
+import com.android.internal.util.ArrayUtils;
import com.android.server.SystemService;
//TODO move to own package!
@@ -40,7 +48,8 @@
public class CompanionDeviceManagerService extends SystemService {
private static final ComponentName SERVICE_TO_BIND_TO = ComponentName.createRelative(
- "com.android.companiondevicemanager", ".DeviceDiscoveryService");
+ CompanionDeviceManager.COMPANION_DEVICE_DISCOVERY_PACKAGE_NAME,
+ ".DeviceDiscoveryService");
private static final boolean DEBUG = false;
private static final String LOG_TAG = "CompanionDeviceManagerService";
@@ -58,14 +67,13 @@
}
class CompanionDeviceManagerImpl extends ICompanionDeviceManager.Stub {
-
@Override
public void associate(
AssociationRequest request,
- IOnAssociateCallback callback,
- String callingPackage) throws RemoteException {
+ IFindDeviceCallback callback,
+ String callingPackage) {
if (DEBUG) {
- Log.i(LOG_TAG, "associate(request = " + request + ", callback = " + callback
+ Slog.i(LOG_TAG, "associate(request = " + request + ", callback = " + callback
+ ", callingPackage = " + callingPackage + ")");
}
checkNotNull(request);
@@ -85,23 +93,24 @@
private ServiceConnection getServiceConnection(
final AssociationRequest<?> request,
- final IOnAssociateCallback callback,
+ final IFindDeviceCallback findDeviceCallback,
final String callingPackage) {
return new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
if (DEBUG) {
- Log.i(LOG_TAG,
+ Slog.i(LOG_TAG,
"onServiceConnected(name = " + name + ", service = "
+ service + ")");
}
try {
- ICompanionDeviceManagerService.Stub
+ ICompanionDeviceDiscoveryService.Stub
.asInterface(service)
.startDiscovery(
request,
- getCallback(callingPackage, callback),
- callingPackage);
+ callingPackage,
+ findDeviceCallback,
+ getServiceCallback());
} catch (RemoteException e) {
throw new RuntimeException(e);
}
@@ -109,39 +118,50 @@
@Override
public void onServiceDisconnected(ComponentName name) {
- if (DEBUG) Log.i(LOG_TAG, "onServiceDisconnected(name = " + name + ")");
+ if (DEBUG) Slog.i(LOG_TAG, "onServiceDisconnected(name = " + name + ")");
}
};
}
- private IOnAssociateCallback.Stub getCallback(
- String callingPackage,
- IOnAssociateCallback propagateTo) {
- return new IOnAssociateCallback.Stub() {
-
+ private ICompanionDeviceDiscoveryServiceCallback.Stub getServiceCallback() {
+ return new ICompanionDeviceDiscoveryServiceCallback.Stub() {
@Override
- public void onSuccess(PendingIntent launcher)
- throws RemoteException {
- if (DEBUG) Log.i(LOG_TAG, "onSuccess(launcher = " + launcher + ")");
- recordSpecialPriviledgesForPackage(callingPackage);
- propagateTo.onSuccess(launcher);
- }
-
- @Override
- public void onFailure(CharSequence reason) throws RemoteException {
- if (DEBUG) Log.i(LOG_TAG, "onFailure()");
- propagateTo.onFailure(reason);
+ public void onDeviceSelected(String packageName, int userId) {
+ grantSpecialAccessPermissionsIfNeeded(packageName, userId);
}
};
}
- void recordSpecialPriviledgesForPackage(String priviledgedPackage) {
- //TODO Show dialog before recording notification access
-// final SettingStringHelper setting =
-// new SettingStringHelper(
-// getContext().getContentResolver(),
-// Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
-// Binder.getCallingUid());
-// setting.write(ColonDelimitedSet.OfStrings.add(setting.read(), priviledgedPackage));
+ private void grantSpecialAccessPermissionsIfNeeded(String packageName, int userId) {
+ final long identity = Binder.clearCallingIdentity();
+ final PackageInfo packageInfo;
+ try {
+ packageInfo = getContext().getPackageManager().getPackageInfoAsUser(
+ packageName, PackageManager.GET_PERMISSIONS, userId);
+ } catch (PackageManager.NameNotFoundException e) {
+ Slog.e(LOG_TAG, "Error granting special access permissions to package:"
+ + packageName, e);
+ return;
+ }
+ try {
+ if (ArrayUtils.contains(packageInfo.requestedPermissions,
+ Manifest.permission.RUN_IN_BACKGROUND)) {
+ IDeviceIdleController idleController = IDeviceIdleController.Stub.asInterface(
+ ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER));
+ try {
+ idleController.addPowerSaveWhitelistApp(packageName);
+ } catch (RemoteException e) {
+ /* ignore - local call */
+ }
+ }
+ if (ArrayUtils.contains(packageInfo.requestedPermissions,
+ Manifest.permission.USE_DATA_IN_BACKGROUND)) {
+ NetworkPolicyManager.from(getContext()).addUidPolicy(
+ packageInfo.applicationInfo.uid,
+ NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
}
diff --git a/services/retaildemo/java/com/android/server/retaildemo/PreloadAppsInstaller.java b/services/retaildemo/java/com/android/server/retaildemo/PreloadAppsInstaller.java
index 3fa72dc..90c58d0 100644
--- a/services/retaildemo/java/com/android/server/retaildemo/PreloadAppsInstaller.java
+++ b/services/retaildemo/java/com/android/server/retaildemo/PreloadAppsInstaller.java
@@ -104,7 +104,7 @@
}
try {
mPackageManager.installExistingPackageAsUser(packageName, userId,
- PackageManager.INSTALL_REASON_UNKNOWN);
+ 0 /*installFlags*/, PackageManager.INSTALL_REASON_UNKNOWN);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} finally {
@@ -175,4 +175,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/services/tests/notification/src/com/android/server/notification/BadgeExtractorTest.java b/services/tests/notification/src/com/android/server/notification/BadgeExtractorTest.java
index b26bac3..0cf4994 100644
--- a/services/tests/notification/src/com/android/server/notification/BadgeExtractorTest.java
+++ b/services/tests/notification/src/com/android/server/notification/BadgeExtractorTest.java
@@ -89,6 +89,7 @@
when(mConfig.canShowBadge(mPkg, mUid)).thenReturn(true);
NotificationChannel channel =
new NotificationChannel("a", "a", NotificationManager.IMPORTANCE_UNSPECIFIED);
+ when(mConfig.getNotificationChannel(mPkg, mUid, "a", false)).thenReturn(channel);
channel.setShowBadge(false);
NotificationRecord r = getNotificationRecord(channel);
@@ -107,6 +108,7 @@
NotificationChannel channel =
new NotificationChannel("a", "a", NotificationManager.IMPORTANCE_HIGH);
channel.setShowBadge(true);
+ when(mConfig.getNotificationChannel(mPkg, mUid, "a", false)).thenReturn(channel);
NotificationRecord r = getNotificationRecord(channel);
@@ -124,6 +126,7 @@
NotificationChannel channel =
new NotificationChannel("a", "a", NotificationManager.IMPORTANCE_UNSPECIFIED);
channel.setShowBadge(true);
+ when(mConfig.getNotificationChannel(mPkg, mUid, "a", false)).thenReturn(channel);
NotificationRecord r = getNotificationRecord(channel);
@@ -141,6 +144,7 @@
NotificationChannel channel =
new NotificationChannel("a", "a", NotificationManager.IMPORTANCE_UNSPECIFIED);
channel.setShowBadge(false);
+ when(mConfig.getNotificationChannel(mPkg, mUid, "a", false)).thenReturn(channel);
NotificationRecord r = getNotificationRecord(channel);
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
index db010b8..88f1a53 100644
--- a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -280,6 +280,21 @@
@Test
@UiThreadTest
+ public void testCancelNotificationWhilePostedAndEnqueued() throws Exception {
+ mBinderService.enqueueNotificationWithTag(mContext.getPackageName(), "opPkg", "tag", 0,
+ generateNotificationRecord(null).getNotification(), new int[1], 0);
+ waitForIdle();
+ mBinderService.enqueueNotificationWithTag(mContext.getPackageName(), "opPkg", "tag", 0,
+ generateNotificationRecord(null).getNotification(), new int[1], 0);
+ mBinderService.cancelNotificationWithTag(mContext.getPackageName(), "tag", 0, 0);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(mContext.getPackageName());
+ assertEquals(0, notifs.length);
+ }
+
+ @Test
+ @UiThreadTest
public void testCancelNotificationsFromListenerImmediatelyAfterEnqueue() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).sbn;
mBinderService.enqueueNotificationWithTag(sbn.getPackageName(), "opPkg", "tag",
diff --git a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
index 9ea9ce9..8210072 100644
--- a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
@@ -776,6 +776,26 @@
}
@Test
+ public void testCreateChannel_addMissingSound() throws Exception {
+ final NotificationChannel channel =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ mHelper.createNotificationChannel(pkg, uid, channel, true);
+ assertNotNull(mHelper.getNotificationChannel(
+ pkg, uid, channel.getId(), false).getSound());
+ }
+
+ @Test
+ public void testCreateChannel_noOverrideSound() throws Exception {
+ Uri sound = new Uri.Builder().scheme("test").build();
+ final NotificationChannel channel = new NotificationChannel("id2", "name2",
+ NotificationManager.IMPORTANCE_DEFAULT);
+ channel.setSound(sound, mAudioAttributes);
+ mHelper.createNotificationChannel(pkg, uid, channel, true);
+ assertEquals(sound, mHelper.getNotificationChannel(
+ pkg, uid, channel.getId(), false).getSound());
+ }
+
+ @Test
public void testPermanentlyDeleteChannels() throws Exception {
NotificationChannel channel1 =
new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
diff --git a/services/tests/notification/src/com/android/server/notification/SnoozeHelperTest.java b/services/tests/notification/src/com/android/server/notification/SnoozeHelperTest.java
index 69724f4..c5abba8 100644
--- a/services/tests/notification/src/com/android/server/notification/SnoozeHelperTest.java
+++ b/services/tests/notification/src/com/android/server/notification/SnoozeHelperTest.java
@@ -18,6 +18,7 @@
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;
@@ -27,6 +28,7 @@
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
+import android.os.SystemClock;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import android.support.test.InstrumentationRegistry;
@@ -71,8 +73,11 @@
public void testSnoozeForTime() throws Exception {
NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
mSnoozeHelper.snooze(r, 1000);
+ ArgumentCaptor<Long> captor = ArgumentCaptor.forClass(Long.class);
verify(mAm, times(1)).setExactAndAllowWhileIdle(
- anyInt(), eq((long) 1000), any(PendingIntent.class));
+ anyInt(), captor.capture(), any(PendingIntent.class));
+ long actualSnoozedUntilDuration = captor.getValue() - SystemClock.elapsedRealtime();
+ assertTrue(Math.abs(actualSnoozedUntilDuration - 1000) < 2);
assertTrue(mSnoozeHelper.isSnoozed(
UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
}
diff --git a/services/tests/servicestests/src/com/android/server/BaseLockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/BaseLockSettingsServiceTests.java
index c89d35c..c6265bc 100644
--- a/services/tests/servicestests/src/com/android/server/BaseLockSettingsServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/BaseLockSettingsServiceTests.java
@@ -134,5 +134,13 @@
File storageDir = mStorage.mStorageDir;
assertTrue(FileUtils.deleteContents(storageDir));
}
+
+ protected static void assertArrayEquals(byte[] expected, byte[] actual) {
+ assertTrue(Arrays.equals(expected, actual));
+ }
+
+ protected static void assertArrayNotSame(byte[] expected, byte[] actual) {
+ assertFalse(Arrays.equals(expected, actual));
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/LockSettingsServiceTestable.java b/services/tests/servicestests/src/com/android/server/LockSettingsServiceTestable.java
index 613ec0b..cfdb5b1 100644
--- a/services/tests/servicestests/src/com/android/server/LockSettingsServiceTestable.java
+++ b/services/tests/servicestests/src/com/android/server/LockSettingsServiceTestable.java
@@ -21,9 +21,11 @@
import android.app.IActivityManager;
import android.content.Context;
import android.os.Handler;
+import android.os.Process;
+import android.os.RemoteException;
import android.os.storage.IStorageManager;
import android.security.KeyStore;
-import android.service.gatekeeper.IGateKeeperService;
+import android.security.keystore.KeyPermanentlyInvalidatedException;
import com.android.internal.widget.LockPatternUtils;
@@ -38,16 +40,18 @@
private IActivityManager mActivityManager;
private LockPatternUtils mLockPatternUtils;
private IStorageManager mStorageManager;
+ private MockGateKeeperService mGatekeeper;
public MockInjector(Context context, LockSettingsStorage storage, KeyStore keyStore,
IActivityManager activityManager, LockPatternUtils lockPatternUtils,
- IStorageManager storageManager) {
+ IStorageManager storageManager, MockGateKeeperService gatekeeper) {
super(context);
mLockSettingsStorage = storage;
mKeyStore = keyStore;
mActivityManager = activityManager;
mLockPatternUtils = lockPatternUtils;
mStorageManager = storageManager;
+ mGatekeeper = gatekeeper;
}
@Override
@@ -89,13 +93,25 @@
public IStorageManager getStorageManager() {
return mStorageManager;
}
+
+ @Override
+ public SyntheticPasswordManager getSyntheticPasswordManager(LockSettingsStorage storage) {
+ return new MockSyntheticPasswordManager(storage, mGatekeeper);
+ }
+
+ @Override
+ public int binderGetCallingUid() {
+ return Process.SYSTEM_UID;
+ }
+
+
}
protected LockSettingsServiceTestable(Context context, LockPatternUtils lockPatternUtils,
- LockSettingsStorage storage, IGateKeeperService gatekeeper, KeyStore keystore,
+ LockSettingsStorage storage, MockGateKeeperService gatekeeper, KeyStore keystore,
IStorageManager storageManager, IActivityManager mActivityManager) {
super(new MockInjector(context, storage, keystore, mActivityManager, lockPatternUtils,
- storageManager));
+ storageManager, gatekeeper));
mGateKeeperService = gatekeeper;
}
@@ -105,12 +121,18 @@
}
@Override
- protected String getDecryptedPasswordForTiedProfile(int userId) throws FileNotFoundException {
+ protected String getDecryptedPasswordForTiedProfile(int userId) throws FileNotFoundException, KeyPermanentlyInvalidatedException {
byte[] storedData = mStorage.readChildProfileLock(userId);
if (storedData == null) {
throw new FileNotFoundException("Child profile lock file not found");
}
+ try {
+ if (mGateKeeperService.getSecureUserId(userId) == 0) {
+ throw new KeyPermanentlyInvalidatedException();
+ }
+ } catch (RemoteException e) {
+ // shouldn't happen.
+ }
return new String(storedData);
}
-
}
diff --git a/services/tests/servicestests/src/com/android/server/LockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/LockSettingsServiceTests.java
index 4c2e171..ae9762a 100644
--- a/services/tests/servicestests/src/com/android/server/LockSettingsServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/LockSettingsServiceTests.java
@@ -123,6 +123,12 @@
UnifiedPassword, PRIMARY_USER_ID);
mStorageManager.setIgnoreBadUnlock(false);
assertEquals(profileSid, mGateKeeperService.getSecureUserId(MANAGED_PROFILE_USER_ID));
+
+ //Clear unified challenge
+ mService.setLockCredential(null, LockPatternUtils.CREDENTIAL_TYPE_NONE, UnifiedPassword,
+ PRIMARY_USER_ID);
+ assertEquals(0, mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
+ assertEquals(0, mGateKeeperService.getSecureUserId(MANAGED_PROFILE_USER_ID));
}
public void testManagedProfileSeparateChallenge() throws RemoteException {
diff --git a/services/tests/servicestests/src/com/android/server/LockSettingsStorageTestable.java b/services/tests/servicestests/src/com/android/server/LockSettingsStorageTestable.java
index e81b02f..18da1a5 100644
--- a/services/tests/servicestests/src/com/android/server/LockSettingsStorageTestable.java
+++ b/services/tests/servicestests/src/com/android/server/LockSettingsStorageTestable.java
@@ -31,19 +31,36 @@
@Override
String getLockPatternFilename(int userId) {
- return new File(mStorageDir,
- super.getLockPatternFilename(userId).replace('/', '-')).getAbsolutePath();
+ return makeDirs(mStorageDir,
+ super.getLockPatternFilename(userId)).getAbsolutePath();
}
@Override
String getLockPasswordFilename(int userId) {
- return new File(mStorageDir,
- super.getLockPasswordFilename(userId).replace('/', '-')).getAbsolutePath();
+ return makeDirs(mStorageDir,
+ super.getLockPasswordFilename(userId)).getAbsolutePath();
}
@Override
String getChildProfileLockFile(int userId) {
- return new File(mStorageDir,
- super.getChildProfileLockFile(userId).replace('/', '-')).getAbsolutePath();
+ return makeDirs(mStorageDir,
+ super.getChildProfileLockFile(userId)).getAbsolutePath();
+ }
+
+ @Override
+ protected File getSyntheticPasswordDirectoryForUser(int userId) {
+ return makeDirs(mStorageDir, super.getSyntheticPasswordDirectoryForUser(
+ userId).getAbsolutePath());
+ }
+
+ private File makeDirs(File baseDir, String filePath) {
+ File path = new File(filePath);
+ if (path.getParent() == null) {
+ return new File(baseDir, filePath);
+ } else {
+ File mappedDir = new File(baseDir, path.getParent());
+ mappedDir.mkdirs();
+ return new File(mappedDir, path.getName());
+ }
}
}
diff --git a/services/tests/servicestests/src/com/android/server/LockSettingsStorageTests.java b/services/tests/servicestests/src/com/android/server/LockSettingsStorageTests.java
index d110fea..c68fbdc 100644
--- a/services/tests/servicestests/src/com/android/server/LockSettingsStorageTests.java
+++ b/services/tests/servicestests/src/com/android/server/LockSettingsStorageTests.java
@@ -329,6 +329,16 @@
assertEquals("/data/system/users/3/gatekeeper.password.key", storage.getLockPasswordFilename(3));
}
+ public void testSyntheticPasswordState() {
+ final byte[] data = {1,2,3,4};
+ mStorage.writeSyntheticPasswordState(10, 1234L, "state", data);
+ assertArrayEquals(data, mStorage.readSyntheticPasswordState(10, 1234L, "state"));
+ assertEquals(null, mStorage.readSyntheticPasswordState(0, 1234L, "state"));
+
+ mStorage.deleteSyntheticPasswordState(10, 1234L, "state", true);
+ assertEquals(null, mStorage.readSyntheticPasswordState(10, 1234L, "state"));
+ }
+
private static void assertArrayEquals(byte[] expected, byte[] actual) {
if (!Arrays.equals(expected, actual)) {
fail("expected:<" + Arrays.toString(expected) +
diff --git a/services/tests/servicestests/src/com/android/server/MockGateKeeperService.java b/services/tests/servicestests/src/com/android/server/MockGateKeeperService.java
index 15983ca..bc93341 100644
--- a/services/tests/servicestests/src/com/android/server/MockGateKeeperService.java
+++ b/services/tests/servicestests/src/com/android/server/MockGateKeeperService.java
@@ -149,6 +149,15 @@
return authTokenMap.get(uid);
}
+ public AuthToken getAuthTokenForSid(long sid) {
+ for(AuthToken token : authTokenMap.values()) {
+ if (token.sid == sid) {
+ return token;
+ }
+ }
+ return null;
+ }
+
public void clearAuthToken(int uid) {
authTokenMap.remove(uid);
}
diff --git a/services/tests/servicestests/src/com/android/server/MockSyntheticPasswordManager.java b/services/tests/servicestests/src/com/android/server/MockSyntheticPasswordManager.java
new file mode 100644
index 0000000..93e3fc6
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/MockSyntheticPasswordManager.java
@@ -0,0 +1,102 @@
+/*
+ * 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;
+
+import android.util.ArrayMap;
+
+import junit.framework.AssertionFailedError;
+
+import java.nio.ByteBuffer;
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Arrays;
+
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+
+public class MockSyntheticPasswordManager extends SyntheticPasswordManager {
+
+ private MockGateKeeperService mGateKeeper;
+
+ public MockSyntheticPasswordManager(LockSettingsStorage storage,
+ MockGateKeeperService gatekeeper) {
+ super(storage);
+ mGateKeeper = gatekeeper;
+ }
+
+ private ArrayMap<String, byte[]> mBlobs = new ArrayMap<>();
+
+ @Override
+ protected byte[] decryptSPBlob(String blobKeyName, byte[] blob, byte[] applicationId) {
+ if (mBlobs.containsKey(blobKeyName) && !Arrays.equals(mBlobs.get(blobKeyName), blob)) {
+ throw new AssertionFailedError("blobKeyName content is overwritten: " + blobKeyName);
+ }
+ ByteBuffer buffer = ByteBuffer.allocate(blob.length);
+ buffer.put(blob, 0, blob.length);
+ buffer.flip();
+ int len;
+ len = buffer.getInt();
+ byte[] data = new byte[len];
+ buffer.get(data);
+ len = buffer.getInt();
+ byte[] appId = new byte[len];
+ buffer.get(appId);
+ long sid = buffer.getLong();
+ if (!Arrays.equals(appId, applicationId)) {
+ throw new AssertionFailedError("Invalid application id");
+ }
+ if (sid != 0 && mGateKeeper.getAuthTokenForSid(sid) == null) {
+ throw new AssertionFailedError("No valid auth token");
+ }
+ return data;
+ }
+
+ @Override
+ protected byte[] createSPBlob(String blobKeyName, byte[] data, byte[] applicationId, long sid) {
+ ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES + data.length + Integer.BYTES
+ + applicationId.length + Long.BYTES);
+ buffer.putInt(data.length);
+ buffer.put(data);
+ buffer.putInt(applicationId.length);
+ buffer.put(applicationId);
+ buffer.putLong(sid);
+ byte[] result = buffer.array();
+ mBlobs.put(blobKeyName, result);
+ return result;
+ }
+
+ @Override
+ protected void destroySPBlobKey(String keyAlias) {
+ }
+
+ @Override
+ protected long sidFromPasswordHandle(byte[] handle) {
+ return new MockGateKeeperService.VerifyHandle(handle).sid;
+ }
+
+ @Override
+ protected byte[] scrypt(String password, byte[] salt, int N, int r, int p, int outLen) {
+ try {
+ PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 10, outLen * 8);
+ SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
+ return f.generateSecret(spec).getEncoded();
+ } catch (InvalidKeySpecException | NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+}
diff --git a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
index 3a88e9c..4141f2f 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
@@ -56,8 +56,7 @@
import android.net.INetworkScoreCache;
import android.net.NetworkKey;
import android.net.NetworkScoreManager;
-import android.net.NetworkScorerAppManager;
-import android.net.NetworkScorerAppManager.NetworkScorerAppData;
+import android.net.NetworkScorerAppData;
import android.net.RecommendationRequest;
import android.net.RecommendationResult;
import android.net.ScoredNetwork;
@@ -117,16 +116,19 @@
private static final String SSID = "ssid";
private static final String SSID_2 = "ssid_2";
private static final String SSID_3 = "ssid_3";
+ private static final String INVALID_BSSID = "invalid_bssid";
private static final ComponentName RECOMMENDATION_SERVICE_COMP =
new ComponentName("newPackageName", "newScoringServiceClass");
+ private static final ComponentName USE_WIFI_ENABLE_ACTIVITY_COMP =
+ new ComponentName("useWifiPackageName", "enableUseWifiActivityClass");
private static final ScoredNetwork SCORED_NETWORK =
new ScoredNetwork(new NetworkKey(new WifiKey(quote(SSID), "00:00:00:00:00:00")),
null /* rssiCurve*/);
private static final ScoredNetwork SCORED_NETWORK_2 =
new ScoredNetwork(new NetworkKey(new WifiKey(quote(SSID_2), "00:00:00:00:00:00")),
null /* rssiCurve*/);
- private static final NetworkScorerAppData NEW_SCORER =
- new NetworkScorerAppData(1, RECOMMENDATION_SERVICE_COMP);
+ private static final NetworkScorerAppData NEW_SCORER = new NetworkScorerAppData(
+ 1, RECOMMENDATION_SERVICE_COMP, USE_WIFI_ENABLE_ACTIVITY_COMP);
@Mock private NetworkScorerAppManager mNetworkScorerAppManager;
@Mock private Context mContext;
@@ -198,10 +200,10 @@
}
@Test
- public void testSystemRunning() {
+ public void testOnUserUnlocked() {
when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER);
- mNetworkScoreService.systemRunning();
+ mNetworkScoreService.onUserUnlocked(0);
verify(mContext).bindServiceAsUser(MockUtils.checkIntent(
new Intent(NetworkScoreManager.ACTION_RECOMMEND_NETWORKS)
@@ -546,9 +548,9 @@
}
@Test
- public void testSetActiveScorer_noScoreNetworksPermission() {
- doThrow(new SecurityException()).when(mContext)
- .enforceCallingOrSelfPermission(eq(permission.SCORE_NETWORKS), anyString());
+ public void testSetActiveScorer_noRequestNetworkScoresPermission() {
+ when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
+ .thenReturn(PackageManager.PERMISSION_DENIED);
try {
mNetworkScoreService.setActiveScorer(null);
@@ -627,7 +629,7 @@
@Test
public void testIsCallerActiveScorer_noBoundService() throws Exception {
- mNetworkScoreService.systemRunning();
+ mNetworkScoreService.onUserUnlocked(0);
assertFalse(mNetworkScoreService.isCallerActiveScorer(Binder.getCallingUid()));
}
@@ -648,7 +650,7 @@
@Test
public void testGetActiveScorerPackage_notActive() throws Exception {
- mNetworkScoreService.systemRunning();
+ mNetworkScoreService.onUserUnlocked(0);
assertNull(mNetworkScoreService.getActiveScorerPackage());
}
@@ -656,10 +658,12 @@
@Test
public void testGetActiveScorerPackage_active() throws Exception {
when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER);
- mNetworkScoreService.systemRunning();
+ mNetworkScoreService.onUserUnlocked(0);
assertEquals(NEW_SCORER.getRecommendationServicePackageName(),
mNetworkScoreService.getActiveScorerPackage());
+ assertEquals(NEW_SCORER.getEnableUseOpenWifiActivity(),
+ mNetworkScoreService.getActiveScorer().getEnableUseOpenWifiActivity());
}
@Test
@@ -778,6 +782,54 @@
}
@Test
+ public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_nullSsid() throws Exception {
+ when(mWifiInfo.getSSID()).thenReturn(null);
+ NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
+ new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
+
+ List<ScoredNetwork> actualList =
+ cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
+
+ assertTrue(actualList.isEmpty());
+ }
+
+ @Test
+ public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_noneSsid() throws Exception {
+ when(mWifiInfo.getSSID()).thenReturn(WifiSsid.NONE);
+ NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
+ new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
+
+ List<ScoredNetwork> actualList =
+ cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
+
+ assertTrue(actualList.isEmpty());
+ }
+
+ @Test
+ public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_emptySsid() throws Exception {
+ when(mWifiInfo.getSSID()).thenReturn("");
+ NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
+ new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
+
+ List<ScoredNetwork> actualList =
+ cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
+
+ assertTrue(actualList.isEmpty());
+ }
+
+ @Test
+ public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_invalidBssid() throws Exception {
+ when(mWifiInfo.getBSSID()).thenReturn(INVALID_BSSID);
+ NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
+ new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
+
+ List<ScoredNetwork> actualList =
+ cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
+
+ assertTrue(actualList.isEmpty());
+ }
+
+ @Test
public void testCurrentNetworkScoreCacheFilter_scoreFiltered() throws Exception {
NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
@@ -813,6 +865,24 @@
}
@Test
+ public void testScanResultsScoreCacheFilter_invalidScanResults() throws Exception {
+ List<ScanResult> invalidScanResults = Lists.newArrayList(
+ new ScanResult(),
+ createScanResult("", SCORED_NETWORK.networkKey.wifiKey.bssid),
+ createScanResult(WifiSsid.NONE, SCORED_NETWORK.networkKey.wifiKey.bssid),
+ createScanResult(SSID, null),
+ createScanResult(SSID, INVALID_BSSID)
+ );
+ NetworkScoreService.ScanResultsScoreCacheFilter cacheFilter =
+ new NetworkScoreService.ScanResultsScoreCacheFilter(() -> invalidScanResults);
+
+ List<ScoredNetwork> actualList =
+ cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
+
+ assertTrue(actualList.isEmpty());
+ }
+
+ @Test
public void testScanResultsScoreCacheFilter_scoresFiltered() throws Exception {
NetworkScoreService.ScanResultsScoreCacheFilter cacheFilter =
new NetworkScoreService.ScanResultsScoreCacheFilter(() -> mScanResults);
@@ -853,8 +923,8 @@
throws Exception {
when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
.thenReturn(PackageManager.PERMISSION_GRANTED);
- NetworkScorerAppData expectedAppData =
- new NetworkScorerAppData(Binder.getCallingUid(), RECOMMENDATION_SERVICE_COMP);
+ NetworkScorerAppData expectedAppData = new NetworkScorerAppData(Binder.getCallingUid(),
+ RECOMMENDATION_SERVICE_COMP, USE_WIFI_ENABLE_ACTIVITY_COMP);
bindToScorer(expectedAppData);
assertEquals(expectedAppData, mNetworkScoreService.getActiveScorer());
}
@@ -889,13 +959,13 @@
return true;
}
});
- mNetworkScoreService.systemRunning();
+ mNetworkScoreService.onUserUnlocked(0);
}
private void bindToScorer(boolean callerIsScorer) {
final int callingUid = callerIsScorer ? Binder.getCallingUid() : Binder.getCallingUid() + 1;
- NetworkScorerAppData appData =
- new NetworkScorerAppData(callingUid, RECOMMENDATION_SERVICE_COMP);
+ NetworkScorerAppData appData = new NetworkScorerAppData(callingUid,
+ RECOMMENDATION_SERVICE_COMP, USE_WIFI_ENABLE_ACTIVITY_COMP);
bindToScorer(appData);
}
@@ -903,7 +973,7 @@
when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(appData);
when(mContext.bindServiceAsUser(isA(Intent.class), isA(ServiceConnection.class), anyInt(),
isA(UserHandle.class))).thenReturn(true);
- mNetworkScoreService.systemRunning();
+ mNetworkScoreService.onUserUnlocked(0);
}
private static class OnResultListener implements RemoteCallback.OnResultListener {
diff --git a/services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java b/services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java
new file mode 100644
index 0000000..e9a2d34
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java
@@ -0,0 +1,322 @@
+/*
+ * 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.server;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.assertTrue;
+
+import static org.junit.Assert.assertFalse;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.Manifest.permission;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.content.res.Resources;
+import android.net.NetworkScoreManager;
+import android.net.NetworkScorerAppData;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.internal.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatcher;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class NetworkScorerAppManagerTest {
+ @Mock private Context mMockContext;
+ @Mock private PackageManager mMockPm;
+ @Mock private Resources mResources;
+ @Mock private NetworkScorerAppManager.SettingsFacade mSettingsFacade;
+ private NetworkScorerAppManager mNetworkScorerAppManager;
+ private List<ResolveInfo> mAvailableServices;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mAvailableServices = new ArrayList<>();
+ when(mMockContext.getPackageManager()).thenReturn(mMockPm);
+ when(mMockPm.queryIntentServices(Mockito.argThat(new ArgumentMatcher<Intent>() {
+ @Override
+ public boolean matches(Object object) {
+ Intent intent = (Intent) object;
+ return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS.equals(intent.getAction());
+ }
+ }), eq(PackageManager.GET_META_DATA))).thenReturn(mAvailableServices);
+ when(mMockContext.getResources()).thenReturn(mResources);
+
+ mNetworkScorerAppManager = new NetworkScorerAppManager(mMockContext, mSettingsFacade);
+ }
+
+ @Test
+ public void testGetActiveScorer_providerAvailable() throws Exception {
+ final ComponentName recoComponent = new ComponentName("package1", "class1");
+ setNetworkRecoPackageSetting(recoComponent.getPackageName());
+ mockScoreNetworksGranted(recoComponent.getPackageName());
+ mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
+
+ final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
+ assertNotNull(activeScorer);
+ assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
+ assertEquals(924, activeScorer.packageUid);
+ }
+
+ @Test
+ public void testGetActiveScorer_permissionMissing() throws Exception {
+ final ComponentName recoComponent = new ComponentName("package1", "class1");
+ setNetworkRecoPackageSetting(recoComponent.getPackageName());
+ mockScoreNetworksDenied(recoComponent.getPackageName());
+ mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
+
+ final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
+ assertNull(activeScorer);
+ }
+
+ @Test
+ public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotSet()
+ throws Exception {
+ final ComponentName recoComponent = new ComponentName("package1", "class1");
+ setNetworkRecoPackageSetting(recoComponent.getPackageName());
+ mockScoreNetworksGranted(recoComponent.getPackageName());
+ mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
+ null /* enableUseOpenWifiPackageActivityPackage*/);
+
+ final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
+ assertNotNull(activeScorer);
+ assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
+ assertEquals(924, activeScorer.packageUid);
+ assertNull(activeScorer.getEnableUseOpenWifiActivity());
+ }
+
+ @Test
+ public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotResolved()
+ throws Exception {
+ final ComponentName recoComponent = new ComponentName("package1", "class1");
+ setNetworkRecoPackageSetting(recoComponent.getPackageName());
+ mockScoreNetworksGranted(recoComponent.getPackageName());
+ mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
+ "package2" /* enableUseOpenWifiPackageActivityPackage*/);
+
+ final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
+ assertNotNull(activeScorer);
+ assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
+ assertEquals(924, activeScorer.packageUid);
+ assertNull(activeScorer.getEnableUseOpenWifiActivity());
+ }
+
+ @Test
+ public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityResolved()
+ throws Exception {
+ final ComponentName recoComponent = new ComponentName("package1", "class1");
+ final ComponentName enableUseOpenWifiComponent = new ComponentName("package2", "class2");
+ setNetworkRecoPackageSetting(recoComponent.getPackageName());
+ mockScoreNetworksGranted(recoComponent.getPackageName());
+ mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
+ enableUseOpenWifiComponent.getPackageName());
+ mockEnableUseOpenWifiActivity(enableUseOpenWifiComponent);
+
+ final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
+ assertNotNull(activeScorer);
+ assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
+ assertEquals(924, activeScorer.packageUid);
+ assertEquals(enableUseOpenWifiComponent, activeScorer.getEnableUseOpenWifiActivity());
+ }
+
+ @Test
+ public void testGetActiveScorer_packageSettingIsNull()
+ throws Exception {
+ // NETWORK_RECOMMENDATIONS_PACKAGE is null
+
+ final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
+ assertNull(activeScorer);
+ }
+
+ @Test
+ public void testGetActiveScorer_packageSettingIsInvalid() throws Exception {
+ final ComponentName recoComponent = new ComponentName("package1", "class1");
+ setDefaultNetworkRecommendationPackage(recoComponent.getPackageName());
+ mockScoreNetworksGranted(recoComponent.getPackageName());
+ // NETWORK_RECOMMENDATIONS_PACKAGE is set to a package that isn't a recommender.
+
+ final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
+ assertNull(activeScorer);
+ }
+
+ @Test
+ public void testSetActiveScorer_noChange() throws Exception {
+ String packageName = "package";
+ setNetworkRecoPackageSetting(packageName);
+
+ assertTrue(mNetworkScorerAppManager.setActiveScorer(packageName));
+ verify(mSettingsFacade, never()).putString(any(), any(), any());
+ }
+
+ @Test
+ public void testSetActiveScorer_nullPackage() throws Exception {
+ String packageName = "package";
+ String defaultPackage = "defaultPackage";
+ setNetworkRecoPackageSetting(packageName);
+ setDefaultNetworkRecommendationPackage(defaultPackage);
+
+ assertTrue(mNetworkScorerAppManager.setActiveScorer(null));
+ verify(mSettingsFacade).putString(mMockContext,
+ Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, defaultPackage);
+ }
+
+ @Test
+ public void testSetActiveScorer_validPackage() throws Exception {
+ String packageName = "package";
+ String newPackage = "newPackage";
+ setNetworkRecoPackageSetting(packageName);
+ final ComponentName recoComponent = new ComponentName(newPackage, "class1");
+ mockScoreNetworksGranted(recoComponent.getPackageName());
+ mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, null);
+
+ assertTrue(mNetworkScorerAppManager.setActiveScorer(newPackage));
+ verify(mSettingsFacade).putString(mMockContext,
+ Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, newPackage);
+ }
+
+ @Test
+ public void testSetActiveScorer_invalidPackage() throws Exception {
+ String packageName = "package";
+ String newPackage = "newPackage";
+ setNetworkRecoPackageSetting(packageName);
+ // newPackage doesn't resolve to a valid recommender
+
+ assertFalse(mNetworkScorerAppManager.setActiveScorer(newPackage));
+ verify(mSettingsFacade, never()).putString(any(), any(), any());
+ }
+
+
+ @Test
+ public void testRevertToDefaultIfNoActive_notActive() throws Exception {
+ String defaultPackage = "defaultPackage";
+ setDefaultNetworkRecommendationPackage(defaultPackage);
+
+ mNetworkScorerAppManager.revertToDefaultIfNoActive();
+
+ verify(mSettingsFacade).putString(mMockContext,
+ Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, defaultPackage);
+ }
+
+ @Test
+ public void testRevertToDefaultIfNoActive_active() throws Exception {
+ String packageName = "package";
+ setNetworkRecoPackageSetting(packageName);
+ final ComponentName recoComponent = new ComponentName(packageName, "class1");
+ mockScoreNetworksGranted(recoComponent.getPackageName());
+ mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, null);
+
+ mNetworkScorerAppManager.revertToDefaultIfNoActive();
+
+ verify(mSettingsFacade, never()).putString(any(), any(), any());
+ }
+
+ private void setNetworkRecoPackageSetting(String packageName) {
+ when(mSettingsFacade.getString(mMockContext,
+ Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE)).thenReturn(packageName);
+ }
+
+ private void setDefaultNetworkRecommendationPackage(String name) {
+ when(mResources.getString(R.string.config_defaultNetworkRecommendationProviderPackage))
+ .thenReturn(name);
+ }
+
+ private void mockScoreNetworksGranted(String packageName) {
+ when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
+ .thenReturn(PackageManager.PERMISSION_GRANTED);
+ }
+
+ private void mockScoreNetworksDenied(String packageName) {
+ when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
+ .thenReturn(PackageManager.PERMISSION_DENIED);
+ }
+
+ private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid) {
+ mockRecommendationServiceAvailable(compName, packageUid, null);
+ }
+
+ private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid,
+ String enableUseOpenWifiActivityPackage) {
+ final ResolveInfo serviceInfo = new ResolveInfo();
+ serviceInfo.serviceInfo = new ServiceInfo();
+ serviceInfo.serviceInfo.name = compName.getClassName();
+ serviceInfo.serviceInfo.packageName = compName.getPackageName();
+ serviceInfo.serviceInfo.applicationInfo = new ApplicationInfo();
+ serviceInfo.serviceInfo.applicationInfo.uid = packageUid;
+ if (enableUseOpenWifiActivityPackage != null) {
+ serviceInfo.serviceInfo.metaData = new Bundle();
+ serviceInfo.serviceInfo.metaData.putString(
+ NetworkScoreManager.USE_OPEN_WIFI_PACKAGE_META_DATA,
+ enableUseOpenWifiActivityPackage);
+ }
+
+ final int flags = PackageManager.GET_META_DATA;
+ when(mMockPm.resolveService(
+ Mockito.argThat(new ArgumentMatcher<Intent>() {
+ @Override
+ public boolean matches(Object object) {
+ Intent intent = (Intent) object;
+ return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS
+ .equals(intent.getAction())
+ && compName.getPackageName().equals(intent.getPackage());
+ }
+ }), Mockito.eq(flags))).thenReturn(serviceInfo);
+
+ mAvailableServices.add(serviceInfo);
+ }
+
+ private void mockEnableUseOpenWifiActivity(final ComponentName useOpenWifiComp) {
+ final ResolveInfo resolveActivityInfo = new ResolveInfo();
+ resolveActivityInfo.activityInfo = new ActivityInfo();
+ resolveActivityInfo.activityInfo.name = useOpenWifiComp.getClassName();
+ resolveActivityInfo.activityInfo.packageName = useOpenWifiComp.getPackageName();
+
+ final int flags = 0;
+ when(mMockPm.resolveActivity(
+ Mockito.argThat(new ArgumentMatcher<Intent>() {
+ @Override
+ public boolean matches(Object object) {
+ Intent intent = (Intent) object;
+ return NetworkScoreManager.ACTION_CUSTOM_ENABLE.equals(intent.getAction())
+ && useOpenWifiComp.getPackageName().equals(intent.getPackage());
+ }
+ }), Mockito.eq(flags))).thenReturn(resolveActivityInfo);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/SyntheticPasswordTests.java b/services/tests/servicestests/src/com/android/server/SyntheticPasswordTests.java
new file mode 100644
index 0000000..6e5ade1
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/SyntheticPasswordTests.java
@@ -0,0 +1,329 @@
+/*
+ * 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;
+
+import static com.android.internal.widget.LockPatternUtils.SYNTHETIC_PASSWORD_ENABLED_KEY;
+import static com.android.internal.widget.LockPatternUtils.SYNTHETIC_PASSWORD_HANDLE_KEY;
+
+import android.os.RemoteException;
+import android.os.UserHandle;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.internal.widget.VerifyCredentialResponse;
+import com.android.server.SyntheticPasswordManager.AuthenticationResult;
+import com.android.server.SyntheticPasswordManager.AuthenticationToken;
+
+
+/**
+ * runtest frameworks-services -c com.android.server.SyntheticPasswordTests
+ */
+public class SyntheticPasswordTests extends BaseLockSettingsServiceTests {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testPasswordBasedSyntheticPassword() throws RemoteException {
+ final int USER_ID = 10;
+ final String PASSWORD = "user-password";
+ final String BADPASSWORD = "bad-password";
+ MockSyntheticPasswordManager manager = new MockSyntheticPasswordManager(mStorage, mGateKeeperService);
+ AuthenticationToken authToken = manager.newSyntheticPasswordAndSid(mGateKeeperService, null,
+ null, USER_ID);
+ long handle = manager.createPasswordBasedSyntheticPassword(mGateKeeperService, PASSWORD,
+ LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, authToken, USER_ID);
+
+ AuthenticationResult result = manager.unwrapPasswordBasedSyntheticPassword(mGateKeeperService, handle, PASSWORD, USER_ID);
+ assertEquals(result.authToken.deriveKeyStorePassword(), authToken.deriveKeyStorePassword());
+
+ result = manager.unwrapPasswordBasedSyntheticPassword(mGateKeeperService, handle, BADPASSWORD, USER_ID);
+ assertNull(result.authToken);
+ }
+
+ private void disableSyntheticPassword(int userId) throws RemoteException {
+ mService.setLong(SYNTHETIC_PASSWORD_ENABLED_KEY, 0, UserHandle.USER_SYSTEM);
+ }
+
+ private void enableSyntheticPassword(int userId) throws RemoteException {
+ mService.setLong(SYNTHETIC_PASSWORD_ENABLED_KEY, 1, UserHandle.USER_SYSTEM);
+ }
+
+ private boolean hasSyntheticPassword(int userId) throws RemoteException {
+ return mService.getLong(SYNTHETIC_PASSWORD_HANDLE_KEY, 0, userId) != 0;
+ }
+
+ public void testPasswordMigration() throws RemoteException {
+ final String PASSWORD = "testPasswordMigration-password";
+
+ disableSyntheticPassword(PRIMARY_USER_ID);
+ mService.setLockCredential(PASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null, PRIMARY_USER_ID);
+ long sid = mGateKeeperService.getSecureUserId(PRIMARY_USER_ID);
+ final byte[] primaryStorageKey = mStorageManager.getUserUnlockToken(PRIMARY_USER_ID);
+ enableSyntheticPassword(PRIMARY_USER_ID);
+ // Performs migration
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(PASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
+ assertEquals(sid, mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
+ assertTrue(hasSyntheticPassword(PRIMARY_USER_ID));
+
+ // SP-based verification
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(PASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
+ assertArrayNotSame(primaryStorageKey, mStorageManager.getUserUnlockToken(PRIMARY_USER_ID));
+ }
+
+ private void initializeCredentialUnderSP(String password, int userId) throws RemoteException {
+ enableSyntheticPassword(userId);
+ mService.setLockCredential(password, password != null ? LockPatternUtils.CREDENTIAL_TYPE_PASSWORD : LockPatternUtils.CREDENTIAL_TYPE_NONE, null, userId);
+ }
+
+ public void testSyntheticPasswordChangeCredential() throws RemoteException {
+ final String PASSWORD = "testSyntheticPasswordChangeCredential-password";
+ final String NEWPASSWORD = "testSyntheticPasswordChangeCredential-newpassword";
+
+ initializeCredentialUnderSP(PASSWORD, PRIMARY_USER_ID);
+ long sid = mGateKeeperService.getSecureUserId(PRIMARY_USER_ID);
+ mService.setLockCredential(NEWPASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, PASSWORD, PRIMARY_USER_ID);
+ mGateKeeperService.clearSecureUserId(PRIMARY_USER_ID);
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(NEWPASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
+ assertEquals(sid, mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
+ }
+
+ public void testSyntheticPasswordVerifyCredential() throws RemoteException {
+ final String PASSWORD = "testSyntheticPasswordVerifyCredential-password";
+ final String BADPASSWORD = "testSyntheticPasswordVerifyCredential-badpassword";
+
+ initializeCredentialUnderSP(PASSWORD, PRIMARY_USER_ID);
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(PASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
+
+ assertEquals(VerifyCredentialResponse.RESPONSE_ERROR,
+ mService.verifyCredential(BADPASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
+ }
+
+ public void testSyntheticPasswordClearCredential() throws RemoteException {
+ final String PASSWORD = "testSyntheticPasswordClearCredential-password";
+ final String NEWPASSWORD = "testSyntheticPasswordClearCredential-newpassword";
+
+ initializeCredentialUnderSP(PASSWORD, PRIMARY_USER_ID);
+ long sid = mGateKeeperService.getSecureUserId(PRIMARY_USER_ID);
+ // clear password
+ mService.setLockCredential(null, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, PASSWORD, PRIMARY_USER_ID);
+ assertEquals(0 ,mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
+
+ // set a new password
+ mService.setLockCredential(NEWPASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null, PRIMARY_USER_ID);
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(NEWPASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
+ assertNotSame(sid, mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
+ }
+
+ public void testSyntheticPasswordClearCredentialUntrusted() throws RemoteException {
+ final String PASSWORD = "testSyntheticPasswordClearCredential-password";
+ final String NEWPASSWORD = "testSyntheticPasswordClearCredential-newpassword";
+
+ initializeCredentialUnderSP(PASSWORD, PRIMARY_USER_ID);
+ long sid = mGateKeeperService.getSecureUserId(PRIMARY_USER_ID);
+ // clear password
+ mService.setLockCredential(null, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null, PRIMARY_USER_ID);
+ assertEquals(0 ,mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
+
+ // set a new password
+ mService.setLockCredential(NEWPASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null, PRIMARY_USER_ID);
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(NEWPASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
+ assertNotSame(sid, mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
+ }
+
+ public void testSyntheticPasswordChangeCredentialUntrusted() throws RemoteException {
+ final String PASSWORD = "testSyntheticPasswordClearCredential-password";
+ final String NEWPASSWORD = "testSyntheticPasswordClearCredential-newpassword";
+
+ initializeCredentialUnderSP(PASSWORD, PRIMARY_USER_ID);
+ long sid = mGateKeeperService.getSecureUserId(PRIMARY_USER_ID);
+ // Untrusted change password
+ mService.setLockCredential(NEWPASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null, PRIMARY_USER_ID);
+ assertNotSame(0 ,mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
+ assertNotSame(sid ,mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
+
+ // Verify the password
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(NEWPASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
+ }
+
+
+ public void testManagedProfileUnifiedChallengeMigration() throws RemoteException {
+ final String UnifiedPassword = "testManagedProfileUnifiedChallengeMigration-pwd";
+ disableSyntheticPassword(PRIMARY_USER_ID);
+ disableSyntheticPassword(MANAGED_PROFILE_USER_ID);
+ mService.setLockCredential(UnifiedPassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null, PRIMARY_USER_ID);
+ mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false, null);
+ final long primarySid = mGateKeeperService.getSecureUserId(PRIMARY_USER_ID);
+ final long profileSid = mGateKeeperService.getSecureUserId(MANAGED_PROFILE_USER_ID);
+ final byte[] primaryStorageKey = mStorageManager.getUserUnlockToken(PRIMARY_USER_ID);
+ final byte[] profileStorageKey = mStorageManager.getUserUnlockToken(MANAGED_PROFILE_USER_ID);
+ assertTrue(primarySid != 0);
+ assertTrue(profileSid != 0);
+ assertTrue(profileSid != primarySid);
+
+ // do migration
+ enableSyntheticPassword(PRIMARY_USER_ID);
+ enableSyntheticPassword(MANAGED_PROFILE_USER_ID);
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(UnifiedPassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
+
+ // verify
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(UnifiedPassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
+ assertEquals(primarySid, mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
+ assertEquals(profileSid, mGateKeeperService.getSecureUserId(MANAGED_PROFILE_USER_ID));
+ assertArrayNotSame(primaryStorageKey, mStorageManager.getUserUnlockToken(PRIMARY_USER_ID));
+ assertArrayNotSame(profileStorageKey, mStorageManager.getUserUnlockToken(MANAGED_PROFILE_USER_ID));
+ assertTrue(hasSyntheticPassword(PRIMARY_USER_ID));
+ assertTrue(hasSyntheticPassword(MANAGED_PROFILE_USER_ID));
+ }
+
+ public void testManagedProfileSeparateChallengeMigration() throws RemoteException {
+ final String primaryPassword = "testManagedProfileSeparateChallengeMigration-primary";
+ final String profilePassword = "testManagedProfileSeparateChallengeMigration-profile";
+ mService.setLockCredential(primaryPassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null, PRIMARY_USER_ID);
+ mService.setLockCredential(profilePassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null, MANAGED_PROFILE_USER_ID);
+ final long primarySid = mGateKeeperService.getSecureUserId(PRIMARY_USER_ID);
+ final long profileSid = mGateKeeperService.getSecureUserId(MANAGED_PROFILE_USER_ID);
+ final byte[] primaryStorageKey = mStorageManager.getUserUnlockToken(PRIMARY_USER_ID);
+ final byte[] profileStorageKey = mStorageManager.getUserUnlockToken(MANAGED_PROFILE_USER_ID);
+ assertTrue(primarySid != 0);
+ assertTrue(profileSid != 0);
+ assertTrue(profileSid != primarySid);
+
+ // do migration
+ enableSyntheticPassword(PRIMARY_USER_ID);
+ enableSyntheticPassword(MANAGED_PROFILE_USER_ID);
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(primaryPassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(profilePassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, MANAGED_PROFILE_USER_ID).getResponseCode());
+
+ // verify
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(primaryPassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(profilePassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, MANAGED_PROFILE_USER_ID).getResponseCode());
+ assertEquals(primarySid, mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
+ assertEquals(profileSid, mGateKeeperService.getSecureUserId(MANAGED_PROFILE_USER_ID));
+ assertArrayNotSame(primaryStorageKey, mStorageManager.getUserUnlockToken(PRIMARY_USER_ID));
+ assertArrayNotSame(profileStorageKey, mStorageManager.getUserUnlockToken(MANAGED_PROFILE_USER_ID));
+ assertTrue(hasSyntheticPassword(PRIMARY_USER_ID));
+ assertTrue(hasSyntheticPassword(MANAGED_PROFILE_USER_ID));
+ }
+
+ public void testTokenBasedResetPassword() throws RemoteException {
+ final String PASSWORD = "password";
+ final String PATTERN = "123654";
+ final String TOKEN = "some-high-entropy-secure-token";
+ initializeCredentialUnderSP(PASSWORD, PRIMARY_USER_ID);
+ final byte[] storageKey = mStorageManager.getUserUnlockToken(PRIMARY_USER_ID);
+
+ long handle = mService.addEscrowToken(TOKEN.getBytes(), PRIMARY_USER_ID);
+ assertFalse(mService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
+
+ mService.verifyCredential(PASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode();
+ assertTrue(mService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
+
+ mService.setLockCredentialWithToken(PATTERN, LockPatternUtils.CREDENTIAL_TYPE_PATTERN, handle, TOKEN.getBytes(), PRIMARY_USER_ID);
+
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(PATTERN, LockPatternUtils.CREDENTIAL_TYPE_PATTERN, 0, PRIMARY_USER_ID).getResponseCode());
+ assertArrayEquals(storageKey, mStorageManager.getUserUnlockToken(PRIMARY_USER_ID));
+ }
+
+ public void testTokenBasedClearPassword() throws RemoteException {
+ final String PASSWORD = "password";
+ final String PATTERN = "123654";
+ final String TOKEN = "some-high-entropy-secure-token";
+ initializeCredentialUnderSP(PASSWORD, PRIMARY_USER_ID);
+ final byte[] storageKey = mStorageManager.getUserUnlockToken(PRIMARY_USER_ID);
+
+ long handle = mService.addEscrowToken(TOKEN.getBytes(), PRIMARY_USER_ID);
+ assertFalse(mService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
+
+ mService.verifyCredential(PASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode();
+ assertTrue(mService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
+
+ mService.setLockCredentialWithToken(null, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, handle, TOKEN.getBytes(), PRIMARY_USER_ID);
+ mService.setLockCredentialWithToken(PATTERN, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, handle, TOKEN.getBytes(), PRIMARY_USER_ID);
+
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(PATTERN, LockPatternUtils.CREDENTIAL_TYPE_PATTERN, 0, PRIMARY_USER_ID).getResponseCode());
+ assertArrayEquals(storageKey, mStorageManager.getUserUnlockToken(PRIMARY_USER_ID));
+ }
+
+ public void testTokenBasedResetPasswordAfterCredentialChanges() throws RemoteException {
+ final String PASSWORD = "password";
+ final String PATTERN = "123654";
+ final String NEWPASSWORD = "password";
+ final String TOKEN = "some-high-entropy-secure-token";
+ initializeCredentialUnderSP(PASSWORD, PRIMARY_USER_ID);
+ final byte[] storageKey = mStorageManager.getUserUnlockToken(PRIMARY_USER_ID);
+
+ long handle = mService.addEscrowToken(TOKEN.getBytes(), PRIMARY_USER_ID);
+ assertFalse(mService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
+
+ mService.verifyCredential(PASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode();
+ assertTrue(mService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
+
+ mService.setLockCredential(PATTERN, LockPatternUtils.CREDENTIAL_TYPE_PATTERN, PASSWORD, PRIMARY_USER_ID);
+
+ mService.setLockCredentialWithToken(NEWPASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, handle, TOKEN.getBytes(), PRIMARY_USER_ID);
+
+ assertEquals(VerifyCredentialResponse.RESPONSE_OK,
+ mService.verifyCredential(NEWPASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
+ assertArrayEquals(storageKey, mStorageManager.getUserUnlockToken(PRIMARY_USER_ID));
+ }
+
+ public void testEscrowTokenActivatedImmediatelyIfNoUserPasswordNeedsMigration() throws RemoteException {
+ final String TOKEN = "some-high-entropy-secure-token";
+ enableSyntheticPassword(PRIMARY_USER_ID);
+ long handle = mService.addEscrowToken(TOKEN.getBytes(), PRIMARY_USER_ID);
+ assertTrue(mService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
+ assertEquals(0, mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
+ assertTrue(hasSyntheticPassword(PRIMARY_USER_ID));
+ }
+
+ public void testEscrowTokenActivatedImmediatelyIfNoUserPasswordNoMigration() throws RemoteException {
+ final String TOKEN = "some-high-entropy-secure-token";
+ initializeCredentialUnderSP(null, PRIMARY_USER_ID);
+ long handle = mService.addEscrowToken(TOKEN.getBytes(), PRIMARY_USER_ID);
+ assertTrue(mService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
+ assertEquals(0, mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
+ assertTrue(hasSyntheticPassword(PRIMARY_USER_ID));
+ }
+
+ // b/34600579
+ //TODO: add non-migration work profile case, and unify/un-unify transition.
+ //TODO: test token after user resets password
+ //TODO: test token based reset after unified work challenge
+ //TODO: test clear password after unified work challenge
+}
+
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 e6dd13f..ca9285b 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
@@ -313,6 +313,11 @@
}
@Override
+ String settingsSecureGetStringForUser(String name, int userHandle) {
+ return context.settings.settingsSecureGetStringForUser(name, userHandle);
+ }
+
+ @Override
void settingsSecurePutIntForUser(String name, int value, int userHandle) {
context.settings.settingsSecurePutIntForUser(name, value, userHandle);
}
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 a186b59..d65a9bf 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -38,6 +38,7 @@
import android.content.res.Resources;
import android.graphics.Color;
import android.net.IIpConnectivityMetrics;
+import android.net.Uri;
import android.content.pm.UserInfo;
import android.net.wifi.WifiInfo;
import android.os.Build.VERSION_CODES;
@@ -56,6 +57,7 @@
import com.android.internal.R;
import com.android.internal.util.ParcelableString;
+import com.android.internal.widget.LockPatternUtils;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.pm.UserRestrictionsUtils;
@@ -917,6 +919,8 @@
assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
dpm.addUserRestriction(admin1, UserManager.DISALLOW_ADD_USER);
+ when(mContext.userManager.hasUserRestriction(eq(UserManager.DISALLOW_ADD_USER),
+ MockUtils.checkUserHandle(UserHandle.USER_SYSTEM))).thenReturn(true);
assertTrue(dpm.isAdminActive(admin1));
assertFalse(dpm.isRemovingAdmin(admin1, UserHandle.USER_SYSTEM));
@@ -946,6 +950,10 @@
// Now DO shouldn't be set.
assertNull(dpm.getDeviceOwnerComponentOnAnyUser());
+ verify(mContext.userManager).setUserRestriction(eq(UserManager.DISALLOW_ADD_USER),
+ eq(false),
+ MockUtils.checkUserHandle(UserHandle.USER_SYSTEM));
+
verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
eq(UserHandle.USER_SYSTEM),
eq(null),
@@ -3735,6 +3743,180 @@
dpm.getPermissionGrantState(admin1, app2, permission));
}
+ public void testResetPasswordWithToken() throws Exception {
+ mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
+ setupDeviceOwner();
+ // test token validation
+ try {
+ dpm.setResetPasswordToken(admin1, new byte[31]);
+ fail("should not have accepted tokens too short");
+ } catch (IllegalArgumentException expected) {
+ }
+ // test adding a token
+ final byte[] token = new byte[32];
+ final long handle = 123456;
+ final String password = "password";
+ when(mContext.lockPatternUtils.addEscrowToken(eq(token), eq(UserHandle.USER_SYSTEM)))
+ .thenReturn(handle);
+ assertTrue(dpm.setResetPasswordToken(admin1, token));
+
+ // test password activation
+ when(mContext.lockPatternUtils.isEscrowTokenActive(eq(handle), eq(UserHandle.USER_SYSTEM)))
+ .thenReturn(true);
+ assertTrue(dpm.isResetPasswordTokenActive(admin1));
+
+ // test reset password with token
+ when(mContext.lockPatternUtils.setLockCredentialWithToken(eq(password),
+ eq(LockPatternUtils.CREDENTIAL_TYPE_PASSWORD), eq(handle), eq(token),
+ eq(UserHandle.USER_SYSTEM)))
+ .thenReturn(true);
+ assertTrue(dpm.resetPasswordWithToken(admin1, password, token, 0));
+
+ // test removing a token
+ when(mContext.lockPatternUtils.removeEscrowToken(eq(handle), eq(UserHandle.USER_SYSTEM)))
+ .thenReturn(true);
+ assertTrue(dpm.clearResetPasswordToken(admin1));
+ }
+
+ public void testIsDefaultInputMethodSetByOwnerForDeviceOwner() throws Exception {
+ final String defaultIme = Settings.Secure.DEFAULT_INPUT_METHOD;
+ final Uri defaultImeUri = Settings.Secure.getUriFor(defaultIme);
+ final UserHandle firstUser = UserHandle.SYSTEM;
+ final UserHandle secondUser = UserHandle.of(DpmMockContext.CALLER_USER_HANDLE);
+
+ // Set up a Device Owner.
+ mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
+ setupDeviceOwner();
+
+ // First and second user set default IMEs manually.
+ final long ident = mContext.binder.clearCallingIdentity();
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
+ mContext.binder.restoreCallingIdentity(ident);
+
+ // Device Owner changes default IME for first user.
+ when(mContext.settings.settingsSecureGetStringForUser(defaultIme, UserHandle.USER_SYSTEM))
+ .thenReturn("ime1");
+ dpm.setSecureSetting(admin1, defaultIme, "ime2");
+ verify(mContext.settings).settingsSecurePutStringForUser(defaultIme, "ime2",
+ UserHandle.USER_SYSTEM);
+ reset(mContext.settings);
+ dpms.notifyChangeToContentObserver(defaultImeUri, UserHandle.USER_SYSTEM);
+ mContext.binder.clearCallingIdentity();
+ assertTrue(dpm.isDefaultInputMethodSetByOwner(firstUser));
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
+ mContext.binder.restoreCallingIdentity(ident);
+
+ // Second user changes default IME manually.
+ dpms.notifyChangeToContentObserver(defaultImeUri, DpmMockContext.CALLER_USER_HANDLE);
+ mContext.binder.clearCallingIdentity();
+ assertTrue(dpm.isDefaultInputMethodSetByOwner(firstUser));
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
+ mContext.binder.restoreCallingIdentity(ident);
+
+ // First user changes default IME manually.
+ dpms.notifyChangeToContentObserver(defaultImeUri, UserHandle.USER_SYSTEM);
+ mContext.binder.clearCallingIdentity();
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
+ mContext.binder.restoreCallingIdentity(ident);
+
+ // Device Owner changes default IME for first user again.
+ when(mContext.settings.settingsSecureGetStringForUser(defaultIme, UserHandle.USER_SYSTEM))
+ .thenReturn("ime2");
+ dpm.setSecureSetting(admin1, defaultIme, "ime3");
+ verify(mContext.settings).settingsSecurePutStringForUser(defaultIme, "ime3",
+ UserHandle.USER_SYSTEM);
+ dpms.notifyChangeToContentObserver(defaultImeUri, UserHandle.USER_SYSTEM);
+ mContext.binder.clearCallingIdentity();
+ assertTrue(dpm.isDefaultInputMethodSetByOwner(firstUser));
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
+
+ // Restarting the DPMS should not lose information.
+ initializeDpms();
+ assertTrue(dpm.isDefaultInputMethodSetByOwner(firstUser));
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
+ mContext.binder.restoreCallingIdentity(ident);
+
+ // Device Owner can find out whether it set the default IME itself.
+ assertTrue(dpm.isDefaultInputMethodSetByOwner(firstUser));
+
+ // Removing the Device Owner should clear the information that it set the default IME.
+ clearDeviceOwner();
+ mContext.binder.clearCallingIdentity();
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
+ }
+
+ public void testIsDefaultInputMethodSetByOwnerForProfileOwner() throws Exception {
+ final String defaultIme = Settings.Secure.DEFAULT_INPUT_METHOD;
+ final Uri defaultImeUri = Settings.Secure.getUriFor(defaultIme);
+ final UserHandle firstUser = UserHandle.SYSTEM;
+ final UserHandle secondUser = UserHandle.of(DpmMockContext.CALLER_USER_HANDLE);
+
+ // Set up a profile owner.
+ setupProfileOwner();
+
+ // First and second user set default IMEs manually.
+ final long ident = mContext.binder.clearCallingIdentity();
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
+ mContext.binder.restoreCallingIdentity(ident);
+
+ // Profile Owner changes default IME for second user.
+ when(mContext.settings.settingsSecureGetStringForUser(defaultIme,
+ DpmMockContext.CALLER_USER_HANDLE)).thenReturn("ime1");
+ dpm.setSecureSetting(admin1, defaultIme, "ime2");
+ verify(mContext.settings).settingsSecurePutStringForUser(defaultIme, "ime2",
+ DpmMockContext.CALLER_USER_HANDLE);
+ reset(mContext.settings);
+ dpms.notifyChangeToContentObserver(defaultImeUri, DpmMockContext.CALLER_USER_HANDLE);
+ mContext.binder.clearCallingIdentity();
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
+ assertTrue(dpm.isDefaultInputMethodSetByOwner(secondUser));
+ mContext.binder.restoreCallingIdentity(ident);
+
+ // First user changes default IME manually.
+ dpms.notifyChangeToContentObserver(defaultImeUri, UserHandle.USER_SYSTEM);
+ mContext.binder.clearCallingIdentity();
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
+ assertTrue(dpm.isDefaultInputMethodSetByOwner(secondUser));
+ mContext.binder.restoreCallingIdentity(ident);
+
+ // Second user changes default IME manually.
+ dpms.notifyChangeToContentObserver(defaultImeUri, DpmMockContext.CALLER_USER_HANDLE);
+ mContext.binder.clearCallingIdentity();
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
+ mContext.binder.restoreCallingIdentity(ident);
+
+ // Profile Owner changes default IME for second user again.
+ when(mContext.settings.settingsSecureGetStringForUser(defaultIme,
+ DpmMockContext.CALLER_USER_HANDLE)).thenReturn("ime2");
+ dpm.setSecureSetting(admin1, defaultIme, "ime3");
+ verify(mContext.settings).settingsSecurePutStringForUser(defaultIme, "ime3",
+ DpmMockContext.CALLER_USER_HANDLE);
+ dpms.notifyChangeToContentObserver(defaultImeUri, DpmMockContext.CALLER_USER_HANDLE);
+ mContext.binder.clearCallingIdentity();
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
+ assertTrue(dpm.isDefaultInputMethodSetByOwner(secondUser));
+
+ // Restarting the DPMS should not lose information.
+ initializeDpms();
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
+ assertTrue(dpm.isDefaultInputMethodSetByOwner(secondUser));
+ mContext.binder.restoreCallingIdentity(ident);
+
+ // Profile Owner can find out whether it set the default IME itself.
+ assertTrue(dpm.isDefaultInputMethodSetByOwner(secondUser));
+
+ // Removing the Profile Owner should clear the information that it set the default IME.
+ dpm.clearProfileOwner(admin1);
+ mContext.binder.clearCallingIdentity();
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
+ assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
+ }
+
private void setUserSetupCompleteForUser(boolean isUserSetupComplete, int userhandle) {
when(mContext.settings.settingsSecureGetIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 0,
userhandle)).thenReturn(isUserSetupComplete ? 1 : 0);
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java
index 46aaf83..258b393 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java
@@ -201,6 +201,10 @@
return 0;
}
+ public String settingsSecureGetStringForUser(String name, int userHandle) {
+ return null;
+ }
+
public void settingsSecurePutIntForUser(String name, int value, int userHandle) {
}
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java
index ed6779c..43e2610 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java
@@ -174,6 +174,8 @@
anyInt(),
eq(UserHandle.getUserId(packageUid)));
+ doReturn(new String[] {admin.getPackageName()}).when(mMockContext.ipackageManager)
+ .getPackagesForUid(eq(packageUid));
// Set up getPackageInfo().
markPackageAsInstalled(admin.getPackageName(), ai, UserHandle.getUserId(packageUid));
}
diff --git a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
index f615bf3..33e1a16 100644
--- a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
@@ -10,7 +10,6 @@
import android.test.AndroidTestCase;
import android.test.RenamingDelegatingContext;
import android.util.Log;
-import android.util.ArraySet;
import com.android.server.job.JobStore.JobSet;
import com.android.server.job.controllers.JobStatus;
@@ -278,6 +277,8 @@
assertEquals("Invalid charging constraint.", first.isRequireCharging(),
second.isRequireCharging());
+ assertEquals("Invalid battery not low constraint.", first.isRequireBatteryNotLow(),
+ second.isRequireBatteryNotLow());
assertEquals("Invalid idle constraint.", first.isRequireDeviceIdle(),
second.isRequireDeviceIdle());
assertEquals("Invalid unmetered constraint.",
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index e2e1844..1b59d72 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -34,6 +34,7 @@
import static org.mockito.Mockito.when;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.Activity;
import android.app.ActivityManager;
@@ -1053,7 +1054,7 @@
ret.applicationInfo.flags &= ~ApplicationInfo.FLAG_INSTALLED;
}
if (mEphemeralPackages.contains(PackageWithUser.of(userId, packageName))) {
- ret.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_EPHEMERAL;
+ ret.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_INSTANT;
}
if (mSystemPackages.contains(packageName)) {
ret.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
@@ -1324,20 +1325,23 @@
protected ShortcutInfo makeShortcut(String id) {
return makeShortcut(
id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
- makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
+ makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
+ /* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
}
@Deprecated // Title was renamed to short label.
protected ShortcutInfo makeShortcutWithTitle(String id, String title) {
return makeShortcut(
id, title, /* activity =*/ null, /* icon =*/ null,
- makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
+ makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
+ /* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
}
protected ShortcutInfo makeShortcutWithShortLabel(String id, String shortLabel) {
return makeShortcut(
id, shortLabel, /* activity =*/ null, /* icon =*/ null,
- makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
+ makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
+ /* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
}
/**
@@ -1346,7 +1350,8 @@
protected ShortcutInfo makeShortcutWithTimestamp(String id, long timestamp) {
final ShortcutInfo s = makeShortcut(
id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
- makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
+ makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
+ /* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
s.setTimestamp(timestamp);
return s;
}
@@ -1358,7 +1363,8 @@
ComponentName activity) {
final ShortcutInfo s = makeShortcut(
id, "Title-" + id, activity, /* icon =*/ null,
- makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
+ makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
+ /* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
s.setTimestamp(timestamp);
return s;
}
@@ -1369,7 +1375,27 @@
protected ShortcutInfo makeShortcutWithIcon(String id, Icon icon) {
return makeShortcut(
id, "Title-" + id, /* activity =*/ null, icon,
- makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
+ makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
+ /* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
+ }
+
+ protected ShortcutInfo makeChooserShortcut(String id, int i, boolean includeIntent) {
+ List<IntentFilter> filters = new ArrayList<>();
+ List<ComponentName> componentNames = new ArrayList<>();
+ for(int j = 0; j < i; j++) {
+ final IntentFilter filter = new IntentFilter();
+ filter.addAction("view");
+ filters.add(filter);
+
+ componentNames.add(new ComponentName("xxxx", "yy" + i));
+ }
+ Intent intent = null;
+ if (includeIntent) {
+ intent = makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class);
+ }
+ return makeShortcut(
+ id, "Title-" + id, /* activity =*/ null, /* icon */ null,
+ intent, /* rank =*/ 0, filters, componentNames);
}
protected ShortcutInfo makePackageShortcut(String packageName, String id) {
@@ -1378,7 +1404,8 @@
setCaller(packageName);
ShortcutInfo s = makeShortcut(
id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
- makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
+ makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
+ /* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
setCaller(origCaller); // restore the caller
return s;
@@ -1402,39 +1429,52 @@
protected ShortcutInfo makeShortcutWithActivity(String id, ComponentName activity) {
return makeShortcut(
id, "Title-" + id, activity, /* icon =*/ null,
- makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
+ makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
+ /* chooserFilters =*/ null, /* chooserComponentNames =*/ null);
}
protected ShortcutInfo makeShortcutWithIntent(String id, Intent intent) {
return makeShortcut(
id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
- intent, /* rank =*/ 0);
+ intent, /* rank =*/ 0, /* chooserFilters =*/ null,
+ /* chooserComponentNames =*/ null);
+
}
protected ShortcutInfo makeShortcutWithActivityAndTitle(String id, ComponentName activity,
String title) {
return makeShortcut(
id, title, activity, /* icon =*/ null,
- makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
+ makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
+ /* chooserFilters =*/ null, /* chooserComponentNames =*/ null);
}
protected ShortcutInfo makeShortcutWithActivityAndRank(String id, ComponentName activity,
int rank) {
return makeShortcut(
id, "Title-" + id, activity, /* icon =*/ null,
- makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), rank);
+ makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), rank,
+ /* chooserFilters =*/ null, /* chooserComponentNames =*/ null);
}
/**
* Make a shortcut with details.
*/
protected ShortcutInfo makeShortcut(String id, String title, ComponentName activity,
- Icon icon, Intent intent, int rank) {
+ Icon icon, Intent intent, int rank, @Nullable List<IntentFilter> chooserFilters,
+ @Nullable List<ComponentName> chooserComponentNames) {
final ShortcutInfo.Builder b = new ShortcutInfo.Builder(mClientContext, id)
.setActivity(new ComponentName(mClientContext.getPackageName(), "main"))
.setShortLabel(title)
- .setRank(rank)
- .setIntent(intent);
+ .setRank(rank);
+ if (intent != null) {
+ b.setIntent(intent);
+ }
+ if (chooserFilters != null) {
+ for (int i = 0; i < chooserFilters.size(); i++) {
+ b.addChooserIntentFilter(chooserFilters.get(i), chooserComponentNames.get(i));
+ }
+ }
if (icon != null) {
b.setIcon(icon);
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
index baf60c5..325d99a 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
@@ -388,6 +388,7 @@
ApplicationInfo.PRIVATE_FLAG_PRIVILEGED /*pkgPrivateFlags*/,
null /*installUser*/,
false /*allowInstall*/,
+ false /*instantApp*/,
null /*parentPkgName*/,
null /*childPkgNames*/,
UserManagerService.getInstance(),
@@ -428,6 +429,7 @@
0 /*pkgPrivateFlags*/,
UserHandle.SYSTEM /*installUser*/,
true /*allowInstall*/,
+ false /*instantApp*/,
null /*parentPkgName*/,
null /*childPkgNames*/,
UserManagerService.getInstance(),
@@ -471,6 +473,7 @@
0 /*pkgPrivateFlags*/,
null /*installUser*/,
false /*allowInstall*/,
+ false /*instantApp*/,
null /*parentPkgName*/,
null /*childPkgNames*/,
UserManagerService.getInstance(),
@@ -514,6 +517,7 @@
0 /*pkgPrivateFlags*/,
null /*installUser*/,
false /*allowInstall*/,
+ false /*instantApp*/,
null /*parentPkgName*/,
null /*childPkgNames*/,
UserManagerService.getInstance(),
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
index e5640c7..d8db331 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
@@ -140,6 +140,36 @@
assertAllFieldsExist(deserialized);
}
+ @Test
+ public void test_stringInterning() throws Exception {
+ PackageParser.Package pkg = new PackageParser.Package("foo");
+ setKnownFields(pkg);
+
+ Parcel p = Parcel.obtain();
+ pkg.writeToParcel(p, 0 /* flags */);
+
+ p.setDataPosition(0);
+ PackageParser.Package deserialized = new PackageParser.Package(p);
+
+ p.setDataPosition(0);
+ PackageParser.Package deserialized2 = new PackageParser.Package(p);
+
+ assertSame(deserialized.packageName, deserialized2.packageName);
+ assertSame(deserialized.applicationInfo.permission,
+ deserialized2.applicationInfo.permission);
+ assertSame(deserialized.requestedPermissions.get(0),
+ deserialized2.requestedPermissions.get(0));
+ assertSame(deserialized.protectedBroadcasts.get(0),
+ deserialized2.protectedBroadcasts.get(0));
+ assertSame(deserialized.usesLibraries.get(0),
+ deserialized2.usesLibraries.get(0));
+ assertSame(deserialized.usesOptionalLibraries.get(0),
+ deserialized2.usesOptionalLibraries.get(0));
+ assertSame(deserialized.mVersionName, deserialized2.mVersionName);
+ assertSame(deserialized.mSharedUserId, deserialized2.mSharedUserId);
+ }
+
+
/**
* A trivial subclass of package parser that only caches the package name, and throws away
* all other information.
@@ -167,7 +197,6 @@
assertEquals(a.installLocation, b.installLocation);
assertEquals(a.coreApp, b.coreApp);
assertEquals(a.mRequiredForAllUsers, b.mRequiredForAllUsers);
- assertEquals(a.mOverlayPriority, b.mOverlayPriority);
assertEquals(a.mTrustedOverlay, b.mTrustedOverlay);
assertEquals(a.use32bitAbi, b.use32bitAbi);
assertEquals(a.packageName, b.packageName);
@@ -380,13 +409,11 @@
assertTrue(Arrays.equals(a.splitSourceDirs, that.splitSourceDirs));
assertTrue(Arrays.equals(a.splitPublicSourceDirs, that.splitPublicSourceDirs));
assertTrue(Arrays.equals(a.resourceDirs, that.resourceDirs));
- assertEquals(a.seinfo, that.seinfo);
+ assertEquals(a.seInfo, that.seInfo);
assertTrue(Arrays.equals(a.sharedLibraryFiles, that.sharedLibraryFiles));
assertEquals(a.dataDir, that.dataDir);
assertEquals(a.deviceProtectedDataDir, that.deviceProtectedDataDir);
- assertEquals(a.deviceEncryptedDataDir, that.deviceEncryptedDataDir);
assertEquals(a.credentialProtectedDataDir, that.credentialProtectedDataDir);
- assertEquals(a.credentialEncryptedDataDir, that.credentialEncryptedDataDir);
assertEquals(a.nativeLibraryDir, that.nativeLibraryDir);
assertEquals(a.secondaryNativeLibraryDir, that.secondaryNativeLibraryDir);
assertEquals(a.nativeLibraryRootDir, that.nativeLibraryRootDir);
@@ -403,15 +430,14 @@
pkg.installLocation = 100;
pkg.coreApp = true;
pkg.mRequiredForAllUsers = true;
- pkg.mOverlayPriority = 100;
pkg.mTrustedOverlay = true;
pkg.use32bitAbi = true;
pkg.packageName = "foo";
- pkg.splitNames = new String[] { "foo" };
- pkg.volumeUuid = "foo";
- pkg.codePath = "foo";
- pkg.baseCodePath = "foo";
- pkg.splitCodePaths = new String[] { "foo" };
+ pkg.splitNames = new String[] { "foo2" };
+ pkg.volumeUuid = "foo3";
+ pkg.codePath = "foo4";
+ pkg.baseCodePath = "foo5";
+ pkg.splitCodePaths = new String[] { "foo6" };
pkg.splitRevisionCodes = new int[] { 100 };
pkg.splitFlags = new int[] { 100 };
pkg.splitPrivateFlags = new int[] { 100 };
@@ -428,48 +454,55 @@
pkg.providers.add(new PackageParser.Provider(dummy, new ProviderInfo()));
pkg.services.add(new PackageParser.Service(dummy, new ServiceInfo()));
pkg.instrumentation.add(new PackageParser.Instrumentation(dummy, new InstrumentationInfo()));
- pkg.requestedPermissions.add("foo");
+ pkg.requestedPermissions.add("foo7");
pkg.protectedBroadcasts = new ArrayList<>();
- pkg.protectedBroadcasts.add("foo");
+ pkg.protectedBroadcasts.add("foo8");
- pkg.parentPackage = new PackageParser.Package("foo");
+ pkg.parentPackage = new PackageParser.Package("foo9");
pkg.childPackages = new ArrayList<>();
pkg.childPackages.add(new PackageParser.Package("bar"));
+ pkg.staticSharedLibName = "foo23";
+ pkg.staticSharedLibVersion = 100;
+ pkg.usesStaticLibraries = new ArrayList<>();
+ pkg.usesStaticLibraries.add("foo23");
+ pkg.usesStaticLibrariesCertDigests = new String[] { "digest" };
+ pkg.usesStaticLibrariesVersions = new int[] { 100 };
+
pkg.libraryNames = new ArrayList<>();
- pkg.libraryNames.add("foo");
+ pkg.libraryNames.add("foo10");
pkg.usesLibraries = new ArrayList<>();
- pkg.usesLibraries.add("foo");
+ pkg.usesLibraries.add("foo11");
pkg.usesOptionalLibraries = new ArrayList<>();
- pkg.usesOptionalLibraries.add("foo");
+ pkg.usesOptionalLibraries.add("foo12");
- pkg.usesLibraryFiles = new String[] { "foo "};
+ pkg.usesLibraryFiles = new String[] { "foo13"};
pkg.mOriginalPackages = new ArrayList<>();
- pkg.mOriginalPackages.add("foo");
+ pkg.mOriginalPackages.add("foo14");
- pkg.mRealPackage = "foo";
+ pkg.mRealPackage = "foo15";
pkg.mAdoptPermissions = new ArrayList<>();
- pkg.mAdoptPermissions.add("foo");
+ pkg.mAdoptPermissions.add("foo16");
pkg.mAppMetaData = new Bundle();
- pkg.mVersionName = "foo";
- pkg.mSharedUserId = "foo";
+ pkg.mVersionName = "foo17";
+ pkg.mSharedUserId = "foo18";
pkg.mSignatures = new Signature[] { new Signature(new byte[16]) };
pkg.mCertificates = new Certificate[][] { new Certificate[] { null }};
pkg.mExtras = new Bundle();
- pkg.mRestrictedAccountType = "foo";
- pkg.mRequiredAccountType = "foo";
- pkg.mOverlayTarget = "foo";
+ pkg.mRestrictedAccountType = "foo19";
+ pkg.mRequiredAccountType = "foo20";
+ pkg.mOverlayTarget = "foo21";
pkg.mSigningKeys = new ArraySet<>();
pkg.mUpgradeKeySets = new ArraySet<>();
pkg.mKeySetMapping = new ArrayMap<>();
- pkg.cpuAbiOverride = "foo";
+ pkg.cpuAbiOverride = "foo22";
pkg.restrictUpdateHash = new byte[16];
pkg.preferredActivityFilters = new ArrayList<>();
@@ -504,7 +537,7 @@
// Sanity check for list fields: Assume they're non-null and contain precisely
// one element.
List<?> list = (List<?>) f.get(pkg);
- assertNotNull(list);
+ assertNotNull("List was null: " + f, list);
assertEquals(1, list.size());
} else if (fieldType.getComponentType() != null) {
// Sanity check for array fields: Assume they're non-null and contain precisely
@@ -514,15 +547,16 @@
} else if (fieldType == String.class) {
// String fields: Check that they're set to "foo".
String value = (String) f.get(pkg);
- assertEquals("foo", value);
+
+ assertTrue("Bad value for field: " + f, value != null && value.startsWith("foo"));
} else if (fieldType == int.class) {
// int fields: Check that they're set to 100.
int value = (int) f.get(pkg);
- assertEquals(100, value);
+ assertEquals("Bad value for field: " + f, 100, value);
} else {
// All other fields: Check that they're set.
Object o = f.get(pkg);
- assertNotNull("Field was null: " + f.getName(), o);
+ assertNotNull("Field was null: " + f, o);
}
}
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
index 980aa2d..94ff07f 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
@@ -15,6 +15,7 @@
*/
package com.android.server.pm;
+import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllChooser;
import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllDisabled;
import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllDynamic;
import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllDynamicOrPinned;
@@ -75,6 +76,8 @@
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
+import android.graphics.drawable.AdaptiveIconDrawable;
+import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.Bundle;
@@ -244,6 +247,8 @@
final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.icon1);
final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
getTestContext().getResources(), R.drawable.icon2));
+ final Icon icon3 = Icon.createWithMaskableBitmap(BitmapFactory.decodeResource(
+ getTestContext().getResources(), R.drawable.icon2));
final ShortcutInfo si1 = makeShortcut(
"shortcut1",
@@ -252,7 +257,9 @@
icon1,
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
"key1", "val1", "nest", makeBundle("key", 123)),
- /* weight */ 10);
+ /* weight */ 10,
+ /* chooserFilter=*/ null,
+ /* chooserComponentNames=*/ null);
final ShortcutInfo si2 = makeShortcut(
"shortcut2",
@@ -260,13 +267,23 @@
/* activity */ null,
icon2,
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
- /* weight */ 12);
- final ShortcutInfo si3 = makeShortcut("shortcut3");
+ /* weight */ 12,
+ /* chooserFilter=*/ null,
+ /* chooserComponentNames=*/ null);
+ final ShortcutInfo si3 = makeShortcut(
+ "shortcut3",
+ "Title 3",
+ /* activity */ null,
+ icon3,
+ makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
+ /* weight */ 13,
+ /* chooserFilter=*/ null,
+ /* chooserComponentNames=*/ null);
- assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
+ assertTrue(mManager.setDynamicShortcuts(list(si1, si2, si3)));
assertShortcutIds(assertAllNotKeyFieldsOnly(
mManager.getDynamicShortcuts()),
- "shortcut1", "shortcut2");
+ "shortcut1", "shortcut2", "shortcut3");
assertEquals(2, mManager.getRemainingCallCount());
// TODO: Check fields
@@ -550,7 +567,7 @@
final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
getTestContext().getResources(), R.drawable.black_32x32));
- final Icon bmp64x64 = Icon.createWithBitmap(BitmapFactory.decodeResource(
+ final Icon bmp64x64_maskable = Icon.createWithMaskableBitmap(BitmapFactory.decodeResource(
getTestContext().getResources(), R.drawable.black_64x64));
final Icon bmp512x512 = Icon.createWithBitmap(BitmapFactory.decodeResource(
getTestContext().getResources(), R.drawable.black_512x512));
@@ -561,7 +578,7 @@
makeShortcutWithIcon("res32x32", res32x32),
makeShortcutWithIcon("res64x64", res64x64),
makeShortcutWithIcon("bmp32x32", bmp32x32),
- makeShortcutWithIcon("bmp64x64", bmp64x64),
+ makeShortcutWithIcon("bmp64x64", bmp64x64_maskable),
makeShortcutWithIcon("bmp512x512", bmp512x512),
makeShortcut("none")
)));
@@ -691,6 +708,15 @@
bmp = pfdToBitmap(
mLauncherApps.getShortcutIconFd(CALLING_PACKAGE_1, "bmp32x32", HANDLE_USER_P0));
assertBitmapSize(128, 128, bmp);
+
+ Drawable dr = mLauncherApps.getShortcutIconDrawable(
+ makeShortcutWithIcon("bmp64x64", bmp64x64_maskable), 0);
+ assertTrue(dr instanceof AdaptiveIconDrawable);
+ float viewportPercentage = 1 / (1 + 2 * AdaptiveIconDrawable.getExtraInsetPercentage());
+ assertEquals((int) (bmp64x64_maskable.getBitmap().getWidth() * viewportPercentage),
+ dr.getIntrinsicWidth());
+ assertEquals((int) (bmp64x64_maskable.getBitmap().getHeight() * viewportPercentage),
+ dr.getIntrinsicHeight());
}
public void testCleanupDanglingBitmaps() throws Exception {
@@ -963,8 +989,10 @@
makeShortcut("s2"),
makeShortcut("s3"),
makeShortcut("s4"),
- makeShortcut("s5")
- )));
+ makeShortcut("s5"),
+ makeChooserShortcut("s6", 2, true),
+ makeChooserShortcut("s7", 2, true),
+ makeChooserShortcut("s8", 1, true))));
});
runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
assertTrue(mManager.setDynamicShortcuts(list(
@@ -972,11 +1000,13 @@
makeShortcut("s2"),
makeShortcut("s3"),
makeShortcut("s4"),
- makeShortcut("s5")
- )));
+ makeShortcut("s5"),
+ makeChooserShortcut("s6", 2, true),
+ makeChooserShortcut("s7", 2, true),
+ makeChooserShortcut("s8", 1, true))));
});
runWithCaller(LAUNCHER_1, UserHandle.USER_SYSTEM, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s2", "s3"),
+ mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s2", "s3", "s6"),
getCallingUser());
mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s4", "s5"),
getCallingUser());
@@ -989,19 +1019,20 @@
mManager.removeDynamicShortcuts(list("s1"));
mManager.removeDynamicShortcuts(list("s3"));
mManager.removeDynamicShortcuts(list("s5"));
+ mManager.removeDynamicShortcuts(list("s7"));
});
runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
assertShortcutIds(assertAllDynamic(
mManager.getDynamicShortcuts()),
- "s3", "s4", "s5");
+ "s3", "s4", "s5", "s6", "s7", "s8");
assertShortcutIds(assertAllPinned(
mManager.getPinnedShortcuts()),
- "s2", "s3");
+ "s2", "s3", "s6");
});
runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
assertShortcutIds(assertAllDynamic(
mManager.getDynamicShortcuts()),
- "s2", "s4");
+ "s2", "s4", "s6", "s8");
assertShortcutIds(assertAllPinned(
mManager.getPinnedShortcuts()),
"s4", "s5");
@@ -1038,10 +1069,10 @@
runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
assertShortcutIds(assertAllDynamic(
mManager.getDynamicShortcuts()),
- "s3", "s4", "s5");
+ "s3", "s4", "s5", "s6", "s7", "s8");
assertShortcutIds(assertAllPinned(
mManager.getPinnedShortcuts()),
- "s2", "s3");
+ "s2", "s3", "s6");
ShortcutInfo s = getCallerShortcut("s2");
assertTrue(s.hasIconResource());
@@ -1057,7 +1088,7 @@
runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
assertShortcutIds(assertAllDynamic(
mManager.getDynamicShortcuts()),
- "s2", "s4");
+ "s2", "s4", "s6", "s8");
assertShortcutIds(assertAllPinned(
mManager.getPinnedShortcuts()),
"s4", "s5");
@@ -1154,7 +1185,46 @@
});
}
- // === Test for launcher side APIs ===
+ public void testUpdateShortcuts_chooser() {
+ runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
+ assertTrue(mManager.setDynamicShortcuts(list(
+ makeShortcut("s1"),
+ makeChooserShortcut("s2", 2, false),
+ makeChooserShortcut("s3", 2, false)
+ )));
+
+ assertFalse(getCallerShortcut("s1").isChooser());
+ assertTrue(getCallerShortcut("s2").isChooser());
+ assertTrue(getCallerShortcut("s3").isChooser());
+
+ ShortcutInfo s = getCallerShortcut("s1");
+ assertNull(s.getChooserIntentFilters());
+ assertNull(s.getChooserComponentNames());
+
+ assertTrue(getCallerShortcut("s1").isDynamic());
+ assertFalse(getCallerShortcut("s2").isDynamic());
+ assertFalse(getCallerShortcut("s3").isDynamic());
+
+
+ // Replace 2 with a chooser shortcut
+ mManager.updateShortcuts(list(makeChooserShortcut("s1", 2, true)));
+
+ s = getCallerShortcut("s1");
+ assertEquals(2, s.getChooserIntentFilters().length);
+ assertEquals(2, s.getChooserComponentNames().length);
+
+ assertShortcutIds(assertAllChooser(
+ mManager.getDynamicShortcuts()),
+ "s1", "s2", "s3");
+
+ assertTrue(getCallerShortcut("s1").isDynamic());
+ assertFalse(getCallerShortcut("s2").isDynamic());
+ assertFalse(getCallerShortcut("s3").isDynamic());
+ });
+ }
+
+
+ // === Test for launcher side APIs ===
public void testGetShortcuts() {
@@ -1465,15 +1535,17 @@
/* icon =*/ null,
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
"key1", "val1", "nest", makeBundle("key", 123)),
- /* weight */ 10);
+ /* weight */ 10, /* chooserFilter=*/ null,
+ /* chooserComponentNames=*/ null);
final ShortcutInfo s1_2 = makeShortcut(
- "s2",
- "Title 2",
+ "s2", "Title 2",
/* activity */ null,
/* icon =*/ null,
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
- /* weight */ 12);
+ /* weight */ 12,
+ /* chooserFilter=*/ null,
+ /* chooserComponentNames=*/ null);
assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
dumpsysOnLogcat();
@@ -1486,7 +1558,9 @@
/* icon =*/ null,
makeIntent(Intent.ACTION_ANSWER, ShortcutActivity2.class,
"key1", "val1", "nest", makeBundle("key", 123)),
- /* weight */ 10);
+ /* weight */ 10,
+ /* chooserFilter=*/ null,
+ /* chooserComponentNames=*/ null);
assertTrue(mManager.setDynamicShortcuts(list(s2_1)));
dumpsysOnLogcat();
@@ -2655,10 +2729,12 @@
final ShortcutInfo s1_2 = makeShortcut(
"s2",
"Title 2",
- /* activity */ null,
- /* icon =*/ null,
+ /* activity */ null,
+ /* icon =*/ null,
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
- /* rank */ 12);
+ /* rank */ 12,
+ /* chooserFilter=*/ null,
+ /* chooserComponentNames=*/ null);
final ShortcutInfo s1_3 = makeShortcut("s3");
@@ -2673,7 +2749,9 @@
/* icon =*/ null,
makeIntent(Intent.ACTION_ANSWER, ShortcutActivity.class,
"key1", "val1", "nest", makeBundle("key", 123)),
- /* weight */ 10);
+ /* weight */ 10,
+ /* chooserFilter=*/ null,
+ /* chooserComponentNames=*/ null);
assertTrue(mManager.setDynamicShortcuts(list(s2_1)));
});
@@ -3091,7 +3169,9 @@
icon1,
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
"key1", "val1", "nest", makeBundle("key", 123)),
- /* weight */ 10);
+ /* weight */ 10,
+ /* chooserFilter=*/ null,
+ /* chooserComponentNames=*/ null);
final ShortcutInfo si2 = makeShortcut(
"s2",
@@ -3099,7 +3179,9 @@
/* activity */ null,
icon2,
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
- /* weight */ 12);
+ /* weight */ 12,
+ /* chooserFilter=*/ null,
+ /* chooserComponentNames=*/ null);
assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
@@ -3117,8 +3199,8 @@
makeComponent(ShortcutActivity.class),
icon1,
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
- "key1", "val1", "nest", makeBundle("key", 123)),
- /* weight */ 10);
+ "key1", "val1", "nest", makeBundle("key", 123)), /* weight */ 10,
+ /* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
final ShortcutInfo si2 = makeShortcut(
"s2",
@@ -3126,7 +3208,8 @@
/* activity */ null,
icon2,
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
- /* weight */ 12);
+ /* weight */ 12, /* chooserFilter=*/ null,
+ /* chooserComponentNames=*/ null);
assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
@@ -3148,7 +3231,8 @@
icon1,
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
"key1", "val1", "nest", makeBundle("key", 123)),
- /* weight */ 10);
+ /* weight */ 10, /* chooserFilter=*/ null,
+ /* chooserComponentNames=*/ null);
final ShortcutInfo si2 = makeShortcut(
"s2",
@@ -3156,7 +3240,8 @@
/* activity */ null,
icon2,
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
- /* weight */ 12);
+ /* weight */ 12, /* chooserFilter=*/ null,
+ /* chooserComponentNames=*/ null);
assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
@@ -6781,10 +6866,12 @@
mManager.setDynamicShortcuts(list(
makeShortcut("ms1", "title1",
new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
- /* icon */ null, new Intent("action1"), /* rank */ 0),
+ /* icon */ null, new Intent("action1"), /* rank */ 0,
+ /* chooserFilter=*/ null, /* chooserComponentNames=*/ null),
makeShortcut("ms2", "title2",
new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
- /* icon */ null, new Intent("action1"), /* rank */ 0)));
+ /* icon */ null, new Intent("action1"), /* rank */ 0, /* chooserFilter=*/ null,
+ /* chooserComponentNames=*/ null)));
});
runWithCaller(LAUNCHER_1, USER_0, () -> {
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
index 562de414..c54fa02 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
@@ -34,6 +34,7 @@
import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.ShortcutInfo;
import android.content.res.Resources;
import android.graphics.BitmapFactory;
@@ -93,11 +94,6 @@
assertExpectException(
RuntimeException.class,
- "intents cannot contain null",
- () -> new ShortcutInfo.Builder(getTestContext(), "id").setIntent(null));
-
- assertExpectException(
- RuntimeException.class,
"action must be set",
() -> new ShortcutInfo.Builder(getTestContext(), "id").setIntent(new Intent()));
@@ -142,6 +138,19 @@
"disabledMessage cannot be empty",
() -> new ShortcutInfo.Builder(getTestContext(), "id").setDisabledMessage(""));
+
+ assertExpectException(
+ RuntimeException.class,
+ "component name cannot be null",
+ () -> new ShortcutInfo.Builder(getTestContext(), "id")
+ .addChooserIntentFilter(new IntentFilter(Intent.ACTION_SEND), null));
+
+ assertExpectException(
+ RuntimeException.class,
+ "intent filter cannot be null",
+ () -> new ShortcutInfo.Builder(getTestContext(), "id")
+ .addChooserIntentFilter(null, new ComponentName("xxx", "s")));
+
assertExpectException(NullPointerException.class, "action must be set",
() -> new ShortcutInfo.Builder(getTestContext(), "id").setIntent(new Intent()));
@@ -240,6 +249,10 @@
PersistableBundle pb = new PersistableBundle();
pb.putInt("k", 1);
+ IntentFilter chooserFilter = new IntentFilter();
+ chooserFilter.addAction(Intent.ACTION_VIEW);
+ PersistableBundle pb2 = new PersistableBundle();
+ pb2.putInt("l", 1);
si = new ShortcutInfo.Builder(getTestContext())
.setId("id")
@@ -252,6 +265,8 @@
.setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
.setRank(123)
.setExtras(pb)
+ .addChooserIntentFilter(chooserFilter, new ComponentName("a", "b"))
+ .setChooserExtras(pb2)
.build();
si.addFlags(ShortcutInfo.FLAG_PINNED);
si.setBitmapPath("abc");
@@ -282,6 +297,12 @@
assertEquals(null, si.getTextResName());
assertEquals(0, si.getDisabledMessageResourceId());
assertEquals(null, si.getDisabledMessageResName());
+
+ assertEquals(1, si.getChooserIntentFilters().length);
+ assertEquals(Intent.ACTION_VIEW, si.getChooserIntentFilters()[0].getAction(0));
+ assertEquals(1, si.getChooserComponentNames().length);
+ assertEquals(new ComponentName("a", "b"), si.getChooserComponentNames()[0]);
+ assertEquals(1, si.getChooserExtras().getInt("l"));
}
public void testShortcutInfoParcel_resId() {
@@ -290,6 +311,10 @@
PersistableBundle pb = new PersistableBundle();
pb.putInt("k", 1);
+ IntentFilter chooserFilter = new IntentFilter();
+ chooserFilter.addAction(Intent.ACTION_VIEW);
+ PersistableBundle pb2 = new PersistableBundle();
+ pb2.putInt("l", 1);
si = new ShortcutInfo.Builder(getTestContext())
.setId("id")
@@ -302,6 +327,8 @@
.setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
.setRank(123)
.setExtras(pb)
+ .addChooserIntentFilter(chooserFilter, new ComponentName("a", "b"))
+ .setChooserExtras(pb2)
.build();
si.addFlags(ShortcutInfo.FLAG_PINNED);
si.setBitmapPath("abc");
@@ -338,6 +365,11 @@
PersistableBundle pb = new PersistableBundle();
pb.putInt("k", 1);
+ IntentFilter chooserFilter = new IntentFilter();
+ chooserFilter.addAction(Intent.ACTION_VIEW);
+ PersistableBundle pb2 = new PersistableBundle();
+ pb2.putInt("l", 1);
+
ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
.setId("id")
.setActivity(new ComponentName("a", "b"))
@@ -349,6 +381,8 @@
.setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
.setRank(123)
.setExtras(pb)
+ .addChooserIntentFilter(chooserFilter, new ComponentName("a", "b"))
+ .setChooserExtras(pb2)
.build();
sorig.addFlags(ShortcutInfo.FLAG_PINNED);
sorig.setBitmapPath("abc");
@@ -378,6 +412,12 @@
assertEquals(456, si.getIconResourceId());
assertEquals("string/r456", si.getIconResName());
+ assertEquals(1, si.getChooserIntentFilters().length);
+ assertEquals(Intent.ACTION_VIEW, si.getChooserIntentFilters()[0].getAction(0));
+ assertEquals(1, si.getChooserComponentNames().length);
+ assertEquals(new ComponentName("a", "b"), si.getChooserComponentNames()[0]);
+ assertEquals(1, si.getChooserExtras().getInt("l"));
+
si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_CREATOR);
assertEquals(mClientContext.getPackageName(), si.getPackage());
@@ -445,6 +485,10 @@
PersistableBundle pb = new PersistableBundle();
pb.putInt("k", 1);
+ IntentFilter chooserFilter = new IntentFilter();
+ chooserFilter.addAction(Intent.ACTION_VIEW);
+ PersistableBundle pb2 = new PersistableBundle();
+ pb2.putInt("l", 1);
ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
.setId("id")
.setActivity(new ComponentName("a", "b"))
@@ -456,6 +500,8 @@
.setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
.setRank(123)
.setExtras(pb)
+ .addChooserIntentFilter(chooserFilter, new ComponentName("a", "b"))
+ .setChooserExtras(pb2)
.build();
sorig.addFlags(ShortcutInfo.FLAG_PINNED);
sorig.setBitmapPath("abc");
@@ -488,6 +534,12 @@
assertEquals(456, si.getIconResourceId());
assertEquals("string/r456", si.getIconResName());
+ assertEquals(1, si.getChooserIntentFilters().length);
+ assertEquals(Intent.ACTION_VIEW, si.getChooserIntentFilters()[0].getAction(0));
+ assertEquals(1, si.getChooserComponentNames().length);
+ assertEquals(new ComponentName("a", "b"), si.getChooserComponentNames()[0]);
+ assertEquals(1, si.getChooserExtras().getInt("l"));
+
si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_CREATOR);
assertEquals(mClientContext.getPackageName(), si.getPackage());
@@ -603,6 +655,10 @@
public void testShortcutInfoCopyNonNullFieldsFrom() throws InterruptedException {
PersistableBundle pb = new PersistableBundle();
pb.putInt("k", 1);
+ IntentFilter chooserFilter = new IntentFilter();
+ chooserFilter.addAction(Intent.ACTION_VIEW);
+ PersistableBundle pb2 = new PersistableBundle();
+ pb2.putInt("l", 1);
ShortcutInfo sorig = new ShortcutInfo.Builder(getTestContext())
.setId("id")
.setActivity(new ComponentName("a", "b"))
@@ -714,12 +770,12 @@
assertEquals(999, si.getRank());
- PersistableBundle pb2 = new PersistableBundle();
- pb2.putInt("x", 99);
+ PersistableBundle pb3 = new PersistableBundle();
+ pb3.putInt("x", 99);
si = sorig.clone(/* flags=*/ 0);
si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
- .setExtras(pb2).build());
+ .setExtras(pb3).build());
assertEquals("text", si.getText());
assertEquals(99, si.getExtras().getInt("x"));
}
@@ -932,6 +988,74 @@
dumpUserFile(USER_10);
}
+ public void testShortcutInfoSaveAndLoad_maskableBitmap() throws InterruptedException {
+ mRunningUsers.put(USER_10, true);
+
+ setCaller(CALLING_PACKAGE_1, USER_10);
+
+ final Icon bmp32x32 = Icon.createWithMaskableBitmap(BitmapFactory.decodeResource(
+ getTestContext().getResources(), R.drawable.black_32x32));
+
+ PersistableBundle pb = new PersistableBundle();
+ pb.putInt("k", 1);
+ ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
+ .setId("id")
+ .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
+ .setIcon(bmp32x32)
+ .setTitle("title")
+ .setText("text")
+ .setDisabledMessage("dismes")
+ .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
+ .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
+ .setRank(123)
+ .setExtras(pb)
+ .build();
+ sorig.setTimestamp(mInjectedCurrentTimeMillis);
+
+ mManager.addDynamicShortcuts(list(sorig));
+
+ mInjectedCurrentTimeMillis += 1;
+ final long now = mInjectedCurrentTimeMillis;
+ mInjectedCurrentTimeMillis += 1;
+
+ dumpsysOnLogcat("before save");
+
+ // Save and load.
+ mService.saveDirtyInfo();
+ initService();
+ mService.handleUnlockUser(USER_10);
+
+ dumpUserFile(USER_10);
+ dumpsysOnLogcat("after load");
+
+ ShortcutInfo si;
+ si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id", USER_10);
+
+ assertEquals(USER_10, si.getUserId());
+ assertEquals(HANDLE_USER_10, si.getUserHandle());
+ assertEquals(CALLING_PACKAGE_1, si.getPackage());
+ assertEquals("id", si.getId());
+ assertEquals(ShortcutActivity2.class.getName(), si.getActivity().getClassName());
+ assertEquals(null, si.getIcon());
+ assertEquals("title", si.getTitle());
+ assertEquals("text", si.getText());
+ assertEquals("dismes", si.getDisabledMessage());
+ assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
+ assertEquals("action", si.getIntent().getAction());
+ assertEquals("val", si.getIntent().getStringExtra("key"));
+ assertEquals(0, si.getRank());
+ assertEquals(1, si.getExtras().getInt("k"));
+
+ assertEquals(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_HAS_ICON_FILE
+ | ShortcutInfo.FLAG_STRINGS_RESOLVED | ShortcutInfo.FLAG_MASKABLE_BITMAP,
+ si.getFlags());
+ assertNotNull(si.getBitmapPath()); // Something should be set.
+ assertEquals(0, si.getIconResourceId());
+ assertTrue(si.getLastChangedTimestamp() < now);
+
+ dumpUserFile(USER_10);
+ }
+
public void testShortcutInfoSaveAndLoad_resId() throws InterruptedException {
mRunningUsers.put(USER_10, true);
diff --git a/services/tests/servicestests/src/com/android/server/policy/AccessibilityShortcutControllerTest.java b/services/tests/servicestests/src/com/android/server/policy/AccessibilityShortcutControllerTest.java
index e2aff16..1de6348 100644
--- a/services/tests/servicestests/src/com/android/server/policy/AccessibilityShortcutControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/policy/AccessibilityShortcutControllerTest.java
@@ -79,6 +79,7 @@
private @Mock Toast mToast;
private MockContentResolver mContentResolver;
+ private WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams();
@Before
public void setUp() throws Exception {
@@ -119,6 +120,9 @@
when(mAlertDialogBuilder.setOnCancelListener(anyObject())).thenReturn(mAlertDialogBuilder);
when(mAlertDialogBuilder.create()).thenReturn(mAlertDialog);
+ mLayoutParams.privateFlags = 0;
+ when(mToast.getWindowParams()).thenReturn(mLayoutParams);
+
Window window = mock(Window.class);
Whitebox.setInternalState(window, "mWindowAttributes", new WindowManager.LayoutParams());
when(mAlertDialog.getWindow()).thenReturn(window);
@@ -183,6 +187,9 @@
accessibilityShortcutController.performAccessibilityShortcut();
accessibilityShortcutController.performAccessibilityShortcut();
verify(mToast).show();
+ assertEquals(WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS,
+ mLayoutParams.privateFlags
+ & WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS);
verify(mAccessibilityManagerService, times(1)).performAccessibilityShortcut();
}
diff --git a/services/tests/servicestests/src/com/android/server/retaildemo/PreloadAppsInstallerTest.java b/services/tests/servicestests/src/com/android/server/retaildemo/PreloadAppsInstallerTest.java
index 346dc42..a8c39c4 100644
--- a/services/tests/servicestests/src/com/android/server/retaildemo/PreloadAppsInstallerTest.java
+++ b/services/tests/servicestests/src/com/android/server/retaildemo/PreloadAppsInstallerTest.java
@@ -104,7 +104,7 @@
null, null);
// Verify that we try to install the package in system user.
verify(mIpm).installExistingPackageAsUser(path, UserHandle.USER_SYSTEM,
- PackageManager.INSTALL_REASON_UNKNOWN);
+ 0 /*installFlags*/, PackageManager.INSTALL_REASON_UNKNOWN);
}
assertEquals("DEMO_USER_SETUP should be set to 1 after preloaded apps are installed",
"1",
@@ -141,7 +141,7 @@
null, null);
// Verify that we try to install the package in system user.
verify(mIpm).installExistingPackageAsUser(path, UserHandle.USER_SYSTEM,
- PackageManager.INSTALL_REASON_UNKNOWN);
+ 0 /*installFlags*/, PackageManager.INSTALL_REASON_UNKNOWN);
}
assertEquals("DEMO_USER_SETUP should be set to 1 after preloaded apps are installed",
"1",
diff --git a/services/tests/servicestests/src/com/android/server/storage/AppCollectorTest.java b/services/tests/servicestests/src/com/android/server/storage/AppCollectorTest.java
index da22e77..29185e9 100644
--- a/services/tests/servicestests/src/com/android/server/storage/AppCollectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/storage/AppCollectorTest.java
@@ -187,10 +187,14 @@
}).start();
latch.await();
- // This should
assertThat(myStats).containsAllOf(stats, otherStats);
}
+ @Test(expected=NullPointerException.class)
+ public void testNullVolumeShouldCauseNPE() throws Exception {
+ AppCollector collector = new AppCollector(mContext, null);
+ }
+
private void addApplication(String packageName, String uuid) {
ApplicationInfo info = new ApplicationInfo();
info.packageName = packageName;
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppIdleHistoryTests.java b/services/tests/servicestests/src/com/android/server/usage/AppIdleHistoryTests.java
index 0bd014c..42ddedf 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppIdleHistoryTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppIdleHistoryTests.java
@@ -45,12 +45,12 @@
final int userId = 0;
AppIdleHistory aih = new AppIdleHistory(mStorageDir, 0);
- aih.updateDisplayLocked(true, /* elapsedRealtime= */ 1000);
- aih.updateDisplayLocked(false, /* elapsedRealtime= */ 2000);
+ aih.updateDisplay(true, /* elapsedRealtime= */ 1000);
+ aih.updateDisplay(false, /* elapsedRealtime= */ 2000);
// Screen On time file should be written right away
assertTrue(aih.getScreenOnTimeFile().exists());
- aih.writeAppIdleTimesLocked(userId);
+ aih.writeAppIdleTimes(userId);
// stats file should be written now
assertTrue(new File(new File(mStorageDir, "users/" + userId),
AppIdleHistory.APP_IDLE_FILENAME).exists());
@@ -58,43 +58,43 @@
public void testScreenOnTime() {
AppIdleHistory aih = new AppIdleHistory(mStorageDir, 1000);
- aih.updateDisplayLocked(false, 2000);
- assertEquals(aih.getScreenOnTimeLocked(2000), 0);
- aih.updateDisplayLocked(true, 3000);
- assertEquals(aih.getScreenOnTimeLocked(4000), 1000);
- assertEquals(aih.getScreenOnTimeLocked(5000), 2000);
- aih.updateDisplayLocked(false, 6000);
+ aih.updateDisplay(false, 2000);
+ assertEquals(aih.getScreenOnTime(2000), 0);
+ aih.updateDisplay(true, 3000);
+ assertEquals(aih.getScreenOnTime(4000), 1000);
+ assertEquals(aih.getScreenOnTime(5000), 2000);
+ aih.updateDisplay(false, 6000);
// Screen on time should not keep progressing with screen is off
- assertEquals(aih.getScreenOnTimeLocked(7000), 3000);
- assertEquals(aih.getScreenOnTimeLocked(8000), 3000);
- aih.writeAppIdleDurationsLocked();
+ assertEquals(aih.getScreenOnTime(7000), 3000);
+ assertEquals(aih.getScreenOnTime(8000), 3000);
+ aih.writeAppIdleDurations();
// Check if the screen on time is persisted across instantiations
AppIdleHistory aih2 = new AppIdleHistory(mStorageDir, 0);
- assertEquals(aih2.getScreenOnTimeLocked(11000), 3000);
- aih2.updateDisplayLocked(true, 4000);
- aih2.updateDisplayLocked(false, 5000);
- assertEquals(aih2.getScreenOnTimeLocked(13000), 4000);
+ assertEquals(aih2.getScreenOnTime(11000), 3000);
+ aih2.updateDisplay(true, 4000);
+ aih2.updateDisplay(false, 5000);
+ assertEquals(aih2.getScreenOnTime(13000), 4000);
}
public void testPackageEvents() {
AppIdleHistory aih = new AppIdleHistory(mStorageDir, 1000);
aih.setThresholds(4000, 1000);
- aih.updateDisplayLocked(true, 1000);
+ aih.updateDisplay(true, 1000);
// App is not-idle by default
- assertFalse(aih.isIdleLocked(PACKAGE_1, 0, 1500));
+ assertFalse(aih.isIdle(PACKAGE_1, 0, 1500));
// Still not idle
- assertFalse(aih.isIdleLocked(PACKAGE_1, 0, 3000));
+ assertFalse(aih.isIdle(PACKAGE_1, 0, 3000));
// Idle now
- assertTrue(aih.isIdleLocked(PACKAGE_1, 0, 8000));
+ assertTrue(aih.isIdle(PACKAGE_1, 0, 8000));
// Not idle
- assertFalse(aih.isIdleLocked(PACKAGE_2, 0, 9000));
+ assertFalse(aih.isIdle(PACKAGE_2, 0, 9000));
// Screen off
- aih.updateDisplayLocked(false, 9100);
+ aih.updateDisplay(false, 9100);
// Still idle after 10 seconds because screen hasn't been on long enough
- assertFalse(aih.isIdleLocked(PACKAGE_2, 0, 20000));
- aih.updateDisplayLocked(true, 21000);
- assertTrue(aih.isIdleLocked(PACKAGE_2, 0, 23000));
+ assertFalse(aih.isIdle(PACKAGE_2, 0, 20000));
+ aih.updateDisplay(true, 21000);
+ assertTrue(aih.isIdle(PACKAGE_2, 0, 23000));
}
}
\ No newline at end of file
diff --git a/services/tests/servicestests/src/com/android/server/usage/StorageStatsServiceTest.java b/services/tests/servicestests/src/com/android/server/usage/StorageStatsServiceTest.java
new file mode 100644
index 0000000..baee865
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/usage/StorageStatsServiceTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.usage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.provider.Settings;
+import android.test.AndroidTestCase;
+import android.test.mock.MockContentResolver;
+
+import com.android.internal.util.test.FakeSettingsProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class StorageStatsServiceTest extends AndroidTestCase {
+ private MockContentResolver mContentResolver;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ mContentResolver = new MockContentResolver();
+ mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
+ }
+
+ @Test
+ public void testDontRunWhenDisabledFromSettingsGlobal() throws Exception {
+ Settings.Global.putInt(mContentResolver, Settings.Global.ENABLE_CACHE_QUOTA_CALCULATION, 0);
+
+ assertThat(StorageStatsService.isCacheQuotaCalculationsEnabled(mContentResolver)).isFalse();
+ }
+
+ @Test
+ public void testCalculationTaskIsEnabledByDefault() throws Exception {
+ // Put null to act as though there is no value here.
+ Settings.Global.putString(
+ mContentResolver, Settings.Global.ENABLE_CACHE_QUOTA_CALCULATION, null);
+
+ assertThat(StorageStatsService.isCacheQuotaCalculationsEnabled(mContentResolver)).isTrue();
+ }
+}
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 30f99e5..73ad7c2 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
@@ -16,24 +16,26 @@
package com.android.server.wm;
+import static android.view.Display.DEFAULT_DISPLAY;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
+import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
+import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import android.content.res.Configuration;
-import android.hardware.display.DisplayManagerGlobal;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
-import android.view.Display;
-import android.view.DisplayInfo;
-import java.util.ArrayList;
-
-import static android.view.Display.DEFAULT_DISPLAY;
-import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS;
-import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
-import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
-import static org.junit.Assert.assertEquals;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
/**
* Tests for the {@link DisplayContent} class.
@@ -54,38 +56,17 @@
exitingAppToken.mIsExiting = true;
exitingAppToken.mTask.mStack.mExitingAppTokens.add(exitingAppToken);
- final ArrayList<WindowState> windows = new ArrayList();
-
- // Test forward traversal.
- sDisplayContent.forAllWindows(w -> {windows.add(w);}, false /* traverseTopToBottom */);
-
- assertEquals(sWallpaperWindow, windows.get(0));
- assertEquals(exitingAppWindow, windows.get(1));
- assertEquals(sChildAppWindowBelow, windows.get(2));
- assertEquals(sAppWindow, windows.get(3));
- assertEquals(sChildAppWindowAbove, windows.get(4));
- assertEquals(sDockedDividerWindow, windows.get(5));
- assertEquals(sStatusBarWindow, windows.get(6));
- assertEquals(sNavBarWindow, windows.get(7));
- assertEquals(sImeWindow, windows.get(8));
- assertEquals(sImeDialogWindow, windows.get(9));
-
- // Test backward traversal.
- windows.clear();
- sDisplayContent.forAllWindows(w -> {windows.add(w);}, true /* traverseTopToBottom */);
-
- assertEquals(sWallpaperWindow, windows.get(9));
- assertEquals(exitingAppWindow, windows.get(8));
- assertEquals(sChildAppWindowBelow, windows.get(7));
- assertEquals(sAppWindow, windows.get(6));
- assertEquals(sChildAppWindowAbove, windows.get(5));
- assertEquals(sDockedDividerWindow, windows.get(4));
- assertEquals(sStatusBarWindow, windows.get(3));
- assertEquals(sNavBarWindow, windows.get(2));
- assertEquals(sImeWindow, windows.get(1));
- assertEquals(sImeDialogWindow, windows.get(0));
-
- exitingAppWindow.removeImmediately();
+ assertForAllWindowsOrder(Arrays.asList(
+ sWallpaperWindow,
+ exitingAppWindow,
+ sChildAppWindowBelow,
+ sAppWindow,
+ sChildAppWindowAbove,
+ sDockedDividerWindow,
+ sStatusBarWindow,
+ sNavBarWindow,
+ sImeWindow,
+ sImeDialogWindow));
}
@Test
@@ -95,78 +76,49 @@
sWm.mInputMethodTarget = imeAppTarget;
- final ArrayList<WindowState> windows = new ArrayList();
+ assertForAllWindowsOrder(Arrays.asList(
+ sWallpaperWindow,
+ sChildAppWindowBelow,
+ sAppWindow,
+ sChildAppWindowAbove,
+ imeAppTarget,
+ sImeWindow,
+ sImeDialogWindow,
+ sDockedDividerWindow,
+ sStatusBarWindow,
+ sNavBarWindow));
+ }
- // Test forward traversal.
- sDisplayContent.forAllWindows(w -> {windows.add(w);}, false /* traverseTopToBottom */);
+ @Test
+ public void testForAllWindows_WithChildWindowImeTarget() throws Exception {
+ sWm.mInputMethodTarget = sChildAppWindowAbove;
- assertEquals(sWallpaperWindow, windows.get(0));
- assertEquals(sChildAppWindowBelow, windows.get(1));
- assertEquals(sAppWindow, windows.get(2));
- assertEquals(sChildAppWindowAbove, windows.get(3));
- assertEquals(imeAppTarget, windows.get(4));
- assertEquals(sImeWindow, windows.get(5));
- assertEquals(sImeDialogWindow, windows.get(6));
- assertEquals(sDockedDividerWindow, windows.get(7));
- assertEquals(sStatusBarWindow, windows.get(8));
- assertEquals(sNavBarWindow, windows.get(9));
-
- // Test backward traversal.
- windows.clear();
- sDisplayContent.forAllWindows(w -> {windows.add(w);}, true /* traverseTopToBottom */);
-
- assertEquals(sWallpaperWindow, windows.get(9));
- assertEquals(sChildAppWindowBelow, windows.get(8));
- assertEquals(sAppWindow, windows.get(7));
- assertEquals(sChildAppWindowAbove, windows.get(6));
- assertEquals(imeAppTarget, windows.get(5));
- assertEquals(sImeWindow, windows.get(4));
- assertEquals(sImeDialogWindow, windows.get(3));
- assertEquals(sDockedDividerWindow, windows.get(2));
- assertEquals(sStatusBarWindow, windows.get(1));
- assertEquals(sNavBarWindow, windows.get(0));
-
- // Clean-up
- sWm.mInputMethodTarget = null;
- imeAppTarget.removeImmediately();
+ assertForAllWindowsOrder(Arrays.asList(
+ sWallpaperWindow,
+ sChildAppWindowBelow,
+ sAppWindow,
+ sChildAppWindowAbove,
+ sImeWindow,
+ sImeDialogWindow,
+ sDockedDividerWindow,
+ sStatusBarWindow,
+ sNavBarWindow));
}
@Test
public void testForAllWindows_WithStatusBarImeTarget() throws Exception {
-
sWm.mInputMethodTarget = sStatusBarWindow;
- final ArrayList<WindowState> windows = new ArrayList();
-
- // Test forward traversal.
- sDisplayContent.forAllWindows(w -> {windows.add(w);}, false /* traverseTopToBottom */);
-
- assertEquals(sWallpaperWindow, windows.get(0));
- assertEquals(sChildAppWindowBelow, windows.get(1));
- assertEquals(sAppWindow, windows.get(2));
- assertEquals(sChildAppWindowAbove, windows.get(3));
- assertEquals(sDockedDividerWindow, windows.get(4));
- assertEquals(sStatusBarWindow, windows.get(5));
- assertEquals(sImeWindow, windows.get(6));
- assertEquals(sImeDialogWindow, windows.get(7));
- assertEquals(sNavBarWindow, windows.get(8));
-
- // Test backward traversal.
- windows.clear();
- sDisplayContent.forAllWindows(w -> {windows.add(w);}, true /* traverseTopToBottom */);
-
- assertEquals(sWallpaperWindow, windows.get(8));
- assertEquals(sChildAppWindowBelow, windows.get(7));
- assertEquals(sAppWindow, windows.get(6));
- assertEquals(sChildAppWindowAbove, windows.get(5));
- assertEquals(sDockedDividerWindow, windows.get(4));
- assertEquals(sStatusBarWindow, windows.get(3));
- assertEquals(sImeWindow, windows.get(2));
- assertEquals(sImeDialogWindow, windows.get(1));
- assertEquals(sNavBarWindow, windows.get(0));
-
- // Clean-up
- sWm.mInputMethodTarget = null;
+ assertForAllWindowsOrder(Arrays.asList(
+ sWallpaperWindow,
+ sChildAppWindowBelow,
+ sAppWindow,
+ sChildAppWindowAbove,
+ sDockedDividerWindow,
+ sStatusBarWindow,
+ sImeWindow,
+ sImeDialogWindow,
+ sNavBarWindow));
}
@Test
@@ -176,38 +128,50 @@
final WindowState voiceInteractionWindow = createWindow(null, TYPE_VOICE_INTERACTION,
sDisplayContent, "voiceInteractionWindow");
- final ArrayList<WindowState> windows = new ArrayList();
+ assertForAllWindowsOrder(Arrays.asList(
+ sWallpaperWindow,
+ sChildAppWindowBelow,
+ sAppWindow,
+ sChildAppWindowAbove,
+ sDockedDividerWindow,
+ voiceInteractionWindow,
+ sStatusBarWindow,
+ sNavBarWindow,
+ sImeWindow,
+ sImeDialogWindow));
+ }
- // Test forward traversal.
- sDisplayContent.forAllWindows(w -> {windows.add(w);}, false /* traverseTopToBottom */);
+ @Test
+ public void testComputeImeTarget() throws Exception {
+ // Verify that an app window can be an ime target.
+ final WindowState appWin = createWindow(null, TYPE_APPLICATION, sDisplayContent, "appWin");
+ appWin.setHasSurface(true);
+ assertTrue(appWin.canBeImeTarget());
+ sWm.mInputMethodTargetCandidate = appWin.mClient.asBinder();
+ WindowState imeTarget = sDisplayContent.computeImeTarget(false /* updateImeTarget */);
+ assertEquals(appWin, imeTarget);
- assertEquals(sWallpaperWindow, windows.get(0));
- assertEquals(sChildAppWindowBelow, windows.get(1));
- assertEquals(sAppWindow, windows.get(2));
- assertEquals(sChildAppWindowAbove, windows.get(3));
- assertEquals(sDockedDividerWindow, windows.get(4));
- assertEquals(voiceInteractionWindow, windows.get(5));
- assertEquals(sStatusBarWindow, windows.get(6));
- assertEquals(sNavBarWindow, windows.get(7));
- assertEquals(sImeWindow, windows.get(8));
- assertEquals(sImeDialogWindow, windows.get(9));
+ // Verify that an child window can be an ime target.
+ final WindowState childWin = createWindow(appWin,
+ TYPE_APPLICATION_ATTACHED_DIALOG, "childWin");
+ childWin.setHasSurface(true);
+ assertTrue(childWin.canBeImeTarget());
+ imeTarget = sDisplayContent.computeImeTarget(false /* updateImeTarget */);
+ assertEquals(childWin, imeTarget);
- // Test backward traversal.
- windows.clear();
- sDisplayContent.forAllWindows(w -> {windows.add(w);}, true /* traverseTopToBottom */);
+ final WindowState appWin2 =
+ createWindow(null, TYPE_APPLICATION, sDisplayContent, "appWin2");
+ appWin2.setHasSurface(true);
+ assertTrue(appWin2.canBeImeTarget());
+ // Verify that the IME target isn't adjusted since mInputMethodTargetCandidate didn't change
+ // to the new app.
+ imeTarget = sDisplayContent.computeImeTarget(false /* updateImeTarget */);
+ assertNotEquals(appWin2, imeTarget);
- assertEquals(sWallpaperWindow, windows.get(9));
- assertEquals(sChildAppWindowBelow, windows.get(8));
- assertEquals(sAppWindow, windows.get(7));
- assertEquals(sChildAppWindowAbove, windows.get(6));
- assertEquals(sDockedDividerWindow, windows.get(5));
- assertEquals(voiceInteractionWindow, windows.get(4));
- assertEquals(sStatusBarWindow, windows.get(3));
- assertEquals(sNavBarWindow, windows.get(2));
- assertEquals(sImeWindow, windows.get(1));
- assertEquals(sImeDialogWindow, windows.get(0));
-
- voiceInteractionWindow.removeImmediately();
+ sWm.mInputMethodTargetCandidate = appWin2.mClient.asBinder();
+ // Verify app is not IME target since its token is set as a candidate.
+ imeTarget = sDisplayContent.computeImeTarget(false /* updateImeTarget */);
+ assertEquals(appWin2, imeTarget);
}
/**
@@ -284,4 +248,24 @@
assertEquals(currentOverrideConfig.densityDpi, globalConfig.densityDpi);
assertEquals(currentOverrideConfig.fontScale, globalConfig.fontScale, 0.1 /* delta */);
}
+
+ private void assertForAllWindowsOrder(List<WindowState> expectedWindows) {
+ final LinkedList<WindowState> actualWindows = new LinkedList();
+
+ // Test forward traversal.
+ sDisplayContent.forAllWindows(actualWindows::addLast, false /* traverseTopToBottom */);
+ assertEquals(expectedWindows.size(), actualWindows.size());
+ for (WindowState w : expectedWindows) {
+ assertEquals(w, actualWindows.pollFirst());
+ }
+ assertTrue(actualWindows.isEmpty());
+
+ // Test backward traversal.
+ sDisplayContent.forAllWindows(actualWindows::addLast, true /* traverseTopToBottom */);
+ assertEquals(expectedWindows.size(), actualWindows.size());
+ for (WindowState w : expectedWindows) {
+ assertEquals(w, actualWindows.pollLast());
+ }
+ assertTrue(actualWindows.isEmpty());
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/TestIWindow.java b/services/tests/servicestests/src/com/android/server/wm/TestIWindow.java
index c029a9f..b6dc9a5 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TestIWindow.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TestIWindow.java
@@ -37,7 +37,7 @@
@Override
public void resized(Rect frame, Rect overscanInsets, Rect contentInsets, Rect visibleInsets,
Rect stableInsets, Rect outsets, boolean reportDraw, Configuration newConfig,
- Rect backDropFrame, boolean forceLayout, boolean alwaysConsumeNavBar)
+ Rect backDropFrame, boolean forceLayout, boolean alwaysConsumeNavBar, int displayId)
throws RemoteException {
}
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 df35b7e..5f51898 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
@@ -23,10 +23,17 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import java.util.LinkedList;
+
import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ABOVE_SUB_PANEL;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -167,4 +174,34 @@
assertFalse(appWindow.canBeImeTarget());
assertFalse(imeWindow.canBeImeTarget());
}
+
+ @Test
+ public void testGetWindow() throws Exception {
+ final WindowState root = createWindow(null, TYPE_APPLICATION, "root");
+ final WindowState mediaChild = createWindow(root, TYPE_APPLICATION_MEDIA, "mediaChild");
+ final WindowState mediaOverlayChild = createWindow(root,
+ TYPE_APPLICATION_MEDIA_OVERLAY, "mediaOverlayChild");
+ final WindowState attachedDialogChild = createWindow(root,
+ TYPE_APPLICATION_ATTACHED_DIALOG, "attachedDialogChild");
+ final WindowState subPanelChild = createWindow(root,
+ TYPE_APPLICATION_SUB_PANEL, "subPanelChild");
+ final WindowState aboveSubPanelChild = createWindow(root,
+ TYPE_APPLICATION_ABOVE_SUB_PANEL, "aboveSubPanelChild");
+
+ final LinkedList<WindowState> windows = new LinkedList();
+
+ root.getWindow(w -> {
+ windows.addLast(w);
+ return false;
+ });
+
+ // getWindow should have returned candidate windows in z-order.
+ assertEquals(aboveSubPanelChild, windows.pollFirst());
+ assertEquals(subPanelChild, windows.pollFirst());
+ assertEquals(attachedDialogChild, windows.pollFirst());
+ assertEquals(root, windows.pollFirst());
+ assertEquals(mediaOverlayChild, windows.pollFirst());
+ assertEquals(mediaChild, windows.pollFirst());
+ assertTrue(windows.isEmpty());
+ }
}
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 e5e3512..b9c2eed 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
@@ -44,6 +44,7 @@
import static android.content.res.Configuration.EMPTY;
import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS;
import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
+import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY;
@@ -60,6 +61,7 @@
import com.android.server.AttributeCache;
import java.util.HashSet;
+import java.util.LinkedList;
/**
* Common base class for window manager unit test classes.
@@ -67,7 +69,6 @@
class WindowTestsBase {
static WindowManagerService sWm = null;
static TestWindowManagerPolicy sPolicy = null;
- private final static IWindow sIWindow = new TestIWindow();
private final static Session sMockSession = mock(Session.class);
private static int sNextDisplayId = Display.DEFAULT_DISPLAY + 1;
static int sNextStackId = FIRST_DYNAMIC_STACK_ID;
@@ -120,6 +121,7 @@
sCommonWindows = new HashSet();
sWallpaperWindow = createCommonWindow(null, TYPE_WALLPAPER, "wallpaperWindow");
sImeWindow = createCommonWindow(null, TYPE_INPUT_METHOD, "sImeWindow");
+ sWm.mInputMethodWindow = sImeWindow;
sImeDialogWindow = createCommonWindow(null, TYPE_INPUT_METHOD_DIALOG, "sImeDialogWindow");
sStatusBarWindow = createCommonWindow(null, TYPE_STATUS_BAR, "sStatusBarWindow");
sNavBarWindow = createCommonWindow(null, TYPE_NAVIGATION_BAR, "sNavBarWindow");
@@ -133,16 +135,26 @@
@After
public void tearDown() throws Exception {
+ final LinkedList<WindowState> nonCommonWindows = new LinkedList();
sWm.mRoot.forAllWindows(w -> {
if (!sCommonWindows.contains(w)) {
- w.removeImmediately();
+ nonCommonWindows.addLast(w);
}
}, true /* traverseTopToBottom */);
+
+ while (!nonCommonWindows.isEmpty()) {
+ nonCommonWindows.pollLast().removeImmediately();
+ }
+
+ sWm.mInputMethodTarget = null;
+ sWm.mInputMethodTargetCandidate = null;
}
private static WindowState createCommonWindow(WindowState parent, int type, String name) {
final WindowState win = createWindow(parent, type, name);
sCommonWindows.add(win);
+ // Prevent common windows from been IMe targets
+ win.mAttrs.flags |= FLAG_NOT_FOCUSABLE;
return win;
}
@@ -225,11 +237,12 @@
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(type);
attrs.setTitle(name);
- final WindowState w = new WindowState(sWm, sMockSession, sIWindow, token, parent, OP_NONE,
- 0, attrs, 0, 0, ownerCanAddInternalSystemWindow);
+ final WindowState w = new WindowState(sWm, sMockSession, new TestIWindow(), token, parent,
+ OP_NONE, 0, attrs, 0, 0, ownerCanAddInternalSystemWindow);
// TODO: Probably better to make this call in the WindowState ctor to avoid errors with
// adding it to the token...
token.addWindow(w);
+ sWm.mWindowMap.put(w.mClient.asBinder(), w);
return w;
}
@@ -451,8 +464,9 @@
boolean resizeReported;
TestWindowState(WindowManager.LayoutParams attrs, WindowToken token) {
- super(sWm, sMockSession, sIWindow, token, null, OP_NONE, 0, attrs, 0, 0,
+ super(sWm, sMockSession, new TestIWindow(), token, null, OP_NONE, 0, attrs, 0, 0,
false /* ownerCanAddInternalSystemWindow */);
+ sWm.mWindowMap.put(mClient.asBinder(), this);
}
@Override
diff --git a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java b/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java
index ea45bd1..fd335c3 100644
--- a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java
+++ b/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java
@@ -508,6 +508,13 @@
return actualShortcuts;
}
+ public static List<ShortcutInfo> assertAllChooser(List<ShortcutInfo> actualShortcuts) {
+ for (ShortcutInfo s : actualShortcuts) {
+ assertTrue("ID " + s.getId(), s.isChooser());
+ }
+ return actualShortcuts;
+ }
+
public static List<ShortcutInfo> assertAllPinned(List<ShortcutInfo> actualShortcuts) {
for (ShortcutInfo s : actualShortcuts) {
assertTrue("ID " + s.getId(), s.isPinned());
diff --git a/services/usage/java/com/android/server/usage/AppIdleHistory.java b/services/usage/java/com/android/server/usage/AppIdleHistory.java
index f69dae4..f298559 100644
--- a/services/usage/java/com/android/server/usage/AppIdleHistory.java
+++ b/services/usage/java/com/android/server/usage/AppIdleHistory.java
@@ -18,7 +18,6 @@
import android.os.Environment;
import android.os.SystemClock;
-import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.AtomicFile;
import android.util.Slog;
@@ -101,7 +100,7 @@
mElapsedSnapshot = elapsedRealtime;
mScreenOnSnapshot = elapsedRealtime;
mStorageDir = storageDir;
- readScreenOnTimeLocked();
+ readScreenOnTime();
}
public void setThresholds(long elapsedTimeThreshold, long screenOnTimeThreshold) {
@@ -109,7 +108,7 @@
mScreenOnTimeThreshold = screenOnTimeThreshold;
}
- public void updateDisplayLocked(boolean screenOn, long elapsedRealtime) {
+ public void updateDisplay(boolean screenOn, long elapsedRealtime) {
if (screenOn == mScreenOn) return;
mScreenOn = screenOn;
@@ -122,7 +121,7 @@
}
}
- public long getScreenOnTimeLocked(long elapsedRealtime) {
+ public long getScreenOnTime(long elapsedRealtime) {
long screenOnTime = mScreenOnDuration;
if (mScreenOn) {
screenOnTime += elapsedRealtime - mScreenOnSnapshot;
@@ -135,7 +134,7 @@
return new File(mStorageDir, "screen_on_time");
}
- private void readScreenOnTimeLocked() {
+ private void readScreenOnTime() {
File screenOnTimeFile = getScreenOnTimeFile();
if (screenOnTimeFile.exists()) {
try {
@@ -146,11 +145,11 @@
} catch (IOException | NumberFormatException e) {
}
} else {
- writeScreenOnTimeLocked();
+ writeScreenOnTime();
}
}
- private void writeScreenOnTimeLocked() {
+ private void writeScreenOnTime() {
AtomicFile screenOnTimeFile = new AtomicFile(getScreenOnTimeFile());
FileOutputStream fos = null;
try {
@@ -166,30 +165,30 @@
/**
* To be called periodically to keep track of elapsed time when app idle times are written
*/
- public void writeAppIdleDurationsLocked() {
+ public void writeAppIdleDurations() {
final long elapsedRealtime = SystemClock.elapsedRealtime();
// Only bump up and snapshot the elapsed time. Don't change screen on duration.
mElapsedDuration += elapsedRealtime - mElapsedSnapshot;
mElapsedSnapshot = elapsedRealtime;
- writeScreenOnTimeLocked();
+ writeScreenOnTime();
}
- public void reportUsageLocked(String packageName, int userId, long elapsedRealtime) {
- ArrayMap<String, PackageHistory> userHistory = getUserHistoryLocked(userId);
- PackageHistory packageHistory = getPackageHistoryLocked(userHistory, packageName,
+ public void reportUsage(String packageName, int userId, long elapsedRealtime) {
+ ArrayMap<String, PackageHistory> userHistory = getUserHistory(userId);
+ PackageHistory packageHistory = getPackageHistory(userHistory, packageName,
elapsedRealtime);
shiftHistoryToNow(userHistory, elapsedRealtime);
packageHistory.lastUsedElapsedTime = mElapsedDuration
+ (elapsedRealtime - mElapsedSnapshot);
- packageHistory.lastUsedScreenTime = getScreenOnTimeLocked(elapsedRealtime);
+ packageHistory.lastUsedScreenTime = getScreenOnTime(elapsedRealtime);
packageHistory.recent[HISTORY_SIZE - 1] = FLAG_LAST_STATE | FLAG_PARTIAL_ACTIVE;
}
public void setIdle(String packageName, int userId, long elapsedRealtime) {
- ArrayMap<String, PackageHistory> userHistory = getUserHistoryLocked(userId);
- PackageHistory packageHistory = getPackageHistoryLocked(userHistory, packageName,
+ ArrayMap<String, PackageHistory> userHistory = getUserHistory(userId);
+ PackageHistory packageHistory = getPackageHistory(userHistory, packageName,
elapsedRealtime);
shiftHistoryToNow(userHistory, elapsedRealtime);
@@ -222,23 +221,23 @@
mLastPeriod = thisPeriod;
}
- private ArrayMap<String, PackageHistory> getUserHistoryLocked(int userId) {
+ private ArrayMap<String, PackageHistory> getUserHistory(int userId) {
ArrayMap<String, PackageHistory> userHistory = mIdleHistory.get(userId);
if (userHistory == null) {
userHistory = new ArrayMap<>();
mIdleHistory.put(userId, userHistory);
- readAppIdleTimesLocked(userId, userHistory);
+ readAppIdleTimes(userId, userHistory);
}
return userHistory;
}
- private PackageHistory getPackageHistoryLocked(ArrayMap<String, PackageHistory> userHistory,
+ private PackageHistory getPackageHistory(ArrayMap<String, PackageHistory> userHistory,
String packageName, long elapsedRealtime) {
PackageHistory packageHistory = userHistory.get(packageName);
if (packageHistory == null) {
packageHistory = new PackageHistory();
- packageHistory.lastUsedElapsedTime = getElapsedTimeLocked(elapsedRealtime);
- packageHistory.lastUsedScreenTime = getScreenOnTimeLocked(elapsedRealtime);
+ packageHistory.lastUsedElapsedTime = getElapsedTime(elapsedRealtime);
+ packageHistory.lastUsedScreenTime = getScreenOnTime(elapsedRealtime);
userHistory.put(packageName, packageHistory);
}
return packageHistory;
@@ -248,41 +247,41 @@
mIdleHistory.remove(userId);
}
- public boolean isIdleLocked(String packageName, int userId, long elapsedRealtime) {
- ArrayMap<String, PackageHistory> userHistory = getUserHistoryLocked(userId);
+ public boolean isIdle(String packageName, int userId, long elapsedRealtime) {
+ ArrayMap<String, PackageHistory> userHistory = getUserHistory(userId);
PackageHistory packageHistory =
- getPackageHistoryLocked(userHistory, packageName, elapsedRealtime);
+ getPackageHistory(userHistory, packageName, elapsedRealtime);
if (packageHistory == null) {
return false; // Default to not idle
} else {
- return hasPassedThresholdsLocked(packageHistory, elapsedRealtime);
+ return hasPassedThresholds(packageHistory, elapsedRealtime);
}
}
- private long getElapsedTimeLocked(long elapsedRealtime) {
+ private long getElapsedTime(long elapsedRealtime) {
return (elapsedRealtime - mElapsedSnapshot + mElapsedDuration);
}
- public void setIdleLocked(String packageName, int userId, boolean idle, long elapsedRealtime) {
- ArrayMap<String, PackageHistory> userHistory = getUserHistoryLocked(userId);
- PackageHistory packageHistory = getPackageHistoryLocked(userHistory, packageName,
+ public void setIdle(String packageName, int userId, boolean idle, long elapsedRealtime) {
+ ArrayMap<String, PackageHistory> userHistory = getUserHistory(userId);
+ PackageHistory packageHistory = getPackageHistory(userHistory, packageName,
elapsedRealtime);
- packageHistory.lastUsedElapsedTime = getElapsedTimeLocked(elapsedRealtime)
+ packageHistory.lastUsedElapsedTime = getElapsedTime(elapsedRealtime)
- mElapsedTimeThreshold;
- packageHistory.lastUsedScreenTime = getScreenOnTimeLocked(elapsedRealtime)
+ packageHistory.lastUsedScreenTime = getScreenOnTime(elapsedRealtime)
- (idle ? mScreenOnTimeThreshold : 0) - 1000 /* just a second more */;
}
- public void clearUsageLocked(String packageName, int userId) {
- ArrayMap<String, PackageHistory> userHistory = getUserHistoryLocked(userId);
+ public void clearUsage(String packageName, int userId) {
+ ArrayMap<String, PackageHistory> userHistory = getUserHistory(userId);
userHistory.remove(packageName);
}
- private boolean hasPassedThresholdsLocked(PackageHistory packageHistory, long elapsedRealtime) {
+ private boolean hasPassedThresholds(PackageHistory packageHistory, long elapsedRealtime) {
return (packageHistory.lastUsedScreenTime
- <= getScreenOnTimeLocked(elapsedRealtime) - mScreenOnTimeThreshold)
+ <= getScreenOnTime(elapsedRealtime) - mScreenOnTimeThreshold)
&& (packageHistory.lastUsedElapsedTime
- <= getElapsedTimeLocked(elapsedRealtime) - mElapsedTimeThreshold);
+ <= getElapsedTime(elapsedRealtime) - mElapsedTimeThreshold);
}
private File getUserFile(int userId) {
@@ -290,7 +289,7 @@
Integer.toString(userId)), APP_IDLE_FILENAME);
}
- private void readAppIdleTimesLocked(int userId, ArrayMap<String, PackageHistory> userHistory) {
+ private void readAppIdleTimes(int userId, ArrayMap<String, PackageHistory> userHistory) {
FileInputStream fis = null;
try {
AtomicFile appIdleFile = new AtomicFile(getUserFile(userId));
@@ -332,7 +331,7 @@
}
}
- public void writeAppIdleTimesLocked(int userId) {
+ public void writeAppIdleTimes(int userId) {
FileOutputStream fos = null;
AtomicFile appIdleFile = new AtomicFile(getUserFile(userId));
try {
@@ -346,7 +345,7 @@
xml.startTag(null, TAG_PACKAGES);
- ArrayMap<String,PackageHistory> userHistory = getUserHistoryLocked(userId);
+ ArrayMap<String,PackageHistory> userHistory = getUserHistory(userId);
final int N = userHistory.size();
for (int i = 0; i < N; i++) {
String packageName = userHistory.keyAt(i);
@@ -374,8 +373,8 @@
idpw.increaseIndent();
ArrayMap<String, PackageHistory> userHistory = mIdleHistory.get(userId);
final long elapsedRealtime = SystemClock.elapsedRealtime();
- final long totalElapsedTime = getElapsedTimeLocked(elapsedRealtime);
- final long screenOnTime = getScreenOnTimeLocked(elapsedRealtime);
+ final long totalElapsedTime = getElapsedTime(elapsedRealtime);
+ final long screenOnTime = getScreenOnTime(elapsedRealtime);
if (userHistory == null) return;
final int P = userHistory.size();
for (int p = 0; p < P; p++) {
@@ -386,15 +385,15 @@
TimeUtils.formatDuration(totalElapsedTime - packageHistory.lastUsedElapsedTime, idpw);
idpw.print(" lastUsedScreenOn=");
TimeUtils.formatDuration(screenOnTime - packageHistory.lastUsedScreenTime, idpw);
- idpw.print(" idle=" + (isIdleLocked(packageName, userId, elapsedRealtime) ? "y" : "n"));
+ idpw.print(" idle=" + (isIdle(packageName, userId, elapsedRealtime) ? "y" : "n"));
idpw.println();
}
idpw.println();
idpw.print("totalElapsedTime=");
- TimeUtils.formatDuration(getElapsedTimeLocked(elapsedRealtime), idpw);
+ TimeUtils.formatDuration(getElapsedTime(elapsedRealtime), idpw);
idpw.println();
idpw.print("totalScreenOnTime=");
- TimeUtils.formatDuration(getScreenOnTimeLocked(elapsedRealtime), idpw);
+ TimeUtils.formatDuration(getScreenOnTime(elapsedRealtime), idpw);
idpw.println();
idpw.decreaseIndent();
}
@@ -410,7 +409,7 @@
for (int i = 0; i < HISTORY_SIZE; i++) {
idpw.print(history[i] == 0 ? '.' : 'A');
}
- idpw.print(" idle=" + (isIdleLocked(packageName, userId, elapsedRealtime) ? "y" : "n"));
+ idpw.print(" idle=" + (isIdle(packageName, userId, elapsedRealtime) ? "y" : "n"));
idpw.print(" " + packageName);
idpw.println();
}
diff --git a/services/usage/java/com/android/server/usage/StorageStatsService.java b/services/usage/java/com/android/server/usage/StorageStatsService.java
index 6826975..ed1530a 100644
--- a/services/usage/java/com/android/server/usage/StorageStatsService.java
+++ b/services/usage/java/com/android/server/usage/StorageStatsService.java
@@ -20,6 +20,8 @@
import android.app.usage.ExternalStorageStats;
import android.app.usage.IStorageStatsManager;
import android.app.usage.StorageStats;
+import android.app.usage.UsageStatsManagerInternal;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -28,25 +30,38 @@
import android.content.pm.UserInfo;
import android.os.Binder;
import android.os.Environment;
+import android.os.FileUtils;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.StatFs;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.StorageEventListener;
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
+import android.provider.Settings;
+import android.text.format.DateUtils;
import android.util.Slog;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
+import com.android.server.IoThread;
+import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.pm.Installer;
import com.android.server.pm.Installer.InstallerException;
+import com.android.server.storage.CacheQuotaStrategy;
public class StorageStatsService extends IStorageStatsManager.Stub {
private static final String TAG = "StorageStatsService";
private static final String PROP_VERIFY_STORAGE = "fw.verify_storage";
+ private static final long DELAY_IN_MILLIS = 30 * DateUtils.SECOND_IN_MILLIS;
+
public static class Lifecycle extends SystemService {
private StorageStatsService mService;
@@ -68,6 +83,7 @@
private final StorageManager mStorage;
private final Installer mInstaller;
+ private final H mHandler;
public StorageStatsService(Context context) {
mContext = Preconditions.checkNotNull(context);
@@ -80,6 +96,9 @@
mInstaller.onStart();
invalidateMounts();
+ mHandler = new H(IoThread.get().getLooper());
+ mHandler.sendEmptyMessageDelayed(H.MSG_CHECK_STORAGE_DELTA, DELAY_IN_MILLIS);
+
mStorage.registerListener(new StorageEventListener() {
@Override
public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState) {
@@ -115,15 +134,25 @@
}
@Override
+ public boolean isQuotaSupported(String volumeUuid, String callingPackage) {
+ enforcePermission(Binder.getCallingUid(), callingPackage);
+
+ try {
+ return mInstaller.isQuotaSupported(volumeUuid);
+ } catch (InstallerException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ @Override
public long getTotalBytes(String volumeUuid, String callingPackage) {
enforcePermission(Binder.getCallingUid(), callingPackage);
if (volumeUuid == StorageManager.UUID_PRIVATE_INTERNAL) {
- // TODO: round total size to nearest power of two
- return mStorage.getPrimaryStorageSize();
+ return FileUtils.roundStorageSize(mStorage.getPrimaryStorageSize());
} else {
final VolumeInfo vol = mStorage.findVolumeByUuid(volumeUuid);
- return vol.disk.size;
+ return FileUtils.roundStorageSize(vol.disk.size);
}
}
@@ -146,6 +175,43 @@
}
@Override
+ public StorageStats queryStatsForPackage(String volumeUuid, String packageName, int userId,
+ String callingPackage) {
+ enforcePermission(Binder.getCallingUid(), callingPackage);
+ if (userId != UserHandle.getCallingUserId()) {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.INTERACT_ACROSS_USERS, TAG);
+ }
+
+ final ApplicationInfo appInfo;
+ try {
+ appInfo = mPackage.getApplicationInfoAsUser(packageName, 0, userId);
+ } catch (NameNotFoundException e) {
+ throw new IllegalStateException(e);
+ }
+
+ if (mPackage.getPackagesForUid(appInfo.uid).length == 1) {
+ // Only one package inside UID means we can fast-path
+ return queryStatsForUid(volumeUuid, appInfo.uid, callingPackage);
+ } else {
+ // Multiple packages means we need to go manual
+ final int appId = UserHandle.getUserId(appInfo.uid);
+ final String[] packageNames = new String[] { packageName };
+ final long[] ceDataInodes = new long[1];
+ final String[] codePaths = new String[] { appInfo.getCodePath() };
+
+ final PackageStats stats = new PackageStats(TAG);
+ try {
+ mInstaller.getAppSize(volumeUuid, packageNames, userId, 0,
+ appId, ceDataInodes, codePaths, stats);
+ } catch (InstallerException e) {
+ throw new IllegalStateException(e);
+ }
+ return translate(stats);
+ }
+ }
+
+ @Override
public StorageStats queryStatsForUid(String volumeUuid, int uid, String callingPackage) {
enforcePermission(Binder.getCallingUid(), callingPackage);
if (UserHandle.getUserId(uid) != UserHandle.getCallingUserId()) {
@@ -274,4 +340,74 @@
res.cacheBytes = stats.cacheSize + stats.externalCacheSize;
return res;
}
+
+ private class H extends Handler {
+ private static final int MSG_CHECK_STORAGE_DELTA = 100;
+ /**
+ * By only triggering a re-calculation after the storage has changed sizes, we can avoid
+ * recalculating quotas too often. Minimum change delta defines the percentage of change
+ * we need to see before we recalculate.
+ */
+ private static final double MINIMUM_CHANGE_DELTA = 0.05;
+ private static final boolean DEBUG = false;
+
+ private final StatFs mStats;
+ private long mPreviousBytes;
+ private double mMinimumThresholdBytes;
+
+ public H(Looper looper) {
+ super(looper);
+ // TODO: Handle all private volumes.
+ mStats = new StatFs(Environment.getDataDirectory().getAbsolutePath());
+ mPreviousBytes = mStats.getFreeBytes();
+ mMinimumThresholdBytes = mStats.getTotalBytes() * MINIMUM_CHANGE_DELTA;
+ // TODO: Load cache quotas from a file to avoid re-doing work.
+ }
+
+ public void handleMessage(Message msg) {
+ if (DEBUG) {
+ Slog.v(TAG, ">>> handling " + msg.what);
+ }
+
+ if (!isCacheQuotaCalculationsEnabled(mContext.getContentResolver())) {
+ return;
+ }
+
+ switch (msg.what) {
+ case MSG_CHECK_STORAGE_DELTA: {
+ long bytesDelta = Math.abs(mPreviousBytes - mStats.getFreeBytes());
+ if (bytesDelta > mMinimumThresholdBytes) {
+ mPreviousBytes = mStats.getFreeBytes();
+ recalculateQuotas();
+ }
+ sendEmptyMessageDelayed(MSG_CHECK_STORAGE_DELTA, DELAY_IN_MILLIS);
+ break;
+ }
+ default:
+ if (DEBUG) {
+ Slog.v(TAG, ">>> default message case ");
+ }
+ return;
+ }
+ }
+
+ private void recalculateQuotas() {
+ if (DEBUG) {
+ Slog.v(TAG, ">>> recalculating quotas ");
+ }
+
+ UsageStatsManagerInternal usageStatsManager =
+ LocalServices.getService(UsageStatsManagerInternal.class);
+ CacheQuotaStrategy strategy = new CacheQuotaStrategy(
+ mContext, usageStatsManager, mInstaller);
+ // TODO: Save cache quotas to an XML file.
+ strategy.recalculateQuotas();
+ }
+ }
+
+ @VisibleForTesting
+ static boolean isCacheQuotaCalculationsEnabled(ContentResolver resolver) {
+ return Settings.Global.getInt(
+ resolver, Settings.Global.ENABLE_CACHE_QUOTA_CALCULATION, 1) != 0;
+ }
}
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 7a69803..469a8f1 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -153,13 +153,17 @@
private volatile boolean mPendingOneTimeCheckIdleStates;
private boolean mSystemServicesReady = false;
- @GuardedBy("mLock")
+ private final Object mAppIdleLock = new Object();
+ @GuardedBy("mAppIdleLock")
private AppIdleHistory mAppIdleHistory;
+ @GuardedBy("mAppIdleLock")
private ArrayList<UsageStatsManagerInternal.AppIdleStateChangeListener>
mPackageAccessListeners = new ArrayList<>();
+ @GuardedBy("mAppIdleLock")
private boolean mHaveCarrierPrivilegedApps;
+ @GuardedBy("mAppIdleLock")
private List<String> mCarrierPrivilegedApps;
public UsageStatsService(Context context) {
@@ -206,6 +210,8 @@
synchronized (mLock) {
cleanUpRemovedUsersLocked();
+ }
+ synchronized (mAppIdleLock) {
mAppIdleHistory = new AppIdleHistory(SystemClock.elapsedRealtime());
}
@@ -234,8 +240,8 @@
mPowerManager = getContext().getSystemService(PowerManager.class);
mDisplayManager.registerDisplayListener(mDisplayListener, mHandler);
- synchronized (mLock) {
- mAppIdleHistory.updateDisplayLocked(isDisplayOn(), SystemClock.elapsedRealtime());
+ synchronized (mAppIdleLock) {
+ mAppIdleHistory.updateDisplay(isDisplayOn(), SystemClock.elapsedRealtime());
}
if (mPendingOneTimeCheckIdleStates) {
@@ -324,8 +330,8 @@
@Override public void onDisplayChanged(int displayId) {
if (displayId == Display.DEFAULT_DISPLAY) {
final boolean displayOn = isDisplayOn();
- synchronized (UsageStatsService.this.mLock) {
- mAppIdleHistory.updateDisplayLocked(displayOn, SystemClock.elapsedRealtime());
+ synchronized (UsageStatsService.this.mAppIdleLock) {
+ mAppIdleHistory.updateDisplay(displayOn, SystemClock.elapsedRealtime());
}
}
}
@@ -386,18 +392,20 @@
PackageManager.MATCH_DISABLED_COMPONENTS,
userId);
final int packageCount = packages.size();
- for (int i = 0; i < packageCount; i++) {
- final PackageInfo pi = packages.get(i);
- String packageName = pi.packageName;
- if (pi.applicationInfo != null && pi.applicationInfo.isSystemApp()) {
- mAppIdleHistory.reportUsageLocked(packageName, userId, elapsedRealtime);
+ synchronized (mAppIdleLock) {
+ for (int i = 0; i < packageCount; i++) {
+ final PackageInfo pi = packages.get(i);
+ String packageName = pi.packageName;
+ if (pi.applicationInfo != null && pi.applicationInfo.isSystemApp()) {
+ mAppIdleHistory.reportUsage(packageName, userId, elapsedRealtime);
+ }
}
}
}
void clearAppIdleForPackage(String packageName, int userId) {
- synchronized (mLock) {
- mAppIdleHistory.clearUsageLocked(packageName, userId);
+ synchronized (mAppIdleLock) {
+ mAppIdleHistory.clearUsage(packageName, userId);
}
}
@@ -429,7 +437,7 @@
}
void setChargingState(boolean charging) {
- synchronized (mLock) {
+ synchronized (mAppIdleLock) {
if (mCharging != charging) {
mCharging = charging;
postParoleStateChanged();
@@ -439,15 +447,16 @@
/** Paroled here means temporary pardon from being inactive */
void setAppIdleParoled(boolean paroled) {
- synchronized (mLock) {
+ synchronized (mAppIdleLock) {
+ final long now = System.currentTimeMillis();
if (mAppIdleTempParoled != paroled) {
mAppIdleTempParoled = paroled;
if (DEBUG) Slog.d(TAG, "Changing paroled to " + mAppIdleTempParoled);
if (paroled) {
postParoleEndTimeout();
} else {
- mLastAppIdleParoledTime = checkAndGetTimeLocked();
- postNextParoleTimeout();
+ mLastAppIdleParoledTime = now;
+ postNextParoleTimeout(now);
}
postParoleStateChanged();
}
@@ -455,19 +464,18 @@
}
boolean isParoledOrCharging() {
- synchronized (mLock) {
+ synchronized (mAppIdleLock) {
return mAppIdleTempParoled || mCharging;
}
}
- private void postNextParoleTimeout() {
+ private void postNextParoleTimeout(long now) {
if (DEBUG) Slog.d(TAG, "Posting MSG_CHECK_PAROLE_TIMEOUT");
mHandler.removeMessages(MSG_CHECK_PAROLE_TIMEOUT);
// Compute when the next parole needs to happen. We check more frequently than necessary
// since the message handler delays are based on elapsedRealTime and not wallclock time.
// The comparison is done in wallclock time.
- long timeLeft = (mLastAppIdleParoledTime + mAppIdleParoleIntervalMillis)
- - checkAndGetTimeLocked();
+ long timeLeft = (mLastAppIdleParoledTime + mAppIdleParoleIntervalMillis) - now;
if (timeLeft < 0) {
timeLeft = 0;
}
@@ -546,7 +554,7 @@
mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS,
userId, isIdle ? 1 : 0, packageName));
if (isIdle) {
- synchronized (mLock) {
+ synchronized (mAppIdleLock) {
mAppIdleHistory.setIdle(packageName, userId, elapsedRealtime);
}
}
@@ -561,18 +569,23 @@
/** Check if it's been a while since last parole and let idle apps do some work */
void checkParoleTimeout() {
- synchronized (mLock) {
+ boolean setParoled = false;
+ synchronized (mAppIdleLock) {
+ final long now = System.currentTimeMillis();
if (!mAppIdleTempParoled) {
- final long timeSinceLastParole = checkAndGetTimeLocked() - mLastAppIdleParoledTime;
+ final long timeSinceLastParole = now - mLastAppIdleParoledTime;
if (timeSinceLastParole > mAppIdleParoleIntervalMillis) {
if (DEBUG) Slog.d(TAG, "Crossed default parole interval");
- setAppIdleParoled(true);
+ setParoled = true;
} else {
if (DEBUG) Slog.d(TAG, "Not long enough to go to parole");
- postNextParoleTimeout();
+ postNextParoleTimeout(now);
}
}
}
+ if (setParoled) {
+ setAppIdleParoled(true);
+ }
}
private void notifyBatteryStats(String packageName, int userId, boolean idle) {
@@ -593,17 +606,23 @@
void onDeviceIdleModeChanged() {
final boolean deviceIdle = mPowerManager.isDeviceIdleMode();
if (DEBUG) Slog.i(TAG, "DeviceIdleMode changed to " + deviceIdle);
- synchronized (mLock) {
- final long timeSinceLastParole = checkAndGetTimeLocked() - mLastAppIdleParoledTime;
+ boolean paroled = false;
+ synchronized (mAppIdleLock) {
+ final long timeSinceLastParole = System.currentTimeMillis() - mLastAppIdleParoledTime;
if (!deviceIdle
&& timeSinceLastParole >= mAppIdleParoleIntervalMillis) {
- if (DEBUG) Slog.i(TAG, "Bringing idle apps out of inactive state due to deviceIdleMode=false");
- setAppIdleParoled(true);
+ if (DEBUG) {
+ Slog.i(TAG, "Bringing idle apps out of inactive state due to deviceIdleMode=false");
+ }
+ paroled = true;
} else if (deviceIdle) {
if (DEBUG) Slog.i(TAG, "Device idle, back to prison");
- setAppIdleParoled(false);
+ paroled = false;
+ } else {
+ return;
}
}
+ setAppIdleParoled(paroled);
}
private static void deleteRecursively(File f) {
@@ -682,21 +701,24 @@
final UserUsageStatsService service =
getUserDataAndInitializeIfNeededLocked(userId, timeNow);
- // TODO: Ideally this should call isAppIdleFiltered() to avoid calling back
- // about apps that are on some kind of whitelist anyway.
- final boolean previouslyIdle = mAppIdleHistory.isIdleLocked(
- event.mPackage, userId, elapsedRealtime);
service.reportEvent(event);
- // Inform listeners if necessary
- if ((event.mEventType == Event.MOVE_TO_FOREGROUND
- || event.mEventType == Event.MOVE_TO_BACKGROUND
- || event.mEventType == Event.SYSTEM_INTERACTION
- || event.mEventType == Event.USER_INTERACTION)) {
- mAppIdleHistory.reportUsageLocked(event.mPackage, userId, elapsedRealtime);
- if (previouslyIdle) {
- mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, userId,
- /* idle = */ 0, event.mPackage));
- notifyBatteryStats(event.mPackage, userId, false);
+
+ synchronized (mAppIdleLock) {
+ // TODO: Ideally this should call isAppIdleFiltered() to avoid calling back
+ // about apps that are on some kind of whitelist anyway.
+ final boolean previouslyIdle = mAppIdleHistory.isIdle(
+ event.mPackage, userId, elapsedRealtime);
+ // Inform listeners if necessary
+ if ((event.mEventType == Event.MOVE_TO_FOREGROUND
+ || event.mEventType == Event.MOVE_TO_BACKGROUND
+ || event.mEventType == Event.SYSTEM_INTERACTION
+ || event.mEventType == Event.USER_INTERACTION)) {
+ mAppIdleHistory.reportUsage(event.mPackage, userId, elapsedRealtime);
+ if (previouslyIdle) {
+ mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, userId,
+ /* idle = */ 0, event.mPackage));
+ notifyBatteryStats(event.mPackage, userId, false);
+ }
}
}
}
@@ -716,7 +738,7 @@
continue;
}
if (!packageName.equals(providerPkgName)) {
- forceIdleState(packageName, userId, false);
+ setAppIdleAsync(packageName, false, userId);
}
} catch (NameNotFoundException e) {
// Shouldn't happen
@@ -728,25 +750,28 @@
* Forces the app's beginIdleTime and lastUsedTime to reflect idle or active. If idle,
* then it rolls back the beginIdleTime and lastUsedTime to a point in time that's behind
* the threshold for idle.
+ *
+ * This method is always called from the handler thread, so not much synchronization is
+ * required.
*/
void forceIdleState(String packageName, int userId, boolean idle) {
final int appId = getAppId(packageName);
if (appId < 0) return;
- synchronized (mLock) {
- final long elapsedRealtime = SystemClock.elapsedRealtime();
+ final long elapsedRealtime = SystemClock.elapsedRealtime();
- final boolean previouslyIdle = isAppIdleFiltered(packageName, appId,
- userId, elapsedRealtime);
- mAppIdleHistory.setIdleLocked(packageName, userId, idle, elapsedRealtime);
- final boolean stillIdle = isAppIdleFiltered(packageName, appId,
- userId, elapsedRealtime);
- // Inform listeners if necessary
- if (previouslyIdle != stillIdle) {
- mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, userId,
- /* idle = */ stillIdle ? 1 : 0, packageName));
- if (!stillIdle) {
- notifyBatteryStats(packageName, userId, idle);
- }
+ final boolean previouslyIdle = isAppIdleFiltered(packageName, appId,
+ userId, elapsedRealtime);
+ synchronized (mAppIdleLock) {
+ mAppIdleHistory.setIdle(packageName, userId, idle, elapsedRealtime);
+ }
+ final boolean stillIdle = isAppIdleFiltered(packageName, appId,
+ userId, elapsedRealtime);
+ // Inform listeners if necessary
+ if (previouslyIdle != stillIdle) {
+ mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, userId,
+ /* idle = */ stillIdle ? 1 : 0, packageName));
+ if (!stillIdle) {
+ notifyBatteryStats(packageName, userId, idle);
}
}
}
@@ -767,7 +792,9 @@
synchronized (mLock) {
Slog.i(TAG, "Removing user " + userId + " and all data.");
mUserState.remove(userId);
- mAppIdleHistory.onUserRemoved(userId);
+ synchronized (mAppIdleLock) {
+ mAppIdleHistory.onUserRemoved(userId);
+ }
cleanUpRemovedUsersLocked();
}
}
@@ -822,13 +849,13 @@
}
private boolean isAppIdleUnfiltered(String packageName, int userId, long elapsedRealtime) {
- synchronized (mLock) {
- return mAppIdleHistory.isIdleLocked(packageName, userId, elapsedRealtime);
+ synchronized (mAppIdleLock) {
+ return mAppIdleHistory.isIdle(packageName, userId, elapsedRealtime);
}
}
void addListener(AppIdleStateChangeListener listener) {
- synchronized (mLock) {
+ synchronized (mAppIdleLock) {
if (!mPackageAccessListeners.contains(listener)) {
mPackageAccessListeners.add(listener);
}
@@ -836,7 +863,7 @@
}
void removeListener(AppIdleStateChangeListener listener) {
- synchronized (mLock) {
+ synchronized (mAppIdleLock) {
mPackageAccessListeners.remove(listener);
}
}
@@ -988,7 +1015,7 @@
return res;
}
- void setAppIdle(String packageName, boolean idle, int userId) {
+ void setAppIdleAsync(String packageName, boolean idle, int userId) {
if (packageName == null) return;
mHandler.obtainMessage(MSG_FORCE_IDLE_STATE, userId, idle ? 1 : 0, packageName)
@@ -1012,9 +1039,9 @@
}
private boolean isCarrierApp(String packageName) {
- synchronized (mLock) {
+ synchronized (mAppIdleLock) {
if (!mHaveCarrierPrivilegedApps) {
- fetchCarrierPrivilegedAppsLocked();
+ fetchCarrierPrivilegedAppsLA();
}
if (mCarrierPrivilegedApps != null) {
return mCarrierPrivilegedApps.contains(packageName);
@@ -1027,13 +1054,14 @@
if (DEBUG) {
Slog.i(TAG, "Clearing carrier privileged apps list");
}
- synchronized (mLock) {
+ synchronized (mAppIdleLock) {
mHaveCarrierPrivilegedApps = false;
mCarrierPrivilegedApps = null; // Need to be refetched.
}
}
- private void fetchCarrierPrivilegedAppsLocked() {
+ @GuardedBy("mAppIdleLock")
+ private void fetchCarrierPrivilegedAppsLA() {
TelephonyManager telephonyManager =
getContext().getSystemService(TelephonyManager.class);
mCarrierPrivilegedApps = telephonyManager.getPackagesWithCarrierPrivileges();
@@ -1071,11 +1099,15 @@
for (int i = 0; i < userCount; i++) {
UserUsageStatsService service = mUserState.valueAt(i);
service.persistActiveStats();
- mAppIdleHistory.writeAppIdleTimesLocked(mUserState.keyAt(i));
+ synchronized (mAppIdleLock) {
+ mAppIdleHistory.writeAppIdleTimes(mUserState.keyAt(i));
+ }
}
// Persist elapsed and screen on time. If this fails for whatever reason, the apps will be
// considered not-idle, which is the safest outcome in such an event.
- mAppIdleHistory.writeAppIdleDurationsLocked();
+ synchronized (mAppIdleLock) {
+ mAppIdleHistory.writeAppIdleDurations();
+ }
mHandler.removeMessages(MSG_FLUSH_TO_DISK);
}
@@ -1100,20 +1132,26 @@
idpw.println();
if (args.length > 0) {
if ("history".equals(args[0])) {
- mAppIdleHistory.dumpHistory(idpw, mUserState.keyAt(i));
+ synchronized (mAppIdleLock) {
+ mAppIdleHistory.dumpHistory(idpw, mUserState.keyAt(i));
+ }
} else if ("flush".equals(args[0])) {
UsageStatsService.this.flushToDiskLocked();
pw.println("Flushed stats to disk");
}
}
}
- mAppIdleHistory.dump(idpw, mUserState.keyAt(i));
+ synchronized (mAppIdleLock) {
+ mAppIdleHistory.dump(idpw, mUserState.keyAt(i));
+ }
idpw.decreaseIndent();
}
pw.println();
- pw.println("Carrier privileged apps (have=" + mHaveCarrierPrivilegedApps
- + "): " + mCarrierPrivilegedApps);
+ synchronized (mAppIdleLock) {
+ pw.println("Carrier privileged apps (have=" + mHaveCarrierPrivilegedApps
+ + "): " + mCarrierPrivilegedApps);
+ }
pw.println();
pw.println("Settings:");
@@ -1252,7 +1290,7 @@
}
void updateSettings() {
- synchronized (mLock) {
+ synchronized (mAppIdleLock) {
// Look at global settings for this.
// TODO: Maybe apply different thresholds for different users.
try {
@@ -1384,7 +1422,7 @@
try {
userId = ActivityManager.getService().handleIncomingUser(
Binder.getCallingPid(), callingUid, userId, false, true,
- "setAppIdle", null);
+ "setAppInactive", null);
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
@@ -1394,7 +1432,7 @@
try {
final int appId = getAppId(packageName);
if (appId < 0) return;
- UsageStatsService.this.setAppIdle(packageName, idle, userId);
+ UsageStatsService.this.setAppIdleAsync(packageName, idle, userId);
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -1586,22 +1624,33 @@
@Override
public byte[] getBackupPayload(int user, String key) {
// Check to ensure that only user 0's data is b/r for now
- if (user == UserHandle.USER_SYSTEM) {
- final UserUsageStatsService userStats =
- getUserDataAndInitializeIfNeededLocked(user, checkAndGetTimeLocked());
- return userStats.getBackupPayload(key);
- } else {
- return null;
+ synchronized (UsageStatsService.this.mLock) {
+ if (user == UserHandle.USER_SYSTEM) {
+ final UserUsageStatsService userStats =
+ getUserDataAndInitializeIfNeededLocked(user, checkAndGetTimeLocked());
+ return userStats.getBackupPayload(key);
+ } else {
+ return null;
+ }
}
}
@Override
public void applyRestoredPayload(int user, String key, byte[] payload) {
- if (user == UserHandle.USER_SYSTEM) {
- final UserUsageStatsService userStats =
- getUserDataAndInitializeIfNeededLocked(user, checkAndGetTimeLocked());
- userStats.applyRestoredPayload(key, payload);
+ synchronized (UsageStatsService.this.mLock) {
+ if (user == UserHandle.USER_SYSTEM) {
+ final UserUsageStatsService userStats =
+ getUserDataAndInitializeIfNeededLocked(user, checkAndGetTimeLocked());
+ userStats.applyRestoredPayload(key, payload);
+ }
}
}
+
+ @Override
+ public List<UsageStats> queryUsageStatsForUser(
+ int userId, int intervalType, long beginTime, long endTime) {
+ return UsageStatsService.this.queryUsageStats(
+ userId, intervalType, beginTime, endTime);
+ }
}
}
diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
index d9f352c..8d335a5 100644
--- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
@@ -529,7 +529,6 @@
pw.decreaseIndent();
pw.println();
- pw.increaseIndent();
pw.println("ChooserCounts");
pw.increaseIndent();
for (UsageStats usageStats : pkgStats.values()) {
@@ -553,6 +552,7 @@
}
pw.println();
}
+ pw.decreaseIndent();
pw.println("configurations");
pw.increaseIndent();
diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java
index 4b8e4c8..bae7cdc 100644
--- a/services/usb/java/com/android/server/usb/UsbPortManager.java
+++ b/services/usb/java/com/android/server/usb/UsbPortManager.java
@@ -455,9 +455,9 @@
public void notifyRoleSwitchStatus(String portName, PortRole role, int retval) {
if (retval == Status.SUCCESS) {
- logAndPrint(Log.INFO, pw, portName + "role switch successful");
+ logAndPrint(Log.INFO, pw, portName + " role switch successful");
} else {
- logAndPrint(Log.ERROR, pw, portName + "role switch failed");
+ logAndPrint(Log.ERROR, pw, portName + " role switch failed");
}
}
};
@@ -498,11 +498,12 @@
mProxy.setCallback(mHALCallback);
mProxy.queryPortStatus();
} catch (NoSuchElementException e) {
- logAndPrint(Log.ERROR, pw, sSERVICENAME + "not found."
- + " Did the service failed to start ?");
+ logAndPrint(Log.ERROR, pw, sSERVICENAME + " not found."
+ + " Did the service fail to start?");
Thread.dumpStack();
} catch (RemoteException e) {
- logAndPrint(Log.ERROR, pw, sSERVICENAME + "connectToProxy: Service not responding");
+ logAndPrint(Log.ERROR, pw, sSERVICENAME
+ + " connectToProxy: Service not responding");
Thread.dumpStack();
}
}
diff --git a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java
index 2e99b6e..caf9ec6 100644
--- a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java
+++ b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java
@@ -16,6 +16,8 @@
package com.android.server.usb;
+import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_MANAGED_PROFILE;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.ActivityNotFoundException;
@@ -41,6 +43,8 @@
import android.util.AtomicFile;
import android.util.Log;
import android.util.Slog;
+import android.util.SparseArray;
+import android.util.SparseIntArray;
import android.util.Xml;
import com.android.internal.annotations.GuardedBy;
@@ -50,6 +54,8 @@
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.XmlUtils;
+import libcore.io.IoUtils;
+
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
@@ -66,10 +72,6 @@
import java.util.List;
import java.util.Map;
-import libcore.io.IoUtils;
-
-import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_MANAGED_PROFILE;
-
class UsbProfileGroupSettingsManager {
private static final String TAG = UsbProfileGroupSettingsManager.class.getSimpleName();
private static final boolean DEBUG = false;
@@ -873,6 +875,56 @@
return resolveInfos;
}
+ /**
+ * Only return those matches with the highest priority.
+ *
+ * @param matches All matches, some might have lower priority
+ *
+ * @return The matches with the highest priority
+ */
+ @NonNull
+ private ArrayList<ResolveInfo> preferHighPriority(
+ @NonNull ArrayList<ResolveInfo> matches) {
+ SparseArray<ArrayList<ResolveInfo>> highestPriorityMatchesByUserId = new SparseArray<>();
+ SparseIntArray highestPriorityByUserId = new SparseIntArray();
+
+ // Create list of highest priority matches per user in highestPriorityMatchesByUserId
+ int numMatches = matches.size();
+ for (int matchNum = 0; matchNum < numMatches; matchNum++) {
+ ResolveInfo match = matches.get(matchNum);
+
+ // If this a previously unknown user?
+ if (highestPriorityByUserId.indexOfKey(match.targetUserId) < 0) {
+ highestPriorityByUserId.put(match.targetUserId, Integer.MIN_VALUE);
+ highestPriorityMatchesByUserId.put(match.targetUserId, new ArrayList<>());
+ }
+
+ // Find current highest priority matches for the current user
+ int highestPriority = highestPriorityByUserId.get(match.targetUserId);
+ ArrayList<ResolveInfo> highestPriorityMatches = highestPriorityMatchesByUserId.get(
+ match.targetUserId);
+
+ if (match.priority == highestPriority) {
+ highestPriorityMatches.add(match);
+ } else if (match.priority > highestPriority) {
+ highestPriorityByUserId.put(match.targetUserId, match.priority);
+
+ highestPriorityMatches.clear();
+ highestPriorityMatches.add(match);
+ }
+ }
+
+ // Combine all users back together. This means that all matches have the same priority for a
+ // user. Matches for different users might have different priority.
+ ArrayList<ResolveInfo> combinedMatches = new ArrayList<>();
+ int numMatchArrays = highestPriorityMatchesByUserId.size();
+ for (int matchArrayNum = 0; matchArrayNum < numMatchArrays; matchArrayNum++) {
+ combinedMatches.addAll(highestPriorityMatchesByUserId.valueAt(matchArrayNum));
+ }
+
+ return combinedMatches;
+ }
+
private final ArrayList<ResolveInfo> getDeviceMatchesLocked(UsbDevice device, Intent intent) {
ArrayList<ResolveInfo> matches = new ArrayList<ResolveInfo>();
List<ResolveInfo> resolveInfos = queryIntentActivitiesForAllProfiles(intent);
@@ -883,7 +935,7 @@
matches.add(resolveInfo);
}
}
- return matches;
+ return preferHighPriority(matches);
}
private final ArrayList<ResolveInfo> getAccessoryMatchesLocked(
@@ -897,7 +949,7 @@
matches.add(resolveInfo);
}
}
- return matches;
+ return preferHighPriority(matches);
}
public void deviceAttached(UsbDevice device) {
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index b20384d..4295d40 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -16,12 +16,21 @@
package android.telecom;
+import android.annotation.IntDef;
+import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
+import android.os.ParcelFileDescriptor;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
import java.lang.String;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -835,6 +844,142 @@
* @param extras Extras associated with the connection event.
*/
public void onConnectionEvent(Call call, String event, Bundle extras) {}
+
+ /**
+ * Invoked when the RTT mode changes for this call.
+ * @param call The call whose RTT mode has changed.
+ * @param mode the new RTT mode, one of
+ * {@link RttCall#RTT_MODE_FULL}, {@link RttCall#RTT_MODE_HCO},
+ * or {@link RttCall#RTT_MODE_VCO}
+ */
+ public void onRttModeChanged(Call call, int mode) {}
+
+ /**
+ * Invoked when the call's RTT status changes, either from off to on or from on to off.
+ * @param call The call whose RTT status has changed.
+ * @param enabled whether RTT is now enabled or disabled
+ * @param rttCall the {@link RttCall} object to use for reading and writing if RTT is now
+ * on, null otherwise.
+ */
+ public void onRttStatusChanged(Call call, boolean enabled, RttCall rttCall) {}
+
+ /**
+ * Invoked when the remote end of the connection has requested that an RTT communication
+ * channel be opened. A response to this should be sent via {@link #respondToRttRequest}
+ * with the same ID that this method is invoked with.
+ * @param call The call which the RTT request was placed on
+ * @param id The ID of the request.
+ */
+ public void onRttRequest(Call call, int id) {}
+ }
+
+ /**
+ * A class that holds the state that describes the state of the RTT channel to the remote
+ * party, if it is active.
+ */
+ public static final class RttCall {
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({RTT_MODE_INVALID, RTT_MODE_FULL, RTT_MODE_HCO, RTT_MODE_VCO})
+ public @interface RttAudioMode {}
+
+ /**
+ * For metrics use. Default value in the proto.
+ * @hide
+ */
+ public static final int RTT_MODE_INVALID = 0;
+
+ /**
+ * Indicates that there should be a bidirectional audio stream between the two parties
+ * on the call.
+ */
+ public static final int RTT_MODE_FULL = 1;
+
+ /**
+ * Indicates that the local user should be able to hear the audio stream from the remote
+ * user, but not vice versa. Equivalent to muting the microphone.
+ */
+ public static final int RTT_MODE_HCO = 2;
+
+ /**
+ * Indicates that the remote user should be able to hear the audio stream from the local
+ * user, but not vice versa. Equivalent to setting the volume to zero.
+ */
+ public static final int RTT_MODE_VCO = 3;
+
+ private static final int READ_BUFFER_SIZE = 1000;
+
+ private InputStreamReader mReceiveStream;
+ private OutputStreamWriter mTransmitStream;
+ private int mRttMode;
+ private final InCallAdapter mInCallAdapter;
+ private char[] mReadBuffer = new char[READ_BUFFER_SIZE];
+
+ /**
+ * @hide
+ */
+ public RttCall(InputStreamReader receiveStream, OutputStreamWriter transmitStream,
+ int mode, InCallAdapter inCallAdapter) {
+ mReceiveStream = receiveStream;
+ mTransmitStream = transmitStream;
+ mRttMode = mode;
+ mInCallAdapter = inCallAdapter;
+ }
+
+ /**
+ * Returns the current RTT audio mode.
+ * @return Current RTT audio mode. One of {@link #RTT_MODE_FULL}, {@link #RTT_MODE_VCO}, or
+ * {@link #RTT_MODE_HCO}.
+ */
+ public int getRttAudioMode() {
+ return mRttMode;
+ }
+
+ /**
+ * Sets the RTT audio mode. The requested mode change will be communicated through
+ * {@link Callback#onRttModeChanged(Call, int)}.
+ * @param mode The desired RTT audio mode, one of {@link #RTT_MODE_FULL},
+ * {@link #RTT_MODE_VCO}, or {@link #RTT_MODE_HCO}.
+ */
+ public void setRttMode(@RttAudioMode int mode) {
+ mInCallAdapter.setRttMode(mode);
+ }
+
+ /**
+ * Writes the string {@param input} into the outgoing text stream for this RTT call. Since
+ * RTT transmits text in real-time, this method should be called once for each character
+ * the user enters into the device.
+ *
+ * This method is not thread-safe -- calling it from multiple threads simultaneously may
+ * lead to interleaved text.
+ * @param input The message to send to the remote user.
+ */
+ public void write(String input) throws IOException {
+ mTransmitStream.write(input);
+ mTransmitStream.flush();
+ }
+
+ /**
+ * Reads a string from the remote user, blocking if there is no data available. Returns
+ * {@code null} if the RTT conversation has been terminated and there is no further data
+ * to read.
+ *
+ * This method is not thread-safe -- calling it from multiple threads simultaneously may
+ * lead to interleaved text.
+ * @return A string containing text sent by the remote user, or {@code null} if the
+ * conversation has been terminated or if there was an error while reading.
+ */
+ public String read() {
+ try {
+ int numRead = mReceiveStream.read(mReadBuffer, 0, READ_BUFFER_SIZE);
+ if (numRead < 0) {
+ return null;
+ }
+ return new String(mReadBuffer, 0, numRead);
+ } catch (IOException e) {
+ Log.w(this, "Exception encountered when reading from InputStreamReader: %s", e);
+ return null;
+ }
+ }
}
/**
@@ -863,6 +1008,7 @@
private String mCallingPackage;
private String mRemainingPostDialSequence;
private VideoCallImpl mVideoCallImpl;
+ private RttCall mRttCall;
private Details mDetails;
private Bundle mExtras;
@@ -1061,6 +1207,34 @@
}
/**
+ * Sends an RTT upgrade request to the remote end of the connection. Success is not
+ * guaranteed, and notification of success will be via the
+ * {@link Callback#onRttStatusChanged(Call, boolean, RttCall)} callback.
+ */
+ public void sendRttRequest() {
+ mInCallAdapter.sendRttRequest();
+ }
+
+ /**
+ * Responds to an RTT request received via the {@link Callback#onRttRequest(Call, int)} )}
+ * callback.
+ * The ID used here should be the same as the ID that was received via the callback.
+ * @param id The request ID received via {@link Callback#onRttRequest(Call, int)}
+ * @param accept {@code true} if the RTT request should be accepted, {@code false} otherwise.
+ */
+ public void respondToRttRequest(int id, boolean accept) {
+ mInCallAdapter.respondToRttRequest(id, accept);
+ }
+
+ /**
+ * Terminate the RTT session on this call. The resulting state change will be notified via
+ * the {@link Callback#onRttStatusChanged(Call, boolean, RttCall)} callback.
+ */
+ public void stopRtt() {
+ mInCallAdapter.stopRtt();
+ }
+
+ /**
* Adds some extras to this {@link Call}. Existing keys are replaced and new ones are
* added.
* <p>
@@ -1240,6 +1414,23 @@
}
/**
+ * Returns this call's RttCall object. The {@link RttCall} instance is used to send and
+ * receive RTT text data, as well as to change the RTT mode.
+ * @return A {@link Call.RttCall}. {@code null} if there is no active RTT connection.
+ */
+ public @Nullable RttCall getRttCall() {
+ return mRttCall;
+ }
+
+ /**
+ * Returns whether this call has an active RTT connection.
+ * @return true if there is a connection, false otherwise.
+ */
+ public boolean isRttActive() {
+ return mRttCall != null;
+ }
+
+ /**
* Registers a callback to this {@code Call}.
*
* @param callback A {@code Callback}.
@@ -1433,6 +1624,32 @@
fireConferenceableCallsChanged();
}
+ boolean isRttChanged = false;
+ boolean rttModeChanged = false;
+ if (parcelableCall.getParcelableRttCall() != null && parcelableCall.getIsRttCallChanged()) {
+ ParcelableRttCall parcelableRttCall = parcelableCall.getParcelableRttCall();
+ InputStreamReader receiveStream = new InputStreamReader(
+ new ParcelFileDescriptor.AutoCloseInputStream(
+ parcelableRttCall.getReceiveStream()),
+ StandardCharsets.UTF_8);
+ OutputStreamWriter transmitStream = new OutputStreamWriter(
+ new ParcelFileDescriptor.AutoCloseOutputStream(
+ parcelableRttCall.getTransmitStream()),
+ StandardCharsets.UTF_8);
+ RttCall newRttCall = new Call.RttCall(
+ receiveStream, transmitStream, parcelableRttCall.getRttMode(), mInCallAdapter);
+ if (mRttCall == null) {
+ isRttChanged = true;
+ } else if (mRttCall.getRttAudioMode() != newRttCall.getRttAudioMode()) {
+ rttModeChanged = true;
+ }
+ mRttCall = newRttCall;
+ } else if (mRttCall != null && parcelableCall.getParcelableRttCall() == null
+ && parcelableCall.getIsRttCallChanged()) {
+ isRttChanged = true;
+ mRttCall = null;
+ }
+
// Now we fire updates, ensuring that any client who listens to any of these notifications
// gets the most up-to-date state.
@@ -1454,6 +1671,12 @@
if (childrenChanged) {
fireChildrenChanged(getChildren());
}
+ if (isRttChanged) {
+ fireOnIsRttChanged(mRttCall != null, mRttCall);
+ }
+ if (rttModeChanged) {
+ fireOnRttModeChanged(mRttCall.getRttAudioMode());
+ }
// If we have transitioned to DISCONNECTED, that means we need to notify clients and
// remove ourselves from the Phone. Note that we do this after completing all state updates
@@ -1484,6 +1707,15 @@
fireOnConnectionEvent(event, extras);
}
+ /** {@hide} */
+ final void internalOnRttUpgradeRequest(final int requestId) {
+ for (CallbackRecord<Callback> record : mCallbackRecords) {
+ final Call call = this;
+ final Callback callback = record.getCallback();
+ record.getHandler().post(() -> callback.onRttRequest(call, requestId));
+ }
+ }
+
private void fireStateChanged(final int newState) {
for (CallbackRecord<Callback> record : mCallbackRecords) {
final Call call = this;
@@ -1652,6 +1884,32 @@
}
/**
+ * Notifies listeners of an RTT on/off change
+ *
+ * @param enabled True if RTT is now enabled, false otherwise
+ */
+ private void fireOnIsRttChanged(final boolean enabled, final RttCall rttCall) {
+ for (CallbackRecord<Callback> record : mCallbackRecords) {
+ final Call call = this;
+ final Callback callback = record.getCallback();
+ record.getHandler().post(() -> callback.onRttStatusChanged(call, enabled, rttCall));
+ }
+ }
+
+ /**
+ * Notifies listeners of a RTT mode change
+ *
+ * @param mode The new RTT mode
+ */
+ private void fireOnRttModeChanged(final int mode) {
+ for (CallbackRecord<Callback> record : mCallbackRecords) {
+ final Call call = this;
+ final Callback callback = record.getCallback();
+ record.getHandler().post(() -> callback.onRttModeChanged(call, mode));
+ }
+ }
+
+ /**
* Determines if two bundles are equal.
*
* @param bundle The original bundle.
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index b7391b4..3e690b9 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -31,10 +31,14 @@
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
+import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.util.ArraySet;
import android.view.Surface;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -385,8 +389,14 @@
*/
public static final int PROPERTY_SELF_MANAGED = 1<<7;
+ /**
+ * When set, indicates that a connection has an active RTT session associated with it.
+ * @hide
+ */
+ public static final int PROPERTY_IS_RTT = 1 << 8;
+
//**********************************************************************************************
- // Next PROPERTY value: 1<<8
+ // Next PROPERTY value: 1<<9
//**********************************************************************************************
/**
@@ -757,6 +767,65 @@
}
/**
+ * Provides methods to read and write RTT data to/from the in-call app.
+ * @hide
+ */
+ public static final class RttTextStream {
+ private static final int READ_BUFFER_SIZE = 1000;
+ private final InputStreamReader mPipeFromInCall;
+ private final OutputStreamWriter mPipeToInCall;
+ private char[] mReadBuffer = new char[READ_BUFFER_SIZE];
+
+ /**
+ * @hide
+ */
+ public RttTextStream(ParcelFileDescriptor toInCall, ParcelFileDescriptor fromInCall) {
+ mPipeFromInCall = new InputStreamReader(
+ new ParcelFileDescriptor.AutoCloseInputStream(fromInCall));
+ mPipeToInCall = new OutputStreamWriter(
+ new ParcelFileDescriptor.AutoCloseOutputStream(toInCall));
+ }
+
+ /**
+ * Writes the string {@param input} into the text stream to the UI for this RTT call. Since
+ * RTT transmits text in real-time, this method should be called as often as text snippets
+ * are received from the remote user, even if it is only one character.
+ *
+ * This method is not thread-safe -- calling it from multiple threads simultaneously may
+ * lead to interleaved text.
+ * @param input The message to send to the in-call app.
+ */
+ public void write(String input) throws IOException {
+ mPipeToInCall.write(input);
+ mPipeToInCall.flush();
+ }
+
+
+ /**
+ * Reads a string from the in-call app, blocking if there is no data available. Returns
+ * {@code null} if the RTT conversation has been terminated and there is no further data
+ * to read.
+ *
+ * This method is not thread-safe -- calling it from multiple threads simultaneously may
+ * lead to interleaved text.
+ * @return A string containing text entered by the user, or {@code null} if the
+ * conversation has been terminated or if there was an error while reading.
+ */
+ public String read() {
+ try {
+ int numRead = mPipeFromInCall.read(mReadBuffer, 0, READ_BUFFER_SIZE);
+ if (numRead < 0) {
+ return null;
+ }
+ return new String(mReadBuffer, 0, numRead);
+ } catch (IOException e) {
+ Log.w(this, "Exception encountered when reading from InputStreamReader: %s", e);
+ return null;
+ }
+ }
+ }
+
+ /**
* Provides a means of controlling the video session associated with a {@link Connection}.
* <p>
* Implementations create a custom subclass of {@link VideoProvider} and the
diff --git a/telecomm/java/android/telecom/ConnectionRequest.java b/telecomm/java/android/telecom/ConnectionRequest.java
index 2343462..054de4c 100644
--- a/telecomm/java/android/telecom/ConnectionRequest.java
+++ b/telecomm/java/android/telecom/ConnectionRequest.java
@@ -19,6 +19,7 @@
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcel;
+import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
/**
@@ -27,13 +28,121 @@
*/
public final class ConnectionRequest implements Parcelable {
- // TODO: Token to limit recursive invocations
+ /**
+ * Builder class for {@link ConnectionRequest}
+ * @hide
+ */
+ public static final class Builder {
+ private PhoneAccountHandle mAccountHandle;
+ private Uri mAddress;
+ private Bundle mExtras;
+ private int mVideoState = VideoProfile.STATE_AUDIO_ONLY;
+ private String mTelecomCallId;
+ private boolean mShouldShowIncomingCallUi = false;
+ private ParcelFileDescriptor mRttPipeToInCall;
+ private ParcelFileDescriptor mRttPipeFromInCall;
+
+ public Builder() { }
+
+ /**
+ * Sets the phone account handle for the resulting {@link ConnectionRequest}
+ * @param accountHandle The accountHandle which should be used to place the call.
+ */
+ public Builder setAccountHandle(PhoneAccountHandle accountHandle) {
+ this.mAccountHandle = accountHandle;
+ return this;
+ }
+
+ /**
+ * Sets the address for the resulting {@link ConnectionRequest}
+ * @param address The address(e.g., phone number) to which the {@link Connection} is to
+ * connect.
+ */
+ public Builder setAddress(Uri address) {
+ this.mAddress = address;
+ return this;
+ }
+
+ /**
+ * Sets the extras bundle for the resulting {@link ConnectionRequest}
+ * @param extras Application-specific extra data.
+ */
+ public Builder setExtras(Bundle extras) {
+ this.mExtras = extras;
+ return this;
+ }
+
+ /**
+ * Sets the video state for the resulting {@link ConnectionRequest}
+ * @param videoState Determines the video state for the connection.
+ */
+ public Builder setVideoState(int videoState) {
+ this.mVideoState = videoState;
+ return this;
+ }
+
+ /**
+ * Sets the Telecom call ID for the resulting {@link ConnectionRequest}
+ * @param telecomCallId The telecom call ID.
+ */
+ public Builder setTelecomCallId(String telecomCallId) {
+ this.mTelecomCallId = telecomCallId;
+ return this;
+ }
+
+ /**
+ * Sets shouldShowIncomingUi for the resulting {@link ConnectionRequest}
+ * @param shouldShowIncomingCallUi For a self-managed {@link ConnectionService}, will be
+ * {@code true} if the {@link ConnectionService} should show
+ * its own incoming call UI for an incoming call. When
+ * {@code false}, Telecom shows the incoming call UI.
+ */
+ public Builder setShouldShowIncomingCallUi(boolean shouldShowIncomingCallUi) {
+ this.mShouldShowIncomingCallUi = shouldShowIncomingCallUi;
+ return this;
+ }
+
+ /**
+ * Sets the RTT pipe for transferring text into the {@link ConnectionService} for the
+ * resulting {@link ConnectionRequest}
+ * @param rttPipeFromInCall The data pipe to read from.
+ */
+ public Builder setRttPipeFromInCall(ParcelFileDescriptor rttPipeFromInCall) {
+ this.mRttPipeFromInCall = rttPipeFromInCall;
+ return this;
+ }
+
+ /**
+ * Sets the RTT pipe for transferring text out of {@link ConnectionService} for the
+ * resulting {@link ConnectionRequest}
+ * @param rttPipeToInCall The data pipe to write to.
+ */
+ public Builder setRttPipeToInCall(ParcelFileDescriptor rttPipeToInCall) {
+ this.mRttPipeToInCall = rttPipeToInCall;
+ return this;
+ }
+
+ public ConnectionRequest build() {
+ return new ConnectionRequest(
+ mAccountHandle,
+ mAddress,
+ mExtras,
+ mVideoState,
+ mTelecomCallId,
+ mShouldShowIncomingCallUi,
+ mRttPipeFromInCall,
+ mRttPipeToInCall);
+ }
+ }
+
private final PhoneAccountHandle mAccountHandle;
private final Uri mAddress;
private final Bundle mExtras;
private final int mVideoState;
private final String mTelecomCallId;
private final boolean mShouldShowIncomingCallUi;
+ private final ParcelFileDescriptor mRttPipeToInCall;
+ private final ParcelFileDescriptor mRttPipeFromInCall;
/**
* @param accountHandle The accountHandle which should be used to place the call.
@@ -44,7 +153,7 @@
PhoneAccountHandle accountHandle,
Uri handle,
Bundle extras) {
- this(accountHandle, handle, extras, VideoProfile.STATE_AUDIO_ONLY, null, false);
+ this(accountHandle, handle, extras, VideoProfile.STATE_AUDIO_ONLY, null, false, null, null);
}
/**
@@ -58,7 +167,7 @@
Uri handle,
Bundle extras,
int videoState) {
- this(accountHandle, handle, extras, videoState, null, false);
+ this(accountHandle, handle, extras, videoState, null, false, null, null);
}
/**
@@ -80,12 +189,27 @@
int videoState,
String telecomCallId,
boolean shouldShowIncomingCallUi) {
+ this(accountHandle, handle, extras, videoState, telecomCallId,
+ shouldShowIncomingCallUi, null, null);
+ }
+
+ private ConnectionRequest(
+ PhoneAccountHandle accountHandle,
+ Uri handle,
+ Bundle extras,
+ int videoState,
+ String telecomCallId,
+ boolean shouldShowIncomingCallUi,
+ ParcelFileDescriptor rttPipeFromInCall,
+ ParcelFileDescriptor rttPipeToInCall) {
mAccountHandle = accountHandle;
mAddress = handle;
mExtras = extras;
mVideoState = videoState;
mTelecomCallId = telecomCallId;
mShouldShowIncomingCallUi = shouldShowIncomingCallUi;
+ mRttPipeFromInCall = rttPipeFromInCall;
+ mRttPipeToInCall = rttPipeToInCall;
}
private ConnectionRequest(Parcel in) {
@@ -95,6 +219,8 @@
mVideoState = in.readInt();
mTelecomCallId = in.readString();
mShouldShowIncomingCallUi = in.readInt() == 1;
+ mRttPipeFromInCall = in.readParcelable(getClass().getClassLoader());
+ mRttPipeToInCall = in.readParcelable(getClass().getClassLoader());
}
/**
@@ -149,6 +275,59 @@
return mShouldShowIncomingCallUi;
}
+ /**
+ * Gets the {@link ParcelFileDescriptor} that is used to send RTT text from the connection
+ * service to the in-call UI. In order to obtain an
+ * {@link java.io.InputStream} from this {@link ParcelFileDescriptor}, use
+ * {@link android.os.ParcelFileDescriptor.AutoCloseInputStream}.
+ * Only text data encoded using UTF-8 should be written into this {@link ParcelFileDescriptor}.
+ * @return The {@link ParcelFileDescriptor} that should be used for communication.
+ * Do not un-hide -- only for use by Telephony
+ * @hide
+ */
+ public ParcelFileDescriptor getRttPipeToInCall() {
+ return mRttPipeToInCall;
+ }
+
+ /**
+ * Gets the {@link ParcelFileDescriptor} that is used to send RTT text from the in-call UI to
+ * the connection service. In order to obtain an
+ * {@link java.io.OutputStream} from this {@link ParcelFileDescriptor}, use
+ * {@link android.os.ParcelFileDescriptor.AutoCloseOutputStream}.
+ * The contents of this {@link ParcelFileDescriptor} will consist solely of text encoded in
+ * UTF-8.
+ * @return The {@link ParcelFileDescriptor} that should be used for communication
+ * Do not un-hide -- only for use by Telephony
+ * @hide
+ */
+ public ParcelFileDescriptor getRttPipeFromInCall() {
+ return mRttPipeFromInCall;
+ }
+
+ /**
+ * Gets the {@link android.telecom.Connection.RttTextStream} object that should be used to
+ * send and receive RTT text to/from the in-call app.
+ * @return An instance of {@link android.telecom.Connection.RttTextStream}, or {@code null}
+ * if this connection request is not requesting an RTT session upon connection establishment.
+ * @hide
+ */
+ public Connection.RttTextStream getRttTextStream() {
+ if (isRequestingRtt()) {
+ return new Connection.RttTextStream(mRttPipeToInCall, mRttPipeFromInCall);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Convenience method for determining whether the ConnectionRequest is requesting an RTT session
+ * @return {@code true} if RTT is requested, {@code false} otherwise.
+ * @hide
+ */
+ public boolean isRequestingRtt() {
+ return mRttPipeFromInCall != null && mRttPipeToInCall != null;
+ }
+
@Override
public String toString() {
return String.format("ConnectionRequest %s %s",
@@ -186,5 +365,7 @@
destination.writeInt(mVideoState);
destination.writeString(mTelecomCallId);
destination.writeInt(mShouldShowIncomingCallUi ? 1 : 0);
+ destination.writeParcelable(mRttPipeFromInCall, 0);
+ destination.writeParcelable(mRttPipeToInCall, 0);
}
}
diff --git a/telecomm/java/android/telecom/InCallAdapter.java b/telecomm/java/android/telecom/InCallAdapter.java
index 3f270d9..d640b1d 100644
--- a/telecomm/java/android/telecom/InCallAdapter.java
+++ b/telecomm/java/android/telecom/InCallAdapter.java
@@ -34,7 +34,7 @@
* <p>
* The adapter will stop functioning when there are no more calls.
*
- * {@hide}
+ * @hide
*/
public final class InCallAdapter {
private final IInCallAdapter mAdapter;
@@ -375,4 +375,48 @@
} catch (RemoteException ignored) {
}
}
+
+ /**
+ * Sends an RTT upgrade request to the remote end of the connection.
+ */
+ public void sendRttRequest() {
+ try {
+ mAdapter.sendRttRequest();
+ } catch (RemoteException ignored) {
+ }
+ }
+
+ /**
+ * Responds to an RTT upgrade request initiated from the remote end.
+ *
+ * @param id the ID of the request as specified by Telecom
+ * @param accept Whether the request should be accepted.
+ */
+ public void respondToRttRequest(int id, boolean accept) {
+ try {
+ mAdapter.respondToRttRequest(id, accept);
+ } catch (RemoteException ignored) {
+ }
+ }
+
+ /**
+ * Instructs Telecom to shut down the RTT communication channel.
+ */
+ public void stopRtt() {
+ try {
+ mAdapter.stopRtt();
+ } catch (RemoteException ignored) {
+ }
+ }
+
+ /**
+ * Sets the RTT audio mode.
+ * @param mode the desired RTT audio mode
+ */
+ public void setRttMode(int mode) {
+ try {
+ mAdapter.setRttMode(mode);
+ } catch (RemoteException ignored) {
+ }
+ }
}
diff --git a/telecomm/java/android/telecom/InCallService.java b/telecomm/java/android/telecom/InCallService.java
index 5d68aae..4bc64c0 100644
--- a/telecomm/java/android/telecom/InCallService.java
+++ b/telecomm/java/android/telecom/InCallService.java
@@ -76,6 +76,7 @@
private static final int MSG_ON_CAN_ADD_CALL_CHANGED = 7;
private static final int MSG_SILENCE_RINGER = 8;
private static final int MSG_ON_CONNECTION_EVENT = 9;
+ private static final int MSG_ON_RTT_UPGRADE_REQUEST = 10;
/** Default Handler used to consolidate binder method calls onto a single thread. */
private final Handler mHandler = new Handler(Looper.getMainLooper()) {
@@ -133,6 +134,12 @@
}
break;
}
+ case MSG_ON_RTT_UPGRADE_REQUEST: {
+ String callId = (String) msg.obj;
+ int requestId = msg.arg1;
+ mPhone.internalOnRttUpgradeRequest(callId, requestId);
+ break;
+ }
default:
break;
}
@@ -198,6 +205,11 @@
args.arg3 = extras;
mHandler.obtainMessage(MSG_ON_CONNECTION_EVENT, args).sendToTarget();
}
+
+ @Override
+ public void onRttUpgradeRequest(String callId, int id) {
+ mHandler.obtainMessage(MSG_ON_RTT_UPGRADE_REQUEST, id, 0, callId).sendToTarget();
+ }
}
private Phone.Listener mPhoneListener = new Phone.Listener() {
diff --git a/telecomm/java/android/telecom/ParcelableCall.java b/telecomm/java/android/telecom/ParcelableCall.java
index a3fce9c..975aa5a 100644
--- a/telecomm/java/android/telecom/ParcelableCall.java
+++ b/telecomm/java/android/telecom/ParcelableCall.java
@@ -50,6 +50,8 @@
private final boolean mIsVideoCallProviderChanged;
private final IVideoProvider mVideoCallProvider;
private VideoCallImpl mVideoCall;
+ private final boolean mIsRttCallChanged;
+ private final ParcelableRttCall mRttCall;
private final String mParentCallId;
private final List<String> mChildCallIds;
private final StatusHints mStatusHints;
@@ -75,6 +77,8 @@
PhoneAccountHandle accountHandle,
boolean isVideoCallProviderChanged,
IVideoProvider videoCallProvider,
+ boolean isRttCallChanged,
+ ParcelableRttCall rttCall,
String parentCallId,
List<String> childCallIds,
StatusHints statusHints,
@@ -98,6 +102,8 @@
mAccountHandle = accountHandle;
mIsVideoCallProviderChanged = isVideoCallProviderChanged;
mVideoCallProvider = videoCallProvider;
+ mIsRttCallChanged = isRttCallChanged;
+ mRttCall = rttCall;
mParentCallId = parentCallId;
mChildCallIds = childCallIds;
mStatusHints = statusHints;
@@ -202,6 +208,18 @@
return mVideoCall;
}
+ public boolean getIsRttCallChanged() {
+ return mIsRttCallChanged;
+ }
+
+ /**
+ * RTT communication channel information
+ * @return The ParcelableRttCall
+ */
+ public ParcelableRttCall getParcelableRttCall() {
+ return mRttCall;
+ }
+
/**
* The conference call to which this call is conferenced. Null if not conferenced.
*/
@@ -301,6 +319,8 @@
Bundle intentExtras = source.readBundle(classLoader);
Bundle extras = source.readBundle(classLoader);
int supportedAudioRoutes = source.readInt();
+ boolean isRttCallChanged = source.readByte() == 1;
+ ParcelableRttCall rttCall = source.readParcelable(classLoader);
return new ParcelableCall(
id,
state,
@@ -318,6 +338,8 @@
accountHandle,
isVideoCallProviderChanged,
videoCallProvider,
+ isRttCallChanged,
+ rttCall,
parentCallId,
childCallIds,
statusHints,
@@ -366,6 +388,8 @@
destination.writeBundle(mIntentExtras);
destination.writeBundle(mExtras);
destination.writeInt(mSupportedAudioRoutes);
+ destination.writeByte((byte) (mIsRttCallChanged ? 1 : 0));
+ destination.writeParcelable(mRttCall, 0);
}
@Override
diff --git a/core/java/android/content/pm/ContainerEncryptionParams.aidl b/telecomm/java/android/telecom/ParcelableRttCall.aidl
similarity index 81%
rename from core/java/android/content/pm/ContainerEncryptionParams.aidl
rename to telecomm/java/android/telecom/ParcelableRttCall.aidl
index c13d946..4480710 100644
--- a/core/java/android/content/pm/ContainerEncryptionParams.aidl
+++ b/telecomm/java/android/telecom/ParcelableRttCall.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright 2012, The Android Open Source Project
+ * 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.
@@ -14,6 +14,9 @@
* limitations under the License.
*/
-package android.content.pm;
+package android.telecom;
-parcelable ContainerEncryptionParams;
+/**
+ * {@hide}
+ */
+parcelable ParcelableRttCall;
diff --git a/telecomm/java/android/telecom/ParcelableRttCall.java b/telecomm/java/android/telecom/ParcelableRttCall.java
new file mode 100644
index 0000000..763e48b
--- /dev/null
+++ b/telecomm/java/android/telecom/ParcelableRttCall.java
@@ -0,0 +1,88 @@
+/*
+ * 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.telecom;
+
+import android.os.Parcel;
+import android.os.ParcelFileDescriptor;
+import android.os.Parcelable;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * Data container for information associated with the RTT connection on a call.
+ * @hide
+ */
+public class ParcelableRttCall implements Parcelable {
+ private final int mRttMode;
+ private final ParcelFileDescriptor mTransmitStream;
+ private final ParcelFileDescriptor mReceiveStream;
+
+ public ParcelableRttCall(
+ int rttMode,
+ ParcelFileDescriptor transmitStream,
+ ParcelFileDescriptor receiveStream) {
+ mRttMode = rttMode;
+ mTransmitStream = transmitStream;
+ mReceiveStream = receiveStream;
+ }
+
+ protected ParcelableRttCall(Parcel in) {
+ mRttMode = in.readInt();
+ mTransmitStream = in.readParcelable(ParcelFileDescriptor.class.getClassLoader());
+ mReceiveStream = in.readParcelable(ParcelFileDescriptor.class.getClassLoader());
+ }
+
+ public static final Creator<ParcelableRttCall> CREATOR = new Creator<ParcelableRttCall>() {
+ @Override
+ public ParcelableRttCall createFromParcel(Parcel in) {
+ return new ParcelableRttCall(in);
+ }
+
+ @Override
+ public ParcelableRttCall[] newArray(int size) {
+ return new ParcelableRttCall[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mRttMode);
+ dest.writeParcelable(mTransmitStream, flags);
+ dest.writeParcelable(mReceiveStream, flags);
+ }
+
+ public int getRttMode() {
+ return mRttMode;
+ }
+
+ public ParcelFileDescriptor getReceiveStream() {
+ return mReceiveStream;
+ }
+
+ public ParcelFileDescriptor getTransmitStream() {
+ return mTransmitStream;
+ }
+}
diff --git a/telecomm/java/android/telecom/Phone.java b/telecomm/java/android/telecom/Phone.java
index 30ec5b3..ebd04c7 100644
--- a/telecomm/java/android/telecom/Phone.java
+++ b/telecomm/java/android/telecom/Phone.java
@@ -201,6 +201,13 @@
}
}
+ final void internalOnRttUpgradeRequest(String callId, int requestId) {
+ Call call = mCallByTelecomCallId.get(callId);
+ if (call != null) {
+ call.internalOnRttUpgradeRequest(requestId);
+ }
+ }
+
/**
* Called to destroy the phone and cleanup any lingering calls.
*/
diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java
index 845a103..3926e20 100644
--- a/telecomm/java/android/telecom/PhoneAccount.java
+++ b/telecomm/java/android/telecom/PhoneAccount.java
@@ -204,6 +204,18 @@
public static final int CAPABILITY_SELF_MANAGED = 0x800;
/**
+ * Flag indicating that this {@link PhoneAccount} is capable of making a call with an
+ * RTT (Real-time text) session.
+ * When set, Telecom will attempt to open an RTT session on outgoing calls that specify
+ * that they should be placed with an RTT session , and the in-call app will be displayed
+ * with text entry fields for RTT. Likewise, the in-call app can request that an RTT
+ * session be opened during a call if this bit is set.
+ */
+ public static final int CAPABILITY_RTT = 0x1000;
+
+ /* NEXT CAPABILITY: 0x2000 */
+
+ /**
* URI scheme for telephone number URIs.
*/
public static final String SCHEME_TEL = "tel";
diff --git a/telecomm/java/android/telecom/RemoteConnectionService.java b/telecomm/java/android/telecom/RemoteConnectionService.java
index 0c7404a..60a40f5 100644
--- a/telecomm/java/android/telecom/RemoteConnectionService.java
+++ b/telecomm/java/android/telecom/RemoteConnectionService.java
@@ -450,11 +450,14 @@
ConnectionRequest request,
boolean isIncoming) {
final String id = UUID.randomUUID().toString();
- final ConnectionRequest newRequest = new ConnectionRequest(
- request.getAccountHandle(),
- request.getAddress(),
- request.getExtras(),
- request.getVideoState());
+ final ConnectionRequest newRequest = new ConnectionRequest.Builder()
+ .setAccountHandle(request.getAccountHandle())
+ .setAddress(request.getAddress())
+ .setExtras(request.getExtras())
+ .setVideoState(request.getVideoState())
+ .setRttPipeFromInCall(request.getRttPipeFromInCall())
+ .setRttPipeToInCall(request.getRttPipeToInCall())
+ .build();
try {
if (mConnectionById.isEmpty()) {
mOutgoingConnectionServiceRpc.addConnectionServiceAdapter(mServant.getStub(),
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index 96070b8..6807ef4 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -317,6 +317,23 @@
public static final String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER";
/**
+ * The number of milliseconds that Telecom should wait after disconnecting a call via the
+ * ACTION_NEW_OUTGOING_CALL broadcast, in order to wait for the app which cancelled the call
+ * to make a new one.
+ * @hide
+ */
+ public static final String EXTRA_NEW_OUTGOING_CALL_CANCEL_TIMEOUT =
+ "android.telecom.extra.NEW_OUTGOING_CALL_CANCEL_TIMEOUT";
+
+ /**
+ * A boolean extra, which when set on the {@link Intent#ACTION_CALL} intent or on the bundle
+ * passed into {@link #placeCall(Uri, Bundle)}, indicates that the call should be initiated with
+ * an RTT session open. See {@link android.telecom.Call.RttCall} for more information on RTT.
+ */
+ public static final String EXTRA_START_CALL_WITH_RTT =
+ "android.telecom.extra.START_CALL_WITH_RTT";
+
+ /**
* A boolean meta-data value indicating whether an {@link InCallService} implements an
* in-call user interface. Dialer implementations (see {@link #getDefaultDialerPackage()}) which
* would also like to replace the in-call interface should set this meta-data to {@code true} in
diff --git a/telecomm/java/android/telecom/VideoProfile.java b/telecomm/java/android/telecom/VideoProfile.java
index 216603c..e0e3a08 100644
--- a/telecomm/java/android/telecom/VideoProfile.java
+++ b/telecomm/java/android/telecom/VideoProfile.java
@@ -235,7 +235,7 @@
StringBuilder sb = new StringBuilder();
sb.append("Audio");
- if (isAudioOnly(videoState)) {
+ if (videoState == STATE_AUDIO_ONLY) {
sb.append(" Only");
} else {
if (isTransmissionEnabled(videoState)) {
@@ -256,6 +256,9 @@
/**
* Indicates whether the video state is audio only.
+ * <p>
+ * Note: Considers only whether either both the {@link #STATE_RX_ENABLED} or
+ * {@link #STATE_TX_ENABLED} bits are off, but not {@link #STATE_PAUSED}.
*
* @param videoState The video state.
* @return {@code True} if the video state is audio only, {@code false} otherwise.
diff --git a/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl b/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl
index 49f9b3b..47c3e6c 100644
--- a/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl
+++ b/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl
@@ -69,4 +69,12 @@
void putExtras(String callId, in Bundle extras);
void removeExtras(String callId, in List<String> keys);
+
+ void sendRttRequest();
+
+ void respondToRttRequest(int id, boolean accept);
+
+ void stopRtt();
+
+ void setRttMode(int mode);
}
diff --git a/telecomm/java/com/android/internal/telecom/IInCallService.aidl b/telecomm/java/com/android/internal/telecom/IInCallService.aidl
index 3e43fe2..1f92e0c 100644
--- a/telecomm/java/com/android/internal/telecom/IInCallService.aidl
+++ b/telecomm/java/com/android/internal/telecom/IInCallService.aidl
@@ -50,4 +50,6 @@
void silenceRinger();
void onConnectionEvent(String callId, String event, in Bundle extras);
+
+ void onRttUpgradeRequest(String callId, int id);
}
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 6746e6c..632a1d6 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -417,6 +417,21 @@
public static final String KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL
= "carrier_volte_provisioning_required_bool";
+ /**
+ * Flag specifying if WFC provisioning depends on VoLTE provisioning.
+ *
+ * {@code false}: default value; honor actual WFC provisioning state.
+ * {@code true}: when VoLTE is not provisioned, treat WFC as not provisioned; when VoLTE is
+ * provisioned, honor actual WFC provisioning state.
+ *
+ * As of now, Verizon is the only carrier enforcing this dependency in their
+ * WFC awareness and activation requirements.
+ *
+ * @hide
+ * */
+ public static final String KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL
+ = "carrier_volte_override_wfc_provisioning_bool";
+
/** Flag specifying whether VoLTE TTY is supported. */
public static final String KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL
= "carrier_volte_tty_supported_bool";
@@ -927,7 +942,7 @@
/**
* Defines carrier-specific actions which act upon
- * android.intent.action.CARRIER_SIGNAL_REDIRECTED, used for customization of the
+ * com.android.internal.telephony.CARRIER_SIGNAL_REDIRECTED, used for customization of the
* default carrier app
* Format: "CARRIER_ACTION_IDX, ..."
* Where {@code CARRIER_ACTION_IDX} is an integer defined in
@@ -942,7 +957,7 @@
/**
* Defines carrier-specific actions which act upon
- * android.intent.action.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED
+ * com.android.internal.telephony.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED
* and configured signal args:
* {@link com.android.internal.telephony.TelephonyIntents#EXTRA_APN_TYPE_KEY apnType},
* {@link com.android.internal.telephony.TelephonyIntents#EXTRA_ERROR_CODE_KEY errorCode}
@@ -983,11 +998,11 @@
* @see com.android.internal.telephony.TelephonyIntents
* Example:
* <item>com.google.android.carrierAPK/.CarrierSignalReceiverA:
- * android.intent.action.CARRIER_SIGNAL_REDIRECTED,
- * android.intent.action.CARRIER_SIGNAL_PCO_VALUE
+ * com.android.internal.telephony.CARRIER_SIGNAL_REDIRECTED,
+ * com.android.internal.telephony.CARRIER_SIGNAL_PCO_VALUE
* </item>
* <item>com.google.android.carrierAPK/.CarrierSignalReceiverB:
- * android.intent.action.CARRIER_SIGNAL_PCO_VALUE
+ * com.android.internal.telephony.CARRIER_SIGNAL_PCO_VALUE
* </item>
* @hide
*/
@@ -1002,11 +1017,11 @@
* @see com.android.internal.telephony.TelephonyIntents
* Example:
* <item>com.google.android.carrierAPK/.CarrierSignalReceiverA:
- * android.intent.action.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED,
- * android.intent.action.CARRIER_SIGNAL_PCO_VALUE
+ * com.android.internal.telephony.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED,
+ * com.android.internal.telephony.CARRIER_SIGNAL_PCO_VALUE
* </item>
* <item>com.google.android.carrierAPK/.CarrierSignalReceiverB:
- * android.intent.action.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED
+ * com.android.internal.telephony.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED
* </item>
* @hide
*/
@@ -1324,6 +1339,7 @@
sDefaults.putInt(KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT, 2);
sDefaults.putBoolean(KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL, false);
sDefaults.putBoolean(KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, false);
+ sDefaults.putBoolean(KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL, false);
sDefaults.putBoolean(KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, true);
sDefaults.putBoolean(KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL, true);
sDefaults.putBoolean(KEY_CARRIER_IMS_GBA_REQUIRED_BOOL, false);
@@ -1485,7 +1501,7 @@
sDefaults.putStringArray(KEY_CARRIER_APP_WAKE_SIGNAL_CONFIG_STRING_ARRAY,
new String[]{
"com.android.carrierdefaultapp/.CarrierDefaultBroadcastReceiver:" +
- "android.intent.action.CARRIER_SIGNAL_REDIRECTED"
+ "com.android.internal.telephony.CARRIER_SIGNAL_REDIRECTED"
});
sDefaults.putStringArray(KEY_CARRIER_APP_NO_WAKE_SIGNAL_CONFIG_STRING_ARRAY, null);
diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java
index 71bfe86..a3e11c8 100644
--- a/telephony/java/android/telephony/PhoneNumberUtils.java
+++ b/telephony/java/android/telephony/PhoneNumberUtils.java
@@ -1140,6 +1140,8 @@
private static final String KOREA_ISO_COUNTRY_CODE = "KR";
+ private static final String JAPAN_ISO_COUNTRY_CODE = "JP";
+
/**
* Breaks the given number down and formats it according to the rules
* for the country the number is from.
@@ -1484,15 +1486,25 @@
String result = null;
try {
PhoneNumber pn = util.parseAndKeepRawInput(phoneNumber, defaultCountryIso);
- /**
- * Need to reformat any local Korean phone numbers (when the user is in Korea) with
- * country code to corresponding national format which would replace the leading
- * +82 with 0.
- */
- if (KOREA_ISO_COUNTRY_CODE.equals(defaultCountryIso) &&
+
+ if (KOREA_ISO_COUNTRY_CODE.equalsIgnoreCase(defaultCountryIso) &&
(pn.getCountryCode() == util.getCountryCodeForRegion(KOREA_ISO_COUNTRY_CODE)) &&
(pn.getCountryCodeSource() ==
PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN)) {
+ /**
+ * Need to reformat any local Korean phone numbers (when the user is in Korea) with
+ * country code to corresponding national format which would replace the leading
+ * +82 with 0.
+ */
+ result = util.format(pn, PhoneNumberUtil.PhoneNumberFormat.NATIONAL);
+ } else if (JAPAN_ISO_COUNTRY_CODE.equalsIgnoreCase(defaultCountryIso) &&
+ pn.getCountryCode() == util.getCountryCodeForRegion(JAPAN_ISO_COUNTRY_CODE) &&
+ (pn.getCountryCodeSource() ==
+ PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN)) {
+ /**
+ * Need to reformat Japanese phone numbers (when user is in Japan) with the national
+ * dialing format.
+ */
result = util.format(pn, PhoneNumberUtil.PhoneNumberFormat.NATIONAL);
} else {
result = util.formatInOriginalFormat(pn, defaultCountryIso);
diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java
index dd03305..afff6d5 100644
--- a/telephony/java/android/telephony/PhoneStateListener.java
+++ b/telephony/java/android/telephony/PhoneStateListener.java
@@ -208,7 +208,9 @@
*
* @see #onOemHookRawEvent
* @hide
+ * @deprecated OEM needs a vendor-extension hal and their apps should use that instead
*/
+ @Deprecated
public static final int LISTEN_OEM_HOOK_RAW_EVENT = 0x00008000;
/**
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 5ebdc0a..81e87b3 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -5244,7 +5244,9 @@
* 0 request was handled succesfully, but no response data
* positive value success, data length of response
* @hide
+ * @deprecated OEM needs a vendor-extension hal and their apps should use that instead
*/
+ @Deprecated
public int invokeOemRilRequestRaw(byte[] oemReq, byte[] oemResp) {
try {
ITelephony telephony = getITelephony();
@@ -5537,6 +5539,44 @@
}
/**
+ * Set SIM card power state. Request is equivalent to inserting or removing the card.
+ *
+ * @param powerUp True if powering up the SIM, otherwise powering down
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}
+ *
+ * @hide
+ **/
+ public void setSimPowerState(boolean powerUp) {
+ setSimPowerStateForSlot(getDefaultSim(), powerUp);
+ }
+
+ /**
+ * Set SIM card power state. Request is equivalent to inserting or removing the card.
+ *
+ * @param slotId SIM slot id
+ * @param powerUp True if powering up the SIM, otherwise powering down
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}
+ *
+ * @hide
+ **/
+ public void setSimPowerStateForSlot(int slotId, boolean powerUp) {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ telephony.setSimPowerStateForSlot(slotId, powerUp);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling ITelephony#setSimPowerStateForSlot", e);
+ } catch (SecurityException e) {
+ Log.e(TAG, "Permission error calling ITelephony#setSimPowerStateForSlot", e);
+ }
+ }
+
+ /**
* Set baseband version for the default phone.
*
* @param version baseband version
@@ -5922,6 +5962,29 @@
}
/**
+ * Sets the per-account voicemail ringtone.
+ *
+ * <p>Requires that the calling app is the default dialer, or has carrier privileges, or has
+ * permission {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}.
+ *
+ * @param phoneAccountHandle The handle for the {@link PhoneAccount} for which to set the
+ * voicemail ringtone.
+ * @param uri The URI for the ringtone to play when receiving a voicemail from a specific
+ * PhoneAccount.
+ * @see #hasCarrierPrivileges
+ */
+ public void setVoicemailRingtoneUri(PhoneAccountHandle phoneAccountHandle, Uri uri) {
+ try {
+ ITelephony service = getITelephony();
+ if (service != null) {
+ service.setVoicemailRingtoneUri(getOpPackageName(), phoneAccountHandle, uri);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling ITelephony#setVoicemailRingtoneUri", e);
+ }
+ }
+
+ /**
* Returns whether vibration is set for voicemail notification in Phone settings.
*
* @param accountHandle The handle for the {@link PhoneAccount} for which to retrieve the
@@ -5941,6 +6004,31 @@
}
/**
+ * Sets the per-account preference whether vibration is enabled for voicemail notifications.
+ *
+ * <p>Requires that the calling app is the default dialer, or has carrier privileges, or has
+ * permission {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}.
+ *
+ * @param phoneAccountHandle The handle for the {@link PhoneAccount} for which to set the
+ * voicemail vibration setting.
+ * @param enabled Whether to enable or disable vibration for voicemail notifications from a
+ * specific PhoneAccount.
+ * @see #hasCarrierPrivileges
+ */
+ public void setVoicemailVibrationEnabled(PhoneAccountHandle phoneAccountHandle,
+ boolean enabled) {
+ try {
+ ITelephony service = getITelephony();
+ if (service != null) {
+ service.setVoicemailVibrationEnabled(getOpPackageName(), phoneAccountHandle,
+ enabled);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling ITelephony#isVoicemailVibrationEnabled", e);
+ }
+ }
+
+ /**
* Return the application ID for the app type like {@link APPTYPE_CSIM}.
*
* Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission
@@ -6073,7 +6161,7 @@
* android.content.pm.PackageManager#FEATURE_TELEPHONY_CARRIERLOCK} enabled.
*
* @return The number of carriers set successfully. Should be length of
- * carrierList on success; -1 on error.
+ * carrierList on success; -1 if carrierList null or on error.
* @hide
*/
@SystemApi
diff --git a/telephony/java/android/telephony/ims/ImsService.java b/telephony/java/android/telephony/ims/ImsService.java
new file mode 100644
index 0000000..406f01e
--- /dev/null
+++ b/telephony/java/android/telephony/ims/ImsService.java
@@ -0,0 +1,452 @@
+/*
+ * 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.telephony.ims;
+
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.RemoteException;
+import android.telephony.CarrierConfigManager;
+import android.telephony.ims.feature.ImsFeature;
+import android.telephony.ims.feature.MMTelFeature;
+import android.telephony.ims.feature.RcsFeature;
+import android.util.Log;
+import android.util.SparseArray;
+
+import com.android.ims.ImsCallProfile;
+import com.android.ims.internal.IImsCallSession;
+import com.android.ims.internal.IImsCallSessionListener;
+import com.android.ims.internal.IImsConfig;
+import com.android.ims.internal.IImsEcbm;
+import com.android.ims.internal.IImsFeatureStatusCallback;
+import com.android.ims.internal.IImsMultiEndpoint;
+import com.android.ims.internal.IImsRegistrationListener;
+import com.android.ims.internal.IImsServiceController;
+import com.android.ims.internal.IImsServiceFeatureListener;
+import com.android.ims.internal.IImsUt;
+import com.android.internal.annotations.VisibleForTesting;
+
+import static android.Manifest.permission.MODIFY_PHONE_STATE;
+import static android.Manifest.permission.READ_PHONE_STATE;
+
+/**
+ * Main ImsService implementation, which binds via the Telephony ImsResolver. Services that extend
+ * ImsService must register the service in their AndroidManifest to be detected by the framework.
+ * First, the application must declare that they use the "android.permission.BIND_IMS_SERVICE"
+ * permission. Then, the ImsService definition in the manifest must follow the following format:
+ *
+ * ...
+ * <service android:name=".EgImsService"
+ * android:permission="android.permission.BIND_IMS_SERVICE" >
+ * <!-- Apps must declare which features they support as metadata. The different categories are
+ * defined below. In this example, the RCS_FEATURE feature is supported. -->
+ * <meta-data android:name="android.telephony.ims.RCS_FEATURE" android:value="true" />
+ * <intent-filter>
+ * <action android:name="android.telephony.ims.ImsService" />
+ * </intent-filter>
+ * </service>
+ * ...
+ *
+ * The telephony framework will then bind to the ImsService you have defined in your manifest
+ * if you are either:
+ * 1) Defined as the default ImsService for the device in the device overlay using
+ * "config_ims_package".
+ * 2) Defined as a Carrier Provided ImsService in the Carrier Configuration using
+ * {@link CarrierConfigManager#KEY_CONFIG_IMS_PACKAGE_OVERRIDE_STRING}.
+ *
+ * The features that are currently supported in an ImsService are:
+ * - RCS_FEATURE: This ImsService implements the {@link RcsFeature} class.
+ * - MMTEL_FEATURE: This ImsService implements the {@link MMTelFeature} class.
+ * - EMERGENCY_MMTEL_FEATURE: This ImsService implements the {@link MMTelFeature} class and will be
+ * available to place emergency calls at all times. This MUST be implemented by the default
+ * ImsService provided in the device overlay.
+ *
+ * @hide
+ */
+public abstract class ImsService extends ImsServiceBase {
+
+ private static final String LOG_TAG = "ImsService";
+
+ /**
+ * The intent that must be defined as an intent-filter in the AndroidManifest of the ImsService.
+ */
+ public static final String SERVICE_INTERFACE = "android.telephony.ims.ImsService";
+
+ // A map of slot Id -> Set of features corresponding to that slot.
+ private final SparseArray<SparseArray<ImsFeature>> mFeatures = new SparseArray<>();
+
+ // Implements all supported features as a flat interface.
+ protected final IBinder mImsServiceController = new IImsServiceController.Stub() {
+
+ @Override
+ public void createImsFeature(int slotId, int feature, IImsFeatureStatusCallback c)
+ throws RemoteException {
+ synchronized (mFeatures) {
+ enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "createImsFeature");
+ onCreateImsFeatureInternal(slotId, feature, c);
+ }
+ }
+
+ @Override
+ public void removeImsFeature(int slotId, int feature) throws RemoteException {
+ synchronized (mFeatures) {
+ enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "removeImsFeature");
+ onRemoveImsFeatureInternal(slotId, feature);
+ }
+ }
+
+ @Override
+ public int startSession(int slotId, int featureType, PendingIntent incomingCallIntent,
+ IImsRegistrationListener listener) throws RemoteException {
+ enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "startSession");
+ synchronized (mFeatures) {
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ return feature.startSession(incomingCallIntent, listener);
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public void endSession(int slotId, int featureType, int sessionId) throws RemoteException {
+ synchronized (mFeatures) {
+ enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "endSession");
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ feature.endSession(sessionId);
+ }
+ }
+ }
+
+ @Override
+ public boolean isConnected(int slotId, int featureType, int callSessionType, int callType)
+ throws RemoteException {
+ enforceCallingOrSelfPermission(READ_PHONE_STATE, "isConnected");
+ synchronized (mFeatures) {
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ return feature.isConnected(callSessionType, callType);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isOpened(int slotId, int featureType) throws RemoteException {
+ enforceCallingOrSelfPermission(READ_PHONE_STATE, "isOpened");
+ synchronized (mFeatures) {
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ return feature.isOpened();
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int getFeatureStatus(int slotId, int featureType) throws RemoteException {
+ enforceCallingOrSelfPermission(READ_PHONE_STATE, "getFeatureStatus");
+ int status = ImsFeature.STATE_NOT_AVAILABLE;
+ synchronized (mFeatures) {
+ SparseArray<ImsFeature> featureMap = mFeatures.get(slotId);
+ if (featureMap != null) {
+ ImsFeature feature = getImsFeatureFromType(featureMap, featureType);
+ if (feature != null) {
+ status = feature.getFeatureState();
+ }
+ }
+ }
+ return status;
+ }
+
+ @Override
+ public void addRegistrationListener(int slotId, int featureType,
+ IImsRegistrationListener listener) throws RemoteException {
+ enforceCallingOrSelfPermission(READ_PHONE_STATE, "addRegistrationListener");
+ synchronized (mFeatures) {
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ feature.addRegistrationListener(listener);
+ }
+ }
+ }
+
+ @Override
+ public void removeRegistrationListener(int slotId, int featureType,
+ IImsRegistrationListener listener) throws RemoteException {
+ enforceCallingOrSelfPermission(READ_PHONE_STATE, "removeRegistrationListener");
+ synchronized (mFeatures) {
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ feature.removeRegistrationListener(listener);
+ }
+ }
+ }
+
+ @Override
+ public ImsCallProfile createCallProfile(int slotId, int featureType, int sessionId,
+ int callSessionType, int callType) throws RemoteException {
+ enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "createCallProfile");
+ synchronized (mFeatures) {
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ return feature.createCallProfile(sessionId, callSessionType, callType);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public IImsCallSession createCallSession(int slotId, int featureType, int sessionId,
+ ImsCallProfile profile, IImsCallSessionListener listener) throws RemoteException {
+ enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "createCallSession");
+ synchronized (mFeatures) {
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ return feature.createCallSession(sessionId, profile, listener);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public IImsCallSession getPendingCallSession(int slotId, int featureType, int sessionId,
+ String callId) throws RemoteException {
+ enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "getPendingCallSession");
+ synchronized (mFeatures) {
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ return feature.getPendingCallSession(sessionId, callId);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public IImsUt getUtInterface(int slotId, int featureType)
+ throws RemoteException {
+ enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "getUtInterface");
+ synchronized (mFeatures) {
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ return feature.getUtInterface();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public IImsConfig getConfigInterface(int slotId, int featureType)
+ throws RemoteException {
+ enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "getConfigInterface");
+ synchronized (mFeatures) {
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ return feature.getConfigInterface();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void turnOnIms(int slotId, int featureType) throws RemoteException {
+ enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "turnOnIms");
+ synchronized (mFeatures) {
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ feature.turnOnIms();
+ }
+ }
+ }
+
+ @Override
+ public void turnOffIms(int slotId, int featureType) throws RemoteException {
+ enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "turnOffIms");
+ synchronized (mFeatures) {
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ feature.turnOffIms();
+ }
+ }
+ }
+
+ @Override
+ public IImsEcbm getEcbmInterface(int slotId, int featureType)
+ throws RemoteException {
+ enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "getEcbmInterface");
+ synchronized (mFeatures) {
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ return feature.getEcbmInterface();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void setUiTTYMode(int slotId, int featureType, int uiTtyMode, Message onComplete)
+ throws RemoteException {
+ enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "setUiTTYMode");
+ synchronized (mFeatures) {
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ feature.setUiTTYMode(uiTtyMode, onComplete);
+ }
+ }
+ }
+
+ @Override
+ public IImsMultiEndpoint getMultiEndpointInterface(int slotId, int featureType)
+ throws RemoteException {
+ enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "getMultiEndpointInterface");
+ synchronized (mFeatures) {
+ MMTelFeature feature = resolveMMTelFeature(slotId, featureType);
+ if (feature != null) {
+ return feature.getMultiEndpointInterface();
+ }
+ }
+ return null;
+ }
+
+ };
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ if(SERVICE_INTERFACE.equals(intent.getAction())) {
+ return mImsServiceController;
+ }
+ return null;
+ }
+
+ /**
+ * Called from the ImsResolver to create the requested ImsFeature, as defined by the slot and
+ * featureType
+ * @param slotId An integer representing which SIM slot the ImsFeature is assigned to.
+ * @param featureType An integer representing the type of ImsFeature being created. This is
+ * defined in {@link ImsFeature}.
+ */
+ // Be sure to lock on mFeatures before accessing this method
+ private void onCreateImsFeatureInternal(int slotId, int featureType,
+ IImsFeatureStatusCallback c) {
+ SparseArray<ImsFeature> featureMap = mFeatures.get(slotId);
+ if (featureMap == null) {
+ featureMap = new SparseArray<>();
+ mFeatures.put(slotId, featureMap);
+ }
+ ImsFeature f = makeImsFeature(slotId, featureType);
+ if (f != null) {
+ f.setImsFeatureStatusCallback(c);
+ featureMap.put(featureType, f);
+ }
+
+ }
+ /**
+ * Called from the ImsResolver to remove an existing ImsFeature, as defined by the slot and
+ * featureType.
+ * @param slotId An integer representing which SIM slot the ImsFeature is assigned to.
+ * @param featureType An integer representing the type of ImsFeature being removed. This is
+ * defined in {@link ImsFeature}.
+ */
+ // Be sure to lock on mFeatures before accessing this method
+ private void onRemoveImsFeatureInternal(int slotId, int featureType) {
+ SparseArray<ImsFeature> featureMap = mFeatures.get(slotId);
+ if (featureMap == null) {
+ return;
+ }
+
+ ImsFeature featureToRemove = getImsFeatureFromType(featureMap, featureType);
+ if (featureToRemove != null) {
+ featureMap.remove(featureType);
+ featureToRemove.notifyFeatureRemoved(slotId);
+ // Remove reference to Binder
+ featureToRemove.setImsFeatureStatusCallback(null);
+ }
+ }
+
+ // Be sure to lock on mFeatures before accessing this method
+ private MMTelFeature resolveMMTelFeature(int slotId, int featureType) {
+ SparseArray<ImsFeature> features = getImsFeatureMap(slotId);
+ MMTelFeature feature = null;
+ if (features != null) {
+ feature = resolveImsFeature(features, featureType, MMTelFeature.class);
+ }
+ return feature;
+ }
+
+ // Be sure to lock on mFeatures before accessing this method
+ private <T extends ImsFeature> T resolveImsFeature(SparseArray<ImsFeature> set, int featureType,
+ Class<T> className) {
+ ImsFeature feature = getImsFeatureFromType(set, featureType);
+ if (feature == null) {
+ return null;
+ }
+ try {
+ return className.cast(feature);
+ } catch (ClassCastException e)
+ {
+ Log.e(LOG_TAG, "Can not cast ImsFeature! Exception: " + e.getMessage());
+ }
+ return null;
+ }
+
+ @VisibleForTesting
+ // Be sure to lock on mFeatures before accessing this method
+ public SparseArray<ImsFeature> getImsFeatureMap(int slotId) {
+ return mFeatures.get(slotId);
+ }
+
+ @VisibleForTesting
+ // Be sure to lock on mFeatures before accessing this method
+ public ImsFeature getImsFeatureFromType(SparseArray<ImsFeature> set, int featureType) {
+ return set.get(featureType);
+ }
+
+ private ImsFeature makeImsFeature(int slotId, int feature) {
+ switch (feature) {
+ case ImsFeature.EMERGENCY_MMTEL: {
+ return onCreateEmergencyMMTelImsFeature(slotId);
+ }
+ case ImsFeature.MMTEL: {
+ return onCreateMMTelImsFeature(slotId);
+ }
+ case ImsFeature.RCS: {
+ return onCreateRcsFeature(slotId);
+ }
+ }
+ // Tried to create feature that is not defined.
+ return null;
+ }
+
+ /**
+ * @return An implementation of MMTelFeature that will be used by the system for MMTel
+ * functionality. Must be able to handle emergency calls at any time as well.
+ */
+ public abstract MMTelFeature onCreateEmergencyMMTelImsFeature(int slotId);
+
+ /**
+ * @return An implementation of MMTelFeature that will be used by the system for MMTel
+ * functionality.
+ */
+ public abstract MMTelFeature onCreateMMTelImsFeature(int slotId);
+
+ /**
+ * @return An implementation of RcsFeature that will be used by the system for RCS.
+ */
+ public abstract RcsFeature onCreateRcsFeature(int slotId);
+}
diff --git a/telephony/java/android/telephony/ims/ImsServiceBase.java b/telephony/java/android/telephony/ims/ImsServiceBase.java
index 0b50eca..0878db8 100644
--- a/telephony/java/android/telephony/ims/ImsServiceBase.java
+++ b/telephony/java/android/telephony/ims/ImsServiceBase.java
@@ -22,7 +22,9 @@
import android.os.IBinder;
/**
- * Base ImsService Implementation, which is used by the ImsResolver to bind.
+ * Base ImsService Implementation, which is used by the ImsResolver to bind. ImsServices that do not
+ * need to provide an ImsService implementation but still wish to be managed by the ImsResolver
+ * lifecycle may implement this class directly.
* @hide
*/
@SystemApi
diff --git a/telephony/java/android/telephony/ims/ImsServiceProxy.java b/telephony/java/android/telephony/ims/ImsServiceProxy.java
new file mode 100644
index 0000000..38ea6e6f
--- /dev/null
+++ b/telephony/java/android/telephony/ims/ImsServiceProxy.java
@@ -0,0 +1,313 @@
+/*
+ * 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.telephony.ims;
+
+import android.app.PendingIntent;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.RemoteException;
+import android.telephony.ims.feature.IRcsFeature;
+import android.telephony.ims.feature.ImsFeature;
+import android.util.Log;
+
+import com.android.ims.ImsCallProfile;
+import com.android.ims.internal.IImsCallSession;
+import com.android.ims.internal.IImsCallSessionListener;
+import com.android.ims.internal.IImsConfig;
+import com.android.ims.internal.IImsEcbm;
+import com.android.ims.internal.IImsMultiEndpoint;
+import com.android.ims.internal.IImsRegistrationListener;
+import com.android.ims.internal.IImsServiceController;
+import com.android.ims.internal.IImsServiceFeatureListener;
+import com.android.ims.internal.IImsUt;
+
+/**
+ * A container of the IImsServiceController binder, which implements all of the ImsFeatures that
+ * the platform currently supports: MMTel and RCS.
+ * @hide
+ */
+
+public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeature {
+
+ protected String LOG_TAG = "ImsServiceProxy";
+ private final int mSupportedFeature;
+
+ // Start by assuming the proxy is available for usage.
+ private boolean mIsAvailable = true;
+ // ImsFeature Status from the ImsService. Cached.
+ private Integer mFeatureStatusCached = null;
+ private ImsServiceProxy.INotifyStatusChanged mStatusCallback;
+ private final Object mLock = new Object();
+
+ public interface INotifyStatusChanged {
+ void notifyStatusChanged();
+ }
+
+ private final IImsServiceFeatureListener mListenerBinder =
+ new IImsServiceFeatureListener.Stub() {
+
+ @Override
+ public void imsFeatureCreated(int slotId, int feature) throws RemoteException {
+ // The feature has been re-enabled. This may happen when the service crashes.
+ synchronized (mLock) {
+ if (!mIsAvailable && mSlotId == slotId && feature == mSupportedFeature) {
+ Log.i(LOG_TAG, "Feature enabled on slotId: " + slotId + " for feature: " +
+ feature);
+ mIsAvailable = true;
+ }
+ }
+ }
+
+ @Override
+ public void imsFeatureRemoved(int slotId, int feature) throws RemoteException {
+ synchronized (mLock) {
+ if (mIsAvailable && mSlotId == slotId && feature == mSupportedFeature) {
+ Log.i(LOG_TAG, "Feature disabled on slotId: " + slotId + " for feature: " +
+ feature);
+ mIsAvailable = false;
+ }
+ }
+ }
+
+ @Override
+ public void imsStatusChanged(int slotId, int feature, int status) throws RemoteException {
+ synchronized (mLock) {
+ Log.i(LOG_TAG, "imsStatusChanged: slot: " + slotId + " feature: " + feature +
+ " status: " + status);
+ if (mSlotId == slotId && feature == mSupportedFeature) {
+ mFeatureStatusCached = status;
+ }
+ }
+ if (mStatusCallback != null) {
+ mStatusCallback.notifyStatusChanged();
+ }
+ }
+ };
+
+ public ImsServiceProxy(int slotId, IBinder binder, int featureType) {
+ super(slotId, binder);
+ mSupportedFeature = featureType;
+ }
+
+ public ImsServiceProxy(int slotId, int featureType) {
+ super(slotId, null /*IBinder*/);
+ mSupportedFeature = featureType;
+ }
+
+ public IImsServiceFeatureListener getListener() {
+ return mListenerBinder;
+ }
+
+ public void setBinder(IBinder binder) {
+ mBinder = binder;
+ }
+
+ @Override
+ public int startSession(PendingIntent incomingCallIntent, IImsRegistrationListener listener)
+ throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).startSession(mSlotId, mSupportedFeature,
+ incomingCallIntent, listener);
+ }
+ }
+
+ @Override
+ public void endSession(int sessionId) throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ getServiceInterface(mBinder).endSession(mSlotId, mSupportedFeature, sessionId);
+ }
+ }
+
+ @Override
+ public boolean isConnected(int callServiceType, int callType)
+ throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).isConnected(mSlotId, mSupportedFeature,
+ callServiceType, callType);
+ }
+ }
+
+ @Override
+ public boolean isOpened() throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).isOpened(mSlotId, mSupportedFeature);
+ }
+ }
+
+ @Override
+ public void addRegistrationListener(IImsRegistrationListener listener)
+ throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ getServiceInterface(mBinder).addRegistrationListener(mSlotId, mSupportedFeature,
+ listener);
+ }
+ }
+
+ @Override
+ public void removeRegistrationListener(IImsRegistrationListener listener)
+ throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ getServiceInterface(mBinder).removeRegistrationListener(mSlotId, mSupportedFeature,
+ listener);
+ }
+ }
+
+ @Override
+ public ImsCallProfile createCallProfile(int sessionId, int callServiceType, int callType)
+ throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).createCallProfile(mSlotId, mSupportedFeature,
+ sessionId, callServiceType, callType);
+ }
+ }
+
+ @Override
+ public IImsCallSession createCallSession(int sessionId, ImsCallProfile profile,
+ IImsCallSessionListener listener) throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).createCallSession(mSlotId, mSupportedFeature,
+ sessionId, profile, listener);
+ }
+ }
+
+ @Override
+ public IImsCallSession getPendingCallSession(int sessionId, String callId)
+ throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).getPendingCallSession(mSlotId, mSupportedFeature,
+ sessionId, callId);
+ }
+ }
+
+ @Override
+ public IImsUt getUtInterface() throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).getUtInterface(mSlotId, mSupportedFeature);
+ }
+ }
+
+ @Override
+ public IImsConfig getConfigInterface() throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).getConfigInterface(mSlotId, mSupportedFeature);
+ }
+ }
+
+ @Override
+ public void turnOnIms() throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ getServiceInterface(mBinder).turnOnIms(mSlotId, mSupportedFeature);
+ }
+ }
+
+ @Override
+ public void turnOffIms() throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ getServiceInterface(mBinder).turnOffIms(mSlotId, mSupportedFeature);
+ }
+ }
+
+ @Override
+ public IImsEcbm getEcbmInterface() throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).getEcbmInterface(mSlotId, mSupportedFeature);
+ }
+ }
+
+ @Override
+ public void setUiTTYMode(int uiTtyMode, Message onComplete)
+ throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ getServiceInterface(mBinder).setUiTTYMode(mSlotId, mSupportedFeature, uiTtyMode,
+ onComplete);
+ }
+ }
+
+ @Override
+ public IImsMultiEndpoint getMultiEndpointInterface() throws RemoteException {
+ synchronized (mLock) {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).getMultiEndpointInterface(mSlotId,
+ mSupportedFeature);
+ }
+ }
+
+ @Override
+ public int getFeatureStatus() {
+ synchronized (mLock) {
+ if (mFeatureStatusCached != null) {
+ return mFeatureStatusCached;
+ }
+ }
+ // Don't synchronize on Binder call.
+ Integer status = retrieveFeatureStatus();
+ synchronized (mLock) {
+ if (status == null) {
+ return ImsFeature.STATE_NOT_AVAILABLE;
+ }
+ // Cache only non-null value for feature status.
+ mFeatureStatusCached = status;
+ }
+ return status;
+ }
+
+ /**
+ * Internal method used to retrieve the feature status from the corresponding ImsService.
+ */
+ private Integer retrieveFeatureStatus() {
+ if (mBinder != null) {
+ try {
+ return getServiceInterface(mBinder).getFeatureStatus(mSlotId, mSupportedFeature);
+ } catch (RemoteException e) {
+ // Status check failed, don't update cache
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @param c Callback that will fire when the feature status has changed.
+ */
+ public void setStatusCallback(INotifyStatusChanged c) {
+ mStatusCallback = c;
+ }
+
+ @Override
+ public boolean isBinderAlive() {
+ return mIsAvailable && getFeatureStatus() == ImsFeature.STATE_READY && mBinder != null &&
+ mBinder.isBinderAlive();
+ }
+
+ private IImsServiceController getServiceInterface(IBinder b) {
+ return IImsServiceController.Stub.asInterface(b);
+ }
+}
diff --git a/telephony/java/android/telephony/ims/ImsServiceProxyCompat.java b/telephony/java/android/telephony/ims/ImsServiceProxyCompat.java
new file mode 100644
index 0000000..bbd5f02
--- /dev/null
+++ b/telephony/java/android/telephony/ims/ImsServiceProxyCompat.java
@@ -0,0 +1,183 @@
+/*
+ * 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.telephony.ims;
+
+import android.app.PendingIntent;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.RemoteException;
+import android.telephony.ims.feature.IMMTelFeature;
+import android.telephony.ims.feature.ImsFeature;
+
+import com.android.ims.ImsCallProfile;
+import com.android.ims.internal.IImsCallSession;
+import com.android.ims.internal.IImsCallSessionListener;
+import com.android.ims.internal.IImsConfig;
+import com.android.ims.internal.IImsEcbm;
+import com.android.ims.internal.IImsMultiEndpoint;
+import com.android.ims.internal.IImsRegistrationListener;
+import com.android.ims.internal.IImsService;
+import com.android.ims.internal.IImsUt;
+
+/**
+ * Compatibility class that implements the new ImsService IMMTelFeature interface, but
+ * uses the old IImsService interface to support older devices that implement the deprecated
+ * opt/net/ims interface.
+ * @hide
+ */
+
+public class ImsServiceProxyCompat implements IMMTelFeature {
+
+ private static final int SERVICE_ID = ImsFeature.MMTEL;
+
+ protected final int mSlotId;
+ protected IBinder mBinder;
+
+ public ImsServiceProxyCompat(int slotId, IBinder binder) {
+ mSlotId = slotId;
+ mBinder = binder;
+ }
+
+ @Override
+ public int startSession(PendingIntent incomingCallIntent, IImsRegistrationListener listener)
+ throws RemoteException {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).open(mSlotId, ImsFeature.MMTEL, incomingCallIntent,
+ listener);
+ }
+
+ @Override
+ public void endSession(int sessionId) throws RemoteException {
+ checkBinderConnection();
+ getServiceInterface(mBinder).close(sessionId);
+ }
+
+ @Override
+ public boolean isConnected(int callServiceType, int callType)
+ throws RemoteException {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).isConnected(SERVICE_ID, callServiceType, callType);
+ }
+
+ @Override
+ public boolean isOpened() throws RemoteException {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).isOpened(SERVICE_ID);
+ }
+
+ @Override
+ public void addRegistrationListener(IImsRegistrationListener listener)
+ throws RemoteException {
+ checkBinderConnection();
+ getServiceInterface(mBinder).addRegistrationListener(mSlotId, ImsFeature.MMTEL, listener);
+ }
+
+ @Override
+ public void removeRegistrationListener(IImsRegistrationListener listener)
+ throws RemoteException {
+ // Not Implemented in old ImsService. If the registration listener becomes invalid, the
+ // ImsService will remove.
+ }
+
+ @Override
+ public ImsCallProfile createCallProfile(int sessionId, int callServiceType, int callType)
+ throws RemoteException {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).createCallProfile(sessionId, callServiceType, callType);
+ }
+
+ @Override
+ public IImsCallSession createCallSession(int sessionId, ImsCallProfile profile,
+ IImsCallSessionListener listener) throws RemoteException {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).createCallSession(sessionId, profile, listener);
+ }
+
+ @Override
+ public IImsCallSession getPendingCallSession(int sessionId, String callId)
+ throws RemoteException {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).getPendingCallSession(sessionId, callId);
+ }
+
+ @Override
+ public IImsUt getUtInterface() throws RemoteException {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).getUtInterface(SERVICE_ID);
+ }
+
+ @Override
+ public IImsConfig getConfigInterface() throws RemoteException {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).getConfigInterface(mSlotId);
+ }
+
+ @Override
+ public void turnOnIms() throws RemoteException {
+ checkBinderConnection();
+ getServiceInterface(mBinder).turnOnIms(mSlotId);
+ }
+
+ @Override
+ public void turnOffIms() throws RemoteException {
+ checkBinderConnection();
+ getServiceInterface(mBinder).turnOffIms(mSlotId);
+ }
+
+ @Override
+ public IImsEcbm getEcbmInterface() throws RemoteException {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).getEcbmInterface(SERVICE_ID);
+ }
+
+ @Override
+ public void setUiTTYMode(int uiTtyMode, Message onComplete)
+ throws RemoteException {
+ checkBinderConnection();
+ getServiceInterface(mBinder).setUiTTYMode(SERVICE_ID, uiTtyMode, onComplete);
+ }
+
+ @Override
+ public IImsMultiEndpoint getMultiEndpointInterface() throws RemoteException {
+ checkBinderConnection();
+ return getServiceInterface(mBinder).getMultiEndpointInterface(SERVICE_ID);
+ }
+
+ /**
+ * Base implementation, always returns READY for compatibility with old ImsService.
+ */
+ public int getFeatureStatus() {
+ return ImsFeature.STATE_READY;
+ }
+
+ /**
+ * @return false if the binder connection is no longer alive.
+ */
+ public boolean isBinderAlive() {
+ return mBinder != null && mBinder.isBinderAlive();
+ }
+
+ private IImsService getServiceInterface(IBinder b) {
+ return IImsService.Stub.asInterface(b);
+ }
+
+ protected void checkBinderConnection() throws RemoteException {
+ if (!isBinderAlive()) {
+ throw new RemoteException("ImsServiceProxy is not available for that feature.");
+ }
+ }
+}
diff --git a/telephony/java/android/telephony/ims/feature/IMMTelFeature.java b/telephony/java/android/telephony/ims/feature/IMMTelFeature.java
new file mode 100644
index 0000000..d65e27e
--- /dev/null
+++ b/telephony/java/android/telephony/ims/feature/IMMTelFeature.java
@@ -0,0 +1,187 @@
+/*
+ * 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.telephony.ims.feature;
+
+import android.app.PendingIntent;
+import android.os.Message;
+import android.os.RemoteException;
+
+import com.android.ims.ImsCallProfile;
+import com.android.ims.internal.IImsCallSession;
+import com.android.ims.internal.IImsCallSessionListener;
+import com.android.ims.internal.IImsConfig;
+import com.android.ims.internal.IImsEcbm;
+import com.android.ims.internal.IImsMultiEndpoint;
+import com.android.ims.internal.IImsRegistrationListener;
+import com.android.ims.internal.IImsUt;
+
+/**
+ * MMTel interface for an ImsService. When updating this interface, ensure that base implementations
+ * of your changes are also present in MMTelFeature for compatibility with older versions of the
+ * MMTel feature.
+ * @hide
+ */
+
+public interface IMMTelFeature {
+
+ /**
+ * Notifies the MMTel feature that you would like to start a session. This should always be
+ * done before making/receiving IMS calls. The IMS service will register the device to the
+ * operator's network with the credentials (from ISIM) periodically in order to receive calls
+ * from the operator's network. When the IMS service receives a new call, it will send out an
+ * intent with the provided action string. The intent contains a call ID extra
+ * {@link IImsCallSession#getCallId} and it can be used to take a call.
+ *
+ * @param incomingCallIntent When an incoming call is received, the IMS service will call
+ * {@link PendingIntent#send} to send back the intent to the caller with
+ * {@link #INCOMING_CALL_RESULT_CODE} as the result code and the intent to fill in the call ID;
+ * It cannot be null.
+ * @param listener To listen to IMS registration events; It cannot be null
+ * @return an integer (greater than 0) representing the session id associated with the session
+ * that has been started.
+ */
+ int startSession(PendingIntent incomingCallIntent, IImsRegistrationListener listener)
+ throws RemoteException;
+
+ /**
+ * End a previously started session using the associated sessionId.
+ * @param sessionId an integer (greater than 0) representing the ongoing session. See
+ * {@link #startSession}.
+ */
+ void endSession(int sessionId) throws RemoteException;
+
+ /**
+ * Checks if the IMS service has successfully registered to the IMS network with the specified
+ * service & call type.
+ *
+ * @param callServiceType a service type that is specified in {@link ImsCallProfile}
+ * {@link ImsCallProfile#SERVICE_TYPE_NORMAL}
+ * {@link ImsCallProfile#SERVICE_TYPE_EMERGENCY}
+ * @param callType a call type that is specified in {@link ImsCallProfile}
+ * {@link ImsCallProfile#CALL_TYPE_VOICE_N_VIDEO}
+ * {@link ImsCallProfile#CALL_TYPE_VOICE}
+ * {@link ImsCallProfile#CALL_TYPE_VT}
+ * {@link ImsCallProfile#CALL_TYPE_VS}
+ * @return true if the specified service id is connected to the IMS network; false otherwise
+ * @throws RemoteException
+ */
+ boolean isConnected(int callServiceType, int callType) throws RemoteException;
+
+ /**
+ * Checks if the specified IMS service is opened.
+ *
+ * @return true if the specified service id is opened; false otherwise
+ */
+ boolean isOpened() throws RemoteException;
+
+ /**
+ * Add a new registration listener for the client associated with the session Id.
+ * @param listener An implementation of IImsRegistrationListener.
+ */
+ void addRegistrationListener(IImsRegistrationListener listener)
+ throws RemoteException;
+
+ /**
+ * Remove a previously registered listener using {@link #addRegistrationListener} for the client
+ * associated with the session Id.
+ * @param listener A previously registered IImsRegistrationListener
+ */
+ void removeRegistrationListener(IImsRegistrationListener listener)
+ throws RemoteException;
+
+ /**
+ * Creates a {@link ImsCallProfile} from the service capabilities & IMS registration state.
+ *
+ * @param sessionId a session id which is obtained from {@link #startSession}
+ * @param callServiceType a service type that is specified in {@link ImsCallProfile}
+ * {@link ImsCallProfile#SERVICE_TYPE_NONE}
+ * {@link ImsCallProfile#SERVICE_TYPE_NORMAL}
+ * {@link ImsCallProfile#SERVICE_TYPE_EMERGENCY}
+ * @param callType a call type that is specified in {@link ImsCallProfile}
+ * {@link ImsCallProfile#CALL_TYPE_VOICE}
+ * {@link ImsCallProfile#CALL_TYPE_VT}
+ * {@link ImsCallProfile#CALL_TYPE_VT_TX}
+ * {@link ImsCallProfile#CALL_TYPE_VT_RX}
+ * {@link ImsCallProfile#CALL_TYPE_VT_NODIR}
+ * {@link ImsCallProfile#CALL_TYPE_VS}
+ * {@link ImsCallProfile#CALL_TYPE_VS_TX}
+ * {@link ImsCallProfile#CALL_TYPE_VS_RX}
+ * @return a {@link ImsCallProfile} object
+ */
+ ImsCallProfile createCallProfile(int sessionId, int callServiceType, int callType)
+ throws RemoteException;
+
+ /**
+ * Creates a {@link ImsCallSession} with the specified call profile.
+ * Use other methods, if applicable, instead of interacting with
+ * {@link ImsCallSession} directly.
+ *
+ * @param sessionId a session id which is obtained from {@link #startSession}
+ * @param profile a call profile to make the call
+ * @param listener An implementation of IImsCallSessionListener.
+ */
+ IImsCallSession createCallSession(int sessionId, ImsCallProfile profile,
+ IImsCallSessionListener listener) throws RemoteException;
+
+ /**
+ * Retrieves the call session associated with a pending call.
+ *
+ * @param sessionId a session id which is obtained from {@link #startSession}
+ * @param callId a call id to make the call
+ */
+ IImsCallSession getPendingCallSession(int sessionId, String callId) throws RemoteException;
+
+ /**
+ * @return The Ut interface for the supplementary service configuration.
+ */
+ IImsUt getUtInterface() throws RemoteException;
+
+ /**
+ * @return The config interface for IMS Configuration
+ */
+ IImsConfig getConfigInterface() throws RemoteException;
+
+ /**
+ * Signal the MMTelFeature to turn on IMS when it has been turned off using {@link #turnOffIms}
+ * @param sessionId a session id which is obtained from {@link #startSession}
+ */
+ void turnOnIms() throws RemoteException;
+
+ /**
+ * Signal the MMTelFeature to turn off IMS when it has been turned on using {@link #turnOnIms}
+ * @param sessionId a session id which is obtained from {@link #startSession}
+ */
+ void turnOffIms() throws RemoteException;
+
+ /**
+ * @return The Emergency call-back mode interface for emergency VoLTE calls that support it.
+ */
+ IImsEcbm getEcbmInterface() throws RemoteException;
+
+ /**
+ * Sets the current UI TTY mode for the MMTelFeature.
+ * @param uiTtyMode An integer containing the new UI TTY Mode.
+ * @param onComplete A {@link Message} to be used when the mode has been set.
+ * @throws RemoteException
+ */
+ void setUiTTYMode(int uiTtyMode, Message onComplete) throws RemoteException;
+
+ /**
+ * @return MultiEndpoint interface for DEP notifications
+ */
+ IImsMultiEndpoint getMultiEndpointInterface() throws RemoteException;
+}
diff --git a/core/java/android/companion/ICompanionDeviceManagerServiceCallback.aidl b/telephony/java/android/telephony/ims/feature/IRcsFeature.java
similarity index 62%
copy from core/java/android/companion/ICompanionDeviceManagerServiceCallback.aidl
copy to telephony/java/android/telephony/ims/feature/IRcsFeature.java
index c9dd345..e28e1b3 100644
--- a/core/java/android/companion/ICompanionDeviceManagerServiceCallback.aidl
+++ b/telephony/java/android/telephony/ims/feature/IRcsFeature.java
@@ -10,15 +10,17 @@
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing per missions and
- * limitations under the License.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
*/
-package android.companion;
+package android.telephony.ims.feature;
-import android.bluetooth.BluetoothDevice;
+/**
+ * Feature interface that provides access to RCS APIs. Currently empty until RCS support is added
+ * in the framework.
+ * @hide
+ */
-/** @hide */
-interface ICompanionDeviceManagerServiceCallback {
- void onDeviceSelected(in BluetoothDevice device);
+public interface IRcsFeature {
}
diff --git a/telephony/java/android/telephony/ims/feature/ImsFeature.java b/telephony/java/android/telephony/ims/feature/ImsFeature.java
index 0509d60..8d7d260 100644
--- a/telephony/java/android/telephony/ims/feature/ImsFeature.java
+++ b/telephony/java/android/telephony/ims/feature/ImsFeature.java
@@ -16,18 +16,112 @@
package android.telephony.ims.feature;
+import android.annotation.IntDef;
+import android.os.RemoteException;
+import android.util.Log;
+
+import com.android.ims.internal.IImsFeatureStatusCallback;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Base class for all IMS features that are supported by the framework.
* @hide
*/
-public class ImsFeature {
+public abstract class ImsFeature {
+
+ private static final String LOG_TAG = "ImsFeature";
// Invalid feature value
public static final int INVALID = -1;
- // ImsFeatures that are defined in the Manifests
+ // ImsFeatures that are defined in the Manifests. Ensure that these values match the previously
+ // defined values in ImsServiceClass for compatibility purposes.
public static final int EMERGENCY_MMTEL = 0;
public static final int MMTEL = 1;
public static final int RCS = 2;
// Total number of features defined
public static final int MAX = 3;
+
+ // Integer values defining the state of the ImsFeature at any time.
+ @IntDef(flag = true,
+ value = {
+ STATE_NOT_AVAILABLE,
+ STATE_INITIALIZING,
+ STATE_READY,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ImsState {}
+ public static final int STATE_NOT_AVAILABLE = 0;
+ public static final int STATE_INITIALIZING = 1;
+ public static final int STATE_READY = 2;
+
+ private List<INotifyFeatureRemoved> mRemovedListeners = new ArrayList<>();
+ private IImsFeatureStatusCallback mStatusCallback;
+ private @ImsState int mState = STATE_NOT_AVAILABLE;
+
+ public interface INotifyFeatureRemoved {
+ void onFeatureRemoved(int slotId);
+ }
+
+ public void addFeatureRemovedListener(INotifyFeatureRemoved listener) {
+ synchronized (mRemovedListeners) {
+ mRemovedListeners.add(listener);
+ }
+ }
+
+ public void removeFeatureRemovedListener(INotifyFeatureRemoved listener) {
+ synchronized (mRemovedListeners) {
+ mRemovedListeners.remove(listener);
+ }
+ }
+
+ // Not final for testing.
+ public void notifyFeatureRemoved(int slotId) {
+ synchronized (mRemovedListeners) {
+ mRemovedListeners.forEach(l -> l.onFeatureRemoved(slotId));
+ onFeatureRemoved();
+ }
+ }
+
+ public int getFeatureState() {
+ return mState;
+ }
+
+ protected final void setFeatureState(@ImsState int state) {
+ if (mState != state) {
+ mState = state;
+ notifyFeatureState(state);
+ }
+ }
+
+ // Not final for testing.
+ public void setImsFeatureStatusCallback(IImsFeatureStatusCallback c) {
+ mStatusCallback = c;
+ // If we have just connected, send queued status.
+ notifyFeatureState(mState);
+ }
+
+ /**
+ * Internal method called by ImsFeature when setFeatureState has changed.
+ * @param state
+ */
+ private void notifyFeatureState(@ImsState int state) {
+ if (mStatusCallback != null) {
+ try {
+ Log.i(LOG_TAG, "notifying ImsFeatureState");
+ mStatusCallback.notifyImsFeatureStatus(state);
+ } catch (RemoteException e) {
+ mStatusCallback = null;
+ Log.w(LOG_TAG, "Couldn't notify feature state: " + e.getMessage());
+ }
+ }
+ }
+
+ /**
+ * Called when the feature is being removed and must be cleaned up.
+ */
+ public abstract void onFeatureRemoved();
}
diff --git a/telephony/java/android/telephony/ims/feature/MMTelFeature.java b/telephony/java/android/telephony/ims/feature/MMTelFeature.java
new file mode 100644
index 0000000..a71f0bf
--- /dev/null
+++ b/telephony/java/android/telephony/ims/feature/MMTelFeature.java
@@ -0,0 +1,122 @@
+/*
+ * 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.telephony.ims.feature;
+
+import android.app.PendingIntent;
+import android.os.Message;
+
+import com.android.ims.ImsCallProfile;
+import com.android.ims.internal.IImsCallSession;
+import com.android.ims.internal.IImsCallSessionListener;
+import com.android.ims.internal.IImsConfig;
+import com.android.ims.internal.IImsEcbm;
+import com.android.ims.internal.IImsMultiEndpoint;
+import com.android.ims.internal.IImsRegistrationListener;
+import com.android.ims.internal.IImsUt;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Base implementation, which implements all methods in IMMTelFeature. Any class wishing to use
+ * MMTelFeature should extend this class and implement all methods that the service supports.
+ *
+ * @hide
+ */
+
+public class MMTelFeature extends ImsFeature implements IMMTelFeature {
+
+ @Override
+ public int startSession(PendingIntent incomingCallIntent, IImsRegistrationListener listener) {
+ return 0;
+ }
+
+ @Override
+ public void endSession(int sessionId) {
+ }
+
+ @Override
+ public boolean isConnected(int callSessionType, int callType) {
+ return false;
+ }
+
+ @Override
+ public boolean isOpened() {
+ return false;
+ }
+
+ @Override
+ public void addRegistrationListener(IImsRegistrationListener listener) {
+ }
+
+ @Override
+ public void removeRegistrationListener(IImsRegistrationListener listener) {
+ }
+
+ @Override
+ public ImsCallProfile createCallProfile(int sessionId, int callSessionType, int callType) {
+ return null;
+ }
+
+ @Override
+ public IImsCallSession createCallSession(int sessionId, ImsCallProfile profile,
+ IImsCallSessionListener listener) {
+ return null;
+ }
+
+ @Override
+ public IImsCallSession getPendingCallSession(int sessionId, String callId) {
+ return null;
+ }
+
+ @Override
+ public IImsUt getUtInterface() {
+ return null;
+ }
+
+ @Override
+ public IImsConfig getConfigInterface() {
+ return null;
+ }
+
+ @Override
+ public void turnOnIms() {
+ }
+
+ @Override
+ public void turnOffIms() {
+ }
+
+ @Override
+ public IImsEcbm getEcbmInterface() {
+ return null;
+ }
+
+ @Override
+ public void setUiTTYMode(int uiTtyMode, Message onComplete) {
+ }
+
+ @Override
+ public IImsMultiEndpoint getMultiEndpointInterface() {
+ return null;
+ }
+
+ @Override
+ public void onFeatureRemoved() {
+
+ }
+}
diff --git a/telephony/java/android/telephony/ims/feature/RcsFeature.java b/telephony/java/android/telephony/ims/feature/RcsFeature.java
new file mode 100644
index 0000000..9cddc1b
--- /dev/null
+++ b/telephony/java/android/telephony/ims/feature/RcsFeature.java
@@ -0,0 +1,35 @@
+/*
+ * 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.telephony.ims.feature;
+
+/**
+ * Base implementation of the RcsFeature APIs. Any ImsService wishing to support RCS should extend
+ * this class and provide implementations of the IRcsFeature methods that they support.
+ * @hide
+ */
+
+public class RcsFeature extends ImsFeature implements IRcsFeature {
+
+ public RcsFeature() {
+ super();
+ }
+
+ @Override
+ public void onFeatureRemoved() {
+
+ }
+}
diff --git a/telephony/java/android/telephony/ims/stub/ImsCallSessionImplBase.java b/telephony/java/android/telephony/ims/stub/ImsCallSessionImplBase.java
new file mode 100644
index 0000000..69b8acc
--- /dev/null
+++ b/telephony/java/android/telephony/ims/stub/ImsCallSessionImplBase.java
@@ -0,0 +1,348 @@
+/*
+ * 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.telephony.ims.stub;
+
+import android.os.Message;
+import android.os.RemoteException;
+
+import com.android.ims.ImsCallProfile;
+import com.android.ims.ImsStreamMediaProfile;
+import com.android.ims.internal.ImsCallSession;
+import com.android.ims.internal.IImsCallSession;
+import com.android.ims.internal.IImsCallSessionListener;
+import com.android.ims.internal.IImsVideoCallProvider;
+
+/**
+ * Base implementation of IImsCallSession, which implements stub versions of the methods in the
+ * IImsCallSession AIDL. Override the methods that your implementation of ImsCallSession supports.
+ *
+ * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you
+ * will break other implementations of ImsCallSession maintained by other ImsServices.
+ *
+ * @hide
+ */
+
+public class ImsCallSessionImplBase extends IImsCallSession.Stub {
+
+ /**
+ * Closes the object. This object is not usable after being closed.
+ */
+ @Override
+ public void close() throws RemoteException {
+
+ }
+
+ /**
+ * Gets the call ID of the session.
+ *
+ * @return the call ID
+ */
+ @Override
+ public String getCallId() throws RemoteException {
+ return null;
+ }
+
+ /**
+ * Gets the call profile that this session is associated with
+ *
+ * @return the {@link ImsCallProfile} that this session is associated with
+ */
+ @Override
+ public ImsCallProfile getCallProfile() throws RemoteException {
+ return null;
+ }
+
+ /**
+ * Gets the local call profile that this session is associated with
+ *
+ * @return the local {@link ImsCallProfile} that this session is associated with
+ */
+ @Override
+ public ImsCallProfile getLocalCallProfile() throws RemoteException {
+ return null;
+ }
+
+ /**
+ * Gets the remote call profile that this session is associated with
+ *
+ * @return the remote {@link ImsCallProfile} that this session is associated with
+ */
+ @Override
+ public ImsCallProfile getRemoteCallProfile() throws RemoteException {
+ return null;
+ }
+
+ /**
+ * Gets the value associated with the specified property of this session.
+ *
+ * @return the string value associated with the specified property
+ */
+ @Override
+ public String getProperty(String name) throws RemoteException {
+ return null;
+ }
+
+ /**
+ * Gets the session state.
+ * The value returned must be one of the states in {@link ImsCallSession.State}.
+ *
+ * @return the session state
+ */
+ @Override
+ public int getState() throws RemoteException {
+ return ImsCallSession.State.INVALID;
+ }
+
+ /**
+ * Checks if the session is in call.
+ *
+ * @return true if the session is in call, false otherwise
+ */
+ @Override
+ public boolean isInCall() throws RemoteException {
+ return false;
+ }
+
+ /**
+ * Sets the listener to listen to the session events. An {@link ImsCallSession}
+ * can only hold one listener at a time. Subsequent calls to this method
+ * override the previous listener.
+ *
+ * @param listener to listen to the session events of this object
+ */
+ @Override
+ public void setListener(IImsCallSessionListener listener) throws RemoteException {
+ }
+
+ /**
+ * Mutes or unmutes the mic for the active call.
+ *
+ * @param muted true if the call is muted, false otherwise
+ */
+ @Override
+ public void setMute(boolean muted) throws RemoteException {
+ }
+
+ /**
+ * Initiates an IMS call with the specified target and call profile.
+ * The session listener set in {@link #setListener} is called back upon defined session events.
+ * The method is only valid to call when the session state is in
+ * {@link ImsCallSession.State#IDLE}.
+ *
+ * @param callee dialed string to make the call to
+ * @param profile call profile to make the call with the specified service type,
+ * call type and media information
+ * @see {@link ImsCallSession.Listener#callSessionStarted},
+ * {@link ImsCallSession.Listener#callSessionStartFailed}
+ */
+ @Override
+ public void start(String callee, ImsCallProfile profile) throws RemoteException {
+ }
+
+ /**
+ * Initiates an IMS call with the specified participants and call profile.
+ * The session listener set in {@link #setListener} is called back upon defined session events.
+ * The method is only valid to call when the session state is in
+ * {@link ImsCallSession.State#IDLE}.
+ *
+ * @param participants participant list to initiate an IMS conference call
+ * @param profile call profile to make the call with the specified service type,
+ * call type and media information
+ * @see {@link ImsCallSession.Listener#callSessionStarted},
+ * {@link ImsCallSession.Listener#callSessionStartFailed}
+ */
+ @Override
+ public void startConference(String[] participants, ImsCallProfile profile)
+ throws RemoteException {
+ }
+
+ /**
+ * Accepts an incoming call or session update.
+ *
+ * @param callType call type specified in {@link ImsCallProfile} to be answered
+ * @param profile stream media profile {@link ImsStreamMediaProfile} to be answered
+ * @see {@link ImsCallSession.Listener#callSessionStarted}
+ */
+ @Override
+ public void accept(int callType, ImsStreamMediaProfile profile) throws RemoteException {
+ }
+
+ /**
+ * Rejects an incoming call or session update.
+ *
+ * @param reason reason code to reject an incoming call, defined in
+ * com.android.ims.ImsReasonInfo
+ * {@link ImsCallSession.Listener#callSessionStartFailed}
+ */
+ @Override
+ public void reject(int reason) throws RemoteException {
+ }
+
+ /**
+ * Terminates a call.
+ *
+ * @param reason reason code to terminate a call, defined in
+ * com.android.ims.ImsReasonInfo
+ *
+ * @see {@link ImsCallSession.Listener#callSessionTerminated}
+ */
+ @Override
+ public void terminate(int reason) throws RemoteException {
+ }
+
+ /**
+ * Puts a call on hold. When it succeeds, {@link ImsCallSession.Listener#callSessionHeld} is
+ * called.
+ *
+ * @param profile stream media profile {@link ImsStreamMediaProfile} to hold the call
+ * @see {@link ImsCallSession.Listener#callSessionHeld},
+ * {@link ImsCallSession.Listener#callSessionHoldFailed}
+ */
+ @Override
+ public void hold(ImsStreamMediaProfile profile) throws RemoteException {
+ }
+
+ /**
+ * Continues a call that's on hold. When it succeeds,
+ * {@link ImsCallSession.Listener#callSessionResumed} is called.
+ *
+ * @param profile stream media profile with {@link ImsStreamMediaProfile} to resume the call
+ * @see {@link ImsCallSession.Listener#callSessionResumed},
+ * {@link ImsCallSession.Listener#callSessionResumeFailed}
+ */
+ @Override
+ public void resume(ImsStreamMediaProfile profile) throws RemoteException {
+ }
+
+ /**
+ * Merges the active & hold call. When the merge starts,
+ * {@link ImsCallSession.Listener#callSessionMergeStarted} is called.
+ * {@link ImsCallSession.Listener#callSessionMergeComplete} is called if the merge is
+ * successful, and {@link ImsCallSession.Listener#callSessionMergeFailed} is called if the merge
+ * fails.
+ *
+ * @see {@link ImsCallSession.Listener#callSessionMergeStarted},
+ * {@link ImsCallSession.Listener#callSessionMergeComplete},
+ * {@link ImsCallSession.Listener#callSessionMergeFailed}
+ */
+ @Override
+ public void merge() throws RemoteException {
+ }
+
+ /**
+ * Updates the current call's properties (ex. call mode change: video upgrade / downgrade).
+ *
+ * @param callType call type specified in {@link ImsCallProfile} to be updated
+ * @param profile stream media profile {@link ImsStreamMediaProfile} to be updated
+ * @see {@link ImsCallSession.Listener#callSessionUpdated},
+ * {@link ImsCallSession.Listener#callSessionUpdateFailed}
+ */
+ @Override
+ public void update(int callType, ImsStreamMediaProfile profile) throws RemoteException {
+ }
+
+ /**
+ * Extends this call to the conference call with the specified recipients.
+ *
+ * @param participants participant list to be invited to the conference call after extending the
+ * call
+ * @see {@link ImsCallSession.Listener#callSessionConferenceExtended},
+ * {@link ImsCallSession.Listener#callSessionConferenceExtendFailed}
+ */
+ @Override
+ public void extendToConference(String[] participants) throws RemoteException {
+ }
+
+ /**
+ * Requests the conference server to invite an additional participants to the conference.
+ *
+ * @param participants participant list to be invited to the conference call
+ * @see {@link ImsCallSession.Listener#callSessionInviteParticipantsRequestDelivered},
+ * {@link ImsCallSession.Listener#callSessionInviteParticipantsRequestFailed}
+ */
+ @Override
+ public void inviteParticipants(String[] participants) throws RemoteException {
+ }
+
+ /**
+ * Requests the conference server to remove the specified participants from the conference.
+ *
+ * @param participants participant list to be removed from the conference call
+ * @see {@link ImsCallSession.Listener#callSessionRemoveParticipantsRequestDelivered},
+ * {@link ImsCallSession.Listener#callSessionRemoveParticipantsRequestFailed}
+ */
+ @Override
+ public void removeParticipants(String[] participants) throws RemoteException {
+ }
+
+ /**
+ * Sends a DTMF code. According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833</a>,
+ * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15,
+ * and event flash to 16. Currently, event flash is not supported.
+ *
+ * @param c the DTMF to send. '0' ~ '9', 'A' ~ 'D', '*', '#' are valid inputs.
+ */
+ @Override
+ public void sendDtmf(char c, Message result) throws RemoteException {
+ }
+
+ /**
+ * Start a DTMF code. According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833</a>,
+ * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15,
+ * and event flash to 16. Currently, event flash is not supported.
+ *
+ * @param c the DTMF to send. '0' ~ '9', 'A' ~ 'D', '*', '#' are valid inputs.
+ */
+ @Override
+ public void startDtmf(char c) throws RemoteException {
+ }
+
+ /**
+ * Stop a DTMF code.
+ */
+ @Override
+ public void stopDtmf() throws RemoteException {
+ }
+
+ /**
+ * Sends an USSD message.
+ *
+ * @param ussdMessage USSD message to send
+ */
+ @Override
+ public void sendUssd(String ussdMessage) throws RemoteException {
+ }
+
+ /**
+ * Returns a binder for the video call provider implementation contained within the IMS service
+ * process. This binder is used by the VideoCallProvider subclass in Telephony which
+ * intermediates between the propriety implementation and Telecomm/InCall.
+ */
+ @Override
+ public IImsVideoCallProvider getVideoCallProvider() throws RemoteException {
+ return null;
+ }
+
+ /**
+ * Determines if the current session is multiparty.
+ * @return {@code True} if the session is multiparty.
+ */
+ @Override
+ public boolean isMultiparty() throws RemoteException {
+ return false;
+ }
+}
diff --git a/telephony/java/android/telephony/ims/stub/ImsCallSessionListenerImplBase.java b/telephony/java/android/telephony/ims/stub/ImsCallSessionListenerImplBase.java
new file mode 100644
index 0000000..46f8f80
--- /dev/null
+++ b/telephony/java/android/telephony/ims/stub/ImsCallSessionListenerImplBase.java
@@ -0,0 +1,251 @@
+/*
+ * 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.telephony.ims.stub;
+
+import com.android.ims.ImsCallProfile;
+import com.android.ims.ImsConferenceState;
+import com.android.ims.ImsReasonInfo;
+import com.android.ims.ImsStreamMediaProfile;
+import com.android.ims.ImsSuppServiceNotification;
+import com.android.ims.internal.IImsCallSession;
+import com.android.ims.internal.IImsCallSessionListener;
+
+/**
+ * Base implementation of ImsCallSessionListenerBase, which implements stub versions of the methods
+ * in the IImsCallSessionListener AIDL. Override the methods that your implementation of
+ * ImsCallSessionListener supports.
+ *
+ * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you
+ * will break other implementations of ImsCallSessionListener maintained by other ImsServices.
+ *
+ * @hide
+ */
+public class ImsCallSessionListenerImplBase extends IImsCallSessionListener.Stub {
+ /**
+ * Notifies the result of the basic session operation (setup / terminate).
+ */
+ @Override
+ public void callSessionProgressing(IImsCallSession session, ImsStreamMediaProfile profile) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionStarted(IImsCallSession session, ImsCallProfile profile) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionStartFailed(IImsCallSession session, ImsReasonInfo reasonInfo) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionTerminated(IImsCallSession session, ImsReasonInfo reasonInfo) {
+ // no-op
+ }
+
+ /**
+ * Notifies the result of the call hold/resume operation.
+ */
+ @Override
+ public void callSessionHeld(IImsCallSession session, ImsCallProfile profile) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionHoldFailed(IImsCallSession session, ImsReasonInfo reasonInfo) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionHoldReceived(IImsCallSession session, ImsCallProfile profile) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionResumed(IImsCallSession session, ImsCallProfile profile) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionResumeFailed(IImsCallSession session, ImsReasonInfo reasonInfo) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionResumeReceived(IImsCallSession session, ImsCallProfile profile) {
+ // no-op
+ }
+
+ /**
+ * Notifies the result of call merge operation.
+ */
+ @Override
+ public void callSessionMergeStarted(IImsCallSession session, IImsCallSession newSession,
+ ImsCallProfile profile) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionMergeComplete(IImsCallSession session) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionMergeFailed(IImsCallSession session, ImsReasonInfo reasonInfo) {
+ // no-op
+ }
+
+ /**
+ * Notifies the result of call upgrade / downgrade or any other call
+ * updates.
+ */
+ @Override
+ public void callSessionUpdated(IImsCallSession session, ImsCallProfile profile) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionUpdateFailed(IImsCallSession session, ImsReasonInfo reasonInfo) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionUpdateReceived(IImsCallSession session, ImsCallProfile profile) {
+ // no-op
+ }
+
+ /**
+ * Notifies the result of conference extension.
+ */
+ @Override
+ public void callSessionConferenceExtended(IImsCallSession session, IImsCallSession newSession,
+ ImsCallProfile profile) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionConferenceExtendFailed(IImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionConferenceExtendReceived(IImsCallSession session,
+ IImsCallSession newSession,
+ ImsCallProfile profile) {
+ // no-op
+ }
+
+ /**
+ * Notifies the result of the participant invitation / removal to/from the
+ * conference session.
+ */
+ @Override
+ public void callSessionInviteParticipantsRequestDelivered(IImsCallSession session) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionInviteParticipantsRequestFailed(IImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionRemoveParticipantsRequestDelivered(IImsCallSession session) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionRemoveParticipantsRequestFailed(IImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ // no-op
+ }
+
+ /**
+ * Notifies the changes of the conference info. the conference session.
+ */
+ @Override
+ public void callSessionConferenceStateUpdated(IImsCallSession session,
+ ImsConferenceState state) {
+ // no-op
+ }
+
+ /**
+ * Notifies the incoming USSD message.
+ */
+ @Override
+ public void callSessionUssdMessageReceived(IImsCallSession session, int mode,
+ String ussdMessage) {
+ // no-op
+ }
+
+ /**
+ * Notifies of handover information for this call
+ */
+ @Override
+ public void callSessionHandover(IImsCallSession session, int srcAccessTech,
+ int targetAccessTech,
+ ImsReasonInfo reasonInfo) {
+ // no-op
+ }
+
+ @Override
+ public void callSessionHandoverFailed(IImsCallSession session, int srcAccessTech,
+ int targetAccessTech,
+ ImsReasonInfo reasonInfo) {
+ // no-op
+ }
+
+ /**
+ * Notifies the TTY mode change by remote party.
+ *
+ * @param mode one of the following: -
+ * {@link com.android.internal.telephony.Phone#TTY_MODE_OFF} -
+ * {@link com.android.internal.telephony.Phone#TTY_MODE_FULL} -
+ * {@link com.android.internal.telephony.Phone#TTY_MODE_HCO} -
+ * {@link com.android.internal.telephony.Phone#TTY_MODE_VCO}
+ */
+ @Override
+ public void callSessionTtyModeReceived(IImsCallSession session, int mode) {
+ // no-op
+ }
+
+ /**
+ * Notifies of a change to the multiparty state for this
+ * {@code ImsCallSession}.
+ *
+ * @param session The call session.
+ * @param isMultiParty {@code true} if the session became multiparty,
+ * {@code false} otherwise.
+ */
+ @Override
+ public void callSessionMultipartyStateChanged(IImsCallSession session, boolean isMultiParty) {
+ // no-op
+ }
+
+ /**
+ * Notifies the supplementary service information for the current session.
+ */
+ @Override
+ public void callSessionSuppServiceReceived(IImsCallSession session,
+ ImsSuppServiceNotification suppSrvNotification) {
+ // no-op
+ }
+}
+
diff --git a/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java
new file mode 100644
index 0000000..5a4db99
--- /dev/null
+++ b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java
@@ -0,0 +1,150 @@
+/*
+ * 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.telephony.ims.stub;
+
+import android.os.RemoteException;
+
+import com.android.ims.ImsConfig;
+import com.android.ims.ImsConfigListener;
+import com.android.ims.internal.IImsConfig;
+
+/**
+ * Base implementation of ImsConfig, which implements stub versions of the methods
+ * in the IImsConfig AIDL. Override the methods that your implementation of ImsConfig supports.
+ *
+ * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you
+ * will break other implementations of ImsConfig maintained by other ImsServices.
+ *
+ * Provides APIs to get/set the IMS service feature/capability/parameters.
+ * The config items include:
+ * 1) Items provisioned by the operator.
+ * 2) Items configured by user. Mainly service feature class.
+ *
+ * @hide
+ */
+
+public class ImsConfigImplBase extends IImsConfig.Stub {
+
+ /**
+ * Gets the value for ims service/capabilities parameters from the provisioned
+ * value storage. Synchronous blocking call.
+ *
+ * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
+ * @return value in Integer format.
+ */
+ @Override
+ public int getProvisionedValue(int item) throws RemoteException {
+ return -1;
+ }
+
+ /**
+ * Gets the value for ims service/capabilities parameters from the provisioned
+ * value storage. Synchronous blocking call.
+ *
+ * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
+ * @return value in String format.
+ */
+ @Override
+ public String getProvisionedStringValue(int item) throws RemoteException {
+ return null;
+ }
+
+ /**
+ * Sets the value for IMS service/capabilities parameters by the operator device
+ * management entity. It sets the config item value in the provisioned storage
+ * from which the master value is derived. Synchronous blocking call.
+ *
+ * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
+ * @param value in Integer format.
+ * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants.
+ */
+ @Override
+ public int setProvisionedValue(int item, int value) throws RemoteException {
+ return ImsConfig.OperationStatusConstants.FAILED;
+ }
+
+ /**
+ * Sets the value for IMS service/capabilities parameters by the operator device
+ * management entity. It sets the config item value in the provisioned storage
+ * from which the master value is derived. Synchronous blocking call.
+ *
+ * @param item as defined in com.android.ims.ImsConfig#ConfigConstants.
+ * @param value in String format.
+ * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants.
+ */
+ @Override
+ public int setProvisionedStringValue(int item, String value) throws RemoteException {
+ return ImsConfig.OperationStatusConstants.FAILED;
+ }
+
+ /**
+ * Gets the value of the specified IMS feature item for specified network type.
+ * This operation gets the feature config value from the master storage (i.e. final
+ * value). Asynchronous non-blocking call.
+ *
+ * @param feature as defined in com.android.ims.ImsConfig#FeatureConstants.
+ * @param network as defined in android.telephony.TelephonyManager#NETWORK_TYPE_XXX.
+ * @param listener feature value returned asynchronously through listener.
+ */
+ @Override
+ public void getFeatureValue(int feature, int network, ImsConfigListener listener)
+ throws RemoteException {
+ }
+
+ /**
+ * Sets the value for IMS feature item for specified network type.
+ * This operation stores the user setting in setting db from which master db
+ * is derived.
+ *
+ * @param feature as defined in com.android.ims.ImsConfig#FeatureConstants.
+ * @param network as defined in android.telephony.TelephonyManager#NETWORK_TYPE_XXX.
+ * @param value as defined in com.android.ims.ImsConfig#FeatureValueConstants.
+ * @param listener, provided if caller needs to be notified for set result.
+ */
+ @Override
+ public void setFeatureValue(int feature, int network, int value, ImsConfigListener listener)
+ throws RemoteException {
+ }
+
+ /**
+ * Gets the value for IMS VoLTE provisioned.
+ * This should be the same as the operator provisioned value if applies.
+ */
+ @Override
+ public boolean getVolteProvisioned() throws RemoteException {
+ return false;
+ }
+
+ /**
+ * Gets the value for IMS feature item video quality.
+ *
+ * @param listener Video quality value returned asynchronously through listener.
+ */
+ @Override
+ public void getVideoQuality(ImsConfigListener listener) throws RemoteException {
+ }
+
+ /**
+ * Sets the value for IMS feature item video quality.
+ *
+ * @param quality, defines the value of video quality.
+ * @param listener, provided if caller needs to be notified for set result.
+ */
+ @Override
+ public void setVideoQuality(int quality, ImsConfigListener listener) throws RemoteException {
+ }
+}
diff --git a/telephony/java/android/telephony/ims/stub/ImsEcbmImplBase.java b/telephony/java/android/telephony/ims/stub/ImsEcbmImplBase.java
new file mode 100644
index 0000000..89f95ff
--- /dev/null
+++ b/telephony/java/android/telephony/ims/stub/ImsEcbmImplBase.java
@@ -0,0 +1,51 @@
+/*
+ * 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.telephony.ims.stub;
+
+import android.os.RemoteException;
+
+import com.android.ims.internal.IImsEcbm;
+import com.android.ims.internal.IImsEcbmListener;
+
+/**
+ * Base implementation of ImsEcbm, which implements stub versions of the methods
+ * in the IImsEcbm AIDL. Override the methods that your implementation of ImsEcbm supports.
+ *
+ * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you
+ * will break other implementations of ImsEcbm maintained by other ImsServices.
+ *
+ * @hide
+ */
+
+public class ImsEcbmImplBase extends IImsEcbm.Stub {
+
+ /**
+ * Sets the listener.
+ */
+ @Override
+ public void setListener(IImsEcbmListener listener) throws RemoteException {
+
+ }
+
+ /**
+ * Requests Modem to come out of ECBM mode
+ */
+ @Override
+ public void exitEmergencyCallbackMode() throws RemoteException {
+
+ }
+}
diff --git a/telephony/java/android/telephony/ims/stub/ImsMultiEndpointImplBase.java b/telephony/java/android/telephony/ims/stub/ImsMultiEndpointImplBase.java
new file mode 100644
index 0000000..05da9da
--- /dev/null
+++ b/telephony/java/android/telephony/ims/stub/ImsMultiEndpointImplBase.java
@@ -0,0 +1,53 @@
+/*
+ * 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.telephony.ims.stub;
+
+import android.os.RemoteException;
+
+import com.android.ims.internal.IImsExternalCallStateListener;
+import com.android.ims.internal.IImsMultiEndpoint;
+
+/**
+ * Base implementation of ImsMultiEndpoint, which implements stub versions of the methods
+ * in the IImsMultiEndpoint AIDL. Override the methods that your implementation of
+ * ImsMultiEndpoint supports.
+ *
+ * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you
+ * will break other implementations of ImsMultiEndpoint maintained by other ImsServices.
+ *
+ * @hide
+ */
+
+public class ImsMultiEndpointImplBase extends IImsMultiEndpoint.Stub {
+
+ /**
+ * Sets the listener.
+ */
+ @Override
+ public void setListener(IImsExternalCallStateListener listener) throws RemoteException {
+
+ }
+
+ /**
+ * Query API to get the latest Dialog Event Package information
+ * Should be invoked only after setListener is done
+ */
+ @Override
+ public void requestImsExternalCallStateInfo() throws RemoteException {
+
+ }
+}
diff --git a/telephony/java/android/telephony/ims/stub/ImsStreamMediaSessionImplBase.java b/telephony/java/android/telephony/ims/stub/ImsStreamMediaSessionImplBase.java
new file mode 100644
index 0000000..92f1a01
--- /dev/null
+++ b/telephony/java/android/telephony/ims/stub/ImsStreamMediaSessionImplBase.java
@@ -0,0 +1,40 @@
+/*
+ * 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.telephony.ims.stub;
+
+import android.os.RemoteException;
+
+import com.android.ims.internal.IImsStreamMediaSession;
+
+/**
+ * Base implementation of ImsStreamMediaSession, which implements stub versions of the methods
+ * in the IImsStreamMediaSession AIDL. Override the methods that your implementation of
+ * ImsStreamMediaSession supports.
+ *
+ * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you
+ * will break other implementations of ImsStreamMediaSession maintained by other ImsServices.
+ *
+ * @hide
+ */
+
+public class ImsStreamMediaSessionImplBase extends IImsStreamMediaSession.Stub {
+
+ @Override
+ public void close() throws RemoteException {
+
+ }
+}
diff --git a/telephony/java/android/telephony/ims/stub/ImsUtImplBase.java b/telephony/java/android/telephony/ims/stub/ImsUtImplBase.java
new file mode 100644
index 0000000..dc74094
--- /dev/null
+++ b/telephony/java/android/telephony/ims/stub/ImsUtImplBase.java
@@ -0,0 +1,174 @@
+/*
+ * 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.telephony.ims.stub;
+
+import android.os.Bundle;
+import android.os.RemoteException;
+
+import com.android.ims.internal.IImsUt;
+import com.android.ims.internal.IImsUtListener;
+
+/**
+ * Base implementation of ImsUt, which implements stub versions of the methods
+ * in the IImsUt AIDL. Override the methods that your implementation of ImsUt supports.
+ *
+ * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you
+ * will break other implementations of ImsUt maintained by other ImsServices.
+ *
+ * Provides the Ut interface interworking to get/set the supplementary service configuration.
+ *
+ * @hide
+ */
+
+public class ImsUtImplBase extends IImsUt.Stub {
+
+ /**
+ * Closes the object. This object is not usable after being closed.
+ */
+ @Override
+ public void close() throws RemoteException {
+
+ }
+
+ /**
+ * Retrieves the configuration of the call barring.
+ */
+ @Override
+ public int queryCallBarring(int cbType) throws RemoteException {
+ return -1;
+ }
+
+ /**
+ * Retrieves the configuration of the call forward.
+ */
+ @Override
+ public int queryCallForward(int condition, String number) throws RemoteException {
+ return -1;
+ }
+
+ /**
+ * Retrieves the configuration of the call waiting.
+ */
+ @Override
+ public int queryCallWaiting() throws RemoteException {
+ return -1;
+ }
+
+ /**
+ * Retrieves the default CLIR setting.
+ */
+ @Override
+ public int queryCLIR() throws RemoteException {
+ return -1;
+ }
+
+ /**
+ * Retrieves the CLIP call setting.
+ */
+ @Override
+ public int queryCLIP() throws RemoteException {
+ return -1;
+ }
+
+ /**
+ * Retrieves the COLR call setting.
+ */
+ @Override
+ public int queryCOLR() throws RemoteException {
+ return -1;
+ }
+
+ /**
+ * Retrieves the COLP call setting.
+ */
+ @Override
+ public int queryCOLP() throws RemoteException {
+ return -1;
+ }
+
+ /**
+ * Updates or retrieves the supplementary service configuration.
+ */
+ @Override
+ public int transact(Bundle ssInfo) throws RemoteException {
+ return -1;
+ }
+
+ /**
+ * Updates the configuration of the call barring.
+ */
+ @Override
+ public int updateCallBarring(int cbType, int action, String[] barrList) throws RemoteException {
+ return -1;
+ }
+
+ /**
+ * Updates the configuration of the call forward.
+ */
+ @Override
+ public int updateCallForward(int action, int condition, String number, int serviceClass,
+ int timeSeconds) throws RemoteException {
+ return 0;
+ }
+
+ /**
+ * Updates the configuration of the call waiting.
+ */
+ @Override
+ public int updateCallWaiting(boolean enable, int serviceClass) throws RemoteException {
+ return -1;
+ }
+
+ /**
+ * Updates the configuration of the CLIR supplementary service.
+ */
+ @Override
+ public int updateCLIR(int clirMode) throws RemoteException {
+ return -1;
+ }
+
+ /**
+ * Updates the configuration of the CLIP supplementary service.
+ */
+ @Override
+ public int updateCLIP(boolean enable) throws RemoteException {
+ return -1;
+ }
+
+ /**
+ * Updates the configuration of the COLR supplementary service.
+ */
+ @Override
+ public int updateCOLR(int presentation) throws RemoteException {
+ return -1;
+ }
+
+ /**
+ * Updates the configuration of the COLP supplementary service.
+ */
+ @Override
+ public int updateCOLP(boolean enable) throws RemoteException {
+ return -1;
+ }
+
+ /**
+ * Sets the listener.
+ */
+ @Override
+ public void setListener(IImsUtListener listener) throws RemoteException {
+ }
+}
diff --git a/telephony/java/android/telephony/ims/stub/ImsUtListenerImplBase.java b/telephony/java/android/telephony/ims/stub/ImsUtListenerImplBase.java
new file mode 100644
index 0000000..b371efb
--- /dev/null
+++ b/telephony/java/android/telephony/ims/stub/ImsUtListenerImplBase.java
@@ -0,0 +1,88 @@
+/*
+ * 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.telephony.ims.stub;
+
+import android.os.Bundle;
+import android.os.RemoteException;
+
+import com.android.ims.ImsCallForwardInfo;
+import com.android.ims.ImsReasonInfo;
+import com.android.ims.ImsSsInfo;
+import com.android.ims.internal.IImsUt;
+import com.android.ims.internal.IImsUtListener;
+
+/**
+ * Base implementation of ImsUtListener, which implements stub versions of the methods
+ * in the IImsUtListener AIDL. Override the methods that your implementation of
+ * ImsUtListener supports.
+ *
+ * DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you
+ * will break other implementations of ImsUtListener maintained by other ImsServices.
+ *
+ * @hide
+ */
+
+public class ImsUtListenerImplBase extends IImsUtListener.Stub {
+
+ /**
+ * Notifies the result of the supplementary service configuration udpate.
+ */
+ @Override
+ public void utConfigurationUpdated(IImsUt ut, int id) throws RemoteException {
+ }
+
+ @Override
+ public void utConfigurationUpdateFailed(IImsUt ut, int id, ImsReasonInfo error)
+ throws RemoteException {
+ }
+
+ /**
+ * Notifies the result of the supplementary service configuration query.
+ */
+ @Override
+ public void utConfigurationQueried(IImsUt ut, int id, Bundle ssInfo) throws RemoteException {
+ }
+
+ @Override
+ public void utConfigurationQueryFailed(IImsUt ut, int id, ImsReasonInfo error)
+ throws RemoteException {
+ }
+
+ /**
+ * Notifies the status of the call barring supplementary service.
+ */
+ @Override
+ public void utConfigurationCallBarringQueried(IImsUt ut, int id, ImsSsInfo[] cbInfo)
+ throws RemoteException {
+ }
+
+ /**
+ * Notifies the status of the call forwarding supplementary service.
+ */
+ @Override
+ public void utConfigurationCallForwardQueried(IImsUt ut, int id, ImsCallForwardInfo[] cfInfo)
+ throws RemoteException {
+ }
+
+ /**
+ * Notifies the status of the call waiting supplementary service.
+ */
+ @Override
+ public void utConfigurationCallWaitingQueried(IImsUt ut, int id, ImsSsInfo[] cwInfo)
+ throws RemoteException {
+ }
+}
diff --git a/telephony/java/com/android/ims/ImsConfig.java b/telephony/java/com/android/ims/ImsConfig.java
new file mode 100644
index 0000000..cd076b1
--- /dev/null
+++ b/telephony/java/com/android/ims/ImsConfig.java
@@ -0,0 +1,694 @@
+/*
+ * 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.ims;
+
+import android.content.Context;
+import android.os.RemoteException;
+import android.telephony.Rlog;
+
+import com.android.ims.internal.IImsConfig;
+
+/**
+ * Provides APIs to get/set the IMS service feature/capability/parameters.
+ * The config items include:
+ * 1) Items provisioned by the operator.
+ * 2) Items configured by user. Mainly service feature class.
+ *
+ * @hide
+ */
+public class ImsConfig {
+ private static final String TAG = "ImsConfig";
+ private boolean DBG = true;
+ private final IImsConfig miConfig;
+ private Context mContext;
+
+ /**
+ * Broadcast action: the feature enable status was changed
+ *
+ * @hide
+ */
+ public static final String ACTION_IMS_FEATURE_CHANGED =
+ "com.android.intent.action.IMS_FEATURE_CHANGED";
+
+ /**
+ * Broadcast action: the configuration was changed
+ *
+ * @hide
+ */
+ public static final String ACTION_IMS_CONFIG_CHANGED =
+ "com.android.intent.action.IMS_CONFIG_CHANGED";
+
+ /**
+ * Extra parameter "item" of intent ACTION_IMS_FEATURE_CHANGED and ACTION_IMS_CONFIG_CHANGED.
+ * It is the value of FeatureConstants or ConfigConstants.
+ *
+ * @hide
+ */
+ public static final String EXTRA_CHANGED_ITEM = "item";
+
+ /**
+ * Extra parameter "value" of intent ACTION_IMS_FEATURE_CHANGED and ACTION_IMS_CONFIG_CHANGED.
+ * It is the new value of "item".
+ *
+ * @hide
+ */
+ public static final String EXTRA_NEW_VALUE = "value";
+
+ /**
+ * Defines IMS service/capability feature constants.
+ */
+ public static class FeatureConstants {
+ public static final int FEATURE_TYPE_UNKNOWN = -1;
+
+ /**
+ * FEATURE_TYPE_VOLTE supports features defined in 3GPP and
+ * GSMA IR.92 over LTE.
+ */
+ public static final int FEATURE_TYPE_VOICE_OVER_LTE = 0;
+
+ /**
+ * FEATURE_TYPE_LVC supports features defined in 3GPP and
+ * GSMA IR.94 over LTE.
+ */
+ public static final int FEATURE_TYPE_VIDEO_OVER_LTE = 1;
+
+ /**
+ * FEATURE_TYPE_VOICE_OVER_WIFI supports features defined in 3GPP and
+ * GSMA IR.92 over WiFi.
+ */
+ public static final int FEATURE_TYPE_VOICE_OVER_WIFI = 2;
+
+ /**
+ * FEATURE_TYPE_VIDEO_OVER_WIFI supports features defined in 3GPP and
+ * GSMA IR.94 over WiFi.
+ */
+ public static final int FEATURE_TYPE_VIDEO_OVER_WIFI = 3;
+
+ /**
+ * FEATURE_TYPE_UT supports features defined in 3GPP and
+ * GSMA IR.92 over LTE.
+ */
+ public static final int FEATURE_TYPE_UT_OVER_LTE = 4;
+
+ /**
+ * FEATURE_TYPE_UT_OVER_WIFI supports features defined in 3GPP and
+ * GSMA IR.92 over WiFi.
+ */
+ public static final int FEATURE_TYPE_UT_OVER_WIFI = 5;
+ }
+
+ /**
+ * Defines IMS service/capability parameters.
+ */
+ public static class ConfigConstants {
+
+ // Define IMS config items
+ public static final int CONFIG_START = 0;
+
+ // Define operator provisioned config items
+ public static final int PROVISIONED_CONFIG_START = CONFIG_START;
+
+ /**
+ * AMR CODEC Mode Value set, 0-7 in comma separated sequence.
+ * Value is in String format.
+ */
+ public static final int VOCODER_AMRMODESET = CONFIG_START;
+
+ /**
+ * Wide Band AMR CODEC Mode Value set,0-7 in comma separated sequence.
+ * Value is in String format.
+ */
+ public static final int VOCODER_AMRWBMODESET = 1;
+
+ /**
+ * SIP Session Timer value (seconds).
+ * Value is in Integer format.
+ */
+ public static final int SIP_SESSION_TIMER = 2;
+
+ /**
+ * Minimum SIP Session Expiration Timer in (seconds).
+ * Value is in Integer format.
+ */
+ public static final int MIN_SE = 3;
+
+ /**
+ * SIP_INVITE cancellation time out value (in milliseconds). Integer format.
+ * Value is in Integer format.
+ */
+ public static final int CANCELLATION_TIMER = 4;
+
+ /**
+ * Delay time when an iRAT transition from eHRPD/HRPD/1xRTT to LTE.
+ * Value is in Integer format.
+ */
+ public static final int TDELAY = 5;
+
+ /**
+ * Silent redial status of Enabled (True), or Disabled (False).
+ * Value is in Integer format.
+ */
+ public static final int SILENT_REDIAL_ENABLE = 6;
+
+ /**
+ * SIP T1 timer value in milliseconds. See RFC 3261 for define.
+ * Value is in Integer format.
+ */
+ public static final int SIP_T1_TIMER = 7;
+
+ /**
+ * SIP T2 timer value in milliseconds. See RFC 3261 for define.
+ * Value is in Integer format.
+ */
+ public static final int SIP_T2_TIMER = 8;
+
+ /**
+ * SIP TF timer value in milliseconds. See RFC 3261 for define.
+ * Value is in Integer format.
+ */
+ public static final int SIP_TF_TIMER = 9;
+
+ /**
+ * VoLTE status for VLT/s status of Enabled (1), or Disabled (0).
+ * Value is in Integer format.
+ */
+ public static final int VLT_SETTING_ENABLED = 10;
+
+ /**
+ * VoLTE status for LVC/s status of Enabled (1), or Disabled (0).
+ * Value is in Integer format.
+ */
+ public static final int LVC_SETTING_ENABLED = 11;
+ /**
+ * Domain Name for the device to populate the request URI for REGISTRATION.
+ * Value is in String format.
+ */
+ public static final int DOMAIN_NAME = 12;
+ /**
+ * Device Outgoing SMS based on either 3GPP or 3GPP2 standards.
+ * Value is in Integer format. 3GPP2(0), 3GPP(1)
+ */
+ public static final int SMS_FORMAT = 13;
+ /**
+ * Turns IMS ON/OFF on the device.
+ * Value is in Integer format. ON (1), OFF(0).
+ */
+ public static final int SMS_OVER_IP = 14;
+ /**
+ * Requested expiration for Published Online availability.
+ * Value is in Integer format.
+ */
+ public static final int PUBLISH_TIMER = 15;
+ /**
+ * Requested expiration for Published Offline availability.
+ * Value is in Integer format.
+ */
+ public static final int PUBLISH_TIMER_EXTENDED = 16;
+ /**
+ *
+ * Value is in Integer format.
+ */
+ public static final int CAPABILITY_DISCOVERY_ENABLED = 17;
+ /**
+ * Period of time the capability information of the contact is cached on handset.
+ * Value is in Integer format.
+ */
+ public static final int CAPABILITIES_CACHE_EXPIRATION = 18;
+ /**
+ * Peiod of time the availability information of a contact is cached on device.
+ * Value is in Integer format.
+ */
+ public static final int AVAILABILITY_CACHE_EXPIRATION = 19;
+ /**
+ * Interval between successive capabilities polling.
+ * Value is in Integer format.
+ */
+ public static final int CAPABILITIES_POLL_INTERVAL = 20;
+ /**
+ * Minimum time between two published messages from the device.
+ * Value is in Integer format.
+ */
+ public static final int SOURCE_THROTTLE_PUBLISH = 21;
+ /**
+ * The Maximum number of MDNs contained in one Request Contained List.
+ * Value is in Integer format.
+ */
+ public static final int MAX_NUMENTRIES_IN_RCL = 22;
+ /**
+ * Expiration timer for subscription of a Request Contained List, used in capability
+ * polling.
+ * Value is in Integer format.
+ */
+ public static final int CAPAB_POLL_LIST_SUB_EXP = 23;
+ /**
+ * Applies compression to LIST Subscription.
+ * Value is in Integer format. Enable (1), Disable(0).
+ */
+ public static final int GZIP_FLAG = 24;
+ /**
+ * VOLTE Status for EAB/s status of Enabled (1), or Disabled (0).
+ * Value is in Integer format.
+ */
+ public static final int EAB_SETTING_ENABLED = 25;
+ /**
+ * Wi-Fi calling roaming status.
+ * Value is in Integer format. ON (1), OFF(0).
+ */
+ public static final int VOICE_OVER_WIFI_ROAMING = 26;
+ /**
+ * Wi-Fi calling modem - WfcModeFeatureValueConstants.
+ * Value is in Integer format.
+ */
+ public static final int VOICE_OVER_WIFI_MODE = 27;
+ /**
+ * VOLTE Status for voice over wifi status of Enabled (1), or Disabled (0).
+ * Value is in Integer format.
+ */
+ public static final int VOICE_OVER_WIFI_SETTING_ENABLED = 28;
+ /**
+ * Mobile data enabled.
+ * Value is in Integer format. On (1), OFF(0).
+ */
+ public static final int MOBILE_DATA_ENABLED = 29;
+ /**
+ * VoLTE user opted in status.
+ * Value is in Integer format. Opted-in (1) Opted-out (0).
+ */
+ public static final int VOLTE_USER_OPT_IN_STATUS = 30;
+ /**
+ * Proxy for Call Session Control Function(P-CSCF) address for Local-BreakOut(LBO).
+ * Value is in String format.
+ */
+ public static final int LBO_PCSCF_ADDRESS = 31;
+ /**
+ * Keep Alive Enabled for SIP.
+ * Value is in Integer format. On(1), OFF(0).
+ */
+ public static final int KEEP_ALIVE_ENABLED = 32;
+ /**
+ * Registration retry Base Time value in seconds.
+ * Value is in Integer format.
+ */
+ public static final int REGISTRATION_RETRY_BASE_TIME_SEC = 33;
+ /**
+ * Registration retry Max Time value in seconds.
+ * Value is in Integer format.
+ */
+ public static final int REGISTRATION_RETRY_MAX_TIME_SEC = 34;
+ /**
+ * Smallest RTP port for speech codec.
+ * Value is in integer format.
+ */
+ public static final int SPEECH_START_PORT = 35;
+ /**
+ * Largest RTP port for speech code.
+ * Value is in Integer format.
+ */
+ public static final int SPEECH_END_PORT = 36;
+ /**
+ * SIP Timer A's value in milliseconds. Timer A is the INVITE request
+ * retransmit interval, for UDP only.
+ * Value is in Integer format.
+ */
+ public static final int SIP_INVITE_REQ_RETX_INTERVAL_MSEC = 37;
+ /**
+ * SIP Timer B's value in milliseconds. Timer B is the wait time for
+ * INVITE message to be acknowledged.
+ * Value is in Integer format.
+ */
+ public static final int SIP_INVITE_RSP_WAIT_TIME_MSEC = 38;
+ /**
+ * SIP Timer D's value in milliseconds. Timer D is the wait time for
+ * response retransmits of the invite client transactions.
+ * Value is in Integer format.
+ */
+ public static final int SIP_INVITE_RSP_RETX_WAIT_TIME_MSEC = 39;
+ /**
+ * SIP Timer E's value in milliseconds. Timer E is the value Non-INVITE
+ * request retransmit interval, for UDP only.
+ * Value is in Integer format.
+ */
+ public static final int SIP_NON_INVITE_REQ_RETX_INTERVAL_MSEC = 40;
+ /**
+ * SIP Timer F's value in milliseconds. Timer F is the Non-INVITE transaction
+ * timeout timer.
+ * Value is in Integer format.
+ */
+ public static final int SIP_NON_INVITE_TXN_TIMEOUT_TIMER_MSEC = 41;
+ /**
+ * SIP Timer G's value in milliseconds. Timer G is the value of INVITE response
+ * retransmit interval.
+ * Value is in Integer format.
+ */
+ public static final int SIP_INVITE_RSP_RETX_INTERVAL_MSEC = 42;
+ /**
+ * SIP Timer H's value in milliseconds. Timer H is the value of wait time for
+ * ACK receipt.
+ * Value is in Integer format.
+ */
+ public static final int SIP_ACK_RECEIPT_WAIT_TIME_MSEC = 43;
+ /**
+ * SIP Timer I's value in milliseconds. Timer I is the value of wait time for
+ * ACK retransmits.
+ * Value is in Integer format.
+ */
+ public static final int SIP_ACK_RETX_WAIT_TIME_MSEC = 44;
+ /**
+ * SIP Timer J's value in milliseconds. Timer J is the value of wait time for
+ * non-invite request retransmission.
+ * Value is in Integer format.
+ */
+ public static final int SIP_NON_INVITE_REQ_RETX_WAIT_TIME_MSEC = 45;
+ /**
+ * SIP Timer K's value in milliseconds. Timer K is the value of wait time for
+ * non-invite response retransmits.
+ * Value is in Integer format.
+ */
+ public static final int SIP_NON_INVITE_RSP_RETX_WAIT_TIME_MSEC = 46;
+ /**
+ * AMR WB octet aligned dynamic payload type.
+ * Value is in Integer format.
+ */
+ public static final int AMR_WB_OCTET_ALIGNED_PT = 47;
+ /**
+ * AMR WB bandwidth efficient payload type.
+ * Value is in Integer format.
+ */
+ public static final int AMR_WB_BANDWIDTH_EFFICIENT_PT = 48;
+ /**
+ * AMR octet aligned dynamic payload type.
+ * Value is in Integer format.
+ */
+ public static final int AMR_OCTET_ALIGNED_PT = 49;
+ /**
+ * AMR bandwidth efficient payload type.
+ * Value is in Integer format.
+ */
+ public static final int AMR_BANDWIDTH_EFFICIENT_PT = 50;
+ /**
+ * DTMF WB payload type.
+ * Value is in Integer format.
+ */
+ public static final int DTMF_WB_PT = 51;
+ /**
+ * DTMF NB payload type.
+ * Value is in Integer format.
+ */
+ public static final int DTMF_NB_PT = 52;
+ /**
+ * AMR Default encoding mode.
+ * Value is in Integer format.
+ */
+ public static final int AMR_DEFAULT_MODE = 53;
+ /**
+ * SMS Public Service Identity.
+ * Value is in String format.
+ */
+ public static final int SMS_PSI = 54;
+ /**
+ * Video Quality - VideoQualityFeatureValuesConstants.
+ * Value is in Integer format.
+ */
+ public static final int VIDEO_QUALITY = 55;
+ /**
+ * LTE threshold.
+ * Handover from LTE to WiFi if LTE < THLTE1 and WiFi >= VOWT_A.
+ */
+ public static final int TH_LTE1 = 56;
+ /**
+ * LTE threshold.
+ * Handover from WiFi to LTE if LTE >= THLTE3 or (WiFi < VOWT_B and LTE >= THLTE2).
+ */
+ public static final int TH_LTE2 = 57;
+ /**
+ * LTE threshold.
+ * Handover from WiFi to LTE if LTE >= THLTE3 or (WiFi < VOWT_B and LTE >= THLTE2).
+ */
+ public static final int TH_LTE3 = 58;
+ /**
+ * 1x threshold.
+ * Handover from 1x to WiFi if 1x < TH1x
+ */
+ public static final int TH_1x = 59;
+ /**
+ * WiFi threshold.
+ * Handover from LTE to WiFi if LTE < THLTE1 and WiFi >= VOWT_A.
+ */
+ public static final int VOWT_A = 60;
+ /**
+ * WiFi threshold.
+ * Handover from WiFi to LTE if LTE >= THLTE3 or (WiFi < VOWT_B and LTE >= THLTE2).
+ */
+ public static final int VOWT_B = 61;
+ /**
+ * LTE ePDG timer.
+ * Device shall not handover back to LTE until the T_ePDG_LTE timer expires.
+ */
+ public static final int T_EPDG_LTE = 62;
+ /**
+ * WiFi ePDG timer.
+ * Device shall not handover back to WiFi until the T_ePDG_WiFi timer expires.
+ */
+ public static final int T_EPDG_WIFI = 63;
+ /**
+ * 1x ePDG timer.
+ * Device shall not re-register on 1x until the T_ePDG_1x timer expires.
+ */
+ public static final int T_EPDG_1X = 64;
+ /**
+ * MultiEndpoint status: Enabled (1), or Disabled (0).
+ * Value is in Integer format.
+ */
+ public static final int VICE_SETTING_ENABLED = 65;
+
+ // Expand the operator config items as needed here, need to change
+ // PROVISIONED_CONFIG_END after that.
+ public static final int PROVISIONED_CONFIG_END = VICE_SETTING_ENABLED;
+
+ // Expand the operator config items as needed here.
+ }
+
+ /**
+ * Defines IMS set operation status.
+ */
+ public static class OperationStatusConstants {
+ public static final int UNKNOWN = -1;
+ public static final int SUCCESS = 0;
+ public static final int FAILED = 1;
+ public static final int UNSUPPORTED_CAUSE_NONE = 2;
+ public static final int UNSUPPORTED_CAUSE_RAT = 3;
+ public static final int UNSUPPORTED_CAUSE_DISABLED = 4;
+ }
+
+ /**
+ * Defines IMS get operation values.
+ */
+ public static class OperationValuesConstants {
+ /**
+ * Values related to Video Quality
+ */
+ public static final int VIDEO_QUALITY_UNKNOWN = -1;
+ public static final int VIDEO_QUALITY_LOW = 0;
+ public static final int VIDEO_QUALITY_HIGH = 1;
+ }
+
+ /**
+ * Defines IMS video quality feature value.
+ */
+ public static class VideoQualityFeatureValuesConstants {
+ public static final int LOW = 0;
+ public static final int HIGH = 1;
+ }
+
+ /**
+ * Defines IMS feature value.
+ */
+ public static class FeatureValueConstants {
+ public static final int OFF = 0;
+ public static final int ON = 1;
+ }
+
+ /**
+ * Defines IMS feature value.
+ */
+ public static class WfcModeFeatureValueConstants {
+ public static final int WIFI_ONLY = 0;
+ public static final int CELLULAR_PREFERRED = 1;
+ public static final int WIFI_PREFERRED = 2;
+ }
+
+ public ImsConfig(IImsConfig iconfig, Context context) {
+ if (DBG) Rlog.d(TAG, "ImsConfig creates");
+ miConfig = iconfig;
+ mContext = context;
+ }
+
+ /**
+ * Gets the provisioned value for IMS service/capabilities parameters used by IMS stack.
+ * This function should not be called from the mainthread as it could block the
+ * mainthread.
+ *
+ * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
+ * @return the value in Integer format.
+ *
+ * @throws ImsException if calling the IMS service results in an error.
+ */
+ public int getProvisionedValue(int item) throws ImsException {
+ int ret = 0;
+ try {
+ ret = miConfig.getProvisionedValue(item);
+ } catch (RemoteException e) {
+ throw new ImsException("getValue()", e,
+ ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
+ }
+ if (DBG) Rlog.d(TAG, "getProvisionedValue(): item = " + item + ", ret =" + ret);
+
+ return ret;
+ }
+
+ /**
+ * Gets the provisioned value for IMS service/capabilities parameters used by IMS stack.
+ * This function should not be called from the mainthread as it could block the
+ * mainthread.
+ *
+ * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
+ * @return value in String format.
+ *
+ * @throws ImsException if calling the IMS service results in an error.
+ */
+ public String getProvisionedStringValue(int item) throws ImsException {
+ String ret = "Unknown";
+ try {
+ ret = miConfig.getProvisionedStringValue(item);
+ } catch (RemoteException e) {
+ throw new ImsException("getProvisionedStringValue()", e,
+ ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
+ }
+ if (DBG) Rlog.d(TAG, "getProvisionedStringValue(): item = " + item + ", ret =" + ret);
+
+ return ret;
+ }
+
+ /**
+ * Sets the value for IMS service/capabilities parameters by
+ * the operator device management entity.
+ * This function should not be called from main thread as it could block
+ * mainthread.
+ *
+ * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
+ * @param value in Integer format.
+ * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants
+ *
+ * @throws ImsException if calling the IMS service results in an error.
+ */
+ public int setProvisionedValue(int item, int value)
+ throws ImsException {
+ int ret = OperationStatusConstants.UNKNOWN;
+ if (DBG) {
+ Rlog.d(TAG, "setProvisionedValue(): item = " + item +
+ "value = " + value);
+ }
+ try {
+ ret = miConfig.setProvisionedValue(item, value);
+ } catch (RemoteException e) {
+ throw new ImsException("setProvisionedValue()", e,
+ ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
+ }
+ if (DBG) {
+ Rlog.d(TAG, "setProvisionedValue(): item = " + item +
+ " value = " + value + " ret = " + ret);
+ }
+ return ret;
+ }
+
+ /**
+ * Sets the value for IMS service/capabilities parameters by
+ * the operator device management entity.
+ * This function should not be called from main thread as it could block
+ * mainthread.
+ *
+ * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
+ * @param value in String format.
+ * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants
+ *
+ * @throws ImsException if calling the IMS service results in an error.
+ */
+ public int setProvisionedStringValue(int item, String value)
+ throws ImsException {
+ int ret = OperationStatusConstants.UNKNOWN;
+ try {
+ ret = miConfig.setProvisionedStringValue(item, value);
+ } catch (RemoteException e) {
+ throw new ImsException("setProvisionedStringValue()", e,
+ ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
+ }
+ if (DBG) {
+ Rlog.d(TAG, "setProvisionedStringValue(): item = " + item +
+ ", value =" + value);
+ }
+ return ret;
+ }
+
+ /**
+ * Gets the value for IMS feature item for specified network type.
+ *
+ * @param feature, defined as in FeatureConstants.
+ * @param network, defined as in android.telephony.TelephonyManager#NETWORK_TYPE_XXX.
+ * @param listener, provided to be notified for the feature on/off status.
+ * @return void
+ *
+ * @throws ImsException if calling the IMS service results in an error.
+ */
+ public void getFeatureValue(int feature, int network,
+ ImsConfigListener listener) throws ImsException {
+ if (DBG) {
+ Rlog.d(TAG, "getFeatureValue: feature = " + feature + ", network =" + network +
+ ", listener =" + listener);
+ }
+ try {
+ miConfig.getFeatureValue(feature, network, listener);
+ } catch (RemoteException e) {
+ throw new ImsException("getFeatureValue()", e,
+ ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
+ }
+ }
+
+ /**
+ * Sets the value for IMS feature item for specified network type.
+ *
+ * @param feature, as defined in FeatureConstants.
+ * @param network, as defined in android.telephony.TelephonyManager#NETWORK_TYPE_XXX.
+ * @param value, as defined in FeatureValueConstants.
+ * @param listener, provided if caller needs to be notified for set result.
+ * @return void
+ *
+ * @throws ImsException if calling the IMS service results in an error.
+ */
+ public void setFeatureValue(int feature, int network, int value,
+ ImsConfigListener listener) throws ImsException {
+ if (DBG) {
+ Rlog.d(TAG, "setFeatureValue: feature = " + feature + ", network =" + network +
+ ", value =" + value + ", listener =" + listener);
+ }
+ try {
+ miConfig.setFeatureValue(feature, network, value, listener);
+ } catch (RemoteException e) {
+ throw new ImsException("setFeatureValue()", e,
+ ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
+ }
+ }
+}
diff --git a/telephony/java/com/android/ims/ImsException.java b/telephony/java/com/android/ims/ImsException.java
new file mode 100644
index 0000000..74b20f4
--- /dev/null
+++ b/telephony/java/com/android/ims/ImsException.java
@@ -0,0 +1,52 @@
+/*
+ * 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 com.android.ims;
+
+/**
+ * This class defines a general IMS-related exception.
+ *
+ * @hide
+ */
+public class ImsException extends Exception {
+
+ /**
+ * Refer to CODE_LOCAL_* in {@link ImsReasonInfo}
+ */
+ private int mCode;
+
+ public ImsException() {
+ }
+
+ public ImsException(String message, int code) {
+ super(message + ", code = " + code);
+ mCode = code;
+ }
+
+ public ImsException(String message, Throwable cause, int code) {
+ super(message, cause);
+ mCode = code;
+ }
+
+ /**
+ * Gets the detailed exception code when ImsException is throwed
+ *
+ * @return the exception code in {@link ImsReasonInfo}
+ */
+ public int getCode() {
+ return mCode;
+ }
+}
diff --git a/telephony/java/com/android/ims/ImsReasonInfo.java b/telephony/java/com/android/ims/ImsReasonInfo.java
index c71808c..e4f380f 100644
--- a/telephony/java/com/android/ims/ImsReasonInfo.java
+++ b/telephony/java/com/android/ims/ImsReasonInfo.java
@@ -313,6 +313,12 @@
public static final int CODE_WIFI_LOST = 1407;
/**
+ * Indicates the registration attempt on IWLAN failed due to IKEv2 authetication failure
+ * during tunnel establishment.
+ */
+ public static final int CODE_IKEV2_AUTH_FAILURE = 1408;
+
+ /**
* Network string error messages.
* mExtraMessage may have these values.
*/
diff --git a/telephony/java/com/android/ims/ImsUtInterface.java b/telephony/java/com/android/ims/ImsUtInterface.java
new file mode 100644
index 0000000..5984e78
--- /dev/null
+++ b/telephony/java/com/android/ims/ImsUtInterface.java
@@ -0,0 +1,179 @@
+/*
+ * 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 com.android.ims;
+
+import android.os.Message;
+
+/**
+ * Provides APIs for the supplementary service settings using IMS (Ut interface).
+ * It is created from 3GPP TS 24.623 (XCAP(XML Configuration Access Protocol)
+ * over the Ut interface for manipulating supplementary services).
+ *
+ * @hide
+ */
+public interface ImsUtInterface {
+ /**
+ * Actions
+ * @hide
+ */
+ public static final int ACTION_DEACTIVATION = 0;
+ public static final int ACTION_ACTIVATION = 1;
+ public static final int ACTION_REGISTRATION = 3;
+ public static final int ACTION_ERASURE = 4;
+ public static final int ACTION_INTERROGATION = 5;
+
+ /**
+ * OIR (Originating Identification Restriction, 3GPP TS 24.607)
+ * OIP (Originating Identification Presentation, 3GPP TS 24.607)
+ * TIR (Terminating Identification Restriction, 3GPP TS 24.608)
+ * TIP (Terminating Identification Presentation, 3GPP TS 24.608)
+ */
+ public static final int OIR_DEFAULT = 0; // "user subscription default value"
+ public static final int OIR_PRESENTATION_RESTRICTED = 1;
+ public static final int OIR_PRESENTATION_NOT_RESTRICTED = 2;
+
+ /**
+ * CW (Communication Waiting, 3GPP TS 24.615)
+ */
+
+ /**
+ * CDIV (Communication Diversion, 3GPP TS 24.604)
+ * actions: target, no reply timer
+ */
+ public static final int CDIV_CF_UNCONDITIONAL = 0;
+ public static final int CDIV_CF_BUSY = 1;
+ public static final int CDIV_CF_NO_REPLY = 2;
+ public static final int CDIV_CF_NOT_REACHABLE = 3;
+ // For CS service code: 002
+ public static final int CDIV_CF_ALL = 4;
+ // For CS service code: 004
+ public static final int CDIV_CF_ALL_CONDITIONAL = 5;
+ // It's only supported in the IMS service (CS does not define it).
+ // IR.92 recommends that an UE activates both the CFNRc and the CFNL
+ // (CDIV using condition not-registered) to the same target.
+ public static final int CDIV_CF_NOT_LOGGED_IN = 6;
+
+ /**
+ * CB (Communication Barring, 3GPP TS 24.611)
+ */
+ // Barring of All Incoming Calls
+ public static final int CB_BAIC = 1;
+ // Barring of All Outgoing Calls
+ public static final int CB_BAOC = 2;
+ // Barring of Outgoing International Calls
+ public static final int CB_BOIC = 3;
+ // Barring of Outgoing International Calls - excluding Home Country
+ public static final int CB_BOIC_EXHC = 4;
+ // Barring of Incoming Calls - when roaming
+ public static final int CB_BIC_WR = 5;
+ // Barring of Anonymous Communication Rejection (ACR) - a particular case of ICB service
+ public static final int CB_BIC_ACR = 6;
+ // Barring of All Calls
+ public static final int CB_BA_ALL = 7;
+ // Barring of Outgoing Services (Service Code 333 - 3GPP TS 22.030 Table B-1)
+ public static final int CB_BA_MO = 8;
+ // Barring of Incoming Services (Service Code 353 - 3GPP TS 22.030 Table B-1)
+ public static final int CB_BA_MT = 9;
+ // Barring of Specific Incoming calls
+ public static final int CB_BS_MT = 10;
+
+ /**
+ * Invalid result value.
+ */
+ public static final int INVALID = (-1);
+
+
+
+ /**
+ * Operations for the supplementary service configuration
+ */
+
+ /**
+ * Retrieves the configuration of the call barring.
+ * The return value of ((AsyncResult)result.obj) is an array of {@link ImsSsInfo}.
+ */
+ public void queryCallBarring(int cbType, Message result);
+
+ /**
+ * Retrieves the configuration of the call forward.
+ * The return value of ((AsyncResult)result.obj) is an array of {@link ImsCallForwardInfo}.
+ */
+ public void queryCallForward(int condition, String number, Message result);
+
+ /**
+ * Retrieves the configuration of the call waiting.
+ * The return value of ((AsyncResult)result.obj) is an array of {@link ImsSsInfo}.
+ */
+ public void queryCallWaiting(Message result);
+
+ /**
+ * Retrieves the default CLIR setting.
+ */
+ public void queryCLIR(Message result);
+
+ /**
+ * Retrieves the CLIP call setting.
+ */
+ public void queryCLIP(Message result);
+
+ /**
+ * Retrieves the COLR call setting.
+ */
+ public void queryCOLR(Message result);
+
+ /**
+ * Retrieves the COLP call setting.
+ */
+ public void queryCOLP(Message result);
+
+ /**
+ * Modifies the configuration of the call barring.
+ */
+ public void updateCallBarring(int cbType, int action,
+ Message result, String[] barrList);
+
+ /**
+ * Modifies the configuration of the call forward.
+ */
+ public void updateCallForward(int action, int condition, String number,
+ int serviceClass, int timeSeconds, Message result);
+
+ /**
+ * Modifies the configuration of the call waiting.
+ */
+ public void updateCallWaiting(boolean enable, int serviceClass, Message result);
+
+ /**
+ * Updates the configuration of the CLIR supplementary service.
+ */
+ public void updateCLIR(int clirMode, Message result);
+
+ /**
+ * Updates the configuration of the CLIP supplementary service.
+ */
+ public void updateCLIP(boolean enable, Message result);
+
+ /**
+ * Updates the configuration of the COLR supplementary service.
+ */
+ public void updateCOLR(int presentation, Message result);
+
+ /**
+ * Updates the configuration of the COLP supplementary service.
+ */
+ public void updateCOLP(boolean enable, Message result);
+}
diff --git a/core/java/android/net/NetworkScorerAppManager.aidl b/telephony/java/com/android/ims/internal/IImsFeatureStatusCallback.aidl
similarity index 60%
copy from core/java/android/net/NetworkScorerAppManager.aidl
copy to telephony/java/com/android/ims/internal/IImsFeatureStatusCallback.aidl
index d968343..41b1042 100644
--- a/core/java/android/net/NetworkScorerAppManager.aidl
+++ b/telephony/java/com/android/ims/internal/IImsFeatureStatusCallback.aidl
@@ -1,11 +1,11 @@
-/**
- * Copyright (c) 2017, The Android Open Source Project
+/*
+ * Copyright (c) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* 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,
@@ -14,6 +14,12 @@
* limitations under the License.
*/
-package android.net;
+package com.android.ims.internal;
-parcelable NetworkScorerAppManager.NetworkScorerAppData;
+/**
+* Interface from ImsFeature in the ImsService to ImsServiceController.
+ * {@hide}
+ */
+oneway interface IImsFeatureStatusCallback {
+ void notifyImsFeatureStatus(int featureStatus);
+}
\ No newline at end of file
diff --git a/telephony/java/com/android/ims/internal/IImsServiceController.aidl b/telephony/java/com/android/ims/internal/IImsServiceController.aidl
index fa86a43..712816f 100644
--- a/telephony/java/com/android/ims/internal/IImsServiceController.aidl
+++ b/telephony/java/com/android/ims/internal/IImsServiceController.aidl
@@ -16,10 +16,49 @@
package com.android.ims.internal;
+import android.app.PendingIntent;
+
+import com.android.ims.ImsCallProfile;
+import com.android.ims.internal.IImsCallSession;
+import com.android.ims.internal.IImsCallSessionListener;
+import com.android.ims.internal.IImsConfig;
+import com.android.ims.internal.IImsEcbm;
+import com.android.ims.internal.IImsFeatureStatusCallback;
+import com.android.ims.internal.IImsMultiEndpoint;
+import com.android.ims.internal.IImsRegistrationListener;
+import com.android.ims.internal.IImsUt;
+
+import android.os.Message;
+
/**
+ * See ImsService and IMMTelFeature for more information.
* {@hide}
*/
interface IImsServiceController {
- void createImsFeature(int slotId, int feature);
+ // ImsService Control
+ void createImsFeature(int slotId, int feature, IImsFeatureStatusCallback c);
void removeImsFeature(int slotId, int feature);
+ // MMTel Feature
+ int startSession(int slotId, int featureType, in PendingIntent incomingCallIntent,
+ in IImsRegistrationListener listener);
+ void endSession(int slotId, int featureType, int sessionId);
+ boolean isConnected(int slotId, int featureType, int callSessionType, int callType);
+ boolean isOpened(int slotId, int featureType);
+ int getFeatureStatus(int slotId, int featureType);
+ void addRegistrationListener(int slotId, int featureType, in IImsRegistrationListener listener);
+ void removeRegistrationListener(int slotId, int featureType,
+ in IImsRegistrationListener listener);
+ ImsCallProfile createCallProfile(int slotId, int featureType, int sessionId,
+ int callSessionType, int callType);
+ IImsCallSession createCallSession(int slotId, int featureType, int sessionId,
+ in ImsCallProfile profile, IImsCallSessionListener listener);
+ IImsCallSession getPendingCallSession(int slotId, int featureType, int sessionId,
+ String callId);
+ IImsUt getUtInterface(int slotId, int featureType);
+ IImsConfig getConfigInterface(int slotId, int featureType);
+ void turnOnIms(int slotId, int featureType);
+ void turnOffIms(int slotId, int featureType);
+ IImsEcbm getEcbmInterface(int slotId, int featureType);
+ void setUiTTYMode(int slotId, int featureType, int uiTtyMode, in Message onComplete);
+ IImsMultiEndpoint getMultiEndpointInterface(int slotId, int featureType);
}
diff --git a/telephony/java/com/android/ims/internal/IImsServiceFeatureListener.aidl b/telephony/java/com/android/ims/internal/IImsServiceFeatureListener.aidl
index 0a36b6b..df10700 100644
--- a/telephony/java/com/android/ims/internal/IImsServiceFeatureListener.aidl
+++ b/telephony/java/com/android/ims/internal/IImsServiceFeatureListener.aidl
@@ -17,9 +17,12 @@
package com.android.ims.internal;
/**
+ * Interface from ImsResolver to ImsServiceProxy in ImsManager.
+ * Callback to ImsManager when a feature changes in the ImsServiceController.
* {@hide}
*/
oneway interface IImsServiceFeatureListener {
void imsFeatureCreated(int slotId, int feature);
void imsFeatureRemoved(int slotId, int feature);
+ void imsStatusChanged(int slotId, int feature, int status);
}
\ No newline at end of file
diff --git a/telephony/java/com/android/ims/internal/ImsCallSession.java b/telephony/java/com/android/ims/internal/ImsCallSession.java
new file mode 100644
index 0000000..8196b23
--- /dev/null
+++ b/telephony/java/com/android/ims/internal/ImsCallSession.java
@@ -0,0 +1,1290 @@
+/*
+ * 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 com.android.ims.internal;
+
+import android.os.Message;
+import android.os.RemoteException;
+
+import java.util.Objects;
+
+import android.telephony.ims.stub.ImsCallSessionListenerImplBase;
+import android.util.Log;
+import com.android.ims.ImsCallProfile;
+import com.android.ims.ImsConferenceState;
+import com.android.ims.ImsReasonInfo;
+import com.android.ims.ImsStreamMediaProfile;
+import com.android.ims.ImsSuppServiceNotification;
+
+/**
+ * Provides the call initiation/termination, and media exchange between two IMS endpoints.
+ * It directly communicates with IMS service which implements the IMS protocol behavior.
+ *
+ * @hide
+ */
+public class ImsCallSession {
+ private static final String TAG = "ImsCallSession";
+
+ /**
+ * Defines IMS call session state.
+ */
+ public static class State {
+ public static final int IDLE = 0;
+ public static final int INITIATED = 1;
+ public static final int NEGOTIATING = 2;
+ public static final int ESTABLISHING = 3;
+ public static final int ESTABLISHED = 4;
+
+ public static final int RENEGOTIATING = 5;
+ public static final int REESTABLISHING = 6;
+
+ public static final int TERMINATING = 7;
+ public static final int TERMINATED = 8;
+
+ public static final int INVALID = (-1);
+
+ /**
+ * Converts the state to string.
+ */
+ public static String toString(int state) {
+ switch (state) {
+ case IDLE:
+ return "IDLE";
+ case INITIATED:
+ return "INITIATED";
+ case NEGOTIATING:
+ return "NEGOTIATING";
+ case ESTABLISHING:
+ return "ESTABLISHING";
+ case ESTABLISHED:
+ return "ESTABLISHED";
+ case RENEGOTIATING:
+ return "RENEGOTIATING";
+ case REESTABLISHING:
+ return "REESTABLISHING";
+ case TERMINATING:
+ return "TERMINATING";
+ case TERMINATED:
+ return "TERMINATED";
+ default:
+ return "UNKNOWN";
+ }
+ }
+
+ private State() {
+ }
+ }
+
+ /**
+ * Listener for events relating to an IMS session, such as when a session is being
+ * recieved ("on ringing") or a call is outgoing ("on calling").
+ * <p>Many of these events are also received by {@link ImsCall.Listener}.</p>
+ */
+ public static class Listener {
+ /**
+ * Called when a request is sent out to initiate a new session
+ * and 1xx response is received from the network.
+ *
+ * @param session the session object that carries out the IMS session
+ */
+ public void callSessionProgressing(ImsCallSession session,
+ ImsStreamMediaProfile profile) {
+ // no-op
+ }
+
+ /**
+ * Called when the session is established.
+ *
+ * @param session the session object that carries out the IMS session
+ */
+ public void callSessionStarted(ImsCallSession session,
+ ImsCallProfile profile) {
+ // no-op
+ }
+
+ /**
+ * Called when the session establishment is failed.
+ *
+ * @param session the session object that carries out the IMS session
+ * @param reasonInfo detailed reason of the session establishment failure
+ */
+ public void callSessionStartFailed(ImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ }
+
+ /**
+ * Called when the session is terminated.
+ *
+ * @param session the session object that carries out the IMS session
+ * @param reasonInfo detailed reason of the session termination
+ */
+ public void callSessionTerminated(ImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ }
+
+ /**
+ * Called when the session is in hold.
+ *
+ * @param session the session object that carries out the IMS session
+ */
+ public void callSessionHeld(ImsCallSession session,
+ ImsCallProfile profile) {
+ }
+
+ /**
+ * Called when the session hold is failed.
+ *
+ * @param session the session object that carries out the IMS session
+ * @param reasonInfo detailed reason of the session hold failure
+ */
+ public void callSessionHoldFailed(ImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ }
+
+ /**
+ * Called when the session hold is received from the remote user.
+ *
+ * @param session the session object that carries out the IMS session
+ */
+ public void callSessionHoldReceived(ImsCallSession session,
+ ImsCallProfile profile) {
+ }
+
+ /**
+ * Called when the session resume is done.
+ *
+ * @param session the session object that carries out the IMS session
+ */
+ public void callSessionResumed(ImsCallSession session,
+ ImsCallProfile profile) {
+ }
+
+ /**
+ * Called when the session resume is failed.
+ *
+ * @param session the session object that carries out the IMS session
+ * @param reasonInfo detailed reason of the session resume failure
+ */
+ public void callSessionResumeFailed(ImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ }
+
+ /**
+ * Called when the session resume is received from the remote user.
+ *
+ * @param session the session object that carries out the IMS session
+ */
+ public void callSessionResumeReceived(ImsCallSession session,
+ ImsCallProfile profile) {
+ }
+
+ /**
+ * Called when the session merge has been started. At this point, the {@code newSession}
+ * represents the session which has been initiated to the IMS conference server for the
+ * new merged conference.
+ *
+ * @param session the session object that carries out the IMS session
+ * @param newSession the session object that is merged with an active & hold session
+ */
+ public void callSessionMergeStarted(ImsCallSession session,
+ ImsCallSession newSession, ImsCallProfile profile) {
+ }
+
+ /**
+ * Called when the session merge is successful and the merged session is active.
+ *
+ * @param session the session object that carries out the IMS session
+ */
+ public void callSessionMergeComplete(ImsCallSession session) {
+ }
+
+ /**
+ * Called when the session merge has failed.
+ *
+ * @param session the session object that carries out the IMS session
+ * @param reasonInfo detailed reason of the call merge failure
+ */
+ public void callSessionMergeFailed(ImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ }
+
+ /**
+ * Called when the session is updated (except for hold/unhold).
+ *
+ * @param session the session object that carries out the IMS session
+ */
+ public void callSessionUpdated(ImsCallSession session,
+ ImsCallProfile profile) {
+ }
+
+ /**
+ * Called when the session update is failed.
+ *
+ * @param session the session object that carries out the IMS session
+ * @param reasonInfo detailed reason of the session update failure
+ */
+ public void callSessionUpdateFailed(ImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ }
+
+ /**
+ * Called when the session update is received from the remote user.
+ *
+ * @param session the session object that carries out the IMS session
+ */
+ public void callSessionUpdateReceived(ImsCallSession session,
+ ImsCallProfile profile) {
+ // no-op
+ }
+
+ /**
+ * Called when the session is extended to the conference session.
+ *
+ * @param session the session object that carries out the IMS session
+ * @param newSession the session object that is extended to the conference
+ * from the active session
+ */
+ public void callSessionConferenceExtended(ImsCallSession session,
+ ImsCallSession newSession, ImsCallProfile profile) {
+ }
+
+ /**
+ * Called when the conference extension is failed.
+ *
+ * @param session the session object that carries out the IMS session
+ * @param reasonInfo detailed reason of the conference extension failure
+ */
+ public void callSessionConferenceExtendFailed(ImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ }
+
+ /**
+ * Called when the conference extension is received from the remote user.
+ *
+ * @param session the session object that carries out the IMS session
+ */
+ public void callSessionConferenceExtendReceived(ImsCallSession session,
+ ImsCallSession newSession, ImsCallProfile profile) {
+ // no-op
+ }
+
+ /**
+ * Called when the invitation request of the participants is delivered to the conference
+ * server.
+ *
+ * @param session the session object that carries out the IMS session
+ */
+ public void callSessionInviteParticipantsRequestDelivered(ImsCallSession session) {
+ // no-op
+ }
+
+ /**
+ * Called when the invitation request of the participants is failed.
+ *
+ * @param session the session object that carries out the IMS session
+ * @param reasonInfo detailed reason of the conference invitation failure
+ */
+ public void callSessionInviteParticipantsRequestFailed(ImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ // no-op
+ }
+
+ /**
+ * Called when the removal request of the participants is delivered to the conference
+ * server.
+ *
+ * @param session the session object that carries out the IMS session
+ */
+ public void callSessionRemoveParticipantsRequestDelivered(ImsCallSession session) {
+ // no-op
+ }
+
+ /**
+ * Called when the removal request of the participants is failed.
+ *
+ * @param session the session object that carries out the IMS session
+ * @param reasonInfo detailed reason of the conference removal failure
+ */
+ public void callSessionRemoveParticipantsRequestFailed(ImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ // no-op
+ }
+
+ /**
+ * Called when the conference state is updated.
+ *
+ * @param session the session object that carries out the IMS session
+ */
+ public void callSessionConferenceStateUpdated(ImsCallSession session,
+ ImsConferenceState state) {
+ // no-op
+ }
+
+ /**
+ * Called when the USSD message is received from the network.
+ *
+ * @param mode mode of the USSD message (REQUEST / NOTIFY)
+ * @param ussdMessage USSD message
+ */
+ public void callSessionUssdMessageReceived(ImsCallSession session,
+ int mode, String ussdMessage) {
+ // no-op
+ }
+
+ /**
+ * Called when session access technology changes
+ *
+ * @param session IMS session object
+ * @param srcAccessTech original access technology
+ * @param targetAccessTech new access technology
+ * @param reasonInfo
+ */
+ public void callSessionHandover(ImsCallSession session,
+ int srcAccessTech, int targetAccessTech,
+ ImsReasonInfo reasonInfo) {
+ // no-op
+ }
+
+ /**
+ * Called when session access technology change fails
+ *
+ * @param session IMS session object
+ * @param srcAccessTech original access technology
+ * @param targetAccessTech new access technology
+ * @param reasonInfo handover failure reason
+ */
+ public void callSessionHandoverFailed(ImsCallSession session,
+ int srcAccessTech, int targetAccessTech,
+ ImsReasonInfo reasonInfo) {
+ // no-op
+ }
+
+ /**
+ * Called when TTY mode of remote party changed
+ *
+ * @param session IMS session object
+ * @param mode TTY mode of remote party
+ */
+ public void callSessionTtyModeReceived(ImsCallSession session,
+ int mode) {
+ // no-op
+ }
+
+ /**
+ * Notifies of a change to the multiparty state for this {@code ImsCallSession}.
+ *
+ * @param session The call session.
+ * @param isMultiParty {@code true} if the session became multiparty, {@code false}
+ * otherwise.
+ */
+ public void callSessionMultipartyStateChanged(ImsCallSession session,
+ boolean isMultiParty) {
+ // no-op
+ }
+
+ /**
+ * Called when the session supplementary service is received
+ *
+ * @param session the session object that carries out the IMS session
+ */
+ public void callSessionSuppServiceReceived(ImsCallSession session,
+ ImsSuppServiceNotification suppServiceInfo) {
+ }
+ }
+
+ private final IImsCallSession miSession;
+ private boolean mClosed = false;
+ private Listener mListener;
+
+ public ImsCallSession(IImsCallSession iSession) {
+ miSession = iSession;
+
+ if (iSession != null) {
+ try {
+ iSession.setListener(new IImsCallSessionListenerProxy());
+ } catch (RemoteException e) {
+ }
+ } else {
+ mClosed = true;
+ }
+ }
+
+ public ImsCallSession(IImsCallSession iSession, Listener listener) {
+ this(iSession);
+ setListener(listener);
+ }
+
+ /**
+ * Closes this object. This object is not usable after being closed.
+ */
+ public synchronized void close() {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.close();
+ mClosed = true;
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Gets the call ID of the session.
+ *
+ * @return the call ID
+ */
+ public String getCallId() {
+ if (mClosed) {
+ return null;
+ }
+
+ try {
+ return miSession.getCallId();
+ } catch (RemoteException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Gets the call profile that this session is associated with
+ *
+ * @return the call profile that this session is associated with
+ */
+ public ImsCallProfile getCallProfile() {
+ if (mClosed) {
+ return null;
+ }
+
+ try {
+ return miSession.getCallProfile();
+ } catch (RemoteException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Gets the local call profile that this session is associated with
+ *
+ * @return the local call profile that this session is associated with
+ */
+ public ImsCallProfile getLocalCallProfile() {
+ if (mClosed) {
+ return null;
+ }
+
+ try {
+ return miSession.getLocalCallProfile();
+ } catch (RemoteException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Gets the remote call profile that this session is associated with
+ *
+ * @return the remote call profile that this session is associated with
+ */
+ public ImsCallProfile getRemoteCallProfile() {
+ if (mClosed) {
+ return null;
+ }
+
+ try {
+ return miSession.getRemoteCallProfile();
+ } catch (RemoteException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Gets the video call provider for the session.
+ *
+ * @return The video call provider.
+ */
+ public IImsVideoCallProvider getVideoCallProvider() {
+ if (mClosed) {
+ return null;
+ }
+
+ try {
+ return miSession.getVideoCallProvider();
+ } catch (RemoteException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Gets the value associated with the specified property of this session.
+ *
+ * @return the string value associated with the specified property
+ */
+ public String getProperty(String name) {
+ if (mClosed) {
+ return null;
+ }
+
+ try {
+ return miSession.getProperty(name);
+ } catch (RemoteException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Gets the session state.
+ * The value returned must be one of the states in {@link State}.
+ *
+ * @return the session state
+ */
+ public int getState() {
+ if (mClosed) {
+ return State.INVALID;
+ }
+
+ try {
+ return miSession.getState();
+ } catch (RemoteException e) {
+ return State.INVALID;
+ }
+ }
+
+ /**
+ * Determines if the {@link ImsCallSession} is currently alive (e.g. not in a terminated or
+ * closed state).
+ *
+ * @return {@code True} if the session is alive.
+ */
+ public boolean isAlive() {
+ if (mClosed) {
+ return false;
+ }
+
+ int state = getState();
+ switch (state) {
+ case State.IDLE:
+ case State.INITIATED:
+ case State.NEGOTIATING:
+ case State.ESTABLISHING:
+ case State.ESTABLISHED:
+ case State.RENEGOTIATING:
+ case State.REESTABLISHING:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Gets the native IMS call session.
+ * @hide
+ */
+ public IImsCallSession getSession() {
+ return miSession;
+ }
+
+ /**
+ * Checks if the session is in call.
+ *
+ * @return true if the session is in call
+ */
+ public boolean isInCall() {
+ if (mClosed) {
+ return false;
+ }
+
+ try {
+ return miSession.isInCall();
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
+ /**
+ * Sets the listener to listen to the session events. A {@link ImsCallSession}
+ * can only hold one listener at a time. Subsequent calls to this method
+ * override the previous listener.
+ *
+ * @param listener to listen to the session events of this object
+ */
+ public void setListener(Listener listener) {
+ mListener = listener;
+ }
+
+ /**
+ * Mutes or unmutes the mic for the active call.
+ *
+ * @param muted true if the call is muted, false otherwise
+ */
+ public void setMute(boolean muted) {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.setMute(muted);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Initiates an IMS call with the specified target and call profile.
+ * The session listener is called back upon defined session events.
+ * The method is only valid to call when the session state is in
+ * {@link ImsCallSession.State#IDLE}.
+ *
+ * @param callee dialed string to make the call to
+ * @param profile call profile to make the call with the specified service type,
+ * call type and media information
+ * @see Listener#callSessionStarted, Listener#callSessionStartFailed
+ */
+ public void start(String callee, ImsCallProfile profile) {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.start(callee, profile);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Initiates an IMS conference call with the specified target and call profile.
+ * The session listener is called back upon defined session events.
+ * The method is only valid to call when the session state is in
+ * {@link ImsCallSession.State#IDLE}.
+ *
+ * @param participants participant list to initiate an IMS conference call
+ * @param profile call profile to make the call with the specified service type,
+ * call type and media information
+ * @see Listener#callSessionStarted, Listener#callSessionStartFailed
+ */
+ public void start(String[] participants, ImsCallProfile profile) {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.startConference(participants, profile);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Accepts an incoming call or session update.
+ *
+ * @param callType call type specified in {@link ImsCallProfile} to be answered
+ * @param profile stream media profile {@link ImsStreamMediaProfile} to be answered
+ * @see Listener#callSessionStarted
+ */
+ public void accept(int callType, ImsStreamMediaProfile profile) {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.accept(callType, profile);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Rejects an incoming call or session update.
+ *
+ * @param reason reason code to reject an incoming call
+ * @see Listener#callSessionStartFailed
+ */
+ public void reject(int reason) {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.reject(reason);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Terminates a call.
+ *
+ * @see Listener#callSessionTerminated
+ */
+ public void terminate(int reason) {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.terminate(reason);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Puts a call on hold. When it succeeds, {@link Listener#callSessionHeld} is called.
+ *
+ * @param profile stream media profile {@link ImsStreamMediaProfile} to hold the call
+ * @see Listener#callSessionHeld, Listener#callSessionHoldFailed
+ */
+ public void hold(ImsStreamMediaProfile profile) {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.hold(profile);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Continues a call that's on hold. When it succeeds,
+ * {@link Listener#callSessionResumed} is called.
+ *
+ * @param profile stream media profile {@link ImsStreamMediaProfile} to resume the call
+ * @see Listener#callSessionResumed, Listener#callSessionResumeFailed
+ */
+ public void resume(ImsStreamMediaProfile profile) {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.resume(profile);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Merges the active & hold call. When it succeeds,
+ * {@link Listener#callSessionMergeStarted} is called.
+ *
+ * @see Listener#callSessionMergeStarted , Listener#callSessionMergeFailed
+ */
+ public void merge() {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.merge();
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Updates the current call's properties (ex. call mode change: video upgrade / downgrade).
+ *
+ * @param callType call type specified in {@link ImsCallProfile} to be updated
+ * @param profile stream media profile {@link ImsStreamMediaProfile} to be updated
+ * @see Listener#callSessionUpdated, Listener#callSessionUpdateFailed
+ */
+ public void update(int callType, ImsStreamMediaProfile profile) {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.update(callType, profile);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Extends this call to the conference call with the specified recipients.
+ *
+ * @param participants list to be invited to the conference call after extending the call
+ * @see Listener#callSessionConferenceExtended
+ * @see Listener#callSessionConferenceExtendFailed
+ */
+ public void extendToConference(String[] participants) {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.extendToConference(participants);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Requests the conference server to invite an additional participants to the conference.
+ *
+ * @param participants list to be invited to the conference call
+ * @see Listener#callSessionInviteParticipantsRequestDelivered
+ * @see Listener#callSessionInviteParticipantsRequestFailed
+ */
+ public void inviteParticipants(String[] participants) {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.inviteParticipants(participants);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Requests the conference server to remove the specified participants from the conference.
+ *
+ * @param participants participant list to be removed from the conference call
+ * @see Listener#callSessionRemoveParticipantsRequestDelivered
+ * @see Listener#callSessionRemoveParticipantsRequestFailed
+ */
+ public void removeParticipants(String[] participants) {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.removeParticipants(participants);
+ } catch (RemoteException e) {
+ }
+ }
+
+
+ /**
+ * Sends a DTMF code. According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833</a>,
+ * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15,
+ * and event flash to 16. Currently, event flash is not supported.
+ *
+ * @param c the DTMF to send. '0' ~ '9', 'A' ~ 'D', '*', '#' are valid inputs.
+ */
+ public void sendDtmf(char c, Message result) {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.sendDtmf(c, result);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Starts a DTMF code. According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833</a>,
+ * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15,
+ * and event flash to 16. Currently, event flash is not supported.
+ *
+ * @param c the DTMF to send. '0' ~ '9', 'A' ~ 'D', '*', '#' are valid inputs.
+ */
+ public void startDtmf(char c) {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.startDtmf(c);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Stops a DTMF code.
+ */
+ public void stopDtmf() {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.stopDtmf();
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Sends an USSD message.
+ *
+ * @param ussdMessage USSD message to send
+ */
+ public void sendUssd(String ussdMessage) {
+ if (mClosed) {
+ return;
+ }
+
+ try {
+ miSession.sendUssd(ussdMessage);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Determines if the session is multiparty.
+ *
+ * @return {@code True} if the session is multiparty.
+ */
+ public boolean isMultiparty() {
+ if (mClosed) {
+ return false;
+ }
+
+ try {
+ return miSession.isMultiparty();
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
+ /**
+ * A listener type for receiving notification on IMS call session events.
+ * When an event is generated for an {@link IImsCallSession},
+ * the application is notified by having one of the methods called on
+ * the {@link IImsCallSessionListener}.
+ */
+ private class IImsCallSessionListenerProxy extends ImsCallSessionListenerImplBase {
+ /**
+ * Notifies the result of the basic session operation (setup / terminate).
+ */
+ @Override
+ public void callSessionProgressing(IImsCallSession session,
+ ImsStreamMediaProfile profile) {
+ if (mListener != null) {
+ mListener.callSessionProgressing(ImsCallSession.this, profile);
+ }
+ }
+
+ @Override
+ public void callSessionStarted(IImsCallSession session,
+ ImsCallProfile profile) {
+ if (mListener != null) {
+ mListener.callSessionStarted(ImsCallSession.this, profile);
+ }
+ }
+
+ @Override
+ public void callSessionStartFailed(IImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ if (mListener != null) {
+ mListener.callSessionStartFailed(ImsCallSession.this, reasonInfo);
+ }
+ }
+
+ @Override
+ public void callSessionTerminated(IImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ if (mListener != null) {
+ mListener.callSessionTerminated(ImsCallSession.this, reasonInfo);
+ }
+ }
+
+ /**
+ * Notifies the result of the call hold/resume operation.
+ */
+ @Override
+ public void callSessionHeld(IImsCallSession session,
+ ImsCallProfile profile) {
+ if (mListener != null) {
+ mListener.callSessionHeld(ImsCallSession.this, profile);
+ }
+ }
+
+ @Override
+ public void callSessionHoldFailed(IImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ if (mListener != null) {
+ mListener.callSessionHoldFailed(ImsCallSession.this, reasonInfo);
+ }
+ }
+
+ @Override
+ public void callSessionHoldReceived(IImsCallSession session,
+ ImsCallProfile profile) {
+ if (mListener != null) {
+ mListener.callSessionHoldReceived(ImsCallSession.this, profile);
+ }
+ }
+
+ @Override
+ public void callSessionResumed(IImsCallSession session,
+ ImsCallProfile profile) {
+ if (mListener != null) {
+ mListener.callSessionResumed(ImsCallSession.this, profile);
+ }
+ }
+
+ @Override
+ public void callSessionResumeFailed(IImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ if (mListener != null) {
+ mListener.callSessionResumeFailed(ImsCallSession.this, reasonInfo);
+ }
+ }
+
+ @Override
+ public void callSessionResumeReceived(IImsCallSession session,
+ ImsCallProfile profile) {
+ if (mListener != null) {
+ mListener.callSessionResumeReceived(ImsCallSession.this, profile);
+ }
+ }
+
+ /**
+ * Notifies the start of a call merge operation.
+ *
+ * @param session The call session.
+ * @param newSession The merged call session.
+ * @param profile The call profile.
+ */
+ @Override
+ public void callSessionMergeStarted(IImsCallSession session,
+ IImsCallSession newSession, ImsCallProfile profile) {
+ // This callback can be used for future use to add additional
+ // functionality that may be needed between conference start and complete
+ Log.d(TAG, "callSessionMergeStarted");
+ }
+
+ /**
+ * Notifies the successful completion of a call merge operation.
+ *
+ * @param newSession The call session.
+ */
+ @Override
+ public void callSessionMergeComplete(IImsCallSession newSession) {
+ if (mListener != null) {
+ if (newSession != null) {
+ // Check if the active session is the same session that was
+ // active before the merge request was sent.
+ ImsCallSession validActiveSession = ImsCallSession.this;
+ try {
+ if (!Objects.equals(miSession.getCallId(), newSession.getCallId())) {
+ // New session created after conference
+ validActiveSession = new ImsCallSession(newSession);
+ }
+ } catch (RemoteException rex) {
+ Log.e(TAG, "callSessionMergeComplete: exception for getCallId!");
+ }
+ mListener.callSessionMergeComplete(validActiveSession);
+ } else {
+ // Session already exists. Hence no need to pass
+ mListener.callSessionMergeComplete(null);
+ }
+ }
+ }
+
+ /**
+ * Notifies of a failure to perform a call merge operation.
+ *
+ * @param session The call session.
+ * @param reasonInfo The merge failure reason.
+ */
+ @Override
+ public void callSessionMergeFailed(IImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ if (mListener != null) {
+ mListener.callSessionMergeFailed(ImsCallSession.this, reasonInfo);
+ }
+ }
+
+ /**
+ * Notifies the result of call upgrade / downgrade or any other call updates.
+ */
+ @Override
+ public void callSessionUpdated(IImsCallSession session,
+ ImsCallProfile profile) {
+ if (mListener != null) {
+ mListener.callSessionUpdated(ImsCallSession.this, profile);
+ }
+ }
+
+ @Override
+ public void callSessionUpdateFailed(IImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ if (mListener != null) {
+ mListener.callSessionUpdateFailed(ImsCallSession.this, reasonInfo);
+ }
+ }
+
+ @Override
+ public void callSessionUpdateReceived(IImsCallSession session,
+ ImsCallProfile profile) {
+ if (mListener != null) {
+ mListener.callSessionUpdateReceived(ImsCallSession.this, profile);
+ }
+ }
+
+ /**
+ * Notifies the result of conference extension.
+ */
+ @Override
+ public void callSessionConferenceExtended(IImsCallSession session,
+ IImsCallSession newSession, ImsCallProfile profile) {
+ if (mListener != null) {
+ mListener.callSessionConferenceExtended(ImsCallSession.this,
+ new ImsCallSession(newSession), profile);
+ }
+ }
+
+ @Override
+ public void callSessionConferenceExtendFailed(IImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ if (mListener != null) {
+ mListener.callSessionConferenceExtendFailed(ImsCallSession.this, reasonInfo);
+ }
+ }
+
+ @Override
+ public void callSessionConferenceExtendReceived(IImsCallSession session,
+ IImsCallSession newSession, ImsCallProfile profile) {
+ if (mListener != null) {
+ mListener.callSessionConferenceExtendReceived(ImsCallSession.this,
+ new ImsCallSession(newSession), profile);
+ }
+ }
+
+ /**
+ * Notifies the result of the participant invitation / removal to/from
+ * the conference session.
+ */
+ @Override
+ public void callSessionInviteParticipantsRequestDelivered(IImsCallSession session) {
+ if (mListener != null) {
+ mListener.callSessionInviteParticipantsRequestDelivered(ImsCallSession.this);
+ }
+ }
+
+ @Override
+ public void callSessionInviteParticipantsRequestFailed(IImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ if (mListener != null) {
+ mListener.callSessionInviteParticipantsRequestFailed(ImsCallSession.this,
+ reasonInfo);
+ }
+ }
+
+ @Override
+ public void callSessionRemoveParticipantsRequestDelivered(IImsCallSession session) {
+ if (mListener != null) {
+ mListener.callSessionRemoveParticipantsRequestDelivered(ImsCallSession.this);
+ }
+ }
+
+ @Override
+ public void callSessionRemoveParticipantsRequestFailed(IImsCallSession session,
+ ImsReasonInfo reasonInfo) {
+ if (mListener != null) {
+ mListener.callSessionRemoveParticipantsRequestFailed(ImsCallSession.this,
+ reasonInfo);
+ }
+ }
+
+ /**
+ * Notifies the changes of the conference info. in the conference session.
+ */
+ @Override
+ public void callSessionConferenceStateUpdated(IImsCallSession session,
+ ImsConferenceState state) {
+ if (mListener != null) {
+ mListener.callSessionConferenceStateUpdated(ImsCallSession.this, state);
+ }
+ }
+
+ /**
+ * Notifies the incoming USSD message.
+ */
+ @Override
+ public void callSessionUssdMessageReceived(IImsCallSession session,
+ int mode, String ussdMessage) {
+ if (mListener != null) {
+ mListener.callSessionUssdMessageReceived(ImsCallSession.this, mode, ussdMessage);
+ }
+ }
+
+ /**
+ * Notifies of handover information for this call
+ */
+ @Override
+ public void callSessionHandover(IImsCallSession session,
+ int srcAccessTech, int targetAccessTech,
+ ImsReasonInfo reasonInfo) {
+ if (mListener != null) {
+ mListener.callSessionHandover(ImsCallSession.this, srcAccessTech,
+ targetAccessTech, reasonInfo);
+ }
+ }
+
+ /**
+ * Notifies of handover failure info for this call
+ */
+ @Override
+ public void callSessionHandoverFailed(IImsCallSession session,
+ int srcAccessTech, int targetAccessTech,
+ ImsReasonInfo reasonInfo) {
+ if (mListener != null) {
+ mListener.callSessionHandoverFailed(ImsCallSession.this, srcAccessTech,
+ targetAccessTech, reasonInfo);
+ }
+ }
+
+ /**
+ * Notifies the TTY mode received from remote party.
+ */
+ @Override
+ public void callSessionTtyModeReceived(IImsCallSession session,
+ int mode) {
+ if (mListener != null) {
+ mListener.callSessionTtyModeReceived(ImsCallSession.this, mode);
+ }
+ }
+
+ /**
+ * Notifies of a change to the multiparty state for this {@code ImsCallSession}.
+ *
+ * @param session The call session.
+ * @param isMultiParty {@code true} if the session became multiparty, {@code false}
+ * otherwise.
+ */
+ public void callSessionMultipartyStateChanged(IImsCallSession session,
+ boolean isMultiParty) {
+
+ if (mListener != null) {
+ mListener.callSessionMultipartyStateChanged(ImsCallSession.this, isMultiParty);
+ }
+ }
+
+ @Override
+ public void callSessionSuppServiceReceived(IImsCallSession session,
+ ImsSuppServiceNotification suppServiceInfo ) {
+ if (mListener != null) {
+ mListener.callSessionSuppServiceReceived(ImsCallSession.this, suppServiceInfo);
+ }
+ }
+
+ }
+
+ /**
+ * Provides a string representation of the {@link ImsCallSession}. Primarily intended for
+ * use in log statements.
+ *
+ * @return String representation of session.
+ */
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("[ImsCallSession objId:");
+ sb.append(System.identityHashCode(this));
+ sb.append(" state:");
+ sb.append(State.toString(getState()));
+ sb.append(" callId:");
+ sb.append(getCallId());
+ sb.append("]");
+ return sb.toString();
+ }
+}
diff --git a/telephony/java/com/android/ims/internal/ImsVideoCallProvider.java b/telephony/java/com/android/ims/internal/ImsVideoCallProvider.java
new file mode 100644
index 0000000..432dc39
--- /dev/null
+++ b/telephony/java/com/android/ims/internal/ImsVideoCallProvider.java
@@ -0,0 +1,294 @@
+/*
+ * 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.ims.internal;
+
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.RemoteException;
+import android.telecom.Connection;
+import android.telecom.VideoProfile;
+import android.telecom.VideoProfile.CameraCapabilities;
+import android.view.Surface;
+
+import com.android.internal.os.SomeArgs;
+
+/**
+ * @hide
+ */
+public abstract class ImsVideoCallProvider {
+ private static final int MSG_SET_CALLBACK = 1;
+ private static final int MSG_SET_CAMERA = 2;
+ private static final int MSG_SET_PREVIEW_SURFACE = 3;
+ private static final int MSG_SET_DISPLAY_SURFACE = 4;
+ private static final int MSG_SET_DEVICE_ORIENTATION = 5;
+ private static final int MSG_SET_ZOOM = 6;
+ private static final int MSG_SEND_SESSION_MODIFY_REQUEST = 7;
+ private static final int MSG_SEND_SESSION_MODIFY_RESPONSE = 8;
+ private static final int MSG_REQUEST_CAMERA_CAPABILITIES = 9;
+ private static final int MSG_REQUEST_CALL_DATA_USAGE = 10;
+ private static final int MSG_SET_PAUSE_IMAGE = 11;
+
+ private final ImsVideoCallProviderBinder mBinder;
+
+ private IImsVideoCallCallback mCallback;
+
+ /**
+ * Default handler used to consolidate binder method calls onto a single thread.
+ */
+ private final Handler mProviderHandler = new Handler(Looper.getMainLooper()) {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_SET_CALLBACK:
+ mCallback = (IImsVideoCallCallback) msg.obj;
+ break;
+ case MSG_SET_CAMERA:
+ {
+ SomeArgs args = (SomeArgs) msg.obj;
+ try {
+ onSetCamera((String) args.arg1);
+ onSetCamera((String) args.arg1, args.argi1);
+ } finally {
+ args.recycle();
+ }
+ break;
+ }
+ case MSG_SET_PREVIEW_SURFACE:
+ onSetPreviewSurface((Surface) msg.obj);
+ break;
+ case MSG_SET_DISPLAY_SURFACE:
+ onSetDisplaySurface((Surface) msg.obj);
+ break;
+ case MSG_SET_DEVICE_ORIENTATION:
+ onSetDeviceOrientation(msg.arg1);
+ break;
+ case MSG_SET_ZOOM:
+ onSetZoom((Float) msg.obj);
+ break;
+ case MSG_SEND_SESSION_MODIFY_REQUEST: {
+ SomeArgs args = (SomeArgs) msg.obj;
+ try {
+ VideoProfile fromProfile = (VideoProfile) args.arg1;
+ VideoProfile toProfile = (VideoProfile) args.arg2;
+
+ onSendSessionModifyRequest(fromProfile, toProfile);
+ } finally {
+ args.recycle();
+ }
+ break;
+ }
+ case MSG_SEND_SESSION_MODIFY_RESPONSE:
+ onSendSessionModifyResponse((VideoProfile) msg.obj);
+ break;
+ case MSG_REQUEST_CAMERA_CAPABILITIES:
+ onRequestCameraCapabilities();
+ break;
+ case MSG_REQUEST_CALL_DATA_USAGE:
+ onRequestCallDataUsage();
+ break;
+ case MSG_SET_PAUSE_IMAGE:
+ onSetPauseImage((Uri) msg.obj);
+ break;
+ default:
+ break;
+ }
+ }
+ };
+
+ /**
+ * IImsVideoCallProvider stub implementation.
+ */
+ private final class ImsVideoCallProviderBinder extends IImsVideoCallProvider.Stub {
+ public void setCallback(IImsVideoCallCallback callback) {
+ mProviderHandler.obtainMessage(MSG_SET_CALLBACK, callback).sendToTarget();
+ }
+
+ public void setCamera(String cameraId, int uid) {
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = cameraId;
+ args.argi1 = uid;
+ mProviderHandler.obtainMessage(MSG_SET_CAMERA, args).sendToTarget();
+ }
+
+ public void setPreviewSurface(Surface surface) {
+ mProviderHandler.obtainMessage(MSG_SET_PREVIEW_SURFACE, surface).sendToTarget();
+ }
+
+ public void setDisplaySurface(Surface surface) {
+ mProviderHandler.obtainMessage(MSG_SET_DISPLAY_SURFACE, surface).sendToTarget();
+ }
+
+ public void setDeviceOrientation(int rotation) {
+ mProviderHandler.obtainMessage(MSG_SET_DEVICE_ORIENTATION, rotation, 0).sendToTarget();
+ }
+
+ public void setZoom(float value) {
+ mProviderHandler.obtainMessage(MSG_SET_ZOOM, value).sendToTarget();
+ }
+
+ public void sendSessionModifyRequest(VideoProfile fromProfile, VideoProfile toProfile) {
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = fromProfile;
+ args.arg2 = toProfile;
+ mProviderHandler.obtainMessage(MSG_SEND_SESSION_MODIFY_REQUEST, args).sendToTarget();
+ }
+
+ public void sendSessionModifyResponse(VideoProfile responseProfile) {
+ mProviderHandler.obtainMessage(
+ MSG_SEND_SESSION_MODIFY_RESPONSE, responseProfile).sendToTarget();
+ }
+
+ public void requestCameraCapabilities() {
+ mProviderHandler.obtainMessage(MSG_REQUEST_CAMERA_CAPABILITIES).sendToTarget();
+ }
+
+ public void requestCallDataUsage() {
+ mProviderHandler.obtainMessage(MSG_REQUEST_CALL_DATA_USAGE).sendToTarget();
+ }
+
+ public void setPauseImage(Uri uri) {
+ mProviderHandler.obtainMessage(MSG_SET_PAUSE_IMAGE, uri).sendToTarget();
+ }
+ }
+
+ public ImsVideoCallProvider() {
+ mBinder = new ImsVideoCallProviderBinder();
+ }
+
+ /**
+ * Returns binder object which can be used across IPC methods.
+ */
+ public final IImsVideoCallProvider getInterface() {
+ return mBinder;
+ }
+
+ /** @see Connection.VideoProvider#onSetCamera */
+ public abstract void onSetCamera(String cameraId);
+
+ /**
+ * Similar to {@link #onSetCamera(String)}, except includes the UID of the calling process which
+ * the IMS service uses when opening the camera. This ensures camera permissions are verified
+ * by the camera service.
+ *
+ * @param cameraId The id of the camera to be opened.
+ * @param uid The uid of the caller, used when opening the camera for permission verification.
+ * @see Connection.VideoProvider#onSetCamera
+ */
+ public void onSetCamera(String cameraId, int uid) {
+ }
+
+ /** @see Connection.VideoProvider#onSetPreviewSurface */
+ public abstract void onSetPreviewSurface(Surface surface);
+
+ /** @see Connection.VideoProvider#onSetDisplaySurface */
+ public abstract void onSetDisplaySurface(Surface surface);
+
+ /** @see Connection.VideoProvider#onSetDeviceOrientation */
+ public abstract void onSetDeviceOrientation(int rotation);
+
+ /** @see Connection.VideoProvider#onSetZoom */
+ public abstract void onSetZoom(float value);
+
+ /** @see Connection.VideoProvider#onSendSessionModifyRequest */
+ public abstract void onSendSessionModifyRequest(VideoProfile fromProfile,
+ VideoProfile toProfile);
+
+ /** @see Connection.VideoProvider#onSendSessionModifyResponse */
+ public abstract void onSendSessionModifyResponse(VideoProfile responseProfile);
+
+ /** @see Connection.VideoProvider#onRequestCameraCapabilities */
+ public abstract void onRequestCameraCapabilities();
+
+ /** @see Connection.VideoProvider#onRequestCallDataUsage */
+ public abstract void onRequestCallDataUsage();
+
+ /** @see Connection.VideoProvider#onSetPauseImage */
+ public abstract void onSetPauseImage(Uri uri);
+
+ /** @see Connection.VideoProvider#receiveSessionModifyRequest */
+ public void receiveSessionModifyRequest(VideoProfile VideoProfile) {
+ if (mCallback != null) {
+ try {
+ mCallback.receiveSessionModifyRequest(VideoProfile);
+ } catch (RemoteException ignored) {
+ }
+ }
+ }
+
+ /** @see Connection.VideoProvider#receiveSessionModifyResponse */
+ public void receiveSessionModifyResponse(
+ int status, VideoProfile requestedProfile, VideoProfile responseProfile) {
+ if (mCallback != null) {
+ try {
+ mCallback.receiveSessionModifyResponse(status, requestedProfile, responseProfile);
+ } catch (RemoteException ignored) {
+ }
+ }
+ }
+
+ /** @see Connection.VideoProvider#handleCallSessionEvent */
+ public void handleCallSessionEvent(int event) {
+ if (mCallback != null) {
+ try {
+ mCallback.handleCallSessionEvent(event);
+ } catch (RemoteException ignored) {
+ }
+ }
+ }
+
+ /** @see Connection.VideoProvider#changePeerDimensions */
+ public void changePeerDimensions(int width, int height) {
+ if (mCallback != null) {
+ try {
+ mCallback.changePeerDimensions(width, height);
+ } catch (RemoteException ignored) {
+ }
+ }
+ }
+
+ /** @see Connection.VideoProvider#changeCallDataUsage */
+ public void changeCallDataUsage(long dataUsage) {
+ if (mCallback != null) {
+ try {
+ mCallback.changeCallDataUsage(dataUsage);
+ } catch (RemoteException ignored) {
+ }
+ }
+ }
+
+ /** @see Connection.VideoProvider#changeCameraCapabilities */
+ public void changeCameraCapabilities(CameraCapabilities CameraCapabilities) {
+ if (mCallback != null) {
+ try {
+ mCallback.changeCameraCapabilities(CameraCapabilities);
+ } catch (RemoteException ignored) {
+ }
+ }
+ }
+
+ /** @see Connection.VideoProvider#changeVideoQuality */
+ public void changeVideoQuality(int videoQuality) {
+ if (mCallback != null) {
+ try {
+ mCallback.changeVideoQuality(videoQuality);
+ } catch (RemoteException ignored) {
+ }
+ }
+ }
+}
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index d90a33e..88daf64 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -1146,6 +1146,20 @@
Uri getVoicemailRingtoneUri(in PhoneAccountHandle accountHandle);
/**
+ * Sets the per-account voicemail ringtone.
+ *
+ * <p>Requires that the calling app is the default dialer, or has carrier privileges, or
+ * has permission {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}.
+ *
+ * @param phoneAccountHandle The handle for the {@link PhoneAccount} for which to set the
+ * voicemail ringtone.
+ * @param uri The URI for the ringtone to play when receiving a voicemail from a specific
+ * PhoneAccount.
+ */
+ void setVoicemailRingtoneUri(String callingPackage,
+ in PhoneAccountHandle phoneAccountHandle, in Uri uri);
+
+ /**
* Returns whether vibration is set for voicemail notification in Phone settings.
*
* @param accountHandle The handle for the {@link PhoneAccount} for which to retrieve the
@@ -1155,6 +1169,20 @@
boolean isVoicemailVibrationEnabled(in PhoneAccountHandle accountHandle);
/**
+ * Sets the per-account preference whether vibration is enabled for voicemail notifications.
+ *
+ * <p>Requires that the calling app is the default dialer, or has carrier privileges, or
+ * has permission {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}.
+ *
+ * @param phoneAccountHandle The handle for the {@link PhoneAccount} for which to set the
+ * voicemail vibration setting.
+ * @param enabled Whether to enable or disable vibration for voicemail notifications from a
+ * specific PhoneAccount.
+ */
+ void setVoicemailVibrationEnabled(String callingPackage,
+ in PhoneAccountHandle phoneAccountHandle, boolean enabled);
+
+ /**
* Returns a list of packages that have carrier privileges.
*/
List<String> getPackagesWithCarrierPrivileges();
@@ -1259,4 +1287,12 @@
* @hide
*/
List<ClientRequestStats> getClientRequestStats(String callingPackage, int subid);
+
+ /**
+ * Set SIM card power state. Request is equivalent to inserting or removing the card.
+ * @param slotId SIM slot id
+ * @param powerUp True if powering up the SIM, otherwise powering down
+ * @hide
+ * */
+ void setSimPowerStateForSlot(int slotId, boolean powerUp);
}
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index 5ee7e23..c3b740e 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -411,6 +411,7 @@
int RIL_REQUEST_GET_ACTIVITY_INFO = 135;
int RIL_REQUEST_SET_ALLOWED_CARRIERS = 136;
int RIL_REQUEST_GET_ALLOWED_CARRIERS = 137;
+ int RIL_REQUEST_SET_SIM_CARD_POWER = 140;
int RIL_RESPONSE_ACKNOWLEDGEMENT = 800;
diff --git a/telephony/java/com/android/internal/telephony/TelephonyIntents.java b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
index 0168874..bcaac6e 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyIntents.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
@@ -16,6 +16,8 @@
package com.android.internal.telephony;
+import android.content.Intent;
+
/**
* The intents that the telephony services broadcast.
*
@@ -184,7 +186,6 @@
public static final String ACTION_DATA_CONNECTION_FAILED
= "android.intent.action.DATA_CONNECTION_FAILED";
-
/**
* Broadcast Action: The sim card state has changed.
* The intent will have the following extra values:</p>
@@ -213,8 +214,7 @@
* by the system.
*/
public static final String ACTION_SIM_STATE_CHANGED
- = "android.intent.action.SIM_STATE_CHANGED";
-
+ = Intent.ACTION_SIM_STATE_CHANGED;
/**
* Broadcast Action: The time was set by the carrier (typically by the NITZ string).
@@ -264,22 +264,13 @@
= "android.intent.action.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS";
/**
- * Activity Action: Start this activity to invoke the carrier setup app.
- * The carrier app must be signed using a certificate that matches the UICC access rules.
- *
- * <p class="note">Callers of this should hold the android.permission.INVOKE_CARRIER_SETUP
- * permission.</p>
- */
- public static final String ACTION_CARRIER_SETUP = "android.intent.action.ACTION_CARRIER_SETUP";
-
- /**
* <p>Broadcast Action: Indicates that the action is forbidden by network.
* <p class="note">
* This is for the OEM applications to understand about possible provisioning issues.
* Used in OMA-DM applications.
*/
public static final String ACTION_FORBIDDEN_NO_SERVICE_AUTHORIZATION
- = "android.intent.action.ACTION_FORBIDDEN_NO_SERVICE_AUTHORIZATION";
+ = "com.android.internal.intent.action.ACTION_FORBIDDEN_NO_SERVICE_AUTHORIZATION";
/**
* Broadcast Action: A "secret code" has been entered in the dialer. Secret codes are
@@ -411,7 +402,7 @@
* <p class="note">This is a protected intent that can only be sent by the system.</p>
*/
public static final String ACTION_CARRIER_SIGNAL_REDIRECTED =
- "android.intent.action.CARRIER_SIGNAL_REDIRECTED";
+ "com.android.internal.telephony.CARRIER_SIGNAL_REDIRECTED";
/**
* <p>Broadcast Action: when data connections setup fails.
* intended for sim/account status checks and only sent to the specified carrier app
@@ -424,7 +415,7 @@
* <p class="note">This is a protected intent that can only be sent by the system. </p>
*/
public static final String ACTION_CARRIER_SIGNAL_REQUEST_NETWORK_FAILED =
- "android.intent.action.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED";
+ "com.android.internal.telephony.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED";
/**
* <p>Broadcast Action: when pco value is available.
@@ -441,7 +432,7 @@
* <p class="note">This is a protected intent that can only be sent by the system. </p>
*/
public static final String ACTION_CARRIER_SIGNAL_PCO_VALUE =
- "android.intent.action.CARRIER_SIGNAL_PCO_VALUE";
+ "com.android.internal.telephony.CARRIER_SIGNAL_PCO_VALUE";
// CARRIER_SIGNAL_ACTION extra keys
public static final String EXTRA_REDIRECTION_URL_KEY = "redirectionUrl";
diff --git a/test-runner/src/android/test/mock/MockContext.java b/test-runner/src/android/test/mock/MockContext.java
index 9ffd92d..3f5ca84 100644
--- a/test-runner/src/android/test/mock/MockContext.java
+++ b/test-runner/src/android/test/mock/MockContext.java
@@ -739,6 +739,12 @@
throw new UnsupportedOperationException();
}
+ /** @hide */
+ @Override
+ public void updateDisplay(int displayId) {
+ throw new UnsupportedOperationException();
+ }
+
@Override
public File[] getExternalFilesDirs(String type) {
throw new UnsupportedOperationException();
@@ -759,6 +765,10 @@
throw new UnsupportedOperationException();
}
+ /** @hide **/
+ @Override
+ public File getPreloadsFileCache() { throw new UnsupportedOperationException(); }
+
@Override
public Context createDeviceProtectedStorageContext() {
throw new UnsupportedOperationException();
diff --git a/test-runner/src/android/test/suitebuilder/TestMethod.java b/test-runner/src/android/test/suitebuilder/TestMethod.java
index 08568d5..ae1db5e 100644
--- a/test-runner/src/android/test/suitebuilder/TestMethod.java
+++ b/test-runner/src/android/test/suitebuilder/TestMethod.java
@@ -26,7 +26,11 @@
/**
* Represents a test to be run. Can be constructed without instantiating the TestCase or even
* loading the class.
+ *
+ * @deprecated New tests should be written using the
+ * <a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a>.
*/
+@Deprecated
public class TestMethod {
private final String enclosingClassname;
diff --git a/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java b/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java
index 8c89489..3b920cf 100644
--- a/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java
+++ b/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java
@@ -38,7 +38,11 @@
/**
* Build suites based on a combination of included packages, excluded packages,
* and predicates that must be satisfied.
+ *
+ * @deprecated New tests should be written using the
+ * <a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a>.
*/
+@Deprecated
public class TestSuiteBuilder {
private Context context;
@@ -223,7 +227,11 @@
/**
* A special {@link junit.framework.TestCase} used to indicate a failure during the build()
* step.
+ *
+ * @deprecated New tests should be written using the
+ * <a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a>.
*/
+ @Deprecated
public static class FailedToCreateTests extends TestCase {
private final Exception exception;
diff --git a/test-runner/src/junit/runner/package-info.java b/test-runner/src/junit/runner/package-info.java
index b746185..364e362 100644
--- a/test-runner/src/junit/runner/package-info.java
+++ b/test-runner/src/junit/runner/package-info.java
@@ -1,4 +1,4 @@
/**
- * Provides JUnit v3.x test runners.
+ * Utility classes supporting the junit test framework.
*/
package junit.runner;
\ No newline at end of file
diff --git a/test-runner/src/junit/runner/package.html b/test-runner/src/junit/runner/package.html
deleted file mode 100644
index f08fa70..0000000
--- a/test-runner/src/junit/runner/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<HTML>
-<BODY>
-Utility classes supporting the junit test framework.
-</BODY>
-</HTML>
diff --git a/test-runner/src/junit/textui/package-info.java b/test-runner/src/junit/textui/package-info.java
index 2dcc10c..28b2ef4 100644
--- a/test-runner/src/junit/textui/package-info.java
+++ b/test-runner/src/junit/textui/package-info.java
@@ -1,5 +1,5 @@
/**
- * Provides JUnit v3.x command line based tool to run tests.
+ * Utility classes supporting the junit test framework.
* {@hide}
*/
package junit.textui;
\ No newline at end of file
diff --git a/test-runner/src/junit/textui/package.html b/test-runner/src/junit/textui/package.html
deleted file mode 100644
index 723f2ae..0000000
--- a/test-runner/src/junit/textui/package.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<HTML>
-<BODY>
-Utility classes supporting the junit test framework.
-{@hide} - Not needed for 1.0 SDK
-</BODY>
-</HTML>
diff --git a/tests/SharedLibrary/client/Android.mk b/tests/SharedLibrary/client/Android.mk
index 1d66bb9..a04fb05 100644
--- a/tests/SharedLibrary/client/Android.mk
+++ b/tests/SharedLibrary/client/Android.mk
@@ -1,6 +1,7 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_RES_LIBRARIES := SharedLibrary
diff --git a/tests/SharedLibrary/client/res/layout/main.xml b/tests/SharedLibrary/client/res/layout/main.xml
index 067ef9f..7dfe965 100644
--- a/tests/SharedLibrary/client/res/layout/main.xml
+++ b/tests/SharedLibrary/client/res/layout/main.xml
@@ -15,7 +15,7 @@
xmlns:custom="http://schemas.android.com/apk/res/com.google.android.test.shared_library"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- custom:name="Professor Android"
+ custom:name="@string/name"
custom:streetNumber="44"
custom:streetName="KitKat Lane"
custom:city="AndroidVille"
diff --git a/tests/SharedLibrary/client/res/values/strings.xml b/tests/SharedLibrary/client/res/values/strings.xml
index d9efdc7..63043ed 100644
--- a/tests/SharedLibrary/client/res/values/strings.xml
+++ b/tests/SharedLibrary/client/res/values/strings.xml
@@ -16,5 +16,6 @@
<resources>
<string name="app_title">SharedLibrary client</string>
+ <string name="name">Professor Android</string>
<string name="changes">@com.google.android.test.shared_library:string/shared_string</string>
</resources>
diff --git a/tests/SharedLibrary/lib/Android.mk b/tests/SharedLibrary/lib/Android.mk
index b2fc369..78fcb8b 100644
--- a/tests/SharedLibrary/lib/Android.mk
+++ b/tests/SharedLibrary/lib/Android.mk
@@ -1,5 +1,6 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
LOCAL_SRC_FILES := $(call all-subdir-java-files)
diff --git a/tests/SharedLibrary/lib/res/values/public.xml b/tests/SharedLibrary/lib/res/values/public.xml
index 23d307e..8d7a7ad 100644
--- a/tests/SharedLibrary/lib/res/values/public.xml
+++ b/tests/SharedLibrary/lib/res/values/public.xml
@@ -15,5 +15,5 @@
<public type="drawable" name="size_48x48" id="0x00030000" />
- <public type="array" name="animals" id="0x02050000" />
+ <public type="array" name="animals" id="0x00050000" />
</resources>
diff --git a/tests/SoundTriggerTestApp/res/layout/main.xml b/tests/SoundTriggerTestApp/res/layout/main.xml
index 0fd8b12..2c6c8d7 100644
--- a/tests/SoundTriggerTestApp/res/layout/main.xml
+++ b/tests/SoundTriggerTestApp/res/layout/main.xml
@@ -87,6 +87,7 @@
android:text="@string/capture"
android:id="@+id/caputre_check_box"
android:layout_gravity="center_horizontal"
+ android:onClick="onCaptureAudioCheckboxClicked"
android:padding="20dp" />
<Button
@@ -94,6 +95,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/play_capture"
+ android:onClick="onPlayCapturedAudioButtonClicked"
android:padding="20dp"
android:enabled="false" />
</LinearLayout>
diff --git a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
index 56aad23..9b1a9f2 100644
--- a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
+++ b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
@@ -297,6 +297,7 @@
Notification n = new Notification.Builder(NotificationTestList.this)
.setSmallIcon(R.drawable.icon2)
.setContentTitle("Low priority")
+ .setTimeout(60000)
.setLights(0xff0000ff, 1, 0)
.setPriority(Notification.PRIORITY_LOW)
.build();
diff --git a/tests/net/java/android/net/ConnectivityMetricsLoggerTest.java b/tests/net/java/android/net/ConnectivityMetricsLoggerTest.java
deleted file mode 100644
index f896030..0000000
--- a/tests/net/java/android/net/ConnectivityMetricsLoggerTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * 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.
- */
-
-package android.net;
-
-import android.os.Bundle;
-import android.os.Parcel;
-import android.test.suitebuilder.annotation.SmallTest;
-import java.util.List;
-import junit.framework.TestCase;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-public class ConnectivityMetricsLoggerTest extends TestCase {
-
- // use same Parcel object everywhere for pointer equality
- static final Bundle FAKE_EV = new Bundle();
- static final int FAKE_COMPONENT = 1;
- static final int FAKE_EVENT = 2;
-
- @Mock IConnectivityMetricsLogger mService;
- ArgumentCaptor<ConnectivityMetricsEvent> evCaptor;
- ArgumentCaptor<ConnectivityMetricsEvent[]> evArrayCaptor;
-
- ConnectivityMetricsLogger mLog;
-
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- evCaptor = ArgumentCaptor.forClass(ConnectivityMetricsEvent.class);
- evArrayCaptor = ArgumentCaptor.forClass(ConnectivityMetricsEvent[].class);
- mLog = new ConnectivityMetricsLogger(mService);
- }
-
- @SmallTest
- public void testLogEvents() throws Exception {
- mLog.logEvent(1, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
- mLog.logEvent(2, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
- mLog.logEvent(3, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
-
- List<ConnectivityMetricsEvent> gotEvents = verifyEvents(3);
- assertEventsEqual(expectedEvent(1), gotEvents.get(0));
- assertEventsEqual(expectedEvent(2), gotEvents.get(1));
- assertEventsEqual(expectedEvent(3), gotEvents.get(2));
- }
-
- @SmallTest
- public void testLogEventTriggerThrottling() throws Exception {
- when(mService.logEvent(any())).thenReturn(1234L);
-
- mLog.logEvent(1, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
- mLog.logEvent(2, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
-
- List<ConnectivityMetricsEvent> gotEvents = verifyEvents(1);
- assertEventsEqual(expectedEvent(1), gotEvents.get(0));
- }
-
- @SmallTest
- public void testLogEventFails() throws Exception {
- when(mService.logEvent(any())).thenReturn(-1L); // Error.
-
- mLog.logEvent(1, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
- mLog.logEvent(2, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
-
- List<ConnectivityMetricsEvent> gotEvents = verifyEvents(1);
- assertEventsEqual(expectedEvent(1), gotEvents.get(0));
- }
-
- @SmallTest
- public void testLogEventWhenThrottling() throws Exception {
- when(mService.logEvent(any())).thenReturn(Long.MAX_VALUE); // Throttled
-
- // No events are logged. The service is only called once
- // After that, throttling state is maintained locally.
- mLog.logEvent(1, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
- mLog.logEvent(2, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
-
- List<ConnectivityMetricsEvent> gotEvents = verifyEvents(1);
- assertEventsEqual(expectedEvent(1), gotEvents.get(0));
- }
-
- @SmallTest
- public void testLogEventRecoverFromThrottling() throws Exception {
- final long throttleTimeout = System.currentTimeMillis() + 10;
- when(mService.logEvent(any())).thenReturn(throttleTimeout, 0L);
-
- mLog.logEvent(1, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
- mLog.logEvent(2, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
- mLog.logEvent(3, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
- Thread.sleep(100);
- mLog.logEvent(53, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
-
- List<ConnectivityMetricsEvent> gotEvents = verifyEvents(1);
- assertEventsEqual(expectedEvent(1), gotEvents.get(0));
-
- verify(mService, times(1)).logEvents(evArrayCaptor.capture());
- ConnectivityMetricsEvent[] gotOtherEvents = evArrayCaptor.getAllValues().get(0);
- assertEquals(ConnectivityMetricsLogger.TAG_SKIPPED_EVENTS, gotOtherEvents[0].eventTag);
- assertEventsEqual(expectedEvent(53), gotOtherEvents[1]);
- }
-
- List<ConnectivityMetricsEvent> verifyEvents(int n) throws Exception {
- verify(mService, times(n)).logEvent(evCaptor.capture());
- return evCaptor.getAllValues();
- }
-
- static ConnectivityMetricsEvent expectedEvent(int timestamp) {
- return new ConnectivityMetricsEvent((long)timestamp, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
- }
-
- /** Outer equality for ConnectivityMetricsEvent to avoid overriding equals() and hashCode(). */
- static void assertEventsEqual(ConnectivityMetricsEvent expected, ConnectivityMetricsEvent got) {
- assertEquals(expected.timestamp, got.timestamp);
- assertEquals(expected.componentTag, got.componentTag);
- assertEquals(expected.eventTag, got.eventTag);
- assertEquals(expected.data, got.data);
- }
-}
diff --git a/tests/net/java/com/android/server/connectivity/MetricsLoggerServiceTest.java b/tests/net/java/com/android/server/connectivity/MetricsLoggerServiceTest.java
deleted file mode 100644
index 5981f48..0000000
--- a/tests/net/java/com/android/server/connectivity/MetricsLoggerServiceTest.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.server.connectivity;
-
-import android.content.Context;
-import android.net.ConnectivityMetricsEvent;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.test.suitebuilder.annotation.SmallTest;
-import static android.net.ConnectivityMetricsEvent.Reference;
-
-import junit.framework.TestCase;
-import org.junit.Before;
-import org.junit.Test;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertArrayEquals;
-
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.io.FileDescriptor;
-import java.io.FileOutputStream;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/*
- * TODO:
- * - allow overriding MetricsLoggerService constants in tests.
- * - test intents are correctly sent after the notification threshold.
- * - test oldest events are correctly pushed out when internal deque is full.
- * - test throttling triggers correctly.
- */
-public class MetricsLoggerServiceTest extends TestCase {
-
- static final int COMPONENT_TAG = 1;
- static final long N_EVENTS = 10L;
- static final ConnectivityMetricsEvent EVENTS[] = new ConnectivityMetricsEvent[(int)N_EVENTS];
- static {
- for (int i = 0; i < N_EVENTS; i++) {
- EVENTS[i] = new ConnectivityMetricsEvent(i, COMPONENT_TAG, i, new Bundle());
- }
- }
-
- static final ConnectivityMetricsEvent NO_EVENTS[] = new ConnectivityMetricsEvent[0];
-
- @Mock Context mContext;
- MetricsLoggerService mService;
-
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mService = new MetricsLoggerService(mContext);
- mService.onStart();
- }
-
- @SmallTest
- public void testGetNoEvents() throws Exception {
- Reference r = new Reference(0);
- assertArrayEquals(NO_EVENTS, mService.mBinder.getEvents(r));
- assertEquals(0, r.getValue());
- }
-
- @SmallTest
- public void testLogAndGetEvents() throws Exception {
- mService.mBinder.logEvents(EVENTS);
-
- Reference r = new Reference(0);
-
- assertArrayEquals(EVENTS, mService.mBinder.getEvents(r));
- assertEquals(N_EVENTS, r.getValue());
-
- assertArrayEquals(NO_EVENTS, mService.mBinder.getEvents(r));
- assertEquals(N_EVENTS, r.getValue());
- }
-
- @SmallTest
- public void testLogOneByOne() throws Exception {
- for (ConnectivityMetricsEvent ev : EVENTS) {
- mService.mBinder.logEvent(ev);
- }
-
- Reference r = new Reference(0);
-
- assertArrayEquals(EVENTS, mService.mBinder.getEvents(r));
- assertEquals(N_EVENTS, r.getValue());
-
- assertArrayEquals(NO_EVENTS, mService.mBinder.getEvents(r));
- assertEquals(N_EVENTS, r.getValue());
- }
-
- @SmallTest
- public void testInterleavedLogAndGet() throws Exception {
- mService.mBinder.logEvents(Arrays.copyOfRange(EVENTS, 0, 3));
-
- Reference r = new Reference(0);
-
- assertArrayEquals(Arrays.copyOfRange(EVENTS, 0, 3), mService.mBinder.getEvents(r));
- assertEquals(3, r.getValue());
-
- mService.mBinder.logEvents(Arrays.copyOfRange(EVENTS, 3, 8));
- mService.mBinder.logEvents(Arrays.copyOfRange(EVENTS, 8, 10));
-
- assertArrayEquals(Arrays.copyOfRange(EVENTS, 3, 10), mService.mBinder.getEvents(r));
- assertEquals(N_EVENTS, r.getValue());
-
- assertArrayEquals(NO_EVENTS, mService.mBinder.getEvents(r));
- assertEquals(N_EVENTS, r.getValue());
- }
-
- @SmallTest
- public void testMultipleGetAll() throws Exception {
- mService.mBinder.logEvents(Arrays.copyOf(EVENTS, 3));
-
- Reference r1 = new Reference(0);
- assertArrayEquals(Arrays.copyOf(EVENTS, 3), mService.mBinder.getEvents(r1));
- assertEquals(3, r1.getValue());
-
- mService.mBinder.logEvents(Arrays.copyOfRange(EVENTS, 3, 10));
-
- Reference r2 = new Reference(0);
- assertArrayEquals(EVENTS, mService.mBinder.getEvents(r2));
- assertEquals(N_EVENTS, r2.getValue());
- }
-
- @SmallTest
- public void testLogAndDumpConcurrently() throws Exception {
- for (int i = 0; i < 50; i++) {
- mContext = null;
- mService = null;
- setUp();
- logAndDumpConcurrently();
- }
- }
-
- public void logAndDumpConcurrently() throws Exception {
- final CountDownLatch latch = new CountDownLatch((int)N_EVENTS);
- final FileDescriptor fd = new FileOutputStream("/dev/null").getFD();
-
- for (ConnectivityMetricsEvent ev : EVENTS) {
- new Thread() {
- public void run() {
- mService.mBinder.logEvent(ev);
- latch.countDown();
- }
- }.start();
- }
-
- new Thread() {
- public void run() {
- while (latch.getCount() > 0) {
- mService.mBinder.dump(fd, new String[]{"--all"});
- }
- }
- }.start();
-
- latch.await(100, TimeUnit.MILLISECONDS);
-
- Reference r = new Reference(0);
- ConnectivityMetricsEvent[] got = mService.mBinder.getEvents(r);
- Arrays.sort(got, new EventComparator());
- assertArrayEquals(EVENTS, got);
- assertEquals(N_EVENTS, r.getValue());
- }
-
- static class EventComparator implements Comparator<ConnectivityMetricsEvent> {
- public int compare(ConnectivityMetricsEvent ev1, ConnectivityMetricsEvent ev2) {
- return Long.compare(ev1.timestamp, ev2.timestamp);
- }
- public boolean equal(Object o) {
- return o instanceof EventComparator;
- }
- };
-}
diff --git a/tests/net/java/com/android/server/connectivity/MetricsTestUtil.java b/tests/net/java/com/android/server/connectivity/MetricsTestUtil.java
index e201012..c5965e8 100644
--- a/tests/net/java/com/android/server/connectivity/MetricsTestUtil.java
+++ b/tests/net/java/com/android/server/connectivity/MetricsTestUtil.java
@@ -17,101 +17,59 @@
package com.android.server.connectivity;
import android.net.ConnectivityMetricsEvent;
-import android.net.ConnectivityMetricsLogger;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
+import java.util.function.Consumer;
+
abstract public class MetricsTestUtil {
private MetricsTestUtil() {
}
- static ConnectivityMetricsEvent ipEv(Parcelable p) {
- return ev(ConnectivityMetricsLogger.COMPONENT_TAG_CONNECTIVITY, p);
+ static ConnectivityMetricsEvent ev(Parcelable p) {
+ return new ConnectivityMetricsEvent(1L, 0, 0, p);
}
- static ConnectivityMetricsEvent telephonyEv() {
- return ev(ConnectivityMetricsLogger.COMPONENT_TAG_TELEPHONY, new Bundle());
- }
-
- static ConnectivityMetricsEvent ev(int tag, Parcelable p) {
- return new ConnectivityMetricsEvent(1L, tag, 0, p);
- }
-
- // Utiliy interface for describing the content of a Parcel. This relies on
- // the implementation defails of Parcelable and on the fact that the fully
- // qualified Parcelable class names are written as string in the Parcels.
- interface ParcelField {
- void write(Parcel p);
- }
-
- static ConnectivityMetricsEvent describeIpEvent(ParcelField... fs) {
+ static ConnectivityMetricsEvent describeIpEvent(Consumer<Parcel>... fs) {
Parcel p = Parcel.obtain();
- for (ParcelField f : fs) {
- f.write(p);
+ for (Consumer<Parcel> f : fs) {
+ f.accept(p);
}
p.setDataPosition(0);
- return ipEv(p.readParcelable(ClassLoader.getSystemClassLoader()));
+ return ev(p.readParcelable(ClassLoader.getSystemClassLoader()));
}
- static ParcelField aType(Class<?> c) {
- return new ParcelField() {
- public void write(Parcel p) {
- p.writeString(c.getName());
- }
- };
+ static Consumer<Parcel> aType(Class<?> c) {
+ return aString(c.getName());
}
- static ParcelField aBool(boolean b) {
+ static Consumer<Parcel> aBool(boolean b) {
return aByte((byte) (b ? 1 : 0));
}
- static ParcelField aByte(byte b) {
- return new ParcelField() {
- public void write(Parcel p) {
- p.writeByte(b);
- }
- };
+ static Consumer<Parcel> aByte(byte b) {
+ return (p) -> p.writeByte(b);
}
- static ParcelField anInt(int i) {
- return new ParcelField() {
- public void write(Parcel p) {
- p.writeInt(i);
- }
- };
+ static Consumer<Parcel> anInt(int i) {
+ return (p) -> p.writeInt(i);
}
- static ParcelField aLong(long l) {
- return new ParcelField() {
- public void write(Parcel p) {
- p.writeLong(l);
- }
- };
+ static Consumer<Parcel> aLong(long l) {
+ return (p) -> p.writeLong(l);
}
- static ParcelField aString(String s) {
- return new ParcelField() {
- public void write(Parcel p) {
- p.writeString(s);
- }
- };
+ static Consumer<Parcel> aString(String s) {
+ return (p) -> p.writeString(s);
}
- static ParcelField aByteArray(byte... ary) {
- return new ParcelField() {
- public void write(Parcel p) {
- p.writeByteArray(ary);
- }
- };
+ static Consumer<Parcel> aByteArray(byte... ary) {
+ return (p) -> p.writeByteArray(ary);
}
- static ParcelField anIntArray(int... ary) {
- return new ParcelField() {
- public void write(Parcel p) {
- p.writeIntArray(ary);
- }
- };
+ static Consumer<Parcel> anIntArray(int... ary) {
+ return (p) -> p.writeIntArray(ary);
}
static byte b(int i) {
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 3ed56df..c72efb0 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
@@ -32,6 +32,8 @@
import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.content.Context;
+import android.os.Handler;
+import android.os.Message;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.IConnectivityManager;
@@ -42,6 +44,10 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.internal.util.State;
+import com.android.internal.util.StateMachine;
+
+import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.junit.Test;
@@ -49,6 +55,7 @@
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -63,6 +70,7 @@
@Mock private Context mContext;
@Mock private IConnectivityManager mCS;
+ private TestStateMachine mSM;
private TestConnectivityManager mCM;
private UpstreamNetworkMonitor mUNM;
@@ -72,7 +80,15 @@
reset(mCS);
mCM = spy(new TestConnectivityManager(mContext, mCS));
- mUNM = new UpstreamNetworkMonitor(null, EVENT_UNM_UPDATE, (ConnectivityManager) mCM);
+ mSM = new TestStateMachine();
+ mUNM = new UpstreamNetworkMonitor(mSM, EVENT_UNM_UPDATE, (ConnectivityManager) mCM);
+ }
+
+ @After public void tearDown() throws Exception {
+ if (mSM != null) {
+ mSM.quit();
+ mSM = null;
+ }
}
@Test
@@ -139,15 +155,17 @@
mUNM.start();
verify(mCM, Mockito.times(1)).registerNetworkCallback(
- any(NetworkRequest.class), any(NetworkCallback.class));
- verify(mCM, Mockito.times(1)).registerDefaultNetworkCallback(any(NetworkCallback.class));
+ any(NetworkRequest.class), any(NetworkCallback.class), any(Handler.class));
+ verify(mCM, Mockito.times(1)).registerDefaultNetworkCallback(
+ any(NetworkCallback.class), any(Handler.class));
assertFalse(mUNM.mobileNetworkRequested());
assertEquals(0, mCM.requested.size());
mUNM.updateMobileRequiresDun(true);
mUNM.registerMobileNetworkRequest();
verify(mCM, Mockito.times(1)).requestNetwork(
- any(NetworkRequest.class), any(NetworkCallback.class), anyInt(), anyInt());
+ any(NetworkRequest.class), any(NetworkCallback.class), anyInt(), anyInt(),
+ any(Handler.class));
assertTrue(mUNM.mobileNetworkRequested());
assertUpstreamTypeRequested(TYPE_MOBILE_DUN);
@@ -224,6 +242,7 @@
}
public static class TestConnectivityManager extends ConnectivityManager {
+ public Map<NetworkCallback, Handler> allCallbacks = new HashMap<>();
public Set<NetworkCallback> trackingDefault = new HashSet<>();
public Map<NetworkCallback, NetworkRequest> listening = new HashMap<>();
public Map<NetworkCallback, NetworkRequest> requested = new HashMap<>();
@@ -234,7 +253,8 @@
}
boolean hasNoCallbacks() {
- return trackingDefault.isEmpty() &&
+ return allCallbacks.isEmpty() &&
+ trackingDefault.isEmpty() &&
listening.isEmpty() &&
requested.isEmpty() &&
legacyTypeMap.isEmpty();
@@ -262,14 +282,23 @@
}
@Override
- public void requestNetwork(NetworkRequest req, NetworkCallback cb) {
+ public void requestNetwork(NetworkRequest req, NetworkCallback cb, Handler h) {
+ assertFalse(allCallbacks.containsKey(cb));
+ allCallbacks.put(cb, h);
assertFalse(requested.containsKey(cb));
requested.put(cb, req);
}
@Override
+ public void requestNetwork(NetworkRequest req, NetworkCallback cb) {
+ fail("Should never be called.");
+ }
+
+ @Override
public void requestNetwork(NetworkRequest req, NetworkCallback cb,
- int timeoutMs, int legacyType) {
+ int timeoutMs, int legacyType, Handler h) {
+ assertFalse(allCallbacks.containsKey(cb));
+ allCallbacks.put(cb, h);
assertFalse(requested.containsKey(cb));
requested.put(cb, req);
assertFalse(legacyTypeMap.containsKey(cb));
@@ -279,18 +308,32 @@
}
@Override
- public void registerNetworkCallback(NetworkRequest req, NetworkCallback cb) {
+ public void registerNetworkCallback(NetworkRequest req, NetworkCallback cb, Handler h) {
+ assertFalse(allCallbacks.containsKey(cb));
+ allCallbacks.put(cb, h);
assertFalse(listening.containsKey(cb));
listening.put(cb, req);
}
@Override
- public void registerDefaultNetworkCallback(NetworkCallback cb) {
+ public void registerNetworkCallback(NetworkRequest req, NetworkCallback cb) {
+ fail("Should never be called.");
+ }
+
+ @Override
+ public void registerDefaultNetworkCallback(NetworkCallback cb, Handler h) {
+ assertFalse(allCallbacks.containsKey(cb));
+ allCallbacks.put(cb, h);
assertFalse(trackingDefault.contains(cb));
trackingDefault.add(cb);
}
@Override
+ public void registerDefaultNetworkCallback(NetworkCallback cb) {
+ fail("Should never be called.");
+ }
+
+ @Override
public void unregisterNetworkCallback(NetworkCallback cb) {
if (trackingDefault.contains(cb)) {
trackingDefault.remove(cb);
@@ -302,10 +345,35 @@
} else {
fail("Unexpected callback removed");
}
+ allCallbacks.remove(cb);
+ assertFalse(allCallbacks.containsKey(cb));
assertFalse(trackingDefault.contains(cb));
assertFalse(listening.containsKey(cb));
assertFalse(requested.containsKey(cb));
}
}
+
+ public static class TestStateMachine extends StateMachine {
+ public final ArrayList<Message> messages = new ArrayList<>();
+ private final State mLoggingState = new LoggingState();
+
+ class LoggingState extends State {
+ @Override public void enter() { messages.clear(); }
+
+ @Override public void exit() { messages.clear(); }
+
+ @Override public boolean processMessage(Message msg) {
+ messages.add(msg);
+ return true;
+ }
+ }
+
+ public TestStateMachine() {
+ super("UpstreamNetworkMonitor.TestStateMachine");
+ addState(mLoggingState);
+ setInitialState(mLoggingState);
+ super.start();
+ }
+ }
}
diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp
index cf5badc..881ac87 100644
--- a/tools/aapt/Resource.cpp
+++ b/tools/aapt/Resource.cpp
@@ -721,11 +721,6 @@
XMLNode::attribute_entry* existingEntry = node->editAttribute(ns, attr);
if (existingEntry != NULL) {
if (replaceExisting) {
- if (kIsDebug) {
- printf("Info: AndroidManifest.xml already defines %s (in %s);"
- " overwriting existing value from manifest.\n",
- String8(attr).string(), String8(ns).string());
- }
existingEntry->string = String16(value);
return true;
}
@@ -737,10 +732,6 @@
return false;
}
- fprintf(stderr, "Warning: AndroidManifest.xml already defines %s (in %s);"
- " using existing value in manifest.\n",
- String8(attr).string(), String8(ns).string());
-
// don't stop the build.
return true;
}
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index dabaca6..57036aa 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -1,5 +1,5 @@
//
-// Copyright (C) 2015 The Android Open Source Project
+// Copyright (C) 2017 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@
"diff/Diff.cpp",
"dump/Dump.cpp",
"link/Link.cpp",
- "strip/Strip.cpp",
+ "optimize/Optimize.cpp",
]
cc_defaults {
@@ -96,11 +96,11 @@
"link/ProductFilter.cpp",
"link/PrivateAttributeMover.cpp",
"link/ReferenceLinker.cpp",
- "link/ResourceDeduper.cpp",
"link/TableMerger.cpp",
- "link/VersionCollapser.cpp",
"link/XmlNamespaceRemover.cpp",
"link/XmlReferenceLinker.cpp",
+ "optimize/ResourceDeduper.cpp",
+ "optimize/VersionCollapser.cpp",
"process/SymbolTable.cpp",
"proto/ProtoHelpers.cpp",
"proto/TableProtoDeserializer.cpp",
diff --git a/tools/aapt2/LoadedApk.cpp b/tools/aapt2/LoadedApk.cpp
index 3d7bd94..1d04b35 100644
--- a/tools/aapt2/LoadedApk.cpp
+++ b/tools/aapt2/LoadedApk.cpp
@@ -58,7 +58,8 @@
return util::make_unique<LoadedApk>(source, std::move(apk), std::move(table));
}
-bool LoadedApk::WriteToArchive(IAaptContext* context, IArchiveWriter* writer) {
+bool LoadedApk::WriteToArchive(IAaptContext* context, const TableFlattenerOptions& options,
+ IArchiveWriter* writer) {
std::set<std::string> referenced_resources;
// List the files being referenced in the resource table.
for (auto& pkg : table_->packages) {
@@ -94,7 +95,9 @@
// The resource table needs to be reserialized since it might have changed.
if (path == "resources.arsc") {
BigBuffer buffer = BigBuffer(1024);
- TableFlattener flattener(&buffer);
+ // TODO(adamlesinski): How to determine if there were sparse entries (and if to encode
+ // with sparse entries) b/35389232.
+ TableFlattener flattener(options, &buffer);
if (!flattener.Consume(context, table_.get())) {
return false;
}
diff --git a/tools/aapt2/LoadedApk.h b/tools/aapt2/LoadedApk.h
index f8878d1..59eb816 100644
--- a/tools/aapt2/LoadedApk.h
+++ b/tools/aapt2/LoadedApk.h
@@ -21,6 +21,7 @@
#include "ResourceTable.h"
#include "flatten/Archive.h"
+#include "flatten/TableFlattener.h"
#include "io/ZipArchive.h"
#include "unflatten/BinaryResourceParser.h"
@@ -45,7 +46,8 @@
* Writes the APK on disk at the given path, while also removing the resource
* files that are not referenced in the resource table.
*/
- bool WriteToArchive(IAaptContext* context, IArchiveWriter* writer);
+ bool WriteToArchive(IAaptContext* context, const TableFlattenerOptions& options,
+ IArchiveWriter* writer);
static std::unique_ptr<LoadedApk> LoadApkFromPath(IAaptContext* context,
const android::StringPiece& path);
diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp
index ba378d7..38d9ef8 100644
--- a/tools/aapt2/Main.cpp
+++ b/tools/aapt2/Main.cpp
@@ -25,7 +25,7 @@
static const char* sMajorVersion = "2";
// Update minor version whenever a feature or flag is added.
-static const char* sMinorVersion = "7";
+static const char* sMinorVersion = "9";
int PrintVersion() {
std::cerr << "Android Asset Packaging Tool (aapt) " << sMajorVersion << "."
@@ -37,7 +37,7 @@
extern int Link(const std::vector<android::StringPiece>& args);
extern int Dump(const std::vector<android::StringPiece>& args);
extern int Diff(const std::vector<android::StringPiece>& args);
-extern int Strip(const std::vector<android::StringPiece>& args);
+extern int Optimize(const std::vector<android::StringPiece>& args);
} // namespace aapt
@@ -60,8 +60,8 @@
return aapt::Dump(args);
} else if (command == "diff") {
return aapt::Diff(args);
- } else if (command == "strip") {
- return aapt::Strip(args);
+ } else if (command == "optimize") {
+ return aapt::Optimize(args);
} else if (command == "version") {
return aapt::PrintVersion();
}
@@ -70,7 +70,7 @@
std::cerr << "no command specified\n";
}
- std::cerr << "\nusage: aapt2 [compile|link|dump|diff|strip|version] ..."
+ std::cerr << "\nusage: aapt2 [compile|link|dump|diff|optimize|version] ..."
<< std::endl;
return 1;
}
diff --git a/tools/aapt2/NameMangler.h b/tools/aapt2/NameMangler.h
index dba2d09..1305a4c 100644
--- a/tools/aapt2/NameMangler.h
+++ b/tools/aapt2/NameMangler.h
@@ -62,6 +62,8 @@
return policy_.packages_to_mangle.count(package) != 0;
}
+ const std::string& GetTargetPackageName() const { return policy_.target_package_name; }
+
/**
* Returns a mangled name that is a combination of `name` and `package`.
* The mangled name should contain symbols that are illegal to define in XML,
diff --git a/tools/aapt2/Resource.h b/tools/aapt2/Resource.h
index 4d915d9..493f238 100644
--- a/tools/aapt2/Resource.h
+++ b/tools/aapt2/Resource.h
@@ -118,6 +118,9 @@
bool is_valid() const;
};
+constexpr const uint8_t kAppPackageId = 0x7fu;
+constexpr const uint8_t kFrameworkPackageId = 0x01u;
+
/**
* A binary identifier representing a resource. Internally it
* is a 32bit integer split as follows:
@@ -138,6 +141,10 @@
ResourceId(uint8_t p, uint8_t t, uint16_t e);
bool is_valid() const;
+
+ // Returns true if the ID is a valid ID or dynamic ID (package ID can be 0).
+ bool is_valid_dynamic() const;
+
uint8_t package_id() const;
uint8_t type_id() const;
uint16_t entry_id() const;
@@ -211,6 +218,8 @@
return (id & 0xff000000u) != 0 && (id & 0x00ff0000u) != 0;
}
+inline bool ResourceId::is_valid_dynamic() const { return (id & 0x00ff0000u) != 0; }
+
inline uint8_t ResourceId::package_id() const {
return static_cast<uint8_t>(id >> 24);
}
diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp
index 47ca266..8461905 100644
--- a/tools/aapt2/ResourceParser.cpp
+++ b/tools/aapt2/ResourceParser.cpp
@@ -701,14 +701,11 @@
out_resource->name.type = *parsed_type;
- if (Maybe<StringPiece> maybe_id_str =
- xml::FindNonEmptyAttribute(parser, "id")) {
- Maybe<ResourceId> maybe_id =
- ResourceUtils::ParseResourceId(maybe_id_str.value());
+ if (Maybe<StringPiece> maybe_id_str = xml::FindNonEmptyAttribute(parser, "id")) {
+ Maybe<ResourceId> maybe_id = ResourceUtils::ParseResourceId(maybe_id_str.value());
if (!maybe_id) {
- diag_->Error(DiagMessage(out_resource->source) << "invalid resource ID '"
- << maybe_id.value()
- << "' in <public>");
+ diag_->Error(DiagMessage(out_resource->source)
+ << "invalid resource ID '" << maybe_id_str.value() << "' in <public>");
return false;
}
out_resource->id = maybe_id.value();
diff --git a/tools/aapt2/ResourceTable.cpp b/tools/aapt2/ResourceTable.cpp
index dd78750..6e4b450 100644
--- a/tools/aapt2/ResourceTable.cpp
+++ b/tools/aapt2/ResourceTable.cpp
@@ -387,8 +387,7 @@
}
ResourceTablePackage* package = FindOrCreatePackage(name.package);
- if (res_id.is_valid() && package->id &&
- package->id.value() != res_id.package_id()) {
+ if (res_id.is_valid_dynamic() && package->id && package->id.value() != res_id.package_id()) {
diag->Error(DiagMessage(value->GetSource())
<< "trying to add resource '" << name << "' with ID " << res_id
<< " but package '" << package->name << "' already has ID "
@@ -397,7 +396,7 @@
}
ResourceTableType* type = package->FindOrCreateType(name.type);
- if (res_id.is_valid() && type->id && type->id.value() != res_id.type_id()) {
+ if (res_id.is_valid_dynamic() && type->id && type->id.value() != res_id.type_id()) {
diag->Error(DiagMessage(value->GetSource())
<< "trying to add resource '" << name << "' with ID " << res_id
<< " but type '" << type->type << "' already has ID "
@@ -406,8 +405,7 @@
}
ResourceEntry* entry = type->FindOrCreateEntry(name.entry);
- if (res_id.is_valid() && entry->id &&
- entry->id.value() != res_id.entry_id()) {
+ if (res_id.is_valid_dynamic() && entry->id && entry->id.value() != res_id.entry_id()) {
diag->Error(DiagMessage(value->GetSource())
<< "trying to add resource '" << name << "' with ID " << res_id
<< " but resource already has ID "
@@ -441,7 +439,7 @@
}
}
- if (res_id.is_valid()) {
+ if (res_id.is_valid_dynamic()) {
package->id = res_id.package_id();
type->id = res_id.type_id();
entry->id = res_id.entry_id();
@@ -480,8 +478,7 @@
}
ResourceTablePackage* package = FindOrCreatePackage(name.package);
- if (res_id.is_valid() && package->id &&
- package->id.value() != res_id.package_id()) {
+ if (res_id.is_valid_dynamic() && package->id && package->id.value() != res_id.package_id()) {
diag->Error(DiagMessage(symbol.source)
<< "trying to add resource '" << name << "' with ID " << res_id
<< " but package '" << package->name << "' already has ID "
@@ -490,7 +487,7 @@
}
ResourceTableType* type = package->FindOrCreateType(name.type);
- if (res_id.is_valid() && type->id && type->id.value() != res_id.type_id()) {
+ if (res_id.is_valid_dynamic() && type->id && type->id.value() != res_id.type_id()) {
diag->Error(DiagMessage(symbol.source)
<< "trying to add resource '" << name << "' with ID " << res_id
<< " but type '" << type->type << "' already has ID "
@@ -499,8 +496,7 @@
}
ResourceEntry* entry = type->FindOrCreateEntry(name.entry);
- if (res_id.is_valid() && entry->id &&
- entry->id.value() != res_id.entry_id()) {
+ if (res_id.is_valid_dynamic() && entry->id && entry->id.value() != res_id.entry_id()) {
diag->Error(DiagMessage(symbol.source)
<< "trying to add resource '" << name << "' with ID " << res_id
<< " but resource already has ID "
@@ -509,7 +505,7 @@
return false;
}
- if (res_id.is_valid()) {
+ if (res_id.is_valid_dynamic()) {
package->id = res_id.package_id();
type->id = res_id.type_id();
entry->id = res_id.entry_id();
diff --git a/tools/aapt2/ResourceTable.h b/tools/aapt2/ResourceTable.h
index 0fe966c..6b69aaf 100644
--- a/tools/aapt2/ResourceTable.h
+++ b/tools/aapt2/ResourceTable.h
@@ -158,11 +158,8 @@
DISALLOW_COPY_AND_ASSIGN(ResourceTableType);
};
-enum class PackageType { System, Vendor, App, Dynamic };
-
class ResourceTablePackage {
public:
- PackageType type = PackageType::App;
Maybe<uint8_t> id;
std::string name;
@@ -241,6 +238,19 @@
Maybe<SearchResult> FindResource(const ResourceNameRef& name);
/**
+ * Returns the package struct with the given name, or nullptr if such a
+ * package does not
+ * exist. The empty string is a valid package and typically is used to
+ * represent the
+ * 'current' package before it is known to the ResourceTable.
+ */
+ ResourceTablePackage* FindPackage(const android::StringPiece& name);
+
+ ResourceTablePackage* FindPackageById(uint8_t id);
+
+ ResourceTablePackage* CreatePackage(const android::StringPiece& name, Maybe<uint8_t> id = {});
+
+ /**
* The string pool used by this resource table. Values that reference strings
* must use
* this pool to create their strings.
@@ -259,18 +269,9 @@
*/
std::vector<std::unique_ptr<ResourceTablePackage>> packages;
- /**
- * Returns the package struct with the given name, or nullptr if such a
- * package does not
- * exist. The empty string is a valid package and typically is used to
- * represent the
- * 'current' package before it is known to the ResourceTable.
- */
- ResourceTablePackage* FindPackage(const android::StringPiece& name);
-
- ResourceTablePackage* FindPackageById(uint8_t id);
-
- ResourceTablePackage* CreatePackage(const android::StringPiece& name, Maybe<uint8_t> id = {});
+ // Set of dynamic packages that this table may reference. Their package names get encoded
+ // into the resources.arsc along with their compile-time assigned IDs.
+ std::map<size_t, std::string> included_packages_;
private:
ResourceTablePackage* FindOrCreatePackage(const android::StringPiece& name);
diff --git a/tools/aapt2/ResourceUtils.cpp b/tools/aapt2/ResourceUtils.cpp
index 150dc58..ca6738b 100644
--- a/tools/aapt2/ResourceUtils.cpp
+++ b/tools/aapt2/ResourceUtils.cpp
@@ -469,7 +469,7 @@
if (android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
if (value.dataType == android::Res_value::TYPE_INT_HEX) {
ResourceId id(value.data);
- if (id.is_valid()) {
+ if (id.is_valid_dynamic()) {
return id;
}
}
@@ -533,6 +533,7 @@
case android::Res_value::TYPE_REFERENCE:
case android::Res_value::TYPE_ATTRIBUTE:
case android::Res_value::TYPE_DYNAMIC_REFERENCE:
+ case android::Res_value::TYPE_DYNAMIC_ATTRIBUTE:
return android::ResTable_map::TYPE_REFERENCE;
case android::Res_value::TYPE_STRING:
diff --git a/tools/aapt2/ResourceValues.cpp b/tools/aapt2/ResourceValues.cpp
index f75ed7a..2868b2a 100644
--- a/tools/aapt2/ResourceValues.cpp
+++ b/tools/aapt2/ResourceValues.cpp
@@ -88,10 +88,24 @@
}
bool Reference::Flatten(android::Res_value* out_value) const {
- out_value->dataType = (reference_type == Reference::Type::kResource)
- ? android::Res_value::TYPE_REFERENCE
- : android::Res_value::TYPE_ATTRIBUTE;
- out_value->data = util::HostToDevice32(id ? id.value().id : 0);
+ const ResourceId resid = id.value_or_default(ResourceId(0));
+ const bool dynamic =
+ (resid.package_id() != kFrameworkPackageId && resid.package_id() != kAppPackageId);
+
+ if (reference_type == Reference::Type::kResource) {
+ if (dynamic) {
+ out_value->dataType = android::Res_value::TYPE_DYNAMIC_REFERENCE;
+ } else {
+ out_value->dataType = android::Res_value::TYPE_REFERENCE;
+ }
+ } else {
+ if (dynamic) {
+ out_value->dataType = android::Res_value::TYPE_DYNAMIC_ATTRIBUTE;
+ } else {
+ out_value->dataType = android::Res_value::TYPE_ATTRIBUTE;
+ }
+ }
+ out_value->data = util::HostToDevice32(resid.id);
return true;
}
diff --git a/tools/aapt2/SdkConstants.h b/tools/aapt2/SdkConstants.h
index 98ba94b..c2ee252 100644
--- a/tools/aapt2/SdkConstants.h
+++ b/tools/aapt2/SdkConstants.h
@@ -25,7 +25,7 @@
namespace aapt {
-enum {
+enum : int {
SDK_CUPCAKE = 3,
SDK_DONUT = 4,
SDK_ECLAIR = 5,
@@ -49,7 +49,7 @@
SDK_MARSHMALLOW = 23,
SDK_NOUGAT = 24,
SDK_NOUGAT_MR1 = 25,
- SDK_O = 26, // STOPSHIP Replace with real version
+ SDK_O = 26, // STOPSHIP Replace with real version
};
size_t FindAttributeSdkLevel(const ResourceId& id);
diff --git a/tools/aapt2/ValueVisitor.h b/tools/aapt2/ValueVisitor.h
index 1cb6aa1..2763d49 100644
--- a/tools/aapt2/ValueVisitor.h
+++ b/tools/aapt2/ValueVisitor.h
@@ -29,7 +29,8 @@
struct RawValueVisitor {
virtual ~RawValueVisitor() = default;
- virtual void VisitItem(Item* value) {}
+ virtual void VisitAny(Value* value) {}
+ virtual void VisitItem(Item* value) { VisitAny(value); }
virtual void Visit(Reference* value) { VisitItem(value); }
virtual void Visit(RawString* value) { VisitItem(value); }
virtual void Visit(String* value) { VisitItem(value); }
@@ -38,11 +39,11 @@
virtual void Visit(Id* value) { VisitItem(value); }
virtual void Visit(BinaryPrimitive* value) { VisitItem(value); }
- virtual void Visit(Attribute* value) {}
- virtual void Visit(Style* value) {}
- virtual void Visit(Array* value) {}
- virtual void Visit(Plural* value) {}
- virtual void Visit(Styleable* value) {}
+ virtual void Visit(Attribute* value) { VisitAny(value); }
+ virtual void Visit(Style* value) { VisitAny(value); }
+ virtual void Visit(Array* value) { VisitAny(value); }
+ virtual void Visit(Plural* value) { VisitAny(value); }
+ virtual void Visit(Styleable* value) { VisitAny(value); }
};
// NOLINT, do not add parentheses around T.
diff --git a/tools/aapt2/compile/IdAssigner.h b/tools/aapt2/compile/IdAssigner.h
index 9640eb8..3dcb1eb 100644
--- a/tools/aapt2/compile/IdAssigner.h
+++ b/tools/aapt2/compile/IdAssigner.h
@@ -26,11 +26,8 @@
namespace aapt {
-/**
- * Assigns IDs to each resource in the table, respecting existing IDs and
- * filling in gaps
- * in between fixed ID assignments.
- */
+// Assigns IDs to each resource in the table, respecting existing IDs and
+// filling in gaps in between fixed ID assignments.
class IdAssigner : public IResourceTableConsumer {
public:
IdAssigner() = default;
diff --git a/tools/aapt2/diff/Diff.cpp b/tools/aapt2/diff/Diff.cpp
index acebeda..c877468 100644
--- a/tools/aapt2/diff/Diff.cpp
+++ b/tools/aapt2/diff/Diff.cpp
@@ -28,6 +28,8 @@
class DiffContext : public IAaptContext {
public:
+ DiffContext() : name_mangler_({}), symbol_table_(&name_mangler_) {}
+
const std::string& GetCompilationPackage() override { return empty_; }
uint8_t GetPackageId() override { return 0x0; }
@@ -45,7 +47,7 @@
private:
std::string empty_;
StdErrDiagnostics diagnostics_;
- NameMangler name_mangler_ = NameMangler(NameManglerPolicy{});
+ NameMangler name_mangler_;
SymbolTable symbol_table_;
};
diff --git a/tools/aapt2/flatten/TableFlattener.cpp b/tools/aapt2/flatten/TableFlattener.cpp
index 19d030e..3098458 100644
--- a/tools/aapt2/flatten/TableFlattener.cpp
+++ b/tools/aapt2/flatten/TableFlattener.cpp
@@ -26,6 +26,7 @@
#include "ResourceTable.h"
#include "ResourceValues.h"
+#include "SdkConstants.h"
#include "ValueVisitor.h"
#include "flatten/ChunkWriter.h"
#include "flatten/ResourceTypeExtensions.h"
@@ -216,13 +217,17 @@
class PackageFlattener {
public:
- PackageFlattener(IDiagnostics* diag, ResourceTablePackage* package)
- : diag_(diag), package_(package) {}
+ PackageFlattener(IAaptContext* context, ResourceTablePackage* package,
+ const std::map<size_t, std::string>* shared_libs, bool use_sparse_entries)
+ : context_(context),
+ diag_(context->GetDiagnostics()),
+ package_(package),
+ shared_libs_(shared_libs),
+ use_sparse_entries_(use_sparse_entries) {}
bool FlattenPackage(BigBuffer* buffer) {
ChunkWriter pkg_writer(buffer);
- ResTable_package* pkg_header =
- pkg_writer.StartChunk<ResTable_package>(RES_TABLE_PACKAGE_TYPE);
+ ResTable_package* pkg_header = pkg_writer.StartChunk<ResTable_package>(RES_TABLE_PACKAGE_TYPE);
pkg_header->id = util::HostToDevice32(package_->id.value());
if (package_->name.size() >= arraysize(pkg_header->name)) {
@@ -249,6 +254,11 @@
// Append the types.
buffer->AppendBuffer(std::move(type_buffer));
+ // If there are libraries (or if the package ID is 0x00), encode a library chunk.
+ if (package_->id.value() == 0x00 || !shared_libs_->empty()) {
+ FlattenLibrarySpec(buffer);
+ }
+
pkg_writer.Finish();
return true;
}
@@ -298,9 +308,12 @@
return true;
}
- bool FlattenConfig(const ResourceTableType* type,
- const ConfigDescription& config,
- std::vector<FlatEntry>* entries, BigBuffer* buffer) {
+ bool FlattenConfig(const ResourceTableType* type, const ConfigDescription& config,
+ const size_t num_total_entries, std::vector<FlatEntry>* entries,
+ BigBuffer* buffer) {
+ CHECK(num_total_entries != 0);
+ CHECK(num_total_entries <= std::numeric_limits<uint16_t>::max());
+
ChunkWriter type_writer(buffer);
ResTable_type* type_header =
type_writer.StartChunk<ResTable_type>(RES_TABLE_TYPE_TYPE);
@@ -308,39 +321,60 @@
type_header->config = config;
type_header->config.swapHtoD();
- auto max_accum = [](uint32_t max,
- const std::unique_ptr<ResourceEntry>& a) -> uint32_t {
- return std::max(max, (uint32_t)a->id.value());
- };
+ std::vector<uint32_t> offsets;
+ offsets.resize(num_total_entries, 0xffffffffu);
- // Find the largest entry ID. That is how many entries we will have.
- const uint32_t entry_count =
- std::accumulate(type->entries.begin(), type->entries.end(), 0,
- max_accum) +
- 1;
-
- type_header->entryCount = util::HostToDevice32(entry_count);
- uint32_t* indices = type_writer.NextBlock<uint32_t>(entry_count);
-
- CHECK((size_t)entry_count <= std::numeric_limits<uint16_t>::max());
- memset(indices, 0xff, entry_count * sizeof(uint32_t));
-
- type_header->entriesStart = util::HostToDevice32(type_writer.size());
-
- const size_t entry_start = type_writer.buffer()->size();
+ BigBuffer values_buffer(512);
for (FlatEntry& flat_entry : *entries) {
- CHECK(flat_entry.entry->id.value() < entry_count);
- indices[flat_entry.entry->id.value()] =
- util::HostToDevice32(type_writer.buffer()->size() - entry_start);
- if (!FlattenValue(&flat_entry, type_writer.buffer())) {
+ CHECK(static_cast<size_t>(flat_entry.entry->id.value()) < num_total_entries);
+ offsets[flat_entry.entry->id.value()] = values_buffer.size();
+ if (!FlattenValue(&flat_entry, &values_buffer)) {
diag_->Error(DiagMessage()
<< "failed to flatten resource '"
- << ResourceNameRef(package_->name, type->type,
- flat_entry.entry->name)
+ << ResourceNameRef(package_->name, type->type, flat_entry.entry->name)
<< "' for configuration '" << config << "'");
return false;
}
}
+
+ bool sparse_encode = use_sparse_entries_;
+
+ // Only sparse encode if the entries will be read on platforms O+.
+ sparse_encode =
+ sparse_encode && (context_->GetMinSdkVersion() >= SDK_O || config.sdkVersion >= SDK_O);
+
+ // Only sparse encode if the offsets are representable in 2 bytes.
+ sparse_encode =
+ sparse_encode && (values_buffer.size() / 4u) <= std::numeric_limits<uint16_t>::max();
+
+ // Only sparse encode if the ratio of populated entries to total entries is below some
+ // threshold.
+ sparse_encode =
+ sparse_encode && ((100 * entries->size()) / num_total_entries) < kSparseEncodingThreshold;
+
+ if (sparse_encode) {
+ type_header->entryCount = util::HostToDevice32(entries->size());
+ type_header->flags |= ResTable_type::FLAG_SPARSE;
+ ResTable_sparseTypeEntry* indices =
+ type_writer.NextBlock<ResTable_sparseTypeEntry>(entries->size());
+ for (size_t i = 0; i < num_total_entries; i++) {
+ if (offsets[i] != ResTable_type::NO_ENTRY) {
+ CHECK((offsets[i] & 0x03) == 0);
+ indices->idx = util::HostToDevice16(i);
+ indices->offset = util::HostToDevice16(offsets[i] / 4u);
+ indices++;
+ }
+ }
+ } else {
+ type_header->entryCount = util::HostToDevice32(num_total_entries);
+ uint32_t* indices = type_writer.NextBlock<uint32_t>(num_total_entries);
+ for (size_t i = 0; i < num_total_entries; i++) {
+ indices[i] = util::HostToDevice32(offsets[i]);
+ }
+ }
+
+ type_header->entriesStart = util::HostToDevice32(type_writer.size());
+ type_writer.buffer()->AppendBuffer(std::move(values_buffer));
type_writer.Finish();
return true;
}
@@ -370,8 +404,7 @@
CHECK(bool(entry->id)) << "entry must have an ID set";
sorted_entries.push_back(entry.get());
}
- std::sort(sorted_entries.begin(), sorted_entries.end(),
- cmp_ids<ResourceEntry>);
+ std::sort(sorted_entries.begin(), sorted_entries.end(), cmp_ids<ResourceEntry>);
return sorted_entries;
}
@@ -443,22 +476,26 @@
type_pool_.MakeRef(ToString(type->type));
std::vector<ResourceEntry*> sorted_entries = CollectAndSortEntries(type);
+ if (sorted_entries.empty()) {
+ continue;
+ }
if (!FlattenTypeSpec(type, &sorted_entries, buffer)) {
return false;
}
+ // Since the entries are sorted by ID, the last ID will be the largest.
+ const size_t num_entries = sorted_entries.back()->id.value() + 1;
+
// The binary resource table lists resource entries for each
// configuration.
// We store them inverted, where a resource entry lists the values for
// each
// configuration available. Here we reverse this to match the binary
// table.
- std::map<ConfigDescription, std::vector<FlatEntry>>
- config_to_entry_list_map;
+ std::map<ConfigDescription, std::vector<FlatEntry>> config_to_entry_list_map;
for (ResourceEntry* entry : sorted_entries) {
- const uint32_t key_index =
- (uint32_t)key_pool_.MakeRef(entry->name).index();
+ const uint32_t key_index = (uint32_t)key_pool_.MakeRef(entry->name).index();
// Group values by configuration.
for (auto& config_value : entry->values) {
@@ -469,7 +506,7 @@
// Flatten a configuration value.
for (auto& entry : config_to_entry_list_map) {
- if (!FlattenConfig(type, entry.first, &entry.second, buffer)) {
+ if (!FlattenConfig(type, entry.first, num_entries, &entry.second, buffer)) {
return false;
}
}
@@ -477,8 +514,39 @@
return true;
}
+ void FlattenLibrarySpec(BigBuffer* buffer) {
+ ChunkWriter lib_writer(buffer);
+ ResTable_lib_header* lib_header =
+ lib_writer.StartChunk<ResTable_lib_header>(RES_TABLE_LIBRARY_TYPE);
+
+ const size_t num_entries = (package_->id.value() == 0x00 ? 1 : 0) + shared_libs_->size();
+ CHECK(num_entries > 0);
+
+ lib_header->count = util::HostToDevice32(num_entries);
+
+ ResTable_lib_entry* lib_entry = buffer->NextBlock<ResTable_lib_entry>(num_entries);
+ if (package_->id.value() == 0x00) {
+ // Add this package
+ lib_entry->packageId = util::HostToDevice32(0x00);
+ strcpy16_htod(lib_entry->packageName, arraysize(lib_entry->packageName),
+ util::Utf8ToUtf16(package_->name));
+ ++lib_entry;
+ }
+
+ for (auto& map_entry : *shared_libs_) {
+ lib_entry->packageId = util::HostToDevice32(map_entry.first);
+ strcpy16_htod(lib_entry->packageName, arraysize(lib_entry->packageName),
+ util::Utf8ToUtf16(map_entry.second));
+ ++lib_entry;
+ }
+ lib_writer.Finish();
+ }
+
+ IAaptContext* context_;
IDiagnostics* diag_;
ResourceTablePackage* package_;
+ const std::map<size_t, std::string>* shared_libs_;
+ bool use_sparse_entries_;
StringPool type_pool_;
StringPool key_pool_;
};
@@ -513,7 +581,8 @@
// Flatten each package.
for (auto& package : table->packages) {
- PackageFlattener flattener(context->GetDiagnostics(), package.get());
+ PackageFlattener flattener(context, package.get(), &table->included_packages_,
+ options_.use_sparse_entries);
if (!flattener.FlattenPackage(&package_buffer)) {
return false;
}
diff --git a/tools/aapt2/flatten/TableFlattener.h b/tools/aapt2/flatten/TableFlattener.h
index 53f52c2..223aef8 100644
--- a/tools/aapt2/flatten/TableFlattener.h
+++ b/tools/aapt2/flatten/TableFlattener.h
@@ -25,15 +25,29 @@
namespace aapt {
+// The percentage of used entries for a type for which using a sparse encoding is
+// preferred.
+constexpr const size_t kSparseEncodingThreshold = 60;
+
+struct TableFlattenerOptions {
+ // When true, types for configurations with a sparse set of entries are encoded
+ // as a sparse map of entry ID and offset to actual data.
+ // This is only available on platforms O+ and will only be respected when
+ // minSdk is O+.
+ bool use_sparse_entries = false;
+};
+
class TableFlattener : public IResourceTableConsumer {
public:
- explicit TableFlattener(BigBuffer* buffer) : buffer_(buffer) {}
+ explicit TableFlattener(const TableFlattenerOptions& options, BigBuffer* buffer)
+ : options_(options), buffer_(buffer) {}
bool Consume(IAaptContext* context, ResourceTable* table) override;
private:
DISALLOW_COPY_AND_ASSIGN(TableFlattener);
+ TableFlattenerOptions options_;
BigBuffer* buffer_;
};
diff --git a/tools/aapt2/flatten/TableFlattener_test.cpp b/tools/aapt2/flatten/TableFlattener_test.cpp
index c726240..4196187 100644
--- a/tools/aapt2/flatten/TableFlattener_test.cpp
+++ b/tools/aapt2/flatten/TableFlattener_test.cpp
@@ -16,7 +16,10 @@
#include "flatten/TableFlattener.h"
+#include "android-base/stringprintf.h"
+
#include "ResourceUtils.h"
+#include "SdkConstants.h"
#include "test/Test.h"
#include "unflatten/BinaryResourceParser.h"
#include "util/Util.h"
@@ -34,32 +37,40 @@
.Build();
}
- ::testing::AssertionResult Flatten(ResourceTable* table,
- ResTable* out_table) {
+ ::testing::AssertionResult Flatten(IAaptContext* context, const TableFlattenerOptions& options,
+ ResourceTable* table, std::string* out_content) {
BigBuffer buffer(1024);
- TableFlattener flattener(&buffer);
- if (!flattener.Consume(context_.get(), table)) {
+ TableFlattener flattener(options, &buffer);
+ if (!flattener.Consume(context, table)) {
return ::testing::AssertionFailure() << "failed to flatten ResourceTable";
}
+ *out_content = buffer.to_string();
+ return ::testing::AssertionSuccess();
+ }
- std::unique_ptr<uint8_t[]> data = util::Copy(buffer);
- if (out_table->add(data.get(), buffer.size(), -1, true) != NO_ERROR) {
+ ::testing::AssertionResult Flatten(IAaptContext* context, const TableFlattenerOptions& options,
+ ResourceTable* table, ResTable* out_table) {
+ std::string content;
+ auto result = Flatten(context, options, table, &content);
+ if (!result) {
+ return result;
+ }
+
+ if (out_table->add(content.data(), content.size(), 1, true) != NO_ERROR) {
return ::testing::AssertionFailure() << "flattened ResTable is corrupt";
}
return ::testing::AssertionSuccess();
}
- ::testing::AssertionResult Flatten(ResourceTable* table,
- ResourceTable* out_table) {
- BigBuffer buffer(1024);
- TableFlattener flattener(&buffer);
- if (!flattener.Consume(context_.get(), table)) {
- return ::testing::AssertionFailure() << "failed to flatten ResourceTable";
+ ::testing::AssertionResult Flatten(IAaptContext* context, const TableFlattenerOptions& options,
+ ResourceTable* table, ResourceTable* out_table) {
+ std::string content;
+ auto result = Flatten(context, options, table, &content);
+ if (!result) {
+ return result;
}
- std::unique_ptr<uint8_t[]> data = util::Copy(buffer);
- BinaryResourceParser parser(context_.get(), out_table, {}, data.get(),
- buffer.size());
+ BinaryResourceParser parser(context, out_table, {}, content.data(), content.size());
if (!parser.Parse()) {
return ::testing::AssertionFailure() << "flattened ResTable is corrupt";
}
@@ -127,7 +138,7 @@
return ::testing::AssertionSuccess();
}
- private:
+ protected:
std::unique_ptr<IAaptContext> context_;
};
@@ -153,7 +164,7 @@
.Build();
ResTable res_table;
- ASSERT_TRUE(Flatten(table.get(), &res_table));
+ ASSERT_TRUE(Flatten(context_.get(), {}, table.get(), &res_table));
EXPECT_TRUE(Exists(&res_table, "com.app.test:id/one", ResourceId(0x7f020000),
{}, Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
@@ -200,7 +211,7 @@
.Build();
ResTable res_table;
- ASSERT_TRUE(Flatten(table.get(), &res_table));
+ ASSERT_TRUE(Flatten(context_.get(), {}, table.get(), &res_table));
EXPECT_TRUE(Exists(&res_table, "com.app.test:id/one", ResourceId(0x7f020001),
{}, Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
@@ -222,7 +233,7 @@
.Build();
ResourceTable result;
- ASSERT_TRUE(Flatten(table.get(), &result));
+ ASSERT_TRUE(Flatten(context_.get(), {}, table.get(), &result));
Attribute* actualAttr =
test::GetValue<Attribute>(&result, "android:attr/foo");
@@ -233,4 +244,171 @@
EXPECT_EQ(attr.max_int, actualAttr->max_int);
}
+static std::unique_ptr<ResourceTable> BuildTableWithSparseEntries(
+ IAaptContext* context, const ConfigDescription& sparse_config, float load) {
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .SetPackageId(context->GetCompilationPackage(), context->GetPackageId())
+ .Build();
+
+ // Add regular entries.
+ int stride = static_cast<int>(1.0f / load);
+ for (int i = 0; i < 100; i++) {
+ const ResourceName name = test::ParseNameOrDie(
+ base::StringPrintf("%s:string/foo_%d", context->GetCompilationPackage().data(), i));
+ const ResourceId resid(context->GetPackageId(), 0x02, static_cast<uint16_t>(i));
+ const auto value =
+ util::make_unique<BinaryPrimitive>(Res_value::TYPE_INT_DEC, static_cast<uint32_t>(i));
+ CHECK(table->AddResource(name, resid, ConfigDescription::DefaultConfig(), "",
+ std::unique_ptr<Value>(value->Clone(nullptr)),
+ context->GetDiagnostics()));
+
+ // Every few entries, write out a sparse_config value. This will give us the desired load.
+ if (i % stride == 0) {
+ CHECK(table->AddResource(name, resid, sparse_config, "",
+ std::unique_ptr<Value>(value->Clone(nullptr)),
+ context->GetDiagnostics()));
+ }
+ }
+ return table;
+}
+
+TEST_F(TableFlattenerTest, FlattenSparseEntryWithMinSdkO) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder()
+ .SetCompilationPackage("android")
+ .SetPackageId(0x01)
+ .SetMinSdkVersion(SDK_O)
+ .Build();
+
+ const ConfigDescription sparse_config = test::ParseConfigOrDie("en-rGB");
+ auto table_in = BuildTableWithSparseEntries(context.get(), sparse_config, 0.25f);
+
+ TableFlattenerOptions options;
+ options.use_sparse_entries = true;
+
+ std::string no_sparse_contents;
+ ASSERT_TRUE(Flatten(context.get(), {}, table_in.get(), &no_sparse_contents));
+
+ std::string sparse_contents;
+ ASSERT_TRUE(Flatten(context.get(), options, table_in.get(), &sparse_contents));
+
+ EXPECT_GT(no_sparse_contents.size(), sparse_contents.size());
+
+ // Attempt to parse the sparse contents.
+
+ ResourceTable sparse_table;
+ BinaryResourceParser parser(context.get(), &sparse_table, Source("test.arsc"),
+ sparse_contents.data(), sparse_contents.size());
+ ASSERT_TRUE(parser.Parse());
+
+ auto value = test::GetValueForConfig<BinaryPrimitive>(&sparse_table, "android:string/foo_0",
+ sparse_config);
+ ASSERT_NE(nullptr, value);
+ EXPECT_EQ(0u, value->value.data);
+
+ ASSERT_EQ(nullptr, test::GetValueForConfig<BinaryPrimitive>(&sparse_table, "android:string/foo_1",
+ sparse_config));
+
+ value = test::GetValueForConfig<BinaryPrimitive>(&sparse_table, "android:string/foo_4",
+ sparse_config);
+ ASSERT_NE(nullptr, value);
+ EXPECT_EQ(4u, value->value.data);
+}
+
+TEST_F(TableFlattenerTest, FlattenSparseEntryWithConfigSdkVersionO) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder()
+ .SetCompilationPackage("android")
+ .SetPackageId(0x01)
+ .SetMinSdkVersion(SDK_LOLLIPOP)
+ .Build();
+
+ const ConfigDescription sparse_config = test::ParseConfigOrDie("en-rGB-v26");
+ auto table_in = BuildTableWithSparseEntries(context.get(), sparse_config, 0.25f);
+
+ TableFlattenerOptions options;
+ options.use_sparse_entries = true;
+
+ std::string no_sparse_contents;
+ ASSERT_TRUE(Flatten(context.get(), {}, table_in.get(), &no_sparse_contents));
+
+ std::string sparse_contents;
+ ASSERT_TRUE(Flatten(context.get(), options, table_in.get(), &sparse_contents));
+
+ EXPECT_GT(no_sparse_contents.size(), sparse_contents.size());
+}
+
+TEST_F(TableFlattenerTest, DoNotUseSparseEntryForDenseConfig) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder()
+ .SetCompilationPackage("android")
+ .SetPackageId(0x01)
+ .SetMinSdkVersion(SDK_O)
+ .Build();
+
+ const ConfigDescription sparse_config = test::ParseConfigOrDie("en-rGB");
+ auto table_in = BuildTableWithSparseEntries(context.get(), sparse_config, 0.80f);
+
+ TableFlattenerOptions options;
+ options.use_sparse_entries = true;
+
+ std::string no_sparse_contents;
+ ASSERT_TRUE(Flatten(context.get(), {}, table_in.get(), &no_sparse_contents));
+
+ std::string sparse_contents;
+ ASSERT_TRUE(Flatten(context.get(), options, table_in.get(), &sparse_contents));
+
+ EXPECT_EQ(no_sparse_contents.size(), sparse_contents.size());
+}
+
+TEST_F(TableFlattenerTest, FlattenSharedLibrary) {
+ std::unique_ptr<IAaptContext> context =
+ test::ContextBuilder().SetCompilationPackage("lib").SetPackageId(0x00).Build();
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .SetPackageId("lib", 0x00)
+ .AddValue("lib:id/foo", ResourceId(0x00010000), util::make_unique<Id>())
+ .Build();
+ ResourceTable result;
+ ASSERT_TRUE(Flatten(context.get(), {}, table.get(), &result));
+
+ Maybe<ResourceTable::SearchResult> search_result =
+ result.FindResource(test::ParseNameOrDie("lib:id/foo"));
+ AAPT_ASSERT_TRUE(search_result);
+ EXPECT_EQ(0x00u, search_result.value().package->id.value());
+
+ auto iter = result.included_packages_.find(0x00);
+ ASSERT_NE(result.included_packages_.end(), iter);
+ EXPECT_EQ("lib", iter->second);
+}
+
+TEST_F(TableFlattenerTest, FlattenTableReferencingSharedLibraries) {
+ std::unique_ptr<IAaptContext> context =
+ test::ContextBuilder().SetCompilationPackage("app").SetPackageId(0x7f).Build();
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .SetPackageId("app", 0x7f)
+ .AddValue("app:id/foo", ResourceId(0x7f010000),
+ test::BuildReference("lib_one:id/foo", ResourceId(0x02010000)))
+ .AddValue("app:id/bar", ResourceId(0x7f010001),
+ test::BuildReference("lib_two:id/bar", ResourceId(0x03010000)))
+ .Build();
+ table->included_packages_[0x02] = "lib_one";
+ table->included_packages_[0x03] = "lib_two";
+
+ ResTable result;
+ ASSERT_TRUE(Flatten(context.get(), {}, table.get(), &result));
+
+ const DynamicRefTable* dynamic_ref_table = result.getDynamicRefTableForCookie(1);
+ ASSERT_NE(nullptr, dynamic_ref_table);
+
+ const KeyedVector<String16, uint8_t> entries = dynamic_ref_table->entries();
+
+ ssize_t idx = entries.indexOfKey(android::String16("lib_one"));
+ ASSERT_GE(idx, 0);
+ EXPECT_EQ(0x02u, entries.valueAt(idx));
+
+ idx = entries.indexOfKey(android::String16("lib_two"));
+ ASSERT_GE(idx, 0);
+ EXPECT_EQ(0x03u, entries.valueAt(idx));
+}
+
} // namespace aapt
diff --git a/tools/aapt2/java/ClassDefinition.cpp b/tools/aapt2/java/ClassDefinition.cpp
index 53d6ea1..0cec9ae 100644
--- a/tools/aapt2/java/ClassDefinition.cpp
+++ b/tools/aapt2/java/ClassDefinition.cpp
@@ -22,6 +22,23 @@
namespace aapt {
+void ClassMember::WriteToStream(const StringPiece& prefix, bool final, std::ostream* out) const {
+ processor_.WriteToStream(out, prefix);
+}
+
+void MethodDefinition::AppendStatement(const StringPiece& statement) {
+ statements_.push_back(statement.to_string());
+}
+
+void MethodDefinition::WriteToStream(const StringPiece& prefix, bool final,
+ std::ostream* out) const {
+ *out << prefix << signature_ << " {\n";
+ for (const auto& statement : statements_) {
+ *out << prefix << " " << statement << "\n";
+ }
+ *out << prefix << "}";
+}
+
bool ClassDefinition::empty() const {
for (const std::unique_ptr<ClassMember>& member : members_) {
if (!member->empty()) {
@@ -40,7 +57,7 @@
ClassMember::WriteToStream(prefix, final, out);
*out << prefix << "public ";
- if (qualifier_ == ClassQualifier::Static) {
+ if (qualifier_ == ClassQualifier::kStatic) {
*out << "static ";
}
*out << "final class " << name_ << " {\n";
diff --git a/tools/aapt2/java/ClassDefinition.h b/tools/aapt2/java/ClassDefinition.h
index 64e4b29..ca76421 100644
--- a/tools/aapt2/java/ClassDefinition.h
+++ b/tools/aapt2/java/ClassDefinition.h
@@ -41,10 +41,11 @@
virtual bool empty() const = 0;
+ // Writes the class member to the out stream. Subclasses should derive this method
+ // to write their own data. Call this base method from the subclass to write out
+ // this member's comments/annotations.
virtual void WriteToStream(const android::StringPiece& prefix, bool final,
- std::ostream* out) const {
- processor_.WriteToStream(out, prefix);
- }
+ std::ostream* out) const;
private:
AnnotationProcessor processor_;
@@ -142,7 +143,29 @@
using ResourceArrayMember = PrimitiveArrayMember<ResourceId>;
-enum class ClassQualifier { None, Static };
+// Represents a method in a class.
+class MethodDefinition : public ClassMember {
+ public:
+ // Expected method signature example: 'public static void onResourcesLoaded(int p)'.
+ explicit MethodDefinition(const android::StringPiece& signature)
+ : signature_(signature.to_string()) {}
+
+ // Appends a single statement to the method. It should include no newlines or else
+ // formatting may be broken.
+ void AppendStatement(const android::StringPiece& statement);
+
+ // Even if the method is empty, we always want to write the method signature.
+ bool empty() const override { return false; }
+
+ void WriteToStream(const android::StringPiece& prefix, bool final,
+ std::ostream* out) const override;
+
+ private:
+ std::string signature_;
+ std::vector<std::string> statements_;
+};
+
+enum class ClassQualifier { kNone, kStatic };
class ClassDefinition : public ClassMember {
public:
diff --git a/tools/aapt2/java/JavaClassGenerator.cpp b/tools/aapt2/java/JavaClassGenerator.cpp
index b71dc48..68bdb95 100644
--- a/tools/aapt2/java/JavaClassGenerator.cpp
+++ b/tools/aapt2/java/JavaClassGenerator.cpp
@@ -23,6 +23,7 @@
#include <tuple>
#include "android-base/logging.h"
+#include "android-base/stringprintf.h"
#include "androidfw/StringPiece.h"
#include "NameMangler.h"
@@ -35,6 +36,7 @@
#include "process/SymbolTable.h"
using android::StringPiece;
+using android::base::StringPrintf;
namespace aapt {
@@ -55,11 +57,9 @@
return sJavaIdentifiers.find(symbol) == sJavaIdentifiers.end();
}
-/*
- * Java symbols can not contain . or -, but those are valid in a resource name.
- * Replace those with '_'.
- */
-static std::string Transform(const StringPiece& symbol) {
+// Java symbols can not contain . or -, but those are valid in a resource name.
+// Replace those with '_'.
+static std::string TransformToFieldName(const StringPiece& symbol) {
std::string output = symbol.to_string();
for (char& c : output) {
if (c == '.' || c == '-') {
@@ -69,34 +69,31 @@
return output;
}
-/**
- * Transforms an attribute in a styleable to the Java field name:
- *
- * <declare-styleable name="Foo">
- * <attr name="android:bar" />
- * <attr name="bar" />
- * </declare-styleable>
- *
- * Foo_android_bar
- * Foo_bar
- */
-static std::string TransformNestedAttr(
- const ResourceNameRef& attr_name, const std::string& styleable_class_name,
- const StringPiece& package_name_to_generate) {
+// Transforms an attribute in a styleable to the Java field name:
+//
+// <declare-styleable name="Foo">
+// <attr name="android:bar" />
+// <attr name="bar" />
+// </declare-styleable>
+//
+// Foo_android_bar
+// Foo_bar
+static std::string TransformNestedAttr(const ResourceNameRef& attr_name,
+ const std::string& styleable_class_name,
+ const StringPiece& package_name_to_generate) {
std::string output = styleable_class_name;
// We may reference IDs from other packages, so prefix the entry name with
// the package.
if (!attr_name.package.empty() &&
package_name_to_generate != attr_name.package) {
- output += "_" + Transform(attr_name.package);
+ output += "_" + TransformToFieldName(attr_name.package);
}
- output += "_" + Transform(attr_name.entry);
+ output += "_" + TransformToFieldName(attr_name.entry);
return output;
}
-static void AddAttributeFormatDoc(AnnotationProcessor* processor,
- Attribute* attr) {
+static void AddAttributeFormatDoc(AnnotationProcessor* processor, Attribute* attr) {
const uint32_t type_mask = attr->type_mask;
if (type_mask & android::ResTable_map::TYPE_REFERENCE) {
processor->AppendComment(
@@ -128,7 +125,7 @@
processor->AppendComment(
"<p>May be a color value, in the form of "
"\"<code>#<i>rgb</i></code>\",\n"
- "\"<code>#<i>argb</i></code>\", \"<code>#<i>rrggbb</i></code\", or \n"
+ "\"<code>#<i>argb</i></code>\", \"<code>#<i>rrggbb</i></code>\", or \n"
"\"<code>#<i>aarrggbb</i></code>\".");
}
@@ -202,18 +199,21 @@
return true;
}
+// Whether or not to skip writing this symbol.
+bool JavaClassGenerator::SkipSymbol(const Maybe<SymbolTable::Symbol>& symbol) {
+ return !symbol || (options_.types == JavaClassGeneratorOptions::SymbolTypes::kPublic &&
+ !symbol.value().is_public);
+}
+
struct StyleableAttr {
- const Reference* attr_ref;
+ const Reference* attr_ref = nullptr;
std::string field_name;
- std::unique_ptr<SymbolTable::Symbol> symbol;
+ Maybe<SymbolTable::Symbol> symbol;
};
-static bool less_styleable_attr(const StyleableAttr& lhs,
- const StyleableAttr& rhs) {
- const ResourceId lhs_id =
- lhs.attr_ref->id ? lhs.attr_ref->id.value() : ResourceId(0);
- const ResourceId rhs_id =
- rhs.attr_ref->id ? rhs.attr_ref->id.value() : ResourceId(0);
+static bool operator<(const StyleableAttr& lhs, const StyleableAttr& rhs) {
+ const ResourceId lhs_id = lhs.attr_ref->id.value_or_default(ResourceId(0));
+ const ResourceId rhs_id = rhs.attr_ref->id.value_or_default(ResourceId(0));
if (lhs_id < rhs_id) {
return true;
} else if (lhs_id > rhs_id) {
@@ -223,72 +223,57 @@
}
}
-void JavaClassGenerator::AddMembersToStyleableClass(
- const StringPiece& package_name_to_generate, const std::string& entry_name,
- const Styleable* styleable, ClassDefinition* out_styleable_class_def) {
- const std::string class_name = Transform(entry_name);
+void JavaClassGenerator::ProcessStyleable(const ResourceNameRef& name, const ResourceId& id,
+ const Styleable& styleable,
+ const StringPiece& package_name_to_generate,
+ ClassDefinition* out_class_def,
+ MethodDefinition* out_rewrite_method) {
+ const std::string array_field_name = TransformToFieldName(name.entry);
+ std::unique_ptr<ResourceArrayMember> array_def =
+ util::make_unique<ResourceArrayMember>(array_field_name);
- std::unique_ptr<ResourceArrayMember> styleable_array_def =
- util::make_unique<ResourceArrayMember>(class_name);
-
- // This must be sorted by resource ID.
+ // The array must be sorted by resource ID.
std::vector<StyleableAttr> sorted_attributes;
- sorted_attributes.reserve(styleable->entries.size());
- for (const auto& attr : styleable->entries) {
+ sorted_attributes.reserve(styleable.entries.size());
+ for (const auto& attr : styleable.entries) {
// If we are not encoding final attributes, the styleable entry may have no
// ID if we are building a static library.
CHECK(!options_.use_final || attr.id) << "no ID set for Styleable entry";
CHECK(bool(attr.name)) << "no name set for Styleable entry";
- // We will need the unmangled, transformed name in the comments and the
- // field,
+ // We will need the unmangled, transformed name in the comments and the field,
// so create it once and cache it in this StyleableAttr data structure.
- StyleableAttr styleable_attr = {};
+ StyleableAttr styleable_attr;
styleable_attr.attr_ref = &attr;
- styleable_attr.field_name = TransformNestedAttr(
- attr.name.value(), class_name, package_name_to_generate);
- Reference mangled_reference;
- mangled_reference.id = attr.id;
- mangled_reference.name = attr.name;
- if (mangled_reference.name.value().package.empty()) {
- mangled_reference.name.value().package =
- context_->GetCompilationPackage();
- }
+ // The field name for this attribute is prefixed by the name of this styleable and
+ // the package it comes from.
+ styleable_attr.field_name =
+ TransformNestedAttr(attr.name.value(), array_field_name, package_name_to_generate);
- if (Maybe<ResourceName> mangled_name =
- context_->GetNameMangler()->MangleName(
- mangled_reference.name.value())) {
- mangled_reference.name = mangled_name;
- }
-
- // Look up the symbol so that we can write out in the comments what are
- // possible
- // legal values for this attribute.
- const SymbolTable::Symbol* symbol =
- context_->GetExternalSymbols()->FindByReference(mangled_reference);
+ // Look up the symbol so that we can write out in the comments what are possible legal values
+ // for this attribute.
+ const SymbolTable::Symbol* symbol = context_->GetExternalSymbols()->FindByReference(attr);
if (symbol && symbol->attribute) {
- // Copy the symbol data structure because the returned instance can be
- // destroyed.
- styleable_attr.symbol = util::make_unique<SymbolTable::Symbol>(*symbol);
+ // Copy the symbol data structure because the returned instance can be destroyed.
+ styleable_attr.symbol = *symbol;
}
sorted_attributes.push_back(std::move(styleable_attr));
}
// Sort the attributes by ID.
- std::sort(sorted_attributes.begin(), sorted_attributes.end(),
- less_styleable_attr);
+ std::sort(sorted_attributes.begin(), sorted_attributes.end());
+ // Build the JavaDoc comment for the Styleable array. This has references to child attributes
+ // and what possible values can be used for them.
const size_t attr_count = sorted_attributes.size();
if (attr_count > 0) {
- // Build the comment string for the Styleable. It includes details about the
- // child attributes.
std::stringstream styleable_comment;
- if (!styleable->GetComment().empty()) {
- styleable_comment << styleable->GetComment() << "\n";
+ if (!styleable.GetComment().empty()) {
+ styleable_comment << styleable.GetComment() << "\n";
} else {
- styleable_comment << "Attributes that can be used with a " << class_name
- << ".\n";
+ // Apply a default intro comment if the styleable has no comments of its own.
+ styleable_comment << "Attributes that can be used with a " << array_field_name << ".\n";
}
styleable_comment << "<p>Includes the following attributes:</p>\n"
@@ -297,22 +282,16 @@
"<colgroup align=\"left\" />\n"
"<tr><th>Attribute</th><th>Description</th></tr>\n";
+ // Build the table of attributes with their links and names.
for (const StyleableAttr& entry : sorted_attributes) {
- if (!entry.symbol) {
+ if (SkipSymbol(entry.symbol)) {
continue;
}
- if (options_.types == JavaClassGeneratorOptions::SymbolTypes::kPublic &&
- !entry.symbol->is_public) {
- // Don't write entries for non-public attributes.
- continue;
- }
-
- StringPiece attr_comment_line = entry.symbol->attribute->GetComment();
+ StringPiece attr_comment_line = entry.symbol.value().attribute->GetComment();
if (attr_comment_line.contains("@removed")) {
// Removed attributes are public but hidden from the documentation, so
- // don't emit
- // them as part of the class documentation.
+ // don't emit them as part of the class documentation.
continue;
}
@@ -327,71 +306,52 @@
styleable_comment << "<td>";
- // Only use the comment up until the first '.'. This is to stay compatible
- // with
- // the way old AAPT did it (presumably to keep it short and to avoid
- // including
+ // Only use the comment up until the first '.'. This is to stay compatible with
+ // the way old AAPT did it (presumably to keep it short and to avoid including
// annotations like @hide which would affect this Styleable).
- auto iter =
- std::find(attr_comment_line.begin(), attr_comment_line.end(), u'.');
+ auto iter = std::find(attr_comment_line.begin(), attr_comment_line.end(), '.');
if (iter != attr_comment_line.end()) {
- attr_comment_line =
- attr_comment_line.substr(0, (iter - attr_comment_line.begin()) + 1);
+ attr_comment_line = attr_comment_line.substr(0, (iter - attr_comment_line.begin()) + 1);
}
styleable_comment << attr_comment_line << "</td></tr>\n";
}
styleable_comment << "</table>\n";
+ // Generate the @see lines for each attribute.
for (const StyleableAttr& entry : sorted_attributes) {
- if (!entry.symbol) {
- continue;
- }
-
- if (options_.types == JavaClassGeneratorOptions::SymbolTypes::kPublic &&
- !entry.symbol->is_public) {
- // Don't write entries for non-public attributes.
+ if (SkipSymbol(entry.symbol)) {
continue;
}
styleable_comment << "@see #" << entry.field_name << "\n";
}
- styleable_array_def->GetCommentBuilder()->AppendComment(
- styleable_comment.str());
+ array_def->GetCommentBuilder()->AppendComment(styleable_comment.str());
}
// Add the ResourceIds to the array member.
for (const StyleableAttr& styleable_attr : sorted_attributes) {
- styleable_array_def->AddElement(styleable_attr.attr_ref->id
- ? styleable_attr.attr_ref->id.value()
- : ResourceId(0));
+ const ResourceId id = styleable_attr.attr_ref->id.value_or_default(ResourceId(0));
+ array_def->AddElement(id);
}
// Add the Styleable array to the Styleable class.
- out_styleable_class_def->AddMember(std::move(styleable_array_def));
+ out_class_def->AddMember(std::move(array_def));
// Now we emit the indices into the array.
for (size_t i = 0; i < attr_count; i++) {
const StyleableAttr& styleable_attr = sorted_attributes[i];
-
- if (!styleable_attr.symbol) {
- continue;
- }
-
- if (options_.types == JavaClassGeneratorOptions::SymbolTypes::kPublic &&
- !styleable_attr.symbol->is_public) {
- // Don't write entries for non-public attributes.
+ if (SkipSymbol(styleable_attr.symbol)) {
continue;
}
StringPiece comment = styleable_attr.attr_ref->GetComment();
- if (styleable_attr.symbol->attribute && comment.empty()) {
- comment = styleable_attr.symbol->attribute->GetComment();
+ if (styleable_attr.symbol.value().attribute && comment.empty()) {
+ comment = styleable_attr.symbol.value().attribute->GetComment();
}
if (comment.contains("@removed")) {
// Removed attributes are public but hidden from the documentation, so
- // don't emit them
- // as part of the class documentation.
+ // don't emit them as part of the class documentation.
continue;
}
@@ -414,114 +374,151 @@
std::stringstream default_comment;
default_comment << "<p>This symbol is the offset where the "
<< "{@link " << package_name << ".R.attr#"
- << Transform(attr_name.entry) << "}\n"
+ << TransformToFieldName(attr_name.entry) << "}\n"
<< "attribute's value can be found in the "
- << "{@link #" << class_name << "} array.";
+ << "{@link #" << array_field_name << "} array.";
attr_processor->AppendComment(default_comment.str());
}
attr_processor->AppendNewLine();
-
- AddAttributeFormatDoc(attr_processor,
- styleable_attr.symbol->attribute.get());
+ AddAttributeFormatDoc(attr_processor, styleable_attr.symbol.value().attribute.get());
attr_processor->AppendNewLine();
+ attr_processor->AppendComment(
+ StringPrintf("@attr name %s:%s", package_name.data(), attr_name.entry.data()));
- std::stringstream doclava_name;
- doclava_name << "@attr name " << package_name << ":" << attr_name.entry;
+ out_class_def->AddMember(std::move(index_member));
+ }
- attr_processor->AppendComment(doclava_name.str());
-
- out_styleable_class_def->AddMember(std::move(index_member));
+ // If there is a rewrite method to generate, add the statements that rewrite package IDs
+ // for this styleable.
+ if (out_rewrite_method != nullptr) {
+ out_rewrite_method->AppendStatement(
+ StringPrintf("for (int i = 0; i < styleable.%s.length; i++) {", array_field_name.data()));
+ out_rewrite_method->AppendStatement(
+ StringPrintf(" if ((styleable.%s[i] & 0xff000000) == 0) {", array_field_name.data()));
+ out_rewrite_method->AppendStatement(
+ StringPrintf(" styleable.%s[i] = (styleable.%s[i] & 0x00ffffff) | (p << 24);",
+ array_field_name.data(), array_field_name.data()));
+ out_rewrite_method->AppendStatement(" }");
+ out_rewrite_method->AppendStatement("}");
}
}
-bool JavaClassGenerator::AddMembersToTypeClass(
- const StringPiece& package_name_to_generate,
- const ResourceTablePackage* package, const ResourceTableType* type,
- ClassDefinition* out_type_class_def) {
- for (const auto& entry : type->entries) {
- if (SkipSymbol(entry->symbol_status.state)) {
+void JavaClassGenerator::ProcessResource(const ResourceNameRef& name, const ResourceId& id,
+ const ResourceEntry& entry, ClassDefinition* out_class_def,
+ MethodDefinition* out_rewrite_method) {
+ const std::string field_name = TransformToFieldName(name.entry);
+ std::unique_ptr<ResourceMember> resource_member =
+ util::make_unique<ResourceMember>(field_name, id);
+
+ // Build the comments and annotations for this entry.
+ AnnotationProcessor* processor = resource_member->GetCommentBuilder();
+
+ // Add the comments from any <public> tags.
+ if (entry.symbol_status.state != SymbolState::kUndefined) {
+ processor->AppendComment(entry.symbol_status.comment);
+ }
+
+ // Add the comments from all configurations of this entry.
+ for (const auto& config_value : entry.values) {
+ processor->AppendComment(config_value->value->GetComment());
+ }
+
+ // If this is an Attribute, append the format Javadoc.
+ if (!entry.values.empty()) {
+ if (Attribute* attr = ValueCast<Attribute>(entry.values.front()->value.get())) {
+ // We list out the available values for the given attribute.
+ AddAttributeFormatDoc(processor, attr);
+ }
+ }
+
+ out_class_def->AddMember(std::move(resource_member));
+
+ if (out_rewrite_method != nullptr) {
+ const StringPiece& type_str = ToString(name.type);
+ out_rewrite_method->AppendStatement(StringPrintf("%s.%s = (%s.%s & 0x00ffffff) | (p << 24);",
+ type_str.data(), field_name.data(),
+ type_str.data(), field_name.data()));
+ }
+}
+
+Maybe<std::string> JavaClassGenerator::UnmangleResource(const StringPiece& package_name,
+ const StringPiece& package_name_to_generate,
+ const ResourceEntry& entry) {
+ if (SkipSymbol(entry.symbol_status.state)) {
+ return {};
+ }
+
+ std::string unmangled_package;
+ std::string unmangled_name = entry.name;
+ if (NameMangler::Unmangle(&unmangled_name, &unmangled_package)) {
+ // The entry name was mangled, and we successfully unmangled it.
+ // Check that we want to emit this symbol.
+ if (package_name != unmangled_package) {
+ // Skip the entry if it doesn't belong to the package we're writing.
+ return {};
+ }
+ } else if (package_name_to_generate != package_name) {
+ // We are processing a mangled package name,
+ // but this is a non-mangled resource.
+ return {};
+ }
+ return {std::move(unmangled_name)};
+}
+
+bool JavaClassGenerator::ProcessType(const StringPiece& package_name_to_generate,
+ const ResourceTablePackage& package,
+ const ResourceTableType& type,
+ ClassDefinition* out_type_class_def,
+ MethodDefinition* out_rewrite_method_def) {
+ for (const auto& entry : type.entries) {
+ const Maybe<std::string> unmangled_name =
+ UnmangleResource(package.name, package_name_to_generate, *entry);
+ if (!unmangled_name) {
continue;
}
+ // Create an ID if there is one (static libraries don't need one).
ResourceId id;
- if (package->id && type->id && entry->id) {
- id = ResourceId(package->id.value(), type->id.value(), entry->id.value());
+ if (package.id && type.id && entry->id) {
+ id = ResourceId(package.id.value(), type.id.value(), entry->id.value());
}
- std::string unmangled_package;
- std::string unmangled_name = entry->name;
- if (NameMangler::Unmangle(&unmangled_name, &unmangled_package)) {
- // The entry name was mangled, and we successfully unmangled it.
- // Check that we want to emit this symbol.
- if (package->name != unmangled_package) {
- // Skip the entry if it doesn't belong to the package we're writing.
- continue;
- }
- } else if (package_name_to_generate != package->name) {
- // We are processing a mangled package name,
- // but this is a non-mangled resource.
- continue;
- }
+ // We need to make sure we hide the fact that we are generating kAttrPrivate attributes.
+ const ResourceNameRef resource_name(
+ package_name_to_generate,
+ type.type == ResourceType::kAttrPrivate ? ResourceType::kAttr : type.type,
+ unmangled_name.value());
- if (!IsValidSymbol(unmangled_name)) {
- ResourceNameRef resource_name(package_name_to_generate, type->type,
- unmangled_name);
+ // Check to see if the unmangled name is a valid Java name (not a keyword).
+ if (!IsValidSymbol(unmangled_name.value())) {
std::stringstream err;
err << "invalid symbol name '" << resource_name << "'";
error_ = err.str();
return false;
}
- if (type->type == ResourceType::kStyleable) {
+ if (resource_name.type == ResourceType::kStyleable) {
CHECK(!entry->values.empty());
const Styleable* styleable =
static_cast<const Styleable*>(entry->values.front()->value.get());
- // Comments are handled within this method.
- AddMembersToStyleableClass(package_name_to_generate, unmangled_name,
- styleable, out_type_class_def);
+ ProcessStyleable(resource_name, id, *styleable, package_name_to_generate, out_type_class_def,
+ out_rewrite_method_def);
} else {
- std::unique_ptr<ResourceMember> resource_member =
- util::make_unique<ResourceMember>(Transform(unmangled_name), id);
-
- // Build the comments and annotations for this entry.
- AnnotationProcessor* processor = resource_member->GetCommentBuilder();
-
- // Add the comments from any <public> tags.
- if (entry->symbol_status.state != SymbolState::kUndefined) {
- processor->AppendComment(entry->symbol_status.comment);
- }
-
- // Add the comments from all configurations of this entry.
- for (const auto& config_value : entry->values) {
- processor->AppendComment(config_value->value->GetComment());
- }
-
- // If this is an Attribute, append the format Javadoc.
- if (!entry->values.empty()) {
- if (Attribute* attr =
- ValueCast<Attribute>(entry->values.front()->value.get())) {
- // We list out the available values for the given attribute.
- AddAttributeFormatDoc(processor, attr);
- }
- }
-
- out_type_class_def->AddMember(std::move(resource_member));
+ ProcessResource(resource_name, id, *entry, out_type_class_def, out_rewrite_method_def);
}
}
return true;
}
-bool JavaClassGenerator::Generate(const StringPiece& package_name_to_generate,
- std::ostream* out) {
+bool JavaClassGenerator::Generate(const StringPiece& package_name_to_generate, std::ostream* out) {
return Generate(package_name_to_generate, package_name_to_generate, out);
}
-static void AppendJavaDocAnnotations(
- const std::vector<std::string>& annotations,
- AnnotationProcessor* processor) {
+static void AppendJavaDocAnnotations(const std::vector<std::string>& annotations,
+ AnnotationProcessor* processor) {
for (const std::string& annotation : annotations) {
std::string proper_annotation = "@";
proper_annotation += annotation;
@@ -532,37 +529,45 @@
bool JavaClassGenerator::Generate(const StringPiece& package_name_to_generate,
const StringPiece& out_package_name,
std::ostream* out) {
- ClassDefinition r_class("R", ClassQualifier::None, true);
+ ClassDefinition r_class("R", ClassQualifier::kNone, true);
+ std::unique_ptr<MethodDefinition> rewrite_method;
+
+ // Generate an onResourcesLoaded() callback if requested.
+ if (options_.rewrite_callback_options) {
+ rewrite_method =
+ util::make_unique<MethodDefinition>("public static void onResourcesLoaded(int p)");
+ for (const std::string& package_to_callback :
+ options_.rewrite_callback_options.value().packages_to_callback) {
+ rewrite_method->AppendStatement(
+ StringPrintf("%s.R.onResourcesLoaded(p);", package_to_callback.data()));
+ }
+ }
for (const auto& package : table_->packages) {
for (const auto& type : package->types) {
if (type->type == ResourceType::kAttrPrivate) {
+ // We generate these as part of the kAttr type, so skip them here.
continue;
}
+ // Stay consistent with AAPT and generate an empty type class if the R class
+ // is public.
const bool force_creation_if_empty =
(options_.types == JavaClassGeneratorOptions::SymbolTypes::kPublic);
- std::unique_ptr<ClassDefinition> class_def =
- util::make_unique<ClassDefinition>(ToString(type->type),
- ClassQualifier::Static,
- force_creation_if_empty);
-
- bool result = AddMembersToTypeClass(
- package_name_to_generate, package.get(), type.get(), class_def.get());
- if (!result) {
+ std::unique_ptr<ClassDefinition> class_def = util::make_unique<ClassDefinition>(
+ ToString(type->type), ClassQualifier::kStatic, force_creation_if_empty);
+ if (!ProcessType(package_name_to_generate, *package, *type, class_def.get(),
+ rewrite_method.get())) {
return false;
}
if (type->type == ResourceType::kAttr) {
// Also include private attributes in this same class.
- ResourceTableType* priv_type =
- package->FindType(ResourceType::kAttrPrivate);
+ const ResourceTableType* priv_type = package->FindType(ResourceType::kAttrPrivate);
if (priv_type) {
- result =
- AddMembersToTypeClass(package_name_to_generate, package.get(),
- priv_type, class_def.get());
- if (!result) {
+ if (!ProcessType(package_name_to_generate, *package, *priv_type, class_def.get(),
+ rewrite_method.get())) {
return false;
}
}
@@ -571,23 +576,23 @@
if (type->type == ResourceType::kStyleable &&
options_.types == JavaClassGeneratorOptions::SymbolTypes::kPublic) {
// When generating a public R class, we don't want Styleable to be part
- // of the API.
- // It is only emitted for documentation purposes.
+ // of the API. It is only emitted for documentation purposes.
class_def->GetCommentBuilder()->AppendComment("@doconly");
}
- AppendJavaDocAnnotations(options_.javadoc_annotations,
- class_def->GetCommentBuilder());
+ AppendJavaDocAnnotations(options_.javadoc_annotations, class_def->GetCommentBuilder());
r_class.AddMember(std::move(class_def));
}
}
- AppendJavaDocAnnotations(options_.javadoc_annotations,
- r_class.GetCommentBuilder());
+ if (rewrite_method != nullptr) {
+ r_class.AddMember(std::move(rewrite_method));
+ }
- if (!ClassDefinition::WriteJavaFile(&r_class, out_package_name,
- options_.use_final, out)) {
+ AppendJavaDocAnnotations(options_.javadoc_annotations, r_class.GetCommentBuilder());
+
+ if (!ClassDefinition::WriteJavaFile(&r_class, out_package_name, options_.use_final, out)) {
return false;
}
diff --git a/tools/aapt2/java/JavaClassGenerator.h b/tools/aapt2/java/JavaClassGenerator.h
index 5cf556e..4510430 100644
--- a/tools/aapt2/java/JavaClassGenerator.h
+++ b/tools/aapt2/java/JavaClassGenerator.h
@@ -25,19 +25,28 @@
#include "ResourceTable.h"
#include "ResourceValues.h"
#include "process/IResourceTableConsumer.h"
+#include "process/SymbolTable.h"
namespace aapt {
class AnnotationProcessor;
class ClassDefinition;
+class MethodDefinition;
+
+// Options for generating onResourcesLoaded callback in R.java.
+struct OnResourcesLoadedCallbackOptions {
+ // Other R classes to delegate the same callback to (with the same package ID).
+ std::vector<std::string> packages_to_callback;
+};
struct JavaClassGeneratorOptions {
- /*
- * Specifies whether to use the 'final' modifier
- * on resource entries. Default is true.
- */
+ // Specifies whether to use the 'final' modifier on resource entries. Default is true.
bool use_final = true;
+ // If set, generates code to rewrite the package ID of resources.
+ // Implies use_final == true. Default is unset.
+ Maybe<OnResourcesLoadedCallbackOptions> rewrite_callback_options;
+
enum class SymbolTypes {
kAll,
kPublicPrivate,
@@ -46,47 +55,54 @@
SymbolTypes types = SymbolTypes::kAll;
- /**
- * A list of JavaDoc annotations to add to the comments of all generated
- * classes.
- */
+ // A list of JavaDoc annotations to add to the comments of all generated classes.
std::vector<std::string> javadoc_annotations;
};
-/*
- * Generates the R.java file for a resource table.
- */
+// Generates the R.java file for a resource table.
class JavaClassGenerator {
public:
JavaClassGenerator(IAaptContext* context, ResourceTable* table,
const JavaClassGeneratorOptions& options);
- /*
- * Writes the R.java file to `out`. Only symbols belonging to `package` are
- * written.
- * All symbols technically belong to a single package, but linked libraries
- * will
- * have their names mangled, denoting that they came from a different package.
- * We need to generate these symbols in a separate file.
- * Returns true on success.
- */
- bool Generate(const android::StringPiece& packageNameToGenerate, std::ostream* out);
+ // Writes the R.java file to `out`. Only symbols belonging to `package` are written.
+ // All symbols technically belong to a single package, but linked libraries will
+ // have their names mangled, denoting that they came from a different package.
+ // We need to generate these symbols in a separate file. Returns true on success.
+ bool Generate(const android::StringPiece& package_name_to_generate, std::ostream* out);
- bool Generate(const android::StringPiece& packageNameToGenerate,
- const android::StringPiece& outputPackageName, std::ostream* out);
+ bool Generate(const android::StringPiece& package_name_to_generate,
+ const android::StringPiece& output_package_name, std::ostream* out);
const std::string& getError() const;
private:
- bool AddMembersToTypeClass(const android::StringPiece& packageNameToGenerate,
- const ResourceTablePackage* package, const ResourceTableType* type,
- ClassDefinition* outTypeClassDef);
-
- void AddMembersToStyleableClass(const android::StringPiece& packageNameToGenerate,
- const std::string& entryName, const Styleable* styleable,
- ClassDefinition* outStyleableClassDef);
-
bool SkipSymbol(SymbolState state);
+ bool SkipSymbol(const Maybe<SymbolTable::Symbol>& symbol);
+
+ // Returns the unmangled resource entry name if the unmangled package is the same as
+ // package_name_to_generate. Returns nothing if the resource should be skipped.
+ Maybe<std::string> UnmangleResource(const android::StringPiece& package_name,
+ const android::StringPiece& package_name_to_generate,
+ const ResourceEntry& entry);
+
+ bool ProcessType(const android::StringPiece& package_name_to_generate,
+ const ResourceTablePackage& package, const ResourceTableType& type,
+ ClassDefinition* out_type_class_def, MethodDefinition* out_rewrite_method_def);
+
+ // Writes a resource to the R.java file, optionally writing out a rewrite rule for its package
+ // ID if `out_rewrite_method` is not nullptr.
+ void ProcessResource(const ResourceNameRef& name, const ResourceId& id,
+ const ResourceEntry& entry, ClassDefinition* out_class_def,
+ MethodDefinition* out_rewrite_method);
+
+ // Writes a styleable resource to the R.java file, optionally writing out a rewrite rule for
+ // its package ID if `out_rewrite_method` is not nullptr.
+ // `package_name_to_generate` is the package
+ void ProcessStyleable(const ResourceNameRef& name, const ResourceId& id,
+ const Styleable& styleable,
+ const android::StringPiece& package_name_to_generate,
+ ClassDefinition* out_class_def, MethodDefinition* out_rewrite_method);
IAaptContext* context_;
ResourceTable* table_;
diff --git a/tools/aapt2/java/JavaClassGenerator_test.cpp b/tools/aapt2/java/JavaClassGenerator_test.cpp
index 55c5cb2..271279f 100644
--- a/tools/aapt2/java/JavaClassGenerator_test.cpp
+++ b/tools/aapt2/java/JavaClassGenerator_test.cpp
@@ -293,8 +293,7 @@
TEST(JavaClassGeneratorTest, CommentsForEnumAndFlagAttributesArePresent) {}
-TEST(JavaClassGeneratorTest,
- CommentsForStyleablesAndNestedAttributesArePresent) {
+TEST(JavaClassGeneratorTest, CommentsForStyleablesAndNestedAttributesArePresent) {
Attribute attr(false);
attr.SetComment(StringPiece("This is an attribute"));
@@ -364,4 +363,37 @@
EXPECT_EQ(std::string::npos, actual.find("removed", pos + 1));
}
+TEST(JavaClassGeneratorTest, GenerateOnResourcesLoadedCallbackForSharedLibrary) {
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .SetPackageId("android", 0x00)
+ .AddValue("android:attr/foo", ResourceId(0x00010000), util::make_unique<Attribute>(false))
+ .AddValue("android:id/foo", ResourceId(0x00020000), util::make_unique<Id>())
+ .AddValue(
+ "android:style/foo", ResourceId(0x00030000),
+ test::StyleBuilder()
+ .AddItem("android:attr/foo", ResourceId(0x00010000), util::make_unique<Id>())
+ .Build())
+ .Build();
+
+ std::unique_ptr<IAaptContext> context =
+ test::ContextBuilder().SetPackageId(0x00).SetCompilationPackage("android").Build();
+
+ JavaClassGeneratorOptions options;
+ options.use_final = false;
+ options.rewrite_callback_options = OnResourcesLoadedCallbackOptions{
+ {"com.foo", "com.boo"},
+ };
+ JavaClassGenerator generator(context.get(), table.get(), options);
+
+ std::stringstream out;
+ ASSERT_TRUE(generator.Generate("android", &out));
+
+ std::string actual = out.str();
+
+ EXPECT_NE(std::string::npos, actual.find("void onResourcesLoaded"));
+ EXPECT_NE(std::string::npos, actual.find("com.foo.R.onResourcesLoaded"));
+ EXPECT_NE(std::string::npos, actual.find("com.boo.R.onResourcesLoaded"));
+}
+
} // namespace aapt
diff --git a/tools/aapt2/java/ManifestClassGenerator.cpp b/tools/aapt2/java/ManifestClassGenerator.cpp
index de8e59a..f49e498 100644
--- a/tools/aapt2/java/ManifestClassGenerator.cpp
+++ b/tools/aapt2/java/ManifestClassGenerator.cpp
@@ -100,11 +100,9 @@
}
std::unique_ptr<ClassDefinition> permission_class =
- util::make_unique<ClassDefinition>("permission", ClassQualifier::Static,
- false);
+ util::make_unique<ClassDefinition>("permission", ClassQualifier::kStatic, false);
std::unique_ptr<ClassDefinition> permission_group_class =
- util::make_unique<ClassDefinition>("permission_group",
- ClassQualifier::Static, false);
+ util::make_unique<ClassDefinition>("permission_group", ClassQualifier::kStatic, false);
bool error = false;
std::vector<xml::Element*> children = el->GetChildElements();
@@ -125,8 +123,7 @@
}
std::unique_ptr<ClassDefinition> manifest_class =
- util::make_unique<ClassDefinition>("Manifest", ClassQualifier::None,
- false);
+ util::make_unique<ClassDefinition>("Manifest", ClassQualifier::kNone, false);
manifest_class->AddMember(std::move(permission_class));
manifest_class->AddMember(std::move(permission_group_class));
return manifest_class;
diff --git a/tools/aapt2/link/Link.cpp b/tools/aapt2/link/Link.cpp
index 0501a3b..dd8e14b 100644
--- a/tools/aapt2/link/Link.cpp
+++ b/tools/aapt2/link/Link.cpp
@@ -46,6 +46,8 @@
#include "link/ManifestFixer.h"
#include "link/ReferenceLinker.h"
#include "link/TableMerger.h"
+#include "optimize/ResourceDeduper.h"
+#include "optimize/VersionCollapser.h"
#include "process/IResourceTableConsumer.h"
#include "process/SymbolTable.h"
#include "proto/ProtoSerialize.h"
@@ -59,7 +61,16 @@
namespace aapt {
+// The type of package to build.
+enum class PackageType {
+ kApp,
+ kSharedLib,
+ kStaticLib,
+};
+
struct LinkOptions {
+ PackageType package_type = PackageType::kApp;
+
std::string output_path;
std::string manifest_path;
std::vector<std::string> include_paths;
@@ -87,7 +98,6 @@
std::unordered_set<std::string> extensions_to_not_compress;
// Static lib options.
- bool static_lib = false;
bool no_static_lib_packages = false;
// AndroidManifest.xml massaging options.
@@ -96,6 +106,9 @@
// Products to use/filter on.
std::unordered_set<std::string> products;
+ // Flattening options.
+ TableFlattenerOptions table_flattener_options;
+
// Split APK options.
TableSplitterOptions table_splitter_options;
std::vector<SplitConstraints> split_constraints;
@@ -108,7 +121,7 @@
class LinkContext : public IAaptContext {
public:
- LinkContext() : name_mangler_({}) {}
+ LinkContext() : name_mangler_({}), symbols_(&name_mangler_) {}
IDiagnostics* GetDiagnostics() override { return &diagnostics_; }
@@ -681,14 +694,13 @@
// First try to load the file as a static lib.
std::string error_str;
- std::unique_ptr<ResourceTable> static_include =
- LoadStaticLibrary(path, &error_str);
- if (static_include) {
- if (!options_.static_lib) {
- // Can't include static libraries when not building a static library.
+ std::unique_ptr<ResourceTable> include_static = LoadStaticLibrary(path, &error_str);
+ if (include_static) {
+ if (options_.package_type != PackageType::kStaticLib) {
+ // Can't include static libraries when not building a static library (they have no IDs
+ // assigned).
context_->GetDiagnostics()->Error(
- DiagMessage(path)
- << "can't include static library when building app");
+ DiagMessage(path) << "can't include static library when not building a static lib");
return false;
}
@@ -696,16 +708,15 @@
// package of this
// table to our compilation package.
if (options_.no_static_lib_packages) {
- if (ResourceTablePackage* pkg =
- static_include->FindPackageById(0x7f)) {
+ if (ResourceTablePackage* pkg = include_static->FindPackageById(0x7f)) {
pkg->name = context_->GetCompilationPackage();
}
}
context_->GetExternalSymbols()->AppendSource(
- util::make_unique<ResourceTableSymbolSource>(static_include.get()));
+ util::make_unique<ResourceTableSymbolSource>(include_static.get()));
- static_table_includes_.push_back(std::move(static_include));
+ static_table_includes_.push_back(std::move(include_static));
} else if (!error_str.empty()) {
// We had an error with reading, so fail.
@@ -714,12 +725,19 @@
}
if (!asset_source->AddAssetPath(path)) {
- context_->GetDiagnostics()->Error(DiagMessage(path)
- << "failed to load include path");
+ context_->GetDiagnostics()->Error(DiagMessage(path) << "failed to load include path");
return false;
}
}
+ // Capture the shared libraries so that the final resource table can be properly flattened
+ // with support for shared libraries.
+ for (auto& entry : asset_source->GetAssignedPackageIds()) {
+ if (entry.first > 0x01 && entry.first < 0x7f) {
+ final_table_.included_packages_[entry.first] = entry.second;
+ }
+ }
+
context_->GetExternalSymbols()->AppendSource(std::move(asset_source));
return true;
}
@@ -874,7 +892,7 @@
bool FlattenTable(ResourceTable* table, IArchiveWriter* writer) {
BigBuffer buffer(1024);
- TableFlattener flattener(&buffer);
+ TableFlattener flattener(options_.table_flattener_options, &buffer);
if (!flattener.Consume(context_, table)) {
return false;
}
@@ -1079,18 +1097,15 @@
return false;
}
- std::unique_ptr<ResourceTable> table =
- LoadTablePbFromCollection(collection.get());
+ std::unique_ptr<ResourceTable> table = LoadTablePbFromCollection(collection.get());
if (!table) {
- context_->GetDiagnostics()->Error(DiagMessage(input)
- << "invalid static library");
+ context_->GetDiagnostics()->Error(DiagMessage(input) << "invalid static library");
return false;
}
ResourceTablePackage* pkg = table->FindPackageById(0x7f);
if (!pkg) {
- context_->GetDiagnostics()->Error(DiagMessage(input)
- << "static library has no package");
+ context_->GetDiagnostics()->Error(DiagMessage(input) << "static library has no package");
return false;
}
@@ -1107,11 +1122,9 @@
pkg->name = "";
if (override) {
- result = table_merger_->MergeOverlay(Source(input), table.get(),
- collection.get());
+ result = table_merger_->MergeOverlay(Source(input), table.get(), collection.get());
} else {
- result =
- table_merger_->Merge(Source(input), table.get(), collection.get());
+ result = table_merger_->Merge(Source(input), table.get(), collection.get());
}
} else {
@@ -1399,7 +1412,7 @@
*/
bool WriteApk(IArchiveWriter* writer, proguard::KeepSet* keep_set,
xml::XmlResource* manifest, ResourceTable* table) {
- const bool keep_raw_values = options_.static_lib;
+ const bool keep_raw_values = options_.package_type == PackageType::kStaticLib;
bool result = FlattenXml(manifest, "AndroidManifest.xml", {},
keep_raw_values, writer, context_);
if (!result) {
@@ -1419,25 +1432,21 @@
file_flattener_options.update_proguard_spec =
static_cast<bool>(options_.generate_proguard_rules_path);
- ResourceFileFlattener file_flattener(file_flattener_options, context_,
- keep_set);
+ ResourceFileFlattener file_flattener(file_flattener_options, context_, keep_set);
if (!file_flattener.Flatten(table, writer)) {
- context_->GetDiagnostics()->Error(DiagMessage()
- << "failed linking file resources");
+ context_->GetDiagnostics()->Error(DiagMessage() << "failed linking file resources");
return false;
}
- if (options_.static_lib) {
+ if (options_.package_type == PackageType::kStaticLib) {
if (!FlattenTableToPb(table, writer)) {
- context_->GetDiagnostics()->Error(
- DiagMessage() << "failed to write resources.arsc.flat");
+ context_->GetDiagnostics()->Error(DiagMessage() << "failed to write resources.arsc.flat");
return false;
}
} else {
if (!FlattenTable(table, writer)) {
- context_->GetDiagnostics()->Error(DiagMessage()
- << "failed to write resources.arsc");
+ context_->GetDiagnostics()->Error(DiagMessage() << "failed to write resources.arsc");
return false;
}
}
@@ -1481,7 +1490,9 @@
context_->SetNameManglerPolicy(
NameManglerPolicy{context_->GetCompilationPackage()});
- if (context_->GetCompilationPackage() == "android") {
+ if (options_.package_type == PackageType::kSharedLib) {
+ context_->SetPackageId(0x00);
+ } else if (context_->GetCompilationPackage() == "android") {
context_->SetPackageId(0x01);
} else {
context_->SetPackageId(0x7f);
@@ -1524,7 +1535,7 @@
return 1;
}
- if (!options_.static_lib) {
+ if (options_.package_type != PackageType::kStaticLib) {
PrivateAttributeMover mover;
if (!mover.Consume(context_, &final_table_)) {
context_->GetDiagnostics()->Error(
@@ -1535,8 +1546,7 @@
// Assign IDs if we are building a regular app.
IdAssigner id_assigner(&options_.stable_id_map);
if (!id_assigner.Consume(context_, &final_table_)) {
- context_->GetDiagnostics()->Error(DiagMessage()
- << "failed assigning IDs");
+ context_->GetDiagnostics()->Error(DiagMessage() << "failed assigning IDs");
return 1;
}
@@ -1583,17 +1593,15 @@
return 1;
}
- if (options_.static_lib) {
+ if (options_.package_type == PackageType::kStaticLib) {
if (!options_.products.empty()) {
- context_->GetDiagnostics()
- ->Warn(DiagMessage()
- << "can't select products when building static library");
+ context_->GetDiagnostics()->Warn(DiagMessage()
+ << "can't select products when building static library");
}
} else {
ProductFilter product_filter(options_.products);
if (!product_filter.Consume(context_, &final_table_)) {
- context_->GetDiagnostics()->Error(DiagMessage()
- << "failed stripping products");
+ context_->GetDiagnostics()->Error(DiagMessage() << "failed stripping products");
return 1;
}
}
@@ -1607,7 +1615,7 @@
}
}
- if (!options_.static_lib && context_->GetMinSdkVersion() > 0) {
+ if (options_.package_type != PackageType::kStaticLib && context_->GetMinSdkVersion() > 0) {
if (context_->IsVerbose()) {
context_->GetDiagnostics()->Note(
DiagMessage() << "collapsing resource versions for minimum SDK "
@@ -1623,8 +1631,7 @@
if (!options_.no_resource_deduping) {
ResourceDeduper deduper;
if (!deduper.Consume(context_, &final_table_)) {
- context_->GetDiagnostics()->Error(DiagMessage()
- << "failed deduping resources");
+ context_->GetDiagnostics()->Error(DiagMessage() << "failed deduping resources");
return 1;
}
}
@@ -1632,12 +1639,11 @@
proguard::KeepSet proguard_keep_set;
proguard::KeepSet proguard_main_dex_keep_set;
- if (options_.static_lib) {
+ if (options_.package_type == PackageType::kStaticLib) {
if (options_.table_splitter_options.config_filter != nullptr ||
!options_.table_splitter_options.preferred_densities.empty()) {
- context_->GetDiagnostics()
- ->Warn(DiagMessage()
- << "can't strip resources when building static library");
+ context_->GetDiagnostics()->Warn(DiagMessage()
+ << "can't strip resources when building static library");
}
} else {
// Adjust the SplitConstraints so that their SDK version is stripped if it
@@ -1771,12 +1777,21 @@
}
if (options_.generate_java_class_path) {
- JavaClassGeneratorOptions options;
- options.types = JavaClassGeneratorOptions::SymbolTypes::kAll;
- options.javadoc_annotations = options_.javadoc_annotations;
+ // The set of packages whose R class to call in the main classes
+ // onResourcesLoaded callback.
+ std::vector<std::string> packages_to_callback;
- if (options_.static_lib || options_.generate_non_final_ids) {
- options.use_final = false;
+ JavaClassGeneratorOptions template_options;
+ template_options.types = JavaClassGeneratorOptions::SymbolTypes::kAll;
+ template_options.javadoc_annotations = options_.javadoc_annotations;
+
+ if (options_.package_type == PackageType::kStaticLib || options_.generate_non_final_ids) {
+ template_options.use_final = false;
+ }
+
+ if (options_.package_type == PackageType::kSharedLib) {
+ template_options.use_final = false;
+ template_options.rewrite_callback_options = OnResourcesLoadedCallbackOptions{};
}
const StringPiece actual_package = context_->GetCompilationPackage();
@@ -1786,36 +1801,51 @@
output_package = options_.custom_java_package.value();
}
+ // Generate the private symbols if required.
if (options_.private_symbols) {
+ packages_to_callback.push_back(options_.private_symbols.value());
+
// If we defined a private symbols package, we only emit Public symbols
// to the original package, and private and public symbols to the
// private package.
-
- options.types = JavaClassGeneratorOptions::SymbolTypes::kPublic;
- if (!WriteJavaFile(&final_table_, context_->GetCompilationPackage(),
- output_package, options)) {
- return 1;
- }
-
+ JavaClassGeneratorOptions options = template_options;
options.types = JavaClassGeneratorOptions::SymbolTypes::kPublicPrivate;
- output_package = options_.private_symbols.value();
- }
-
- if (!WriteJavaFile(&final_table_, actual_package, output_package,
- options)) {
- return 1;
- }
-
- for (const std::string& extra_package : options_.extra_java_packages) {
- if (!WriteJavaFile(&final_table_, actual_package, extra_package,
+ if (!WriteJavaFile(&final_table_, actual_package, options_.private_symbols.value(),
options)) {
return 1;
}
}
+
+ // Generate all the symbols for all extra packages.
+ for (const std::string& extra_package : options_.extra_java_packages) {
+ packages_to_callback.push_back(extra_package);
+
+ JavaClassGeneratorOptions options = template_options;
+ options.types = JavaClassGeneratorOptions::SymbolTypes::kAll;
+ if (!WriteJavaFile(&final_table_, actual_package, extra_package, options)) {
+ return 1;
+ }
+ }
+
+ // Generate the main public R class.
+ JavaClassGeneratorOptions options = template_options;
+
+ // Only generate public symbols if we have a private package.
+ if (options_.private_symbols) {
+ options.types = JavaClassGeneratorOptions::SymbolTypes::kPublic;
+ }
+
+ if (options.rewrite_callback_options) {
+ options.rewrite_callback_options.value().packages_to_callback =
+ std::move(packages_to_callback);
+ }
+
+ if (!WriteJavaFile(&final_table_, actual_package, output_package, options)) {
+ return 1;
+ }
}
- if (!WriteProguardFile(options_.generate_proguard_rules_path,
- proguard_keep_set)) {
+ if (!WriteProguardFile(options_.generate_proguard_rules_path, proguard_keep_set)) {
return 1;
}
@@ -1847,9 +1877,11 @@
std::vector<std::unique_ptr<io::IFileCollection>> collections_;
// A vector of ResourceTables. This is here to retain ownership, so that the
- // SymbolTable
- // can use these.
+ // SymbolTable can use these.
std::vector<std::unique_ptr<ResourceTable>> static_table_includes_;
+
+ // The set of shared libraries being used, mapping their assigned package ID to package name.
+ std::map<size_t, std::string> shared_libs_;
};
int Link(const std::vector<StringPiece>& args) {
@@ -1863,6 +1895,8 @@
bool legacy_x_flag = false;
bool require_localization = false;
bool verbose = false;
+ bool shared_lib = false;
+ bool static_lib = false;
Maybe<std::string> stable_id_file_path;
std::vector<std::string> split_args;
Flags flags =
@@ -1870,24 +1904,19 @@
.RequiredFlag("-o", "Output path", &options.output_path)
.RequiredFlag("--manifest", "Path to the Android manifest to build",
&options.manifest_path)
- .OptionalFlagList("-I", "Adds an Android APK to link against",
- &options.include_paths)
- .OptionalFlagList(
- "-R",
- "Compilation unit to link, using `overlay` semantics.\n"
- "The last conflicting resource given takes precedence.",
- &overlay_arg_list)
+ .OptionalFlagList("-I", "Adds an Android APK to link against", &options.include_paths)
+ .OptionalFlagList("-R",
+ "Compilation unit to link, using `overlay` semantics.\n"
+ "The last conflicting resource given takes precedence.",
+ &overlay_arg_list)
.OptionalFlag("--java", "Directory in which to generate R.java",
&options.generate_java_class_path)
- .OptionalFlag("--proguard",
- "Output file for generated Proguard rules",
+ .OptionalFlag("--proguard", "Output file for generated Proguard rules",
&options.generate_proguard_rules_path)
- .OptionalFlag(
- "--proguard-main-dex",
- "Output file for generated Proguard rules for the main dex",
- &options.generate_main_dex_proguard_rules_path)
- .OptionalSwitch("--no-auto-version",
- "Disables automatic style and layout SDK versioning",
+ .OptionalFlag("--proguard-main-dex",
+ "Output file for generated Proguard rules for the main dex",
+ &options.generate_main_dex_proguard_rules_path)
+ .OptionalSwitch("--no-auto-version", "Disables automatic style and layout SDK versioning",
&options.no_auto_version)
.OptionalSwitch("--no-version-vectors",
"Disables automatic versioning of vector drawables. "
@@ -1903,25 +1932,22 @@
"Disables automatic deduping of resources with\n"
"identical values across compatible configurations.",
&options.no_resource_deduping)
- .OptionalSwitch(
- "-x",
- "Legacy flag that specifies to use the package identifier 0x01",
- &legacy_x_flag)
- .OptionalSwitch("-z",
- "Require localization of strings marked 'suggested'",
+ .OptionalSwitch("--enable-sparse-encoding",
+ "Enables encoding sparse entries using a binary search tree.\n"
+ "This decreases APK size at the cost of resource retrieval performance.",
+ &options.table_flattener_options.use_sparse_entries)
+ .OptionalSwitch("-x", "Legacy flag that specifies to use the package identifier 0x01",
+ &legacy_x_flag)
+ .OptionalSwitch("-z", "Require localization of strings marked 'suggested'",
&require_localization)
- .OptionalFlag(
- "-c",
- "Comma separated list of configurations to include. The default\n"
- "is all configurations",
- &configs)
- .OptionalFlag(
- "--preferred-density",
- "Selects the closest matching density and strips out all others.",
- &preferred_density)
- .OptionalFlag("--product",
- "Comma separated list of product names to keep",
- &product_list)
+ .OptionalFlag("-c",
+ "Comma separated list of configurations to include. The default\n"
+ "is all configurations",
+ &configs)
+ .OptionalFlag("--preferred-density",
+ "Selects the closest matching density and strips out all others.",
+ &preferred_density)
+ .OptionalFlag("--product", "Comma separated list of product names to keep", &product_list)
.OptionalSwitch("--output-to-dir",
"Outputs the APK contents to a directory specified "
"by -o",
@@ -1935,11 +1961,10 @@
"Default minimum SDK version to use for "
"AndroidManifest.xml",
&options.manifest_fixer_options.min_sdk_version_default)
- .OptionalFlag(
- "--target-sdk-version",
- "Default target SDK version to use for "
- "AndroidManifest.xml",
- &options.manifest_fixer_options.target_sdk_version_default)
+ .OptionalFlag("--target-sdk-version",
+ "Default target SDK version to use for "
+ "AndroidManifest.xml",
+ &options.manifest_fixer_options.target_sdk_version_default)
.OptionalFlag("--version-code",
"Version code (integer) to inject into the "
"AndroidManifest.xml if none is present",
@@ -1948,8 +1973,8 @@
"Version name to inject into the AndroidManifest.xml "
"if none is present",
&options.manifest_fixer_options.version_name_default)
- .OptionalSwitch("--static-lib", "Generate a static Android library",
- &options.static_lib)
+ .OptionalSwitch("--shared-lib", "Generates a shared Android runtime library", &shared_lib)
+ .OptionalSwitch("--static-lib", "Generate a static Android library", &static_lib)
.OptionalSwitch("--no-static-lib-packages",
"Merge all library resources under the app's package",
&options.no_static_lib_packages)
@@ -1957,14 +1982,12 @@
"Generates R.java without the final modifier.\n"
"This is implied when --static-lib is specified.",
&options.generate_non_final_ids)
- .OptionalFlag("--stable-ids",
- "File containing a list of name to ID mapping.",
+ .OptionalFlag("--stable-ids", "File containing a list of name to ID mapping.",
&stable_id_file_path)
- .OptionalFlag(
- "--emit-ids",
- "Emit a file at the given path with a list of name to ID\n"
- "mappings, suitable for use with --stable-ids.",
- &options.resource_id_map_path)
+ .OptionalFlag("--emit-ids",
+ "Emit a file at the given path with a list of name to ID\n"
+ "mappings, suitable for use with --stable-ids.",
+ &options.resource_id_map_path)
.OptionalFlag("--private-symbols",
"Package name to use when generating R.java for "
"private symbols.\n"
@@ -1972,8 +1995,7 @@
"the application's "
"package name",
&options.private_symbols)
- .OptionalFlag("--custom-package",
- "Custom Java package under which to generate R.java",
+ .OptionalFlag("--custom-package", "Custom Java package under which to generate R.java",
&options.custom_java_package)
.OptionalFlagList("--extra-packages",
"Generate the same R.java but with different "
@@ -1987,23 +2009,19 @@
"Allows the addition of new resources in "
"overlays without <add-resource> tags",
&options.auto_add_overlay)
- .OptionalFlag("--rename-manifest-package",
- "Renames the package in AndroidManifest.xml",
+ .OptionalFlag("--rename-manifest-package", "Renames the package in AndroidManifest.xml",
&options.manifest_fixer_options.rename_manifest_package)
- .OptionalFlag(
- "--rename-instrumentation-target-package",
- "Changes the name of the target package for instrumentation. "
- "Most useful "
- "when used\nin conjunction with --rename-manifest-package",
- &options.manifest_fixer_options
- .rename_instrumentation_target_package)
+ .OptionalFlag("--rename-instrumentation-target-package",
+ "Changes the name of the target package for instrumentation. "
+ "Most useful "
+ "when used\nin conjunction with --rename-manifest-package",
+ &options.manifest_fixer_options.rename_instrumentation_target_package)
.OptionalFlagList("-0", "File extensions not to compress",
&options.extensions_to_not_compress)
- .OptionalFlagList(
- "--split",
- "Split resources matching a set of configs out to a "
- "Split APK.\nSyntax: path/to/output.apk:<config>[,<config>[...]]",
- &split_args)
+ .OptionalFlagList("--split",
+ "Split resources matching a set of configs out to a "
+ "Split APK.\nSyntax: path/to/output.apk:<config>[,<config>[...]]",
+ &split_args)
.OptionalSwitch("-v", "Enables verbose logging", &verbose);
if (!flags.Parse("aapt2 link", args, &std::cerr)) {
@@ -2110,7 +2128,19 @@
options.table_splitter_options.preferred_densities.push_back(preferred_density_config.density);
}
- if (!options.static_lib && stable_id_file_path) {
+ if (shared_lib && static_lib) {
+ context.GetDiagnostics()->Error(DiagMessage()
+ << "only one of --shared-lib and --static-lib can be defined");
+ return 1;
+ }
+
+ if (shared_lib) {
+ options.package_type = PackageType::kSharedLib;
+ } else if (static_lib) {
+ options.package_type = PackageType::kStaticLib;
+ }
+
+ if (options.package_type != PackageType::kStaticLib && stable_id_file_path) {
if (!LoadStableIdMap(context.GetDiagnostics(), stable_id_file_path.value(),
&options.stable_id_map)) {
return 1;
@@ -2136,7 +2166,7 @@
}
// Turn off auto versioning for static-libs.
- if (options.static_lib) {
+ if (options.package_type == PackageType::kStaticLib) {
options.no_auto_version = true;
options.no_version_vectors = true;
options.no_version_transitions = true;
diff --git a/tools/aapt2/link/Linkers.h b/tools/aapt2/link/Linkers.h
index 4687d2c..d00fa73 100644
--- a/tools/aapt2/link/Linkers.h
+++ b/tools/aapt2/link/Linkers.h
@@ -58,29 +58,6 @@
DISALLOW_COPY_AND_ASSIGN(AutoVersioner);
};
-class VersionCollapser : public IResourceTableConsumer {
- public:
- VersionCollapser() = default;
-
- bool Consume(IAaptContext* context, ResourceTable* table) override;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(VersionCollapser);
-};
-
-/**
- * Removes duplicated key-value entries from dominated resources.
- */
-class ResourceDeduper : public IResourceTableConsumer {
- public:
- ResourceDeduper() = default;
-
- bool Consume(IAaptContext* context, ResourceTable* table) override;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(ResourceDeduper);
-};
-
/**
* If any attribute resource values are defined as public, this consumer will
* move all private
diff --git a/tools/aapt2/link/ManifestFixer.cpp b/tools/aapt2/link/ManifestFixer.cpp
index b4cf4f8..313fe45 100644
--- a/tools/aapt2/link/ManifestFixer.cpp
+++ b/tools/aapt2/link/ManifestFixer.cpp
@@ -54,16 +54,14 @@
return true;
}
-static bool OptionalNameIsJavaClassName(xml::Element* el,
- SourcePathDiagnostics* diag) {
+static bool OptionalNameIsJavaClassName(xml::Element* el, SourcePathDiagnostics* diag) {
if (xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "name")) {
return NameIsJavaClassName(el, attr, diag);
}
return true;
}
-static bool RequiredNameIsJavaClassName(xml::Element* el,
- SourcePathDiagnostics* diag) {
+static bool RequiredNameIsJavaClassName(xml::Element* el, SourcePathDiagnostics* diag) {
if (xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "name")) {
return NameIsJavaClassName(el, attr, diag);
}
@@ -72,6 +70,26 @@
return false;
}
+static bool RequiredNameIsJavaPackage(xml::Element* el, SourcePathDiagnostics* diag) {
+ if (xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "name")) {
+ return util::IsJavaPackageName(attr->value);
+ }
+ diag->Error(DiagMessage(el->line_number)
+ << "<" << el->name << "> is missing attribute 'android:name'");
+ return false;
+}
+
+static xml::XmlNodeAction::ActionFuncWithDiag RequiredAndroidAttribute(const std::string& attr) {
+ return [=](xml::Element* el, SourcePathDiagnostics* diag) -> bool {
+ if (el->FindAttribute(xml::kSchemaAndroid, attr) == nullptr) {
+ diag->Error(DiagMessage(el->line_number)
+ << "<" << el->name << "> is missing required attribute 'android:" << attr << "'");
+ return false;
+ }
+ return true;
+ };
+}
+
static bool VerifyManifest(xml::Element* el, SourcePathDiagnostics* diag) {
xml::Attribute* attr = el->FindAttribute({}, "package");
if (!attr) {
@@ -263,7 +281,18 @@
xml::XmlNodeAction& application_action = manifest_action["application"];
application_action.Action(OptionalNameIsJavaClassName);
- application_action["uses-library"];
+ application_action["uses-library"].Action(RequiredNameIsJavaPackage);
+ application_action["library"].Action(RequiredNameIsJavaPackage);
+
+ xml::XmlNodeAction& static_library_action = application_action["static-library"];
+ static_library_action.Action(RequiredNameIsJavaPackage);
+ static_library_action.Action(RequiredAndroidAttribute("version"));
+
+ xml::XmlNodeAction& uses_static_library_action = application_action["uses-static-library"];
+ uses_static_library_action.Action(RequiredNameIsJavaPackage);
+ uses_static_library_action.Action(RequiredAndroidAttribute("version"));
+ uses_static_library_action.Action(RequiredAndroidAttribute("certDigest"));
+
application_action["meta-data"] = meta_data_action;
application_action["activity"] = component_action;
application_action["activity-alias"] = component_action;
diff --git a/tools/aapt2/link/PrivateAttributeMover.cpp b/tools/aapt2/link/PrivateAttributeMover.cpp
index cc07a6e..eee4b60 100644
--- a/tools/aapt2/link/PrivateAttributeMover.cpp
+++ b/tools/aapt2/link/PrivateAttributeMover.cpp
@@ -26,11 +26,9 @@
namespace aapt {
template <typename InputContainer, typename OutputIterator, typename Predicate>
-OutputIterator move_if(InputContainer& input_container, OutputIterator result,
- Predicate pred) {
+OutputIterator move_if(InputContainer& input_container, OutputIterator result, Predicate pred) {
const auto last = input_container.end();
- auto new_end =
- std::find_if(input_container.begin(), input_container.end(), pred);
+ auto new_end = std::find_if(input_container.begin(), input_container.end(), pred);
if (new_end == last) {
return result;
}
@@ -57,8 +55,7 @@
return result;
}
-bool PrivateAttributeMover::Consume(IAaptContext* context,
- ResourceTable* table) {
+bool PrivateAttributeMover::Consume(IAaptContext* context, ResourceTable* table) {
for (auto& package : table->packages) {
ResourceTableType* type = package->FindType(ResourceType::kAttr);
if (!type) {
@@ -68,18 +65,24 @@
if (type->symbol_status.state != SymbolState::kPublic) {
// No public attributes, so we can safely leave these private attributes
// where they are.
- return true;
+ continue;
}
- ResourceTableType* priv_attr_type =
- package->FindOrCreateType(ResourceType::kAttrPrivate);
- CHECK(priv_attr_type->entries.empty());
+ std::vector<std::unique_ptr<ResourceEntry>> private_attr_entries;
- move_if(type->entries, std::back_inserter(priv_attr_type->entries),
+ move_if(type->entries, std::back_inserter(private_attr_entries),
[](const std::unique_ptr<ResourceEntry>& entry) -> bool {
return entry->symbol_status.state != SymbolState::kPublic;
});
- break;
+
+ if (private_attr_entries.empty()) {
+ // No private attributes.
+ continue;
+ }
+
+ ResourceTableType* priv_attr_type = package->FindOrCreateType(ResourceType::kAttrPrivate);
+ CHECK(priv_attr_type->entries.empty());
+ priv_attr_type->entries = std::move(private_attr_entries);
}
return true;
}
diff --git a/tools/aapt2/link/PrivateAttributeMover_test.cpp b/tools/aapt2/link/PrivateAttributeMover_test.cpp
index 90c4922..7fcf6e7 100644
--- a/tools/aapt2/link/PrivateAttributeMover_test.cpp
+++ b/tools/aapt2/link/PrivateAttributeMover_test.cpp
@@ -54,8 +54,7 @@
EXPECT_NE(type->FindEntry("privateB"), nullptr);
}
-TEST(PrivateAttributeMoverTest,
- LeavePrivateAttributesWhenNoPublicAttributesDefined) {
+TEST(PrivateAttributeMoverTest, LeavePrivateAttributesWhenNoPublicAttributesDefined) {
std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
@@ -77,4 +76,23 @@
ASSERT_EQ(type, nullptr);
}
+TEST(PrivateAttributeMoverTest, DoNotCreatePrivateAttrsIfNoneExist) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .AddSimple("android:attr/pub")
+ .SetSymbolState("android:attr/pub", ResourceId(0x01010000), SymbolState::kPublic)
+ .Build();
+
+ ResourceTablePackage* package = table->FindPackage("android");
+ ASSERT_NE(nullptr, package);
+
+ ASSERT_EQ(nullptr, package->FindType(ResourceType::kAttrPrivate));
+
+ PrivateAttributeMover mover;
+ ASSERT_TRUE(mover.Consume(context.get(), table.get()));
+
+ ASSERT_EQ(nullptr, package->FindType(ResourceType::kAttrPrivate));
+}
+
} // namespace aapt
diff --git a/tools/aapt2/link/ReferenceLinker.cpp b/tools/aapt2/link/ReferenceLinker.cpp
index ea68b61..0331313 100644
--- a/tools/aapt2/link/ReferenceLinker.cpp
+++ b/tools/aapt2/link/ReferenceLinker.cpp
@@ -96,10 +96,8 @@
// Find the attribute in the symbol table and check if it is visible from
// this callsite.
- const SymbolTable::Symbol* symbol =
- ReferenceLinker::ResolveAttributeCheckVisibility(
- transformed_reference, context_->GetNameMangler(), symbols_,
- callsite_, &err_str);
+ const SymbolTable::Symbol* symbol = ReferenceLinker::ResolveAttributeCheckVisibility(
+ transformed_reference, symbols_, callsite_, &err_str);
if (symbol) {
// Assign our style key the correct ID.
// The ID may not exist.
@@ -124,8 +122,7 @@
DiagMessage msg(entry.key.GetSource());
// Call the matches method again, this time with a DiagMessage so we
- // fill
- // in the actual error message.
+ // fill in the actual error message.
symbol->attribute->Matches(entry.value.get(), &msg);
context_->GetDiagnostics()->Error(msg);
error_ = true;
@@ -225,12 +222,10 @@
return true;
}
-const SymbolTable::Symbol* ReferenceLinker::ResolveSymbol(
- const Reference& reference, NameMangler* mangler, SymbolTable* symbols) {
+const SymbolTable::Symbol* ReferenceLinker::ResolveSymbol(const Reference& reference,
+ SymbolTable* symbols) {
if (reference.name) {
- Maybe<ResourceName> mangled = mangler->MangleName(reference.name.value());
- return symbols->FindByName(mangled ? mangled.value()
- : reference.name.value());
+ return symbols->FindByName(reference.name.value());
} else if (reference.id) {
return symbols->FindById(reference.id.value());
} else {
@@ -238,11 +233,11 @@
}
}
-const SymbolTable::Symbol* ReferenceLinker::ResolveSymbolCheckVisibility(
- const Reference& reference, NameMangler* name_mangler, SymbolTable* symbols,
- CallSite* callsite, std::string* out_error) {
- const SymbolTable::Symbol* symbol =
- ResolveSymbol(reference, name_mangler, symbols);
+const SymbolTable::Symbol* ReferenceLinker::ResolveSymbolCheckVisibility(const Reference& reference,
+ SymbolTable* symbols,
+ CallSite* callsite,
+ std::string* out_error) {
+ const SymbolTable::Symbol* symbol = ResolveSymbol(reference, symbols);
if (!symbol) {
if (out_error) *out_error = "not found";
return nullptr;
@@ -256,10 +251,9 @@
}
const SymbolTable::Symbol* ReferenceLinker::ResolveAttributeCheckVisibility(
- const Reference& reference, NameMangler* name_mangler, SymbolTable* symbols,
- CallSite* callsite, std::string* out_error) {
- const SymbolTable::Symbol* symbol = ResolveSymbolCheckVisibility(
- reference, name_mangler, symbols, callsite, out_error);
+ const Reference& reference, SymbolTable* symbols, CallSite* callsite, std::string* out_error) {
+ const SymbolTable::Symbol* symbol =
+ ResolveSymbolCheckVisibility(reference, symbols, callsite, out_error);
if (!symbol) {
return nullptr;
}
@@ -271,11 +265,11 @@
return symbol;
}
-Maybe<xml::AaptAttribute> ReferenceLinker::CompileXmlAttribute(
- const Reference& reference, NameMangler* name_mangler, SymbolTable* symbols,
- CallSite* callsite, std::string* out_error) {
- const SymbolTable::Symbol* symbol =
- ResolveSymbol(reference, name_mangler, symbols);
+Maybe<xml::AaptAttribute> ReferenceLinker::CompileXmlAttribute(const Reference& reference,
+ SymbolTable* symbols,
+ CallSite* callsite,
+ std::string* out_error) {
+ const SymbolTable::Symbol* symbol = ResolveSymbol(reference, symbols);
if (!symbol) {
if (out_error) *out_error = "not found";
return {};
@@ -311,13 +305,11 @@
CHECK(reference->name || reference->id);
Reference transformed_reference = *reference;
- TransformReferenceFromNamespace(decls, context->GetCompilationPackage(),
- &transformed_reference);
+ TransformReferenceFromNamespace(decls, context->GetCompilationPackage(), &transformed_reference);
std::string err_str;
- const SymbolTable::Symbol* s = ResolveSymbolCheckVisibility(
- transformed_reference, context->GetNameMangler(), symbols, callsite,
- &err_str);
+ const SymbolTable::Symbol* s =
+ ResolveSymbolCheckVisibility(transformed_reference, symbols, callsite, &err_str);
if (s) {
// The ID may not exist. This is fine because of the possibility of building
// against libraries without assigned IDs.
diff --git a/tools/aapt2/link/ReferenceLinker.h b/tools/aapt2/link/ReferenceLinker.h
index bdabf24..2d18c49 100644
--- a/tools/aapt2/link/ReferenceLinker.h
+++ b/tools/aapt2/link/ReferenceLinker.h
@@ -51,18 +51,17 @@
* Performs name mangling and looks up the resource in the symbol table.
* Returns nullptr if the symbol was not found.
*/
- static const SymbolTable::Symbol* ResolveSymbol(const Reference& reference,
- NameMangler* mangler,
- SymbolTable* symbols);
+ static const SymbolTable::Symbol* ResolveSymbol(const Reference& reference, SymbolTable* symbols);
/**
* Performs name mangling and looks up the resource in the symbol table. If
* the symbol is not visible by the reference at the callsite, nullptr is
* returned. out_error holds the error message.
*/
- static const SymbolTable::Symbol* ResolveSymbolCheckVisibility(
- const Reference& reference, NameMangler* name_mangler,
- SymbolTable* symbols, CallSite* callsite, std::string* out_error);
+ static const SymbolTable::Symbol* ResolveSymbolCheckVisibility(const Reference& reference,
+ SymbolTable* symbols,
+ CallSite* callsite,
+ std::string* out_error);
/**
* Same as resolveSymbolCheckVisibility(), but also makes sure the symbol is
@@ -70,18 +69,19 @@
* That is, the return value will have a non-null value for
* ISymbolTable::Symbol::attribute.
*/
- static const SymbolTable::Symbol* ResolveAttributeCheckVisibility(
- const Reference& reference, NameMangler* name_mangler,
- SymbolTable* symbols, CallSite* callsite, std::string* out_error);
+ static const SymbolTable::Symbol* ResolveAttributeCheckVisibility(const Reference& reference,
+ SymbolTable* symbols,
+ CallSite* callsite,
+ std::string* out_error);
/**
* Resolves the attribute reference and returns an xml::AaptAttribute if
* successful.
* If resolution fails, outError holds the error message.
*/
- static Maybe<xml::AaptAttribute> CompileXmlAttribute(
- const Reference& reference, NameMangler* name_mangler,
- SymbolTable* symbols, CallSite* callsite, std::string* out_error);
+ static Maybe<xml::AaptAttribute> CompileXmlAttribute(const Reference& reference,
+ SymbolTable* symbols, CallSite* callsite,
+ std::string* out_error);
/**
* Writes the resource name to the DiagMessage, using the
diff --git a/tools/aapt2/link/TableMerger.cpp b/tools/aapt2/link/TableMerger.cpp
index 7e7b9fb..9311091 100644
--- a/tools/aapt2/link/TableMerger.cpp
+++ b/tools/aapt2/link/TableMerger.cpp
@@ -39,14 +39,12 @@
bool TableMerger::Merge(const Source& src, ResourceTable* table,
io::IFileCollection* collection) {
- return MergeImpl(src, table, collection, false /* overlay */,
- true /* allow new */);
+ return MergeImpl(src, table, collection, false /* overlay */, true /* allow new */);
}
bool TableMerger::MergeOverlay(const Source& src, ResourceTable* table,
io::IFileCollection* collection) {
- return MergeImpl(src, table, collection, true /* overlay */,
- options_.auto_add_overlay);
+ return MergeImpl(src, table, collection, true /* overlay */, options_.auto_add_overlay);
}
/**
@@ -55,25 +53,13 @@
bool TableMerger::MergeImpl(const Source& src, ResourceTable* table,
io::IFileCollection* collection, bool overlay,
bool allow_new) {
- const uint8_t desired_package_id = context_->GetPackageId();
-
bool error = false;
for (auto& package : table->packages) {
- // Warn of packages with an unrelated ID.
- const Maybe<ResourceId>& id = package->id;
- if (id && id.value() != 0x0 && id.value() != desired_package_id) {
- context_->GetDiagnostics()->Warn(DiagMessage(src) << "ignoring package "
- << package->name);
- continue;
- }
-
// Only merge an empty package or the package we're building.
// Other packages may exist, which likely contain attribute definitions.
// This is because at compile time it is unknown if the attributes are
- // simply
- // uses of the attribute or definitions.
- if (package->name.empty() ||
- context_->GetCompilationPackage() == package->name) {
+ // simply uses of the attribute or definitions.
+ if (package->name.empty() || context_->GetCompilationPackage() == package->name) {
FileMergeCallback callback;
if (collection) {
callback = [&](const ResourceNameRef& name,
@@ -83,8 +69,7 @@
io::IFile* f = collection->FindFile(*old_file->path);
if (!f) {
context_->GetDiagnostics()->Error(DiagMessage(src)
- << "file '" << *old_file->path
- << "' not found");
+ << "file '" << *old_file->path << "' not found");
return false;
}
diff --git a/tools/aapt2/link/XmlReferenceLinker.cpp b/tools/aapt2/link/XmlReferenceLinker.cpp
index 1dbe53c..b839862 100644
--- a/tools/aapt2/link/XmlReferenceLinker.cpp
+++ b/tools/aapt2/link/XmlReferenceLinker.cpp
@@ -107,8 +107,8 @@
attr_ref.private_reference = maybe_package.value().private_namespace;
std::string err_str;
- attr.compiled_attribute = ReferenceLinker::CompileXmlAttribute(
- attr_ref, context_->GetNameMangler(), symbols_, callsite_, &err_str);
+ attr.compiled_attribute =
+ ReferenceLinker::CompileXmlAttribute(attr_ref, symbols_, callsite_, &err_str);
if (!attr.compiled_attribute) {
context_->GetDiagnostics()->Error(DiagMessage(source) << "attribute '"
diff --git a/tools/aapt2/optimize/Optimize.cpp b/tools/aapt2/optimize/Optimize.cpp
new file mode 100644
index 0000000..9615962
--- /dev/null
+++ b/tools/aapt2/optimize/Optimize.cpp
@@ -0,0 +1,201 @@
+/*
+ * 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 <memory>
+#include <vector>
+
+#include "androidfw/StringPiece.h"
+
+#include "Diagnostics.h"
+#include "Flags.h"
+#include "LoadedApk.h"
+#include "SdkConstants.h"
+#include "flatten/TableFlattener.h"
+#include "optimize/ResourceDeduper.h"
+#include "optimize/VersionCollapser.h"
+#include "split/TableSplitter.h"
+
+using android::StringPiece;
+
+namespace aapt {
+
+struct OptimizeOptions {
+ // Path to the output APK.
+ std::string output_path;
+
+ // List of screen density configurations the APK will be optimized for.
+ std::vector<ConfigDescription> target_configs;
+
+ TableFlattenerOptions table_flattener_options;
+};
+
+class OptimizeContext : public IAaptContext {
+ public:
+ IDiagnostics* GetDiagnostics() override { return &diagnostics_; }
+
+ NameMangler* GetNameMangler() override {
+ abort();
+ return nullptr;
+ }
+
+ const std::string& GetCompilationPackage() override {
+ static std::string empty;
+ return empty;
+ }
+
+ uint8_t GetPackageId() override { return 0; }
+
+ SymbolTable* GetExternalSymbols() override {
+ abort();
+ return nullptr;
+ }
+
+ bool IsVerbose() override { return verbose_; }
+
+ void SetVerbose(bool val) { verbose_ = val; }
+
+ void SetMinSdkVersion(int sdk_version) { sdk_version_ = sdk_version; }
+
+ int GetMinSdkVersion() override { return sdk_version_; }
+
+ private:
+ StdErrDiagnostics diagnostics_;
+ bool verbose_ = false;
+ int sdk_version_ = 0;
+};
+
+class OptimizeCommand {
+ public:
+ OptimizeCommand(OptimizeContext* context, const OptimizeOptions& options)
+ : options_(options),
+ context_(context) {}
+
+ int Run(std::unique_ptr<LoadedApk> apk) {
+ if (context_->IsVerbose()) {
+ context_->GetDiagnostics()->Note(DiagMessage() << "Optimizing APK...");
+ }
+
+ VersionCollapser collapser;
+ if (!collapser.Consume(context_, apk->GetResourceTable())) {
+ return 1;
+ }
+
+ ResourceDeduper deduper;
+ if (!deduper.Consume(context_, apk->GetResourceTable())) {
+ context_->GetDiagnostics()->Error(DiagMessage() << "failed deduping resources");
+ return 1;
+ }
+
+ // Stripping the APK using the TableSplitter with no splits and the target
+ // densities as the preferred densities. The resource table is modified in
+ // place in the LoadedApk.
+ TableSplitterOptions splitter_options;
+ for (auto& config : options_.target_configs) {
+ splitter_options.preferred_densities.push_back(config.density);
+ }
+ std::vector<SplitConstraints> splits;
+ TableSplitter splitter(splits, splitter_options);
+ splitter.SplitTable(apk->GetResourceTable());
+
+ std::unique_ptr<IArchiveWriter> writer =
+ CreateZipFileArchiveWriter(context_->GetDiagnostics(), options_.output_path);
+ if (!apk->WriteToArchive(context_, options_.table_flattener_options, writer.get())) {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ private:
+ OptimizeOptions options_;
+ OptimizeContext* context_;
+};
+
+int Optimize(const std::vector<StringPiece>& args) {
+ OptimizeContext context;
+ OptimizeOptions options;
+ Maybe<std::string> target_densities;
+ bool verbose = false;
+ Flags flags =
+ Flags()
+ .RequiredFlag("-o", "Path to the output APK.", &options.output_path)
+ .OptionalFlag(
+ "--target-densities",
+ "Comma separated list of the screen densities that the APK will "
+ "be optimized for. All the resources that would be unused on "
+ "devices of the given densities will be removed from the APK.",
+ &target_densities)
+ .OptionalSwitch("--enable-sparse-encoding",
+ "Enables encoding sparse entries using a binary search tree.\n"
+ "This decreases APK size at the cost of resource retrieval performance.",
+ &options.table_flattener_options.use_sparse_entries)
+ .OptionalSwitch("-v", "Enables verbose logging", &verbose);
+
+ if (!flags.Parse("aapt2 optimize", args, &std::cerr)) {
+ return 1;
+ }
+
+ if (flags.GetArgs().size() != 1u) {
+ std::cerr << "must have one APK as argument.\n\n";
+ flags.Usage("aapt2 optimize", &std::cerr);
+ return 1;
+ }
+
+ std::unique_ptr<LoadedApk> apk =
+ LoadedApk::LoadApkFromPath(&context, flags.GetArgs()[0]);
+ if (!apk) {
+ return 1;
+ }
+
+ if (verbose) {
+ context.SetVerbose(verbose);
+ }
+
+ if (target_densities) {
+ // Parse the target screen densities.
+ for (const StringPiece& config_str : util::Tokenize(target_densities.value(), ',')) {
+ ConfigDescription config;
+ if (!ConfigDescription::Parse(config_str, &config) || config.density == 0) {
+ context.GetDiagnostics()->Error(
+ DiagMessage() << "invalid density '" << config_str
+ << "' for --target-densities option");
+ return 1;
+ }
+
+ // Clear the version that can be automatically added.
+ config.sdkVersion = 0;
+
+ if (config.diff(ConfigDescription::DefaultConfig()) !=
+ ConfigDescription::CONFIG_DENSITY) {
+ context.GetDiagnostics()->Error(
+ DiagMessage() << "invalid density '" << config_str
+ << "' for --target-densities option. Must be only a "
+ << "density value.");
+ return 1;
+ }
+
+ options.target_configs.push_back(config);
+ }
+ }
+
+ // TODO(adamlesinski): Read manfiest and set the proper minSdkVersion.
+ // context.SetMinSdkVersion(SDK_O);
+
+ OptimizeCommand cmd(&context, options);
+ return cmd.Run(std::move(apk));
+}
+
+} // namespace aapt
diff --git a/tools/aapt2/link/ResourceDeduper.cpp b/tools/aapt2/optimize/ResourceDeduper.cpp
similarity index 98%
rename from tools/aapt2/link/ResourceDeduper.cpp
rename to tools/aapt2/optimize/ResourceDeduper.cpp
index 9431dce..3aab2e3 100644
--- a/tools/aapt2/link/ResourceDeduper.cpp
+++ b/tools/aapt2/optimize/ResourceDeduper.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#include "link/Linkers.h"
+#include "optimize/ResourceDeduper.h"
#include <algorithm>
diff --git a/tools/aapt2/optimize/ResourceDeduper.h b/tools/aapt2/optimize/ResourceDeduper.h
new file mode 100644
index 0000000..4a669d4
--- /dev/null
+++ b/tools/aapt2/optimize/ResourceDeduper.h
@@ -0,0 +1,41 @@
+/*
+ * 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.
+ */
+
+#ifndef AAPT_OPTIMIZE_RESOURCEDEDUPER_H
+#define AAPT_OPTIMIZE_RESOURCEDEDUPER_H
+
+#include "android-base/macros.h"
+
+#include "process/IResourceTableConsumer.h"
+
+namespace aapt {
+
+class ResourceTable;
+
+// Removes duplicated key-value entries from dominated resources.
+class ResourceDeduper : public IResourceTableConsumer {
+ public:
+ ResourceDeduper() = default;
+
+ bool Consume(IAaptContext* context, ResourceTable* table) override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ResourceDeduper);
+};
+
+} // namespace aapt
+
+#endif // AAPT_OPTIMIZE_RESOURCEDEDUPER_H
diff --git a/tools/aapt2/link/ResourceDeduper_test.cpp b/tools/aapt2/optimize/ResourceDeduper_test.cpp
similarity index 98%
rename from tools/aapt2/link/ResourceDeduper_test.cpp
rename to tools/aapt2/optimize/ResourceDeduper_test.cpp
index d38059d..4d00fa6 100644
--- a/tools/aapt2/link/ResourceDeduper_test.cpp
+++ b/tools/aapt2/optimize/ResourceDeduper_test.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#include "link/Linkers.h"
+#include "optimize/ResourceDeduper.h"
#include "ResourceTable.h"
#include "test/Test.h"
diff --git a/tools/aapt2/link/VersionCollapser.cpp b/tools/aapt2/optimize/VersionCollapser.cpp
similarity index 98%
rename from tools/aapt2/link/VersionCollapser.cpp
rename to tools/aapt2/optimize/VersionCollapser.cpp
index 3df5899..d941b48 100644
--- a/tools/aapt2/link/VersionCollapser.cpp
+++ b/tools/aapt2/optimize/VersionCollapser.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#include "link/Linkers.h"
+#include "optimize/VersionCollapser.h"
#include <algorithm>
#include <vector>
diff --git a/tools/aapt2/optimize/VersionCollapser.h b/tools/aapt2/optimize/VersionCollapser.h
new file mode 100644
index 0000000..5ab3b25
--- /dev/null
+++ b/tools/aapt2/optimize/VersionCollapser.h
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ */
+
+#ifndef AAPT_OPTIMIZE_VERSIONCOLLAPSER_H
+#define AAPT_OPTIMIZE_VERSIONCOLLAPSER_H
+
+#include "android-base/macros.h"
+
+#include "process/IResourceTableConsumer.h"
+
+namespace aapt {
+
+class ResourceTable;
+
+class VersionCollapser : public IResourceTableConsumer {
+ public:
+ VersionCollapser() = default;
+
+ bool Consume(IAaptContext* context, ResourceTable* table) override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(VersionCollapser);
+};
+
+} // namespace aapt
+
+#endif // AAPT_OPTIMIZE_VERSIONCOLLAPSER_H
diff --git a/tools/aapt2/link/VersionCollapser_test.cpp b/tools/aapt2/optimize/VersionCollapser_test.cpp
similarity index 98%
rename from tools/aapt2/link/VersionCollapser_test.cpp
rename to tools/aapt2/optimize/VersionCollapser_test.cpp
index 44babb2..aa0d0c0 100644
--- a/tools/aapt2/link/VersionCollapser_test.cpp
+++ b/tools/aapt2/optimize/VersionCollapser_test.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#include "link/Linkers.h"
+#include "optimize/VersionCollapser.h"
#include "test/Test.h"
diff --git a/tools/aapt2/process/SymbolTable.cpp b/tools/aapt2/process/SymbolTable.cpp
index 1a3da73..bcafbca 100644
--- a/tools/aapt2/process/SymbolTable.cpp
+++ b/tools/aapt2/process/SymbolTable.cpp
@@ -16,10 +16,15 @@
#include "process/SymbolTable.h"
+#include <iostream>
+
+#include "android-base/logging.h"
+#include "android-base/stringprintf.h"
#include "androidfw/AssetManager.h"
#include "androidfw/ResourceTypes.h"
#include "ConfigDescription.h"
+#include "NameMangler.h"
#include "Resource.h"
#include "ResourceUtils.h"
#include "ValueVisitor.h"
@@ -45,25 +50,49 @@
}
const SymbolTable::Symbol* SymbolTable::FindByName(const ResourceName& name) {
- if (const std::shared_ptr<Symbol>& s = cache_.get(name)) {
+ const ResourceName* name_with_package = &name;
+
+ // Fill in the package name if necessary.
+ // If there is no package in `name`, we will need to copy the ResourceName
+ // and store it somewhere; we use the Maybe<> class to reserve storage.
+ Maybe<ResourceName> name_with_package_impl;
+ if (name.package.empty()) {
+ name_with_package_impl = ResourceName(mangler_->GetTargetPackageName(), name.type, name.entry);
+ name_with_package = &name_with_package_impl.value();
+ }
+
+ // We store the name unmangled in the cache, so look it up as-is.
+ if (const std::shared_ptr<Symbol>& s = cache_.get(*name_with_package)) {
return s.get();
}
- // We did not find it in the cache, so look through the sources.
+ // The name was not found in the cache. Mangle it (if necessary) and find it in our sources.
+ // Again, here we use a Maybe<> object to reserve storage if we need to mangle.
+ const ResourceName* mangled_name = name_with_package;
+ Maybe<ResourceName> mangled_name_impl;
+ if (mangler_->ShouldMangle(name_with_package->package)) {
+ mangled_name_impl = mangler_->MangleName(*name_with_package);
+ mangled_name = &mangled_name_impl.value();
+ }
+
for (auto& symbolSource : sources_) {
- std::unique_ptr<Symbol> symbol = symbolSource->FindByName(name);
+ std::unique_ptr<Symbol> symbol = symbolSource->FindByName(*mangled_name);
if (symbol) {
// Take ownership of the symbol into a shared_ptr. We do this because
- // LruCache
- // doesn't support unique_ptr.
- std::shared_ptr<Symbol> shared_symbol =
- std::shared_ptr<Symbol>(symbol.release());
- cache_.put(name, shared_symbol);
+ // LruCache doesn't support unique_ptr.
+ std::shared_ptr<Symbol> shared_symbol(std::move(symbol));
+
+ // Since we look in the cache with the unmangled, but package prefixed
+ // name, we must put the same name into the cache.
+ cache_.put(*name_with_package, shared_symbol);
if (shared_symbol->id) {
// The symbol has an ID, so we can also cache this!
id_cache_.put(shared_symbol->id.value(), shared_symbol);
}
+
+ // Returns the raw pointer. Callers are not expected to hold on to this
+ // between calls to Find*.
return shared_symbol.get();
}
}
@@ -79,12 +108,13 @@
for (auto& symbolSource : sources_) {
std::unique_ptr<Symbol> symbol = symbolSource->FindById(id);
if (symbol) {
- // Take ownership of the symbol into a shared_ptr. We do this because
- // LruCache
+ // Take ownership of the symbol into a shared_ptr. We do this because LruCache
// doesn't support unique_ptr.
- std::shared_ptr<Symbol> shared_symbol =
- std::shared_ptr<Symbol>(symbol.release());
+ std::shared_ptr<Symbol> shared_symbol(std::move(symbol));
id_cache_.put(id, shared_symbol);
+
+ // Returns the raw pointer. Callers are not expected to hold on to this
+ // between calls to Find*.
return shared_symbol.get();
}
}
@@ -92,16 +122,12 @@
}
const SymbolTable::Symbol* SymbolTable::FindByReference(const Reference& ref) {
- // First try the ID. This is because when we lookup by ID, we only fill in the
- // ID cache.
- // Looking up by name fills in the name and ID cache. So a cache miss will
- // cause a failed
- // ID lookup, then a successful name lookup. Subsequent look ups will hit
- // immediately
+ // First try the ID. This is because when we lookup by ID, we only fill in the ID cache.
+ // Looking up by name fills in the name and ID cache. So a cache miss will cause a failed
+ // ID lookup, then a successful name lookup. Subsequent look ups will hit immediately
// because the ID is cached too.
//
- // If we looked up by name first, a cache miss would mean we failed to lookup
- // by name, then
+ // If we looked up by name first, a cache miss would mean we failed to lookup by name, then
// succeeded to lookup by ID. Subsequent lookups will miss then hit.
const SymbolTable::Symbol* symbol = nullptr;
if (ref.id) {
@@ -120,25 +146,21 @@
if (!result) {
if (name.type == ResourceType::kAttr) {
// Recurse and try looking up a private attribute.
- return FindByName(
- ResourceName(name.package, ResourceType::kAttrPrivate, name.entry));
+ return FindByName(ResourceName(name.package, ResourceType::kAttrPrivate, name.entry));
}
return {};
}
ResourceTable::SearchResult sr = result.value();
- std::unique_ptr<SymbolTable::Symbol> symbol =
- util::make_unique<SymbolTable::Symbol>();
+ std::unique_ptr<SymbolTable::Symbol> symbol = util::make_unique<SymbolTable::Symbol>();
symbol->is_public = (sr.entry->symbol_status.state == SymbolState::kPublic);
if (sr.package->id && sr.type->id && sr.entry->id) {
- symbol->id = ResourceId(sr.package->id.value(), sr.type->id.value(),
- sr.entry->id.value());
+ symbol->id = ResourceId(sr.package->id.value(), sr.type->id.value(), sr.entry->id.value());
}
- if (name.type == ResourceType::kAttr ||
- name.type == ResourceType::kAttrPrivate) {
+ if (name.type == ResourceType::kAttr || name.type == ResourceType::kAttrPrivate) {
const ConfigDescription kDefaultConfig;
ResourceConfigValue* config_value = sr.entry->FindValue(kDefaultConfig);
if (config_value) {
@@ -155,8 +177,18 @@
bool AssetManagerSymbolSource::AddAssetPath(const StringPiece& path) {
int32_t cookie = 0;
- return assets_.addAssetPath(android::String8(path.data(), path.size()),
- &cookie);
+ return assets_.addAssetPath(android::String8(path.data(), path.size()), &cookie);
+}
+
+std::map<size_t, std::string> AssetManagerSymbolSource::GetAssignedPackageIds() const {
+ std::map<size_t, std::string> package_map;
+ const android::ResTable& table = assets_.getResources(false);
+ const size_t package_count = table.getBasePackageCount();
+ for (size_t i = 0; i < package_count; i++) {
+ package_map[table.getBasePackageId(i)] =
+ util::Utf16ToUtf8(android::StringPiece16(table.getBasePackageName(i).string()));
+ }
+ return package_map;
}
static std::unique_ptr<SymbolTable::Symbol> LookupAttributeInTable(
@@ -170,8 +202,7 @@
}
// We found a resource.
- std::unique_ptr<SymbolTable::Symbol> s =
- util::make_unique<SymbolTable::Symbol>();
+ std::unique_ptr<SymbolTable::Symbol> s = util::make_unique<SymbolTable::Symbol>();
s->id = id;
// Check to see if it is an attribute.
@@ -204,8 +235,7 @@
return nullptr;
}
- Maybe<ResourceName> parsed_name =
- ResourceUtils::ToResourceName(entry_name);
+ Maybe<ResourceName> parsed_name = ResourceUtils::ToResourceName(entry_name);
if (!parsed_name) {
return nullptr;
}
@@ -246,8 +276,7 @@
}
if (s) {
- s->is_public =
- (type_spec_flags & android::ResTable_typeSpec::SPEC_PUBLIC) != 0;
+ s->is_public = (type_spec_flags & android::ResTable_typeSpec::SPEC_PUBLIC) != 0;
return s;
}
return {};
@@ -264,6 +293,11 @@
std::unique_ptr<SymbolTable::Symbol> AssetManagerSymbolSource::FindById(
ResourceId id) {
+ if (!id.is_valid()) {
+ // Exit early and avoid the error logs from AssetManager.
+ return {};
+ }
+
const android::ResTable& table = assets_.getResources(false);
Maybe<ResourceName> maybe_name = GetResourceName(table, id);
if (!maybe_name) {
@@ -282,8 +316,7 @@
}
if (s) {
- s->is_public =
- (type_spec_flags & android::ResTable_typeSpec::SPEC_PUBLIC) != 0;
+ s->is_public = (type_spec_flags & android::ResTable_typeSpec::SPEC_PUBLIC) != 0;
return s;
}
return {};
diff --git a/tools/aapt2/process/SymbolTable.h b/tools/aapt2/process/SymbolTable.h
index cf597bb..298da4d 100644
--- a/tools/aapt2/process/SymbolTable.h
+++ b/tools/aapt2/process/SymbolTable.h
@@ -47,6 +47,7 @@
}
class ISymbolSource;
+class NameMangler;
class SymbolTable {
public:
@@ -72,25 +73,32 @@
bool is_public = false;
};
- SymbolTable() : cache_(200), id_cache_(200) {}
+ SymbolTable(NameMangler* mangler) : mangler_(mangler), cache_(200), id_cache_(200) {}
+ // Appends a symbol source. The cache is not cleared since entries that
+ // have already been found would take precedence due to ordering.
void AppendSource(std::unique_ptr<ISymbolSource> source);
+
+ // Prepends a symbol source so that its symbols take precedence. This will
+ // cause the existing cache to be cleared.
void PrependSource(std::unique_ptr<ISymbolSource> source);
- /**
- * Never hold on to the result between calls to FindByName or FindById. The
- * results stored in a cache which may evict entries.
- */
+ // NOTE: Never hold on to the result between calls to FindByXXX. The
+ // results are stored in a cache which may evict entries on subsequent calls.
const Symbol* FindByName(const ResourceName& name);
+
+ // NOTE: Never hold on to the result between calls to FindByXXX. The
+ // results are stored in a cache which may evict entries on subsequent calls.
const Symbol* FindById(const ResourceId& id);
- /**
- * Let's the ISymbolSource decide whether looking up by name or ID is faster,
- * if both are available.
- */
+ // Let's the ISymbolSource decide whether looking up by name or ID is faster,
+ // if both are available.
+ // NOTE: Never hold on to the result between calls to FindByXXX. The
+ // results are stored in a cache which may evict entries on subsequent calls.
const Symbol* FindByReference(const Reference& ref);
private:
+ NameMangler* mangler_;
std::vector<std::unique_ptr<ISymbolSource>> sources_;
// We use shared_ptr because unique_ptr is not supported and
@@ -155,6 +163,7 @@
AssetManagerSymbolSource() = default;
bool AddAssetPath(const android::StringPiece& path);
+ std::map<size_t, std::string> GetAssignedPackageIds() const;
std::unique_ptr<SymbolTable::Symbol> FindByName(
const ResourceName& name) override;
diff --git a/tools/aapt2/process/SymbolTable_test.cpp b/tools/aapt2/process/SymbolTable_test.cpp
index 9ea0786..bba316f 100644
--- a/tools/aapt2/process/SymbolTable_test.cpp
+++ b/tools/aapt2/process/SymbolTable_test.cpp
@@ -55,4 +55,19 @@
EXPECT_NE(nullptr, s->attribute);
}
+TEST(SymbolTableTest, FindByName) {
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .AddSimple("com.android.app:id/foo")
+ .AddSimple("com.android.app:id/" + NameMangler::MangleEntry("com.android.lib", "foo"))
+ .Build();
+
+ NameMangler mangler(NameManglerPolicy{"com.android.app", {"com.android.lib"}});
+ SymbolTable symbol_table(&mangler);
+ symbol_table.AppendSource(util::make_unique<ResourceTableSymbolSource>(table.get()));
+
+ EXPECT_NE(nullptr, symbol_table.FindByName(test::ParseNameOrDie("id/foo")));
+ EXPECT_NE(nullptr, symbol_table.FindByName(test::ParseNameOrDie("com.android.lib:id/foo")));
+}
+
} // namespace aapt
diff --git a/tools/aapt2/readme.md b/tools/aapt2/readme.md
index 8bc4e8c..fedd65c 100644
--- a/tools/aapt2/readme.md
+++ b/tools/aapt2/readme.md
@@ -1,7 +1,27 @@
# Android Asset Packaging Tool 2.0 (AAPT2) release notes
+## Version 2.9
+### `aapt2 link ...`
+- Added sparse resource type encoding, which encodes resource entries that are sparse with
+ a binary search tree representation. Only available when minSdkVersion >= API O or resource
+ qualifier of resource types is >= v26 (or whatever API level O becomes). Enabled with
+ `--enable-sparse-encoding` flag.
+### `aapt2 optimize ...`
+- Adds an optimization pass that supports:
+ - stripping out any density assets that do not match the `--target-densities` list of
+ densities.
+ - resource deduping when the resources are dominated and identical (already happens during
+ `link` phase but this covers apps built with `aapt`).
+ - new sparse resource type encoding with the `--enable-sparse-encoding` flag if possible
+ (minSdkVersion >= O or resource qualifier >= v26).
+
+## Version 2.8
+### `aapt2 link ...`
+- Adds shared library support. Build a shared library with the `--shared-lib` flag.
+ Build a client of a shared library by simply including it via `-I`.
+
## Version 2.7
-### `aapt2 compile`
+### `aapt2 compile ...`
- Fixes bug where psuedolocalization auto-translated strings marked 'translateable="false"'.
## Version 2.6
diff --git a/tools/aapt2/strip/Strip.cpp b/tools/aapt2/strip/Strip.cpp
deleted file mode 100644
index 7260649..0000000
--- a/tools/aapt2/strip/Strip.cpp
+++ /dev/null
@@ -1,172 +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.
- */
-
-#include <memory>
-#include <vector>
-
-#include "androidfw/StringPiece.h"
-
-#include "Diagnostics.h"
-#include "Flags.h"
-#include "LoadedApk.h"
-#include "split/TableSplitter.h"
-
-using android::StringPiece;
-
-namespace aapt {
-
-struct StripOptions {
- /** Path to the output APK. */
- std::string output_path;
-
- /** List of screen density configurations the APK will be optimized for. */
- std::vector<ConfigDescription> target_configs;
-};
-
-class StripContext : public IAaptContext {
- public:
- IDiagnostics* GetDiagnostics() override { return &diagnostics_; }
-
- NameMangler* GetNameMangler() override {
- abort();
- return nullptr;
- }
-
- const std::string& GetCompilationPackage() override {
- static std::string empty;
- return empty;
- }
-
- uint8_t GetPackageId() override { return 0; }
-
- SymbolTable* GetExternalSymbols() override {
- abort();
- return nullptr;
- }
-
- bool IsVerbose() override { return verbose_; }
-
- void SetVerbose(bool val) { verbose_ = val; }
-
- int GetMinSdkVersion() override { return 0; }
-
- private:
- StdErrDiagnostics diagnostics_;
- bool verbose_ = false;
-};
-
-class StripCommand {
- public:
- StripCommand(StripContext* context, const StripOptions& options)
- : options_(options),
- context_(context) {}
-
- int Run(std::unique_ptr<LoadedApk> apk) {
- if (context_->IsVerbose()) {
- context_->GetDiagnostics()->Note(DiagMessage() << "Stripping APK...");
- }
-
- // Stripping the APK using the TableSplitter with no splits and the target
- // densities as the preferred densities. The resource table is modified in
- // place in the LoadedApk.
- TableSplitterOptions splitter_options;
- for (auto& config : options_.target_configs) {
- splitter_options.preferred_densities.push_back(config.density);
- }
- std::vector<SplitConstraints> splits;
- TableSplitter splitter(splits, splitter_options);
- splitter.SplitTable(apk->GetResourceTable());
-
- std::unique_ptr<IArchiveWriter> writer =
- CreateZipFileArchiveWriter(context_->GetDiagnostics(), options_.output_path);
- if (!apk->WriteToArchive(context_, writer.get())) {
- return 1;
- }
-
- return 0;
- }
-
- private:
- StripOptions options_;
- StripContext* context_;
-};
-
-int Strip(const std::vector<StringPiece>& args) {
- StripContext context;
- StripOptions options;
- std::string target_densities;
- bool verbose = false;
- Flags flags =
- Flags()
- .RequiredFlag("-o", "Path to the output APK.", &options.output_path)
- .RequiredFlag(
- "--target-densities",
- "Comma separated list of the screen densities that the APK will "
- "be optimized for. All the resources that would be unused on "
- "devices of the given densities will be removed from the APK.",
- &target_densities)
- .OptionalSwitch("-v", "Enables verbose logging", &verbose);
-
- if (!flags.Parse("aapt2 strip", args, &std::cerr)) {
- return 1;
- }
-
- if (flags.GetArgs().size() != 1u) {
- std::cerr << "must have one APK as argument.\n\n";
- flags.Usage("aapt2 strip", &std::cerr);
- return 1;
- }
-
- std::unique_ptr<LoadedApk> apk =
- LoadedApk::LoadApkFromPath(&context, flags.GetArgs()[0]);
- if (!apk) {
- return 1;
- }
-
- if (verbose) {
- context.SetVerbose(verbose);
- }
-
- // Parse the target screen densities.
- for (const StringPiece& config_str : util::Tokenize(target_densities, ',')) {
- ConfigDescription config;
- if (!ConfigDescription::Parse(config_str, &config) || config.density == 0) {
- context.GetDiagnostics()->Error(
- DiagMessage() << "invalid density '" << config_str
- << "' for --target-densities option");
- return 1;
- }
-
- // Clear the version that can be automatically added.
- config.sdkVersion = 0;
-
- if (config.diff(ConfigDescription::DefaultConfig()) !=
- ConfigDescription::CONFIG_DENSITY) {
- context.GetDiagnostics()->Error(
- DiagMessage() << "invalid density '" << config_str
- << "' for --target-densities option. Must be only a "
- << "density value.");
- return 1;
- }
-
- options.target_configs.push_back(config);
- }
-
- StripCommand cmd(&context, options);
- return cmd.Run(std::move(apk));
-}
-
-} // namespace aapt
diff --git a/tools/aapt2/test/Context.h b/tools/aapt2/test/Context.h
index 63e5f16..557cd1b 100644
--- a/tools/aapt2/test/Context.h
+++ b/tools/aapt2/test/Context.h
@@ -33,7 +33,7 @@
class Context : public IAaptContext {
public:
- Context() = default;
+ Context() : name_mangler_({}), symbols_(&name_mangler_), min_sdk_version_(0) {}
SymbolTable* GetExternalSymbols() override { return &symbols_; }
@@ -63,9 +63,9 @@
Maybe<std::string> compilation_package_;
Maybe<uint8_t> package_id_;
StdErrDiagnostics diagnostics_;
+ NameMangler name_mangler_;
SymbolTable symbols_;
- NameMangler name_mangler_ = NameMangler({});
- int min_sdk_version_ = 0;
+ int min_sdk_version_;
};
class ContextBuilder {
diff --git a/tools/aapt2/unflatten/BinaryResourceParser.cpp b/tools/aapt2/unflatten/BinaryResourceParser.cpp
index 7098fe9..9158bdd 100644
--- a/tools/aapt2/unflatten/BinaryResourceParser.cpp
+++ b/tools/aapt2/unflatten/BinaryResourceParser.cpp
@@ -248,6 +248,12 @@
}
break;
+ case android::RES_TABLE_LIBRARY_TYPE:
+ if (!ParseLibrary(parser.chunk())) {
+ return false;
+ }
+ break;
+
default:
context_->GetDiagnostics()->Warn(
DiagMessage(source_)
@@ -395,6 +401,21 @@
return true;
}
+bool BinaryResourceParser::ParseLibrary(const ResChunk_header* chunk) {
+ DynamicRefTable dynamic_ref_table;
+ if (dynamic_ref_table.load(reinterpret_cast<const ResTable_lib_header*>(chunk)) != NO_ERROR) {
+ return false;
+ }
+
+ const KeyedVector<String16, uint8_t>& entries = dynamic_ref_table.entries();
+ const size_t count = entries.size();
+ for (size_t i = 0; i < count; i++) {
+ table_->included_packages_[entries.valueAt(i)] =
+ util::Utf16ToUtf8(StringPiece16(entries.keyAt(i).string()));
+ }
+ return true;
+}
+
std::unique_ptr<Item> BinaryResourceParser::ParseValue(
const ResourceNameRef& name, const ConfigDescription& config,
const Res_value* value, uint16_t flags) {
@@ -437,10 +458,14 @@
}
if (value->dataType == Res_value::TYPE_REFERENCE ||
- value->dataType == Res_value::TYPE_ATTRIBUTE) {
- const Reference::Type type = (value->dataType == Res_value::TYPE_REFERENCE)
- ? Reference::Type::kResource
- : Reference::Type::kAttribute;
+ value->dataType == Res_value::TYPE_ATTRIBUTE ||
+ value->dataType == Res_value::TYPE_DYNAMIC_REFERENCE ||
+ value->dataType == Res_value::TYPE_DYNAMIC_ATTRIBUTE) {
+ Reference::Type type = Reference::Type::kResource;
+ if (value->dataType == Res_value::TYPE_ATTRIBUTE ||
+ value->dataType == Res_value::TYPE_DYNAMIC_ATTRIBUTE) {
+ type = Reference::Type::kAttribute;
+ }
if (data == 0) {
// A reference of 0, must be the magic @null reference.
diff --git a/tools/aapt2/unflatten/BinaryResourceParser.h b/tools/aapt2/unflatten/BinaryResourceParser.h
index dc668fd..e3dd802 100644
--- a/tools/aapt2/unflatten/BinaryResourceParser.h
+++ b/tools/aapt2/unflatten/BinaryResourceParser.h
@@ -61,6 +61,7 @@
bool ParseTypeSpec(const android::ResChunk_header* chunk);
bool ParseType(const ResourceTablePackage* package,
const android::ResChunk_header* chunk);
+ bool ParseLibrary(const android::ResChunk_header* chunk);
std::unique_ptr<Item> ParseValue(const ResourceNameRef& name,
const ConfigDescription& config,
diff --git a/tools/aapt2/util/BigBuffer.cpp b/tools/aapt2/util/BigBuffer.cpp
index ef99dca..75fa789 100644
--- a/tools/aapt2/util/BigBuffer.cpp
+++ b/tools/aapt2/util/BigBuffer.cpp
@@ -76,4 +76,12 @@
return blocks_.back().buffer.get();
}
+std::string BigBuffer::to_string() const {
+ std::string result;
+ for (const Block& block : blocks_) {
+ result.append(block.buffer.get(), block.buffer.get() + block.size);
+ }
+ return result;
+}
+
} // namespace aapt
diff --git a/tools/aapt2/util/BigBuffer.h b/tools/aapt2/util/BigBuffer.h
index d23c41d..3045255 100644
--- a/tools/aapt2/util/BigBuffer.h
+++ b/tools/aapt2/util/BigBuffer.h
@@ -19,6 +19,7 @@
#include <cstring>
#include <memory>
+#include <string>
#include <type_traits>
#include <vector>
@@ -116,6 +117,8 @@
const_iterator begin() const;
const_iterator end() const;
+ std::string to_string() const;
+
private:
DISALLOW_COPY_AND_ASSIGN(BigBuffer);
diff --git a/tools/fonts/fontchain_lint.py b/tools/fonts/fontchain_lint.py
index f193ea4..eb8a1cc 100755
--- a/tools/fonts/fontchain_lint.py
+++ b/tools/fonts/fontchain_lint.py
@@ -14,7 +14,9 @@
LANG_TO_SCRIPT = {
'as': 'Beng',
+ 'bg': 'Cyrl',
'bn': 'Beng',
+ 'cu': 'Cyrl',
'cy': 'Latn',
'da': 'Latn',
'de': 'Latn',
diff --git a/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java b/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
index 9bc8e18..2c7e936 100644
--- a/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
+++ b/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
@@ -638,6 +638,9 @@
return mContext.getProjectResourceValue(ResourceType.ID, idName, defValue);
}
}
+ else if (value.startsWith("@aapt:_aapt")) {
+ return mContext.getLayoutlibCallback().getResourceId(ResourceType.AAPT, value);
+ }
// not a direct id valid reference. First check if it's an enum (this is a corner case
// for attributes that have a reference|enum type), then fallback to resolve
diff --git a/tools/layoutlib/bridge/src/android/content/res/Resources_Delegate.java b/tools/layoutlib/bridge/src/android/content/res/Resources_Delegate.java
index d71cc6f..c20ee12 100644
--- a/tools/layoutlib/bridge/src/android/content/res/Resources_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/content/res/Resources_Delegate.java
@@ -50,6 +50,7 @@
import android.util.DisplayMetrics;
import android.util.LruCache;
import android.util.TypedValue;
+import android.view.DisplayAdjustments;
import android.view.ViewGroup.LayoutParams;
import java.io.File;
@@ -71,7 +72,8 @@
DisplayMetrics metrics,
Configuration config,
LayoutlibCallback layoutlibCallback) {
- Resources resources = new Resources(assets, metrics, config);
+ Resources resources = new Resources(Resources_Delegate.class.getClassLoader());
+ resources.setImpl(new ResourcesImpl(assets, metrics, config, new DisplayAdjustments()));
resources.mContext = context;
resources.mLayoutlibCallback = layoutlibCallback;
return Resources.mSystem = resources;
@@ -129,9 +131,16 @@
if (resourceInfo != null) {
String attributeName = resourceInfo.getSecond();
RenderResources renderResources = resources.mContext.getRenderResources();
- return Pair.of(attributeName, platformResFlag_out[0] ?
+ ResourceValue value = platformResFlag_out[0] ?
renderResources.getFrameworkResource(resourceInfo.getFirst(), attributeName) :
- renderResources.getProjectResource(resourceInfo.getFirst(), attributeName));
+ renderResources.getProjectResource(resourceInfo.getFirst(), attributeName);
+
+ if (value == null) {
+ // Unable to resolve the attribute, just leave the unresolved value
+ value = new ResourceValue(resourceInfo.getFirst(), attributeName, attributeName,
+ platformResFlag_out[0]);
+ }
+ return Pair.of(attributeName, value);
}
return null;
diff --git a/tools/layoutlib/bridge/src/android/graphics/FontFamily_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/FontFamily_Delegate.java
index fb24c01..ff5a5e9 100644
--- a/tools/layoutlib/bridge/src/android/graphics/FontFamily_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/FontFamily_Delegate.java
@@ -314,7 +314,7 @@
@LayoutlibDelegate
/*package*/ static boolean nAddFontFromAssetManager(long builderPtr, AssetManager mgr, String path,
- int cookie, boolean isAsset) {
+ int cookie, boolean isAsset, int weight, boolean isItalic) {
FontFamily_Delegate ffd = sManager.getDelegate(builderPtr);
if (ffd == null) {
return false;
@@ -355,8 +355,12 @@
Font font = Font.createFont(Font.TRUETYPE_FONT, fontStream);
fontInfo = new FontInfo();
fontInfo.mFont = font;
- fontInfo.mWeight = font.isBold() ? BOLD_FONT_WEIGHT : DEFAULT_FONT_WEIGHT;
- fontInfo.mIsItalic = font.isItalic();
+ if (weight == 0) {
+ fontInfo.mWeight = font.isBold() ? BOLD_FONT_WEIGHT : DEFAULT_FONT_WEIGHT;
+ } else {
+ fontInfo.mWeight = weight;
+ }
+ fontInfo.mIsItalic = weight == 0 ? font.isItalic() : isItalic;
ffd.addFont(fontInfo);
return true;
} catch (IOException e) {
diff --git a/tools/layoutlib/bridge/src/android/graphics/drawable/VectorDrawable_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/drawable/VectorDrawable_Delegate.java
index 174bbcf..cc7631a 100644
--- a/tools/layoutlib/bridge/src/android/graphics/drawable/VectorDrawable_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/drawable/VectorDrawable_Delegate.java
@@ -571,6 +571,8 @@
@NonNull
public Consumer<Float> getFloatPropertySetter(int propertyIdx) {
switch (propertyIdx) {
+ case STROKE_WIDTH_INDEX:
+ return this::setStrokeWidth;
case STROKE_ALPHA_INDEX:
return this::setStrokeAlpha;
case FILL_ALPHA_INDEX:
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java
index 91668af..e10f20d 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java
@@ -100,7 +100,8 @@
mView.setText(text);
}
- private void setGravity(int gravity) {
+ @SuppressWarnings("WeakerAccess") // This method is used from Studio
+ public void setGravity(int gravity) {
mView.setGravity(gravity);
}
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
index 16bf724..df3ce19 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
@@ -65,6 +65,7 @@
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.graphics.Bitmap;
+import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.hardware.display.DisplayManager;
import android.net.Uri;
@@ -381,6 +382,18 @@
return true;
}
+ String stringValue = value.getValue();
+ if (!stringValue.isEmpty()) {
+ if (stringValue.charAt(0) == '#') {
+ outValue.type = TypedValue.TYPE_INT_COLOR_ARGB8;
+ outValue.data = Color.parseColor(value.getValue());
+ }
+ else if (stringValue.charAt(0) == '@') {
+ outValue.type = TypedValue.TYPE_REFERENCE;
+ }
+
+ }
+
int a;
// if this is a framework value.
if (value.isFramework()) {
@@ -399,7 +412,7 @@
}
// If the value is not a valid reference, fallback to pass the value as a string.
- outValue.string = value.getValue();
+ outValue.string = stringValue;
return true;
}
@@ -627,6 +640,10 @@
return AccessibilityManager.getInstance(this);
}
+ if (AUTO_FILL_MANAGER_SERVICE.equals(service)) {
+ return null;
+ }
+
throw new UnsupportedOperationException("Unsupported Service: " + service);
}
@@ -1412,6 +1429,12 @@
}
@Override
+ public File getPreloadsFileCache() {
+ // pass
+ return null;
+ }
+
+ @Override
public ContentResolver getContentResolver() {
if (mContentResolver == null) {
mContentResolver = new BridgeContentResolver(this);
@@ -1888,6 +1911,11 @@
}
@Override
+ public void updateDisplay(int displayId) {
+ // pass
+ }
+
+ @Override
public int getUserId() {
return 0; // not used
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java
index a51ad2e..4689491 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java
@@ -50,7 +50,7 @@
@Override
public void resized(Rect rect, Rect rect2, Rect rect3, Rect rect4, Rect rect5, Rect rect6,
- boolean b, Configuration configuration, Rect rect7, boolean b2, boolean b3)
+ boolean b, Configuration configuration, Rect rect7, boolean b2, boolean b3, int i0)
throws RemoteException {
// pass for now.
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
index b3a2d3e..f1e7b51 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
@@ -286,18 +286,15 @@
Density density = Density.MEDIUM;
if (value instanceof DensityBasedResourceValue) {
- density =
- ((DensityBasedResourceValue)value).getResourceDensity();
+ density = ((DensityBasedResourceValue) value).getResourceDensity();
}
-
if (lowerCaseValue.endsWith(NinePatch.EXTENSION_9PATCH)) {
File file = new File(stringValue);
if (file.isFile()) {
try {
- return getNinePatchDrawable(
- new FileInputStream(file), density, value.isFramework(),
- stringValue, context);
+ return getNinePatchDrawable(new FileInputStream(file), density,
+ value.isFramework(), stringValue, context);
} catch (IOException e) {
// failed to read the file, we'll return null below.
Bridge.getLog().error(LayoutLog.TAG_RESOURCES_READ,
@@ -306,30 +303,28 @@
}
return null;
- } else if (lowerCaseValue.endsWith(".xml")) {
+ } else if (lowerCaseValue.endsWith(".xml") || stringValue.startsWith("@aapt:_aapt/")) {
// create a block parser for the file
- File f = new File(stringValue);
- if (f.isFile()) {
- try {
- // let the framework inflate the Drawable from the XML file.
- XmlPullParser parser = ParserFactory.create(f);
-
- BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(
- parser, context, value.isFramework());
- try {
- return Drawable.createFromXml(context.getResources(), blockParser, theme);
- } finally {
- blockParser.ensurePopped();
+ try {
+ XmlPullParser parser = context.getLayoutlibCallback().getParser(value);
+ if (parser == null) {
+ File drawableFile = new File(stringValue);
+ if (drawableFile.isFile()) {
+ parser = ParserFactory.create(drawableFile);
}
- } catch (Exception e) {
- // this is an error and not warning since the file existence is checked before
- // attempting to parse it.
- Bridge.getLog().error(null, "Failed to parse file " + stringValue,
- e, null /*data*/);
}
- } else {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- String.format("File %s does not exist (or is not a file)", stringValue),
+
+ BridgeXmlBlockParser blockParser =
+ new BridgeXmlBlockParser(parser, context, value.isFramework());
+ try {
+ return Drawable.createFromXml(context.getResources(), blockParser, theme);
+ } finally {
+ blockParser.ensurePopped();
+ }
+ } catch (Exception e) {
+ // this is an error and not warning since the file existence is checked before
+ // attempting to parse it.
+ Bridge.getLog().error(null, "Failed to parse file " + stringValue, e,
null /*data*/);
}
@@ -342,8 +337,8 @@
value.isFramework() ? null : context.getProjectKey());
if (bitmap == null) {
- bitmap = Bitmap_Delegate.createBitmap(bmpFile, false /*isMutable*/,
- density);
+ bitmap =
+ Bitmap_Delegate.createBitmap(bmpFile, false /*isMutable*/, density);
Bridge.setCachedBitmap(stringValue, bitmap,
value.isFramework() ? null : context.getProjectKey());
}
diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/allwidgets.png b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/allwidgets.png
index a53dcba..f15d669 100644
--- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/allwidgets.png
+++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/allwidgets.png
Binary files differ
diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/allwidgets.xml b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/allwidgets.xml
index 05a3665..456b5f6 100644
--- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/allwidgets.xml
+++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/allwidgets.xml
@@ -263,7 +263,8 @@
android:id="@id/radioButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="New RadioButton" />
+ android:text="New RadioButton"
+ android:checked="true" />
</RadioGroup>
diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java
index ded52a7..b15ee95 100644
--- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java
+++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java
@@ -25,13 +25,15 @@
import org.junit.runners.Suite.SuiteClasses;
import android.graphics.Matrix_DelegateTest;
+import android.util.BridgeXmlPullAttributesTest;
/**
* Suite used by the layoutlib build system
*/
@RunWith(Suite.class)
@SuiteClasses({
- RenderTests.class, LayoutParserWrapperTest.class, BridgeXmlBlockParserTest.class,
+ RenderTests.class, LayoutParserWrapperTest.class,
+ BridgeXmlBlockParserTest.class, BridgeXmlPullAttributesTest.class,
Matrix_DelegateTest.class, TestDelegates.class
})
public class Main {
diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/RenderTests.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/RenderTests.java
index 913519c..9e60f0f 100644
--- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/RenderTests.java
+++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/RenderTests.java
@@ -36,6 +36,7 @@
import android.content.res.Configuration;
import android.content.res.Resources;
import android.util.DisplayMetrics;
+import android.util.TypedValue;
import java.lang.reflect.Field;
import java.util.concurrent.TimeUnit;
@@ -43,6 +44,7 @@
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@@ -334,6 +336,7 @@
AssetManager assetManager = AssetManager.getSystem();
DisplayMetrics metrics = new DisplayMetrics();
Configuration configuration = RenderAction.getConfiguration(params);
+ //noinspection deprecation
Resources resources = new Resources(assetManager, metrics, configuration);
resources.mLayoutlibCallback = params.getLayoutlibCallback();
resources.mContext =
@@ -370,6 +373,7 @@
AssetManager assetManager = AssetManager.getSystem();
DisplayMetrics metrics = new DisplayMetrics();
Configuration configuration = RenderAction.getConfiguration(params);
+ //noinspection deprecation
Resources resources = new Resources(assetManager, metrics, configuration);
resources.mLayoutlibCallback = params.getLayoutlibCallback();
resources.mContext =
@@ -390,4 +394,34 @@
// TODO: styles seem to be broken in TextView
renderAndVerify("fonts_test.xml", "font_test.png");
}
+
+ @Test
+ public void testColorTypedValue() throws Exception {
+ // Setup
+ // Create the layout pull parser for our resources (empty.xml can not be part of the test
+ // app as it won't compile).
+ LayoutPullParser parser = new LayoutPullParser("/empty.xml");
+ // Create LayoutLibCallback.
+ LayoutLibTestCallback layoutLibCallback =
+ new LayoutLibTestCallback(RenderTestBase.getLogger(), mDefaultClassLoader);
+ layoutLibCallback.initResources();
+ SessionParams params = getSessionParams(parser, ConfigGenerator.NEXUS_4,
+ layoutLibCallback, "AppTheme", true, RenderingMode.NORMAL, 22);
+ AssetManager assetManager = AssetManager.getSystem();
+ DisplayMetrics metrics = new DisplayMetrics();
+ Configuration configuration = RenderAction.getConfiguration(params);
+ //noinspection deprecation
+ Resources resources = new Resources(assetManager, metrics, configuration);
+ resources.mLayoutlibCallback = params.getLayoutlibCallback();
+ resources.mContext =
+ new BridgeContext(params.getProjectKey(), metrics, params.getResources(),
+ params.getAssets(), params.getLayoutlibCallback(), configuration,
+ params.getTargetSdkVersion(), params.isRtlSupported());
+
+ TypedValue outValue = new TypedValue();
+ resources.mContext.resolveThemeAttribute(android.R.attr.colorPrimary, outValue, true);
+ assertEquals(TypedValue.TYPE_INT_COLOR_ARGB8, outValue.type);
+ assertNotEquals(0, outValue.data);
+ assertTrue(sRenderMessages.isEmpty());
+ }
}
diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java
index bae2dc0c..8ebfc65 100644
--- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java
+++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java
@@ -132,7 +132,11 @@
@Override
public Integer getResourceId(ResourceType type, String name) {
- return mResources.get(type).get(name);
+ Map<String, Integer> resName2Id = mResources.get(type);
+ if (resName2Id == null) {
+ return null;
+ }
+ return resName2Id.get(name);
}
@Override
diff --git a/tools/layoutlib/create/create.iml b/tools/layoutlib/create/create.iml
index 368b46b..ac97502 100644
--- a/tools/layoutlib/create/create.iml
+++ b/tools/layoutlib/create/create.iml
@@ -12,9 +12,9 @@
<orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library">
- <library name="asm-5.0">
+ <library name="asm-5.2">
<CLASSES>
- <root url="jar://$MODULE_DIR$/../../../../../prebuilts/misc/common/asm/asm-5.0.jar!/" />
+ <root url="jar://$MODULE_DIR$/../../../../../prebuilts/misc/common/asm/asm-5.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
diff --git a/tools/preload2/src/com/android/preload/DeviceUtils.java b/tools/preload2/src/com/android/preload/DeviceUtils.java
index 803a7f1..18cab7b 100644
--- a/tools/preload2/src/com/android/preload/DeviceUtils.java
+++ b/tools/preload2/src/com/android/preload/DeviceUtils.java
@@ -16,13 +16,18 @@
package com.android.preload;
+import com.android.ddmlib.AdbCommandRejectedException;
import com.android.ddmlib.AndroidDebugBridge;
import com.android.ddmlib.AndroidDebugBridge.IDeviceChangeListener;
import com.android.preload.classdataretrieval.hprof.Hprof;
import com.android.ddmlib.DdmPreferences;
import com.android.ddmlib.IDevice;
import com.android.ddmlib.IShellOutputReceiver;
+import com.android.ddmlib.SyncException;
+import com.android.ddmlib.TimeoutException;
+import java.io.File;
+import java.io.IOException;
import java.util.Date;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
@@ -32,6 +37,18 @@
*/
public class DeviceUtils {
+ // Locations
+ private static final String PRELOADED_CLASSES_FILE = "/etc/preloaded-classes";
+ // Shell commands
+ private static final String CREATE_EMPTY_PRELOADED_CMD = "touch " + PRELOADED_CLASSES_FILE;
+ private static final String DELETE_CACHE_CMD = "rm /data/dalvik-cache/*/*boot.art";
+ private static final String DELETE_PRELOADED_CMD = "rm " + PRELOADED_CLASSES_FILE;
+ private static final String READ_PRELOADED_CMD = "cat " + PRELOADED_CLASSES_FILE;
+ private static final String START_SHELL_CMD = "start";
+ private static final String STOP_SHELL_CMD = "stop";
+ private static final String REMOUNT_SYSTEM_CMD = "mount -o rw,remount /system";
+ private static final String UNSET_BOOTCOMPLETE_CMD = "setprop dev.bootcomplete \"0\"";
+
public static void init(int debugPort) {
DdmPreferences.setSelectedDebugPort(debugPort);
@@ -119,43 +136,56 @@
return !ret.contains("No such file or directory");
}
- /**
- * Remove files involved in a standard build that interfere with collecting data. This will
- * remove /etc/preloaded-classes, which determines which classes are allocated already in the
- * boot image. It also deletes any compiled boot image on the device. Then it restarts the
- * device.
- *
- * This is a potentially long-running operation, as the boot after the deletion may take a while.
- * The method will abort after the given timeout.
- */
- public static boolean removePreloaded(IDevice device, long preloadedWaitTimeInSeconds) {
- String oldContent =
- DeviceUtils.doShellReturnString(device, "cat /etc/preloaded-classes", 1, TimeUnit.SECONDS);
- if (oldContent.trim().equals("")) {
- System.out.println("Preloaded-classes already empty.");
- return true;
- }
+ /**
+ * Write over the preloaded-classes file with an empty or existing file and regenerate the boot
+ * image as necessary.
+ *
+ * @param device
+ * @param pcFile
+ * @param bootTimeout
+ * @throws AdbCommandRejectedException
+ * @throws IOException
+ * @throws TimeoutException
+ * @throws SyncException
+ * @return true if successfully overwritten, false otherwise
+ */
+ public static boolean overwritePreloaded(IDevice device, File pcFile, long bootTimeout)
+ throws AdbCommandRejectedException, IOException, TimeoutException, SyncException {
+ boolean writeEmpty = (pcFile == null);
+ if (writeEmpty) {
+ // Check if the preloaded-classes file is already empty.
+ String oldContent =
+ doShellReturnString(device, READ_PRELOADED_CMD, 1, TimeUnit.SECONDS);
+ if (oldContent.trim().equals("")) {
+ System.out.println("Preloaded-classes already empty.");
+ return true;
+ }
+ }
- // Stop the system server etc.
- doShell(device, "stop", 100, TimeUnit.MILLISECONDS);
+ // Stop the system server etc.
+ doShell(device, STOP_SHELL_CMD, 1, TimeUnit.SECONDS);
+ // Remount the read-only system partition
+ doShell(device, REMOUNT_SYSTEM_CMD, 1, TimeUnit.SECONDS);
+ // Delete the preloaded-classes file
+ doShell(device, DELETE_PRELOADED_CMD, 1, TimeUnit.SECONDS);
+ // Delete the dalvik cache files
+ doShell(device, DELETE_CACHE_CMD, 1, TimeUnit.SECONDS);
+ if (writeEmpty) {
+ // Write an empty preloaded-classes file
+ doShell(device, CREATE_EMPTY_PRELOADED_CMD, 500, TimeUnit.MILLISECONDS);
+ } else {
+ // Push the new preloaded-classes file
+ device.pushFile(pcFile.getAbsolutePath(), PRELOADED_CLASSES_FILE);
+ }
+ // Manually reset the boot complete flag
+ doShell(device, UNSET_BOOTCOMPLETE_CMD, 1, TimeUnit.SECONDS);
+ // Restart system server on the device
+ doShell(device, START_SHELL_CMD, 1, TimeUnit.SECONDS);
+ // Wait for the boot complete flag and return the outcome.
+ return waitForBootComplete(device, bootTimeout);
+ }
- // Remount /system, delete /etc/preloaded-classes. It would be nice to use "adb remount,"
- // but AndroidDebugBridge doesn't expose it.
- doShell(device, "mount -o remount,rw /system", 500, TimeUnit.MILLISECONDS);
- doShell(device, "rm /etc/preloaded-classes", 100, TimeUnit.MILLISECONDS);
- // We do need an empty file.
- doShell(device, "touch /etc/preloaded-classes", 100, TimeUnit.MILLISECONDS);
-
- // Delete the files in the dalvik cache.
- doShell(device, "rm /data/dalvik-cache/*/*boot.art", 500, TimeUnit.MILLISECONDS);
-
- // We'll try to use dev.bootcomplete to know when the system server is back up. But stop
- // doesn't reset it, so do it manually.
- doShell(device, "setprop dev.bootcomplete \"0\"", 500, TimeUnit.MILLISECONDS);
-
- // Start the system server.
- doShell(device, "start", 100, TimeUnit.MILLISECONDS);
-
+ private static boolean waitForBootComplete(IDevice device, long timeout) {
// Do a loop checking each second whether bootcomplete. Wait for at most the given
// threshold.
Date startDate = new Date();
@@ -178,7 +208,7 @@
Date endDate = new Date();
long seconds =
TimeUnit.SECONDS.convert(endDate.getTime() - startDate.getTime(), TimeUnit.MILLISECONDS);
- if (seconds > preloadedWaitTimeInSeconds) {
+ if (seconds > timeout) {
return false;
}
}
diff --git a/tools/preload2/src/com/android/preload/Main.java b/tools/preload2/src/com/android/preload/Main.java
index c42a19b..2265e95 100644
--- a/tools/preload2/src/com/android/preload/Main.java
+++ b/tools/preload2/src/com/android/preload/Main.java
@@ -29,6 +29,7 @@
import com.android.preload.actions.ScanAllPackagesAction;
import com.android.preload.actions.ScanPackageAction;
import com.android.preload.actions.ShowDataAction;
+import com.android.preload.actions.WritePreloadedClassesAction;
import com.android.preload.classdataretrieval.ClassDataRetriever;
import com.android.preload.classdataretrieval.hprof.Hprof;
import com.android.preload.classdataretrieval.jdwp.JDWPClassDataRetriever;
@@ -96,6 +97,7 @@
public final static String COMPUTE_FILE_CMD = "comp";
public final static String EXPORT_CMD = "export";
public final static String IMPORT_CMD = "import";
+ public final static String WRITE_CMD = "write";
/**
* @param args
@@ -132,6 +134,7 @@
null));
actions.add(new ComputeThresholdXAction("Compute(X)", dataTableModel,
CLASS_PRELOAD_BLACKLIST));
+ actions.add(new WritePreloadedClassesAction(clientUtils, null, dataTableModel));
actions.add(new ShowDataAction(dataTableModel));
actions.add(new ImportAction(dataTableModel));
actions.add(new ExportAction(dataTableModel));
@@ -200,6 +203,11 @@
ui.input(it.next());
ui.confirmYes();
ui.output(new File(it.next()));
+ // Operation: Write preloaded classes from a specific file
+ } else if (WRITE_CMD.equals(op)) {
+ System.out.println("Writing preloaded classes.");
+ ui.action(WritePreloadedClassesAction.class);
+ ui.input(new File(it.next()));
}
}
} catch (NoSuchElementException e) {
@@ -305,8 +313,16 @@
Main.getUI().showMessageDialog("The device will reboot. This will potentially take a "
+ "long time. Please be patient.");
- if (!DeviceUtils.removePreloaded(device, 15 * 60) /* 15m timeout */) {
- Main.getUI().showMessageDialog("Removing preloaded-classes failed unexpectedly!");
+ boolean success = false;
+ try {
+ success = DeviceUtils.overwritePreloaded(device, null, 15 * 60);
+ } catch (Exception e) {
+ System.err.println(e);
+ } finally {
+ if (!success) {
+ Main.getUI().showMessageDialog(
+ "Removing preloaded-classes failed unexpectedly!");
+ }
}
}
}
diff --git a/tools/preload2/src/com/android/preload/actions/WritePreloadedClassesAction.java b/tools/preload2/src/com/android/preload/actions/WritePreloadedClassesAction.java
new file mode 100644
index 0000000..9b97f11
--- /dev/null
+++ b/tools/preload2/src/com/android/preload/actions/WritePreloadedClassesAction.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.preload.actions;
+
+import com.android.ddmlib.Client;
+import com.android.ddmlib.IDevice;
+import com.android.preload.ClientUtils;
+import com.android.preload.DeviceUtils;
+import com.android.preload.DumpData;
+import com.android.preload.DumpTableModel;
+import com.android.preload.Main;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.util.Date;
+import java.util.Map;
+
+public class WritePreloadedClassesAction extends AbstractThreadedDeviceSpecificAction {
+ private File preloadedClassFile;
+
+ public WritePreloadedClassesAction(ClientUtils utils, IDevice device, DumpTableModel dataTableModel) {
+ super("Write preloaded classes action", device);
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ File[] files = Main.getUI().showOpenDialog(true);
+ if (files != null && files.length > 0) {
+ preloadedClassFile = files[0];
+ super.actionPerformed(e);
+ }
+ }
+
+ @Override
+ public void run() {
+ Main.getUI().showWaitDialog();
+ try {
+ // Write the new file with a 5-minute timeout
+ DeviceUtils.overwritePreloaded(device, preloadedClassFile, 5 * 60);
+ } catch (Exception e) {
+ System.err.println(e);
+ } finally {
+ Main.getUI().hideWaitDialog();
+ }
+ }
+}
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 97a15e4..a4ab64f 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -855,6 +855,7 @@
* This network is disabled because EAP-TLS failure
*/
public static final int DISABLED_TLS_VERSION_MISMATCH = 7;
+ // Values above are for temporary disablement; values below are for permanent disablement.
/**
* This network is disabled due to absence of user credentials
*/
@@ -979,6 +980,28 @@
private boolean mHasEverConnected;
/**
+ * Boolean indicating whether {@link com.android.server.wifi.RecommendedNetworkEvaluator}
+ * chose not to connect to this network in the last qualified network selection process.
+ */
+ private boolean mNotRecommended;
+
+ /**
+ * Set whether {@link com.android.server.wifi.RecommendedNetworkEvaluator} does not
+ * recommend connecting to this network.
+ */
+ public void setNotRecommended(boolean notRecommended) {
+ mNotRecommended = notRecommended;
+ }
+
+ /**
+ * Returns whether {@link com.android.server.wifi.RecommendedNetworkEvaluator} does not
+ * recommend connecting to this network.
+ */
+ public boolean isNotRecommended() {
+ return mNotRecommended;
+ }
+
+ /**
* set whether this network is visible in latest Qualified Network Selection
* @param seen value set to candidate
*/
@@ -1282,6 +1305,7 @@
setConnectChoice(source.getConnectChoice());
setConnectChoiceTimestamp(source.getConnectChoiceTimestamp());
setHasEverConnected(source.getHasEverConnected());
+ setNotRecommended(source.isNotRecommended());
}
public void writeToParcel(Parcel dest) {
@@ -1301,6 +1325,7 @@
dest.writeInt(CONNECT_CHOICE_NOT_EXISTS);
}
dest.writeInt(getHasEverConnected() ? 1 : 0);
+ dest.writeInt(isNotRecommended() ? 1 : 0);
}
public void readFromParcel(Parcel in) {
@@ -1320,6 +1345,7 @@
setConnectChoiceTimestamp(INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP);
}
setHasEverConnected(in.readInt() != 0);
+ setNotRecommended(in.readInt() != 0);
}
}
diff --git a/wifi/java/android/net/wifi/aware/ConfigRequest.java b/wifi/java/android/net/wifi/aware/ConfigRequest.java
index 6a5957b..cc14ab2 100644
--- a/wifi/java/android/net/wifi/aware/ConfigRequest.java
+++ b/wifi/java/android/net/wifi/aware/ConfigRequest.java
@@ -19,6 +19,8 @@
import android.os.Parcel;
import android.os.Parcelable;
+import java.util.Arrays;
+
/**
* Defines a request object to configure a Wi-Fi Aware network. Built using
* {@link ConfigRequest.Builder}. Configuration is requested using
@@ -41,6 +43,18 @@
public static final int CLUSTER_ID_MAX = 0xFFFF;
/**
+ * Indices for configuration variables which are specified per band.
+ */
+ public static final int NAN_BAND_24GHZ = 0;
+ public static final int NAN_BAND_5GHZ = 1;
+
+ /**
+ * Magic values for Discovery Window (DW) interval configuration
+ */
+ public static final int DW_INTERVAL_NOT_INIT = -1;
+ public static final int DW_DISABLE = 0; // only valid for 5GHz
+
+ /**
* Indicates whether 5G band support is requested.
*/
public final boolean mSupport5gBand;
@@ -62,19 +76,26 @@
*/
public final int mClusterHigh;
+ /**
+ * Specifies the discovery window interval for the device on NAN_BAND_*.
+ */
+ public final int mDiscoveryWindowInterval[];
+
private ConfigRequest(boolean support5gBand, int masterPreference, int clusterLow,
- int clusterHigh) {
+ int clusterHigh, int discoveryWindowInterval[]) {
mSupport5gBand = support5gBand;
mMasterPreference = masterPreference;
mClusterLow = clusterLow;
mClusterHigh = clusterHigh;
+ mDiscoveryWindowInterval = discoveryWindowInterval;
}
@Override
public String toString() {
return "ConfigRequest [mSupport5gBand=" + mSupport5gBand + ", mMasterPreference="
+ mMasterPreference + ", mClusterLow=" + mClusterLow + ", mClusterHigh="
- + mClusterHigh + "]";
+ + mClusterHigh + ", mDiscoveryWindowInterval="
+ + Arrays.toString(mDiscoveryWindowInterval) + "]";
}
@Override
@@ -88,6 +109,7 @@
dest.writeInt(mMasterPreference);
dest.writeInt(mClusterLow);
dest.writeInt(mClusterHigh);
+ dest.writeIntArray(mDiscoveryWindowInterval);
}
public static final Creator<ConfigRequest> CREATOR = new Creator<ConfigRequest>() {
@@ -102,7 +124,10 @@
int masterPreference = in.readInt();
int clusterLow = in.readInt();
int clusterHigh = in.readInt();
- return new ConfigRequest(support5gBand, masterPreference, clusterLow, clusterHigh);
+ int discoveryWindowInterval[] = in.createIntArray();
+
+ return new ConfigRequest(support5gBand, masterPreference, clusterLow, clusterHigh,
+ discoveryWindowInterval);
}
};
@@ -119,17 +144,8 @@
ConfigRequest lhs = (ConfigRequest) o;
return mSupport5gBand == lhs.mSupport5gBand && mMasterPreference == lhs.mMasterPreference
- && mClusterLow == lhs.mClusterLow && mClusterHigh == lhs.mClusterHigh;
- }
-
- /**
- * Checks whether the configuration's settings are non-default.
- *
- * @return true if any of the settings are non-default.
- */
- public boolean isNonDefault() {
- return mSupport5gBand || mMasterPreference != 0 || mClusterLow != CLUSTER_ID_MIN
- || mClusterHigh != CLUSTER_ID_MAX;
+ && mClusterLow == lhs.mClusterLow && mClusterHigh == lhs.mClusterHigh
+ && Arrays.equals(mDiscoveryWindowInterval, lhs.mDiscoveryWindowInterval);
}
@Override
@@ -140,6 +156,7 @@
result = 31 * result + mMasterPreference;
result = 31 * result + mClusterLow;
result = 31 * result + mClusterHigh;
+ result = 31 * result + Arrays.hashCode(mDiscoveryWindowInterval);
return result;
}
@@ -173,6 +190,23 @@
throw new IllegalArgumentException(
"Invalid argument combination - must have Cluster Low <= Cluster High");
}
+ if (mDiscoveryWindowInterval.length != 2) {
+ throw new IllegalArgumentException(
+ "Invalid discovery window interval: must have 2 elements (2.4 & 5");
+ }
+ if (mDiscoveryWindowInterval[NAN_BAND_24GHZ] != DW_INTERVAL_NOT_INIT &&
+ (mDiscoveryWindowInterval[NAN_BAND_24GHZ] < 1 // valid for 2.4GHz: [1-5]
+ || mDiscoveryWindowInterval[NAN_BAND_24GHZ] > 5)) {
+ throw new IllegalArgumentException(
+ "Invalid discovery window interval for 2.4GHz: valid is UNSET or [1,5]");
+ }
+ if (mDiscoveryWindowInterval[NAN_BAND_5GHZ] != DW_INTERVAL_NOT_INIT &&
+ (mDiscoveryWindowInterval[NAN_BAND_5GHZ] < 0 // valid for 5GHz: [0-5]
+ || mDiscoveryWindowInterval[NAN_BAND_5GHZ] > 5)) {
+ throw new IllegalArgumentException(
+ "Invalid discovery window interval for 5GHz: valid is UNSET or [0,5]");
+ }
+
}
/**
@@ -183,6 +217,7 @@
private int mMasterPreference = 0;
private int mClusterLow = CLUSTER_ID_MIN;
private int mClusterHigh = CLUSTER_ID_MAX;
+ private int mDiscoveryWindowInterval[] = {DW_INTERVAL_NOT_INIT, DW_INTERVAL_NOT_INIT};
/**
* Specify whether 5G band support is required in this request. Disabled by default.
@@ -271,6 +306,33 @@
}
/**
+ * The discovery window interval specifies the discovery windows in which the device will be
+ * awake. The configuration enables trading off latency vs. power (higher interval means
+ * higher discovery latency but lower power).
+ *
+ * @param band Either {@link #NAN_BAND_24GHZ} or {@link #NAN_BAND_5GHZ}.
+ * @param interval A value of 1, 2, 3, 4, or 5 indicating an interval of 2^(interval-1). For
+ * the 5GHz band a value of 0 indicates that the device will not be awake
+ * for any discovery windows.
+ *
+ * @return The builder itself to facilitate chaining operations
+ * {@code builder.setDiscoveryWindowInterval(...).setMasterPreference(...)}.
+ */
+ public Builder setDiscoveryWindowInterval(int band, int interval) {
+ if (band != NAN_BAND_24GHZ && band != NAN_BAND_5GHZ) {
+ throw new IllegalArgumentException("Invalid band value");
+ }
+ if ((band == NAN_BAND_24GHZ && (interval < 1 || interval > 5))
+ || (band == NAN_BAND_5GHZ && (interval < 0 || interval > 5))) {
+ throw new IllegalArgumentException(
+ "Invalid interval value: 2.4 GHz [1,5] or 5GHz [0,5]");
+ }
+
+ mDiscoveryWindowInterval[band] = interval;
+ return this;
+ }
+
+ /**
* Build {@link ConfigRequest} given the current requests made on the
* builder.
*/
@@ -280,7 +342,8 @@
"Invalid argument combination - must have Cluster Low <= Cluster High");
}
- return new ConfigRequest(mSupport5gBand, mMasterPreference, mClusterLow, mClusterHigh);
+ return new ConfigRequest(mSupport5gBand, mMasterPreference, mClusterLow, mClusterHigh,
+ mDiscoveryWindowInterval);
}
}
}
diff --git a/wifi/java/android/net/wifi/aware/DiscoverySession.java b/wifi/java/android/net/wifi/aware/DiscoverySession.java
index adf189b..57b98e9 100644
--- a/wifi/java/android/net/wifi/aware/DiscoverySession.java
+++ b/wifi/java/android/net/wifi/aware/DiscoverySession.java
@@ -31,8 +31,7 @@
* {@link PublishDiscoverySession} and {@link SubscribeDiscoverySession}. This
* class provides functionality common to both publish and subscribe discovery sessions:
* <ul>
- * <li>Sending messages: {@link #sendMessage(PeerHandle, int, byte[])} or
- * {@link #sendMessage(PeerHandle, int, byte[], int)} methods.
+ * <li>Sending messages: {@link #sendMessage(PeerHandle, int, byte[])}.
* <li>Creating a network-specifier when requesting a Aware connection:
* {@link #createNetworkSpecifier(PeerHandle, byte[])}.
* </ul>
@@ -62,6 +61,8 @@
* {@link #sendMessage(PeerHandle, int, byte[], int)}.
*
* @return Maximum retry count when sending messages.
+ *
+ * @hide
*/
public static int getMaxSendRetryCount() {
return MAX_SEND_RETRY_COUNT;
@@ -163,6 +164,8 @@
* or MAC level) retries should be attempted if there is no ACK from the receiver
* (note: no retransmissions are attempted in other failure cases). A value of 0
* indicates no retries. Max permitted value is {@link #getMaxSendRetryCount()}.
+ *
+ * @hide
*/
public void sendMessage(@NonNull PeerHandle peerHandle, int messageId,
@Nullable byte[] message, int retryCount) {
@@ -195,8 +198,6 @@
* The peer will get a callback indicating a message was received using
* {@link DiscoverySessionCallback#onMessageReceived(PeerHandle,
* byte[])}.
- * Equivalent to {@link #sendMessage(PeerHandle, int, byte[], int)}
- * with a {@code retryCount} of 0.
*
* @param peerHandle The peer's handle for the message. Must be a result of an
* {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle,
diff --git a/wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java b/wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java
index 33da182..9645b1d 100644
--- a/wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java
+++ b/wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java
@@ -124,10 +124,9 @@
}
/**
- * Called when message transmission fails - when no ACK is received from the peer.
- * Retries when ACKs are not received are done by hardware, MAC, and in the Aware stack (using
- * the {@link DiscoverySession#sendMessage(PeerHandle, int,
- * byte[], int)} method) - this event is received after all retries are exhausted.
+ * Called when message transmission initiated with
+ * {@link DiscoverySession#sendMessage(PeerHandle, int, byte[])} fails. E.g. when no ACK is
+ * received from the peer.
* <p>
* Note that either this callback or
* {@link DiscoverySessionCallback#onMessageSendSucceeded(int)} will be received
@@ -141,9 +140,7 @@
/**
* Called when a message is received from a discovery session peer - in response to the
- * peer's {@link DiscoverySession#sendMessage(PeerHandle, int,
- * byte[])} or {@link DiscoverySession#sendMessage(PeerHandle,
- * int, byte[], int)}.
+ * peer's {@link DiscoverySession#sendMessage(PeerHandle, int, byte[])}.
*
* @param peerHandle An opaque handle to the peer matching our discovery operation.
* @param message A byte array containing the message.
diff --git a/wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl b/wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl
index 794c142..0f4910f 100644
--- a/wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl
+++ b/wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl
@@ -34,8 +34,6 @@
interface IWifiAwareManager
{
// Aware API
- void enableUsage();
- void disableUsage();
boolean isUsageEnabled();
Characteristics getCharacteristics();
diff --git a/wifi/java/android/net/wifi/aware/WifiAwareManager.java b/wifi/java/android/net/wifi/aware/WifiAwareManager.java
index a9e38ce..0eb6a3d 100644
--- a/wifi/java/android/net/wifi/aware/WifiAwareManager.java
+++ b/wifi/java/android/net/wifi/aware/WifiAwareManager.java
@@ -253,36 +253,6 @@
}
/**
- * Enable the usage of the Aware API. Doesn't actually turn on Aware cluster formation - that
- * only happens when an attach is attempted. {@link #ACTION_WIFI_AWARE_STATE_CHANGED} broadcast
- * will be triggered.
- *
- * @hide
- */
- public void enableUsage() {
- try {
- mService.enableUsage();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * Disable the usage of the Aware API. All attempts to attach() will be rejected. All open
- * connections and sessions will be terminated. {@link #ACTION_WIFI_AWARE_STATE_CHANGED}
- * broadcast will be triggered.
- *
- * @hide
- */
- public void disableUsage() {
- try {
- mService.disableUsage();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
* Returns the current status of Aware API: whether or not Aware is available. To track
* changes in the state of Aware API register for the
* {@link #ACTION_WIFI_AWARE_STATE_CHANGED} broadcast.
diff --git a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
index 5f949747..632cfaf 100644
--- a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
@@ -20,6 +20,7 @@
import static org.junit.Assert.assertEquals;
import android.os.Parcel;
+import android.net.wifi.WifiConfiguration.NetworkSelectionStatus;
import org.junit.Before;
import org.junit.Test;
@@ -66,4 +67,35 @@
assertArrayEquals(bytes, rebytes);
}
+
+ @Test
+ public void testNetworkSelectionStatusCopy() {
+ NetworkSelectionStatus networkSelectionStatus = new NetworkSelectionStatus();
+ networkSelectionStatus.setNotRecommended(true);
+
+ NetworkSelectionStatus copy = new NetworkSelectionStatus();
+ copy.copy(networkSelectionStatus);
+
+ assertEquals(networkSelectionStatus.isNotRecommended(), copy.isNotRecommended());
+ }
+
+ @Test
+ public void testNetworkSelectionStatusParcel() {
+ NetworkSelectionStatus networkSelectionStatus = new NetworkSelectionStatus();
+ networkSelectionStatus.setNotRecommended(true);
+
+ Parcel parcelW = Parcel.obtain();
+ networkSelectionStatus.writeToParcel(parcelW);
+ byte[] bytes = parcelW.marshall();
+ parcelW.recycle();
+
+ Parcel parcelR = Parcel.obtain();
+ parcelR.unmarshall(bytes, 0, bytes.length);
+ parcelR.setDataPosition(0);
+
+ NetworkSelectionStatus copy = new NetworkSelectionStatus();
+ copy.readFromParcel(parcelR);
+
+ assertEquals(networkSelectionStatus.isNotRecommended(), copy.isNotRecommended());
+ }
}
diff --git a/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java b/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java
index a396d87..7f68f6f 100644
--- a/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java
+++ b/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java
@@ -100,26 +100,6 @@
*/
/**
- * Validate pass-through of enableUsage() API.
- */
- @Test
- public void testEnableUsage() throws Exception {
- mDut.enableUsage();
-
- verify(mockAwareService).enableUsage();
- }
-
- /**
- * Validate pass-through of disableUsage() API.
- */
- @Test
- public void testDisableUsage() throws Exception {
- mDut.disableUsage();
-
- verify(mockAwareService).disableUsage();
- }
-
- /**
* Validate pass-through of isUsageEnabled() API.
*/
@Test
@@ -566,6 +546,12 @@
collector.checkThat("mMasterPreference", 0,
equalTo(configRequest.mMasterPreference));
collector.checkThat("mSupport5gBand", false, equalTo(configRequest.mSupport5gBand));
+ collector.checkThat("mDiscoveryWindowInterval.length", 2,
+ equalTo(configRequest.mDiscoveryWindowInterval.length));
+ collector.checkThat("mDiscoveryWindowInterval[2.4GHz]", ConfigRequest.DW_INTERVAL_NOT_INIT,
+ equalTo(configRequest.mDiscoveryWindowInterval[ConfigRequest.NAN_BAND_24GHZ]));
+ collector.checkThat("mDiscoveryWindowInterval[5Hz]", ConfigRequest.DW_INTERVAL_NOT_INIT,
+ equalTo(configRequest.mDiscoveryWindowInterval[ConfigRequest.NAN_BAND_5GHZ]));
}
@Test
@@ -574,10 +560,12 @@
final int clusterLow = 5;
final int masterPreference = 55;
final boolean supportBand5g = true;
+ final int dwWindow5GHz = 3;
ConfigRequest configRequest = new ConfigRequest.Builder().setClusterHigh(clusterHigh)
.setClusterLow(clusterLow).setMasterPreference(masterPreference)
.setSupport5gBand(supportBand5g)
+ .setDiscoveryWindowInterval(ConfigRequest.NAN_BAND_5GHZ, dwWindow5GHz)
.build();
collector.checkThat("mClusterHigh", clusterHigh, equalTo(configRequest.mClusterHigh));
@@ -585,6 +573,12 @@
collector.checkThat("mMasterPreference", masterPreference,
equalTo(configRequest.mMasterPreference));
collector.checkThat("mSupport5gBand", supportBand5g, equalTo(configRequest.mSupport5gBand));
+ collector.checkThat("mDiscoveryWindowInterval.length", 2,
+ equalTo(configRequest.mDiscoveryWindowInterval.length));
+ collector.checkThat("mDiscoveryWindowInterval[2.4GHz]", ConfigRequest.DW_INTERVAL_NOT_INIT,
+ equalTo(configRequest.mDiscoveryWindowInterval[ConfigRequest.NAN_BAND_24GHZ]));
+ collector.checkThat("mDiscoveryWindowInterval[5GHz]", dwWindow5GHz,
+ equalTo(configRequest.mDiscoveryWindowInterval[ConfigRequest.NAN_BAND_5GHZ]));
}
@Test(expected = IllegalArgumentException.class)
@@ -633,16 +627,44 @@
new ConfigRequest.Builder().setClusterLow(100).setClusterHigh(5).build();
}
+ @Test(expected = IllegalArgumentException.class)
+ public void testConfigRequestBuilderDwIntervalInvalidBand() {
+ new ConfigRequest.Builder().setDiscoveryWindowInterval(5, 1).build();
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testConfigRequestBuilderDwIntervalInvalidValueZero() {
+ new ConfigRequest.Builder().setDiscoveryWindowInterval(ConfigRequest.NAN_BAND_24GHZ,
+ 0).build();
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testConfigRequestBuilderDwIntervalInvalidValueLarge() {
+ new ConfigRequest.Builder().setDiscoveryWindowInterval(ConfigRequest.NAN_BAND_5GHZ,
+ 6).build();
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testConfigRequestBuilderDwIntervalInvalidValueLargeValidate() {
+ ConfigRequest cr = new ConfigRequest.Builder().build();
+ cr.mDiscoveryWindowInterval[ConfigRequest.NAN_BAND_5GHZ] = 6;
+ cr.validate();
+ }
+
@Test
public void testConfigRequestParcel() {
final int clusterHigh = 189;
final int clusterLow = 25;
final int masterPreference = 177;
final boolean supportBand5g = true;
+ final int dwWindow24GHz = 1;
+ final int dwWindow5GHz = 5;
ConfigRequest configRequest = new ConfigRequest.Builder().setClusterHigh(clusterHigh)
.setClusterLow(clusterLow).setMasterPreference(masterPreference)
.setSupport5gBand(supportBand5g)
+ .setDiscoveryWindowInterval(ConfigRequest.NAN_BAND_24GHZ, dwWindow24GHz)
+ .setDiscoveryWindowInterval(ConfigRequest.NAN_BAND_5GHZ, dwWindow5GHz)
.build();
Parcel parcelW = Parcel.obtain();